| 1402 | } |
| 1403 | |
| 1404 | static 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; |
no test coverage detected