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 | 1403 | s.i = 0; |
| 1404 | 1404 | s.p = p; |
| 1405 | 1405 | |
| 1406 | − s.mul_count = 1; | |
| 1407 | − | |
| 1406 | + for(int v = 0; v< 512; v++) { | |
| 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 | 1412 | for (int i= 0; i<s.pixel_num; i++) { |
| 1409 | 1413 | int64_t val = sc->unit[p][i].val; |
| 1410 | 1414 | if (val != last_val) { |
| 1411 | 1415 | av_assert2(last_val < val); |
| 1412 | 1416 | for(int si= 0; si < FF_ARRAY_ELEMS(score_tab); si++) { |
| 1413 | 1417 | int64_t delta = val - last_val; |
| 1414 | − int mul = last_val < 0 ? 1 : (1<<si); | |
| 1415 | − int64_t cost = FFMAX((delta + mul/2) / mul, 1); | |
| 1416 | − score_tab[si] += log2(cost) + fabs(delta - cost*mul); | |
| 1418 | + int mul; | |
| 1419 | + int64_t cost; | |
| 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 | 1431 | last_val = val; |
| 1419 | 1432 | } |
| @@ -1422,7 +1435,12 @@ static void encode_float32_remap(FFV1Context *f, FFV1SliceContext *sc, · 2 unmodified lines | ||
| 1422 | 1435 | if (score_tab[si] < score_tab[ best_index ]) |
| 1423 | 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 | 1444 | s.mul[s.mul_count] = 1; |
| 1427 | 1445 | |
| 1428 | 1446 | encode_float32_remap_segment(sc, &s, 1, 1); |