MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / encode_float32_remap

Function encode_float32_remap

libavcodec/ffv1enc.c:1404–1500  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1402}
1403
1404static void encode_float32_remap(FFV1Context *f, FFV1SliceContext *sc,
1405 const uint8_t *src[4])
1406{
1407 int pixel_num = sc->slice_width * sc->slice_height;
1408 const int max_log2_mul_count = ((int[]){ 1, 1, 1, 9, 9, 10})[f->remap_optimizer];
1409 const int log2_mul_count_step = ((int[]){ 1, 1, 1, 9, 9, 1})[f->remap_optimizer];
1410 const int max_log2_mul = ((int[]){ 1, 8, 8, 9, 22, 22})[f->remap_optimizer];
1411 const int log2_mul_step = ((int[]){ 1, 8, 1, 1, 1, 1})[f->remap_optimizer];
1412 const int bruteforce_count = ((int[]){ 0, 0, 0, 1, 1, 1})[f->remap_optimizer];
1413 const int stair_mode = ((int[]){ 0, 0, 0, 1, 0, 0})[f->remap_optimizer];
1414 const int magic_log2 = ((int[]){ 1, 1, 1, 1, 0, 0})[f->remap_optimizer];
1415
1416 for (int p= 0; p < 1 + 2*f->chroma_planes + f->transparency; p++) {
1417 int best_log2_mul_count = 0;
1418 float score_sum[11] = {0};
1419 int mul_all[11][1025];
1420
1421 for (int log2_mul_count= 0; log2_mul_count <= max_log2_mul_count; log2_mul_count += log2_mul_count_step) {
1422 float score_tab_all[1025][23] = {0};
1423 int64_t last_val = -1;
1424 int *mul_tab = mul_all[log2_mul_count];
1425 int last_mul_index = -1;
1426 int mul_count = 1 << log2_mul_count;
1427
1428 score_sum[log2_mul_count] = 2 * log2_mul_count;
1429 if (magic_log2)
1430 score_sum[log2_mul_count] = av_float2int((float)mul_count * mul_count);
1431 for (int i= 0; i<pixel_num; i++) {
1432 int64_t val = sc->unit[p][i].val;
1433 int mul_index = (val + 1LL)*mul_count >> 32;
1434 if (val != last_val) {
1435 float *score_tab = score_tab_all[(last_val + 1LL)*mul_count >> 32];
1436 av_assert2(last_val < val);
1437 for(int si= 0; si <= max_log2_mul; si += log2_mul_step) {
1438 int64_t delta = val - last_val;
1439 int mul;
1440 int64_t cost;
1441
1442 if (last_val < 0) {
1443 mul = 1;
1444 } else if (stair_mode && mul_count == 512 && si == max_log2_mul ) {
1445 if (mul_index >= 0x378/8 && mul_index <= 23 + 0x378/8) {
1446 mul = (0x800080 >> (mul_index - 0x378/8));
1447 } else
1448 mul = 1;
1449 } else {
1450 mul = (0x10001LL)<<si >> 16;
1451 }
1452
1453 cost = FFMAX((delta + mul/2) / mul, 1);
1454 float score = 1;
1455 if (mul > 1) {
1456 score *= (FFABS(delta - cost*mul)+1);
1457 if (mul_count > 1)
1458 score *= score;
1459 }
1460 score *= cost;
1461 score *= score;

Callers 1

encode_sliceFunction · 0.85

Calls 2

av_float2intFunction · 0.85

Tested by

no test coverage detected