Showing the changes to libavcodec (1 of 1 file). Show all
Unified · Split
| @@ -1403,17 +1403,30 @@ static void encode_float32_remap(FFV1Context *f, FFV1SliceContext *sc, · 1402 unmodified lines | |||
| 1403 | s.i = 0; | 1403 | s.i = 0; |
| 1404 | s.p = p; | 1404 | s.p = p; |
| 1405 | 1405 | ||
| 1406 | s.mul_count = 1; | 1406 | for(int v = 0; v< 512; v++) { |
| 1407 | 1407 | if (v >= 0x378/8 && v <= 23 + 0x378/8) { | |
| 1408 | s.mul[v] = -(0x800080 >> (v - 0x378/8)); | ||
| 1409 | } else | ||
| 1410 | s.mul[v] = -1; | ||
| 1411 | } | ||
| 1408 | for (int i= 0; i<s.pixel_num; i++) { | 1412 | for (int i= 0; i<s.pixel_num; i++) { |
| 1409 | int64_t val = sc->unit[p][i].val; | 1413 | int64_t val = sc->unit[p][i].val; |
| 1410 | if (val != last_val) { | 1414 | if (val != last_val) { |
| 1411 | av_assert2(last_val < val); | 1415 | av_assert2(last_val < val); |
| 1412 | for(int si= 0; si < FF_ARRAY_ELEMS(score_tab); si++) { | 1416 | for(int si= 0; si < FF_ARRAY_ELEMS(score_tab); si++) { |
| 1413 | int64_t delta = val - last_val; | 1417 | int64_t delta = val - last_val; |
| 1414 | int mul = last_val < 0 ? 1 : (1<<si); | 1418 | int mul; |
| 1415 | int64_t cost = FFMAX((delta + mul/2) / mul, 1); | 1419 | int64_t cost; |
| 1416 | score_tab[si] += log2(cost) + fabs(delta - cost*mul); | 1420 | |
| 1421 | if (last_val < 0) { | ||
| 1422 | mul = 1; | ||
| 1423 | } else if (si + 1 == FF_ARRAY_ELEMS(score_tab)) { | ||
| 1424 | mul = -s.mul[ (last_val + 1) >> (32-9) ]; | ||
| 1425 | } else | ||
| 1426 | mul = 1<<si; | ||
| 1427 | |||
| 1428 | cost = FFMAX((delta + mul/2) / mul, 1); | ||
| 1429 | score_tab[si] += log2(cost) + log2(fabs(delta - cost*mul)+1); | ||
| 1417 | } | 1430 | } |
| 1418 | last_val = val; | 1431 | last_val = val; |
| 1419 | } | 1432 | } |
| @@ -1422,7 +1435,12 @@ static void encode_float32_remap(FFV1Context *f, FFV1SliceContext *sc, · 2 unmodified lines | |||
| 1422 | if (score_tab[si] < score_tab[ best_index ]) | 1435 | if (score_tab[si] < score_tab[ best_index ]) |
| 1423 | best_index = si; | 1436 | best_index = si; |
| 1424 | } | 1437 | } |
| 1425 | s.mul[0] = -1 << best_index; | 1438 | if (best_index + 1 < FF_ARRAY_ELEMS(score_tab)) { |
| 1439 | s.mul[0] = -1 << best_index; | ||
| 1440 | s.mul_count = 1; | ||
| 1441 | } else { | ||
| 1442 | s.mul_count = 512; | ||
| 1443 | } | ||
| 1426 | s.mul[s.mul_count] = 1; | 1444 | s.mul[s.mul_count] = 1; |
| 1427 | 1445 | ||
| 1428 | encode_float32_remap_segment(sc, &s, 1, 1); | 1446 | encode_float32_remap_segment(sc, &s, 1, 1); |