Unified · Split
| @@ -1271,44 +1271,26 @@ typedef struct RemapEncoderState { · 1270 unmodified lines | |||
| 1271 | int run1start_mul_index; | 1271 | int run1start_mul_index; |
| 1272 | } RemapEncoderState; | 1272 | } RemapEncoderState; |
| 1273 | 1273 | ||
| 1274 | static inline void copy_state(RemapEncoderState *dst, const RemapEncoderState *src) | ||
| 1275 | { | ||
| 1276 | dst->rc = src->rc; | ||
| 1277 | memcpy(dst->mul, src->mul, (src->mul_count + 1) * sizeof(src->mul[0])); | ||
| 1278 | memcpy(dst->state, src->state, sizeof(dst->state)); | ||
| 1279 | dst->lu = src->lu; | ||
| 1280 | dst->run = src->run; | ||
| 1281 | dst->last_val = src->last_val; | ||
| 1282 | dst->compact_index = src->compact_index; | ||
| 1283 | dst->mul_count = src->mul_count; | ||
| 1284 | dst->i = src->i; | ||
| 1285 | dst->pixel_num = src->pixel_num; | ||
| 1286 | dst->p = src->p; | ||
| 1287 | dst->current_mul_index = src->current_mul_index; | ||
| 1288 | dst->run1final = src->run1final; | ||
| 1289 | dst->run1start_i = src->run1start_i; | ||
| 1290 | dst->run1start_last_val = src->run1start_last_val; | ||
| 1291 | dst->run1start_mul_index = src->run1start_mul_index; | ||
| 1292 | } | ||
| 1293 | |||
| 1294 | static int encode_float32_remap_segment(FFV1SliceContext *sc, | 1274 | static int encode_float32_remap_segment(FFV1SliceContext *sc, |
| 1295 | RemapEncoderState *state_arg, int update, int final) | 1275 | int p, int mul_count, int *mul_tab, int update, int final) |
| 1296 | { | 1276 | { |
| 1297 | RemapEncoderState s; | 1277 | RemapEncoderState s; |
| 1298 | 1278 | ||
| 1299 | copy_state(&s, state_arg); | 1279 | s.pixel_num = sc->slice_width * sc->slice_height; |
| 1300 | 1280 | s.p = p; | |
| 1301 | if (s.i == 0) { | 1281 | s.i = 0; |
| 1302 | memset(s.state, 128, sizeof(s.state)); | 1282 | s.rc = sc->c; |
| 1303 | put_symbol(&s.rc, s.state[0][0], s.mul_count, 0); | 1283 | s.mul_count = mul_count; |
| 1304 | memset(s.state, 128, sizeof(s.state)); | 1284 | memcpy(s.mul, mul_tab, sizeof(*mul_tab)*(mul_count+1)); |
| 1305 | s.last_val = -1; | 1285 | memset(s.state, 128, sizeof(s.state)); |
| 1306 | s.compact_index = -1; | 1286 | put_symbol(&s.rc, s.state[0][0], s.mul_count, 0); |
| 1307 | s.lu = 0; | 1287 | memset(s.state, 128, sizeof(s.state)); |
| 1308 | s.run = 0; | 1288 | s.last_val = -1; |
| 1309 | s.current_mul_index = -1; | 1289 | s.compact_index = -1; |
| 1310 | s.run1final = 0; | 1290 | s.lu = 0; |
| 1311 | } | 1291 | s.run = 0; |
| 1292 | s.current_mul_index = -1; | ||
| 1293 | s.run1final = 0; | ||
| 1312 | 1294 | ||
| 1313 | for (; s.i < s.pixel_num+1; s.i++) { | 1295 | for (; s.i < s.pixel_num+1; s.i++) { |
| 1314 | int current_mul = s.current_mul_index < 0 ? 1 : FFABS(s.mul[s.current_mul_index]); | 1296 | int current_mul = s.current_mul_index < 0 ? 1 : FFABS(s.mul[s.current_mul_index]); |
| @@ -1395,7 +1377,7 @@ static int encode_float32_remap_segment(FFV1SliceContext *sc, · 80 unmodified lines | |||
| 1395 | } | 1377 | } |
| 1396 | 1378 | ||
| 1397 | if (update) { | 1379 | if (update) { |
| 1398 | copy_state(state_arg, &s); | 1380 | sc->c = s.rc; |
| 1399 | } | 1381 | } |
| 1400 | return get_rac_count(&s.rc); | 1382 | return get_rac_count(&s.rc); |
| 1401 | } | 1383 | } |
| @@ -1403,25 +1385,22 @@ static int encode_float32_remap_segment(FFV1SliceContext *sc, · 1 unmodified line | |||
| 1403 | static void encode_float32_remap(FFV1Context *f, FFV1SliceContext *sc, | 1385 | static void encode_float32_remap(FFV1Context *f, FFV1SliceContext *sc, |
| 1404 | const uint8_t *src[4]) | 1386 | const uint8_t *src[4]) |
| 1405 | { | 1387 | { |
| 1406 | RemapEncoderState s; | 1388 | int pixel_num = sc->slice_width * sc->slice_height; |
| 1407 | s.pixel_num = sc->slice_width * sc->slice_height; | 1389 | int mul_count; |
| 1408 | 1390 | ||
| 1409 | av_assert0 (s.pixel_num <= 65536); | 1391 | av_assert0 (pixel_num <= 65536); |
| 1410 | 1392 | ||
| 1411 | for (int p= 0; p < 1 + 2*f->chroma_planes + f->transparency; p++) { | 1393 | for (int p= 0; p < 1 + 2*f->chroma_planes + f->transparency; p++) { |
| 1412 | float score_sum[2] = {0}; | 1394 | float score_sum[2] = {0}; |
| 1413 | int mul_all[2][513]; | 1395 | int mul_all[2][513]; |
| 1414 | s.rc = sc->c; | ||
| 1415 | s.i = 0; | ||
| 1416 | s.p = p; | ||
| 1417 | 1396 | ||
| 1418 | for (int mul_count= 1; mul_count<=512; mul_count+=511) { | 1397 | for (mul_count= 1; mul_count<=512; mul_count+=511) { |
| 1419 | float score_tab_all[513][23] = {0}; | 1398 | float score_tab_all[513][23] = {0}; |
| 1420 | int64_t last_val = -1; | 1399 | int64_t last_val = -1; |
| 1421 | int *mul_tab = mul_all[mul_count>>9]; | 1400 | int *mul_tab = mul_all[mul_count>>9]; |
| 1422 | int last_mul_index = -1; | 1401 | int last_mul_index = -1; |
| 1423 | score_sum[mul_count>>9] += log2(mul_count); | 1402 | score_sum[mul_count>>9] += log2(mul_count); |
| 1424 | for (int i= 0; i<s.pixel_num; i++) { | 1403 | for (int i= 0; i<pixel_num; i++) { |
| 1425 | int64_t val = sc->unit[p][i].val; | 1404 | int64_t val = sc->unit[p][i].val; |
| 1426 | int mul_index = (val + 1LL)*mul_count >> 32; | 1405 | int mul_index = (val + 1LL)*mul_count >> 32; |
| 1427 | if (val != last_val) { | 1406 | if (val != last_val) { |
| @@ -1461,17 +1440,11 @@ static void encode_float32_remap(FFV1Context *f, FFV1SliceContext *sc, · 33 unmodified lines | |||
| 1461 | } | 1440 | } |
| 1462 | mul_tab[mul_count] = 1; | 1441 | mul_tab[mul_count] = 1; |
| 1463 | 1442 | ||
| 1464 | s.mul_count = mul_count; | 1443 | score_sum[mul_count>>9] = encode_float32_remap_segment(sc, p, mul_count, mul_all[mul_count>>9], 0, 0); |
| 1465 | memcpy(s.mul, mul_all[s.mul_count>>9], sizeof(*s.mul)*(s.mul_count+1)); | ||
| 1466 | score_sum[mul_count>>9] = encode_float32_remap_segment(sc, &s, 0, 0); | ||
| 1467 | } | 1444 | } |
| 1468 | 1445 | ||
| 1469 | s.mul_count = score_sum[0] <= score_sum[1] ? 1 : 512; | 1446 | mul_count = score_sum[0] <= score_sum[1] ? 1 : 512; |
| 1470 | memcpy(s.mul, mul_all[s.mul_count>>9], sizeof(*s.mul)*(s.mul_count+1)); | 1447 | encode_float32_remap_segment(sc, p, mul_count, mul_all[mul_count>>9], 1, 1); |
| 1471 | |||
| 1472 | encode_float32_remap_segment(sc, &s, 1, 1); | ||
| 1473 | |||
| 1474 | sc->c = s.rc; | ||
| 1475 | } | 1448 | } |
| 1476 | } | 1449 | } |
| 1477 | 1450 | ||