History

avcodec/ffv1enc: Eliminate copy_state

Michael Niedermayer committed 1 year ago

Commit 3faee891 parent 2f0500f1 file · +25 −52Browse files

Unified · Split

libavcodec/ffv1enc.c+25−52
@@ -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
1274static 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
1294static int encode_float32_remap_segment(FFV1SliceContext *sc,1274static 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
1403static void encode_float32_remap(FFV1Context *f, FFV1SliceContext *sc,1385static 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

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t