| /* |
| * Copyright (c) 2021, Alliance for Open Media. All rights reserved |
| * |
| * This source code is subject to the terms of the BSD 3-Clause Clear License |
| * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear |
| * License was not distributed with this source code in the LICENSE file, you |
| * can obtain it at aomedia.org/license/software-license/bsd-3-c-c/. If the |
| * Alliance for Open Media Patent License 1.0 was not distributed with this |
| * source code in the PATENTS file, you can obtain it at |
| * aomedia.org/license/patent-license/. |
| */ |
| |
| // This tool is a gadget for offline probability training. |
| // A binary executable aom_entropy_optimizer will be generated in tools/. It |
| // parses a binary file consisting of counts written in the format of |
| // FRAME_COUNTS in entropymode.h, and computes optimized probability tables |
| // and CDF tables, which will be written to a new c file optimized_probs.c |
| // according to format in the codebase. |
| // |
| // Command line: ./aom_entropy_optimizer [directory of the count file] |
| // |
| // The input file can either be generated by encoding a single clip by |
| // turning on entropy_stats experiment, or be collected at a larger scale at |
| // which a python script which will be provided soon can be used to aggregate |
| // multiple stats output. |
| |
| #include <assert.h> |
| #include <stdio.h> |
| |
| #include "config/aom_config.h" |
| |
| #include "av1/encoder/encoder.h" |
| |
| #define SPACES_PER_TAB 2 |
| #define CDF_MAX_SIZE 16 |
| |
| typedef unsigned int aom_count_type; |
| // A log file recording parsed counts |
| static FILE *logfile; // TODO(yuec): make it a command line option |
| |
| static void counts_to_cdf(const aom_count_type *counts, aom_cdf_prob *cdf, |
| int modes) { |
| int64_t csum[CDF_MAX_SIZE]; |
| assert(modes <= CDF_MAX_SIZE); |
| |
| csum[0] = counts[0] + 1; |
| for (int i = 1; i < modes; ++i) csum[i] = counts[i] + 1 + csum[i - 1]; |
| |
| for (int i = 0; i < modes; ++i) fprintf(logfile, "%d ", counts[i]); |
| fprintf(logfile, "\n"); |
| |
| int64_t sum = csum[modes - 1]; |
| const int64_t round_shift = sum >> 1; |
| for (int i = 0; i < modes; ++i) { |
| cdf[i] = (csum[i] * CDF_PROB_TOP + round_shift) / sum; |
| cdf[i] = AOMMIN(cdf[i], CDF_PROB_TOP - (modes - 1 + i) * 4); |
| cdf[i] = (i == 0) ? AOMMAX(cdf[i], 4) : AOMMAX(cdf[i], cdf[i - 1] + 4); |
| } |
| } |
| |
| static int parse_counts_for_cdf_opt(aom_count_type **ct_ptr, |
| FILE *const probsfile, int tabs, |
| int dim_of_cts, int *cts_each_dim) { |
| if (dim_of_cts < 1) { |
| fprintf(stderr, "The dimension of a counts vector should be at least 1!\n"); |
| return 1; |
| } |
| const int total_modes = cts_each_dim[0]; |
| if (dim_of_cts == 1) { |
| assert(total_modes <= CDF_MAX_SIZE); |
| aom_cdf_prob cdfs[CDF_MAX_SIZE]; |
| aom_count_type *counts1d = *ct_ptr; |
| |
| counts_to_cdf(counts1d, cdfs, total_modes); |
| (*ct_ptr) += total_modes; |
| |
| if (tabs > 0) fprintf(probsfile, "%*c", tabs * SPACES_PER_TAB, ' '); |
| fprintf(probsfile, "AOM_CDF%d(", total_modes); |
| for (int k = 0; k < total_modes - 1; ++k) { |
| fprintf(probsfile, "%d", cdfs[k]); |
| if (k < total_modes - 2) fprintf(probsfile, ", "); |
| } |
| fprintf(probsfile, ")"); |
| } else { |
| for (int k = 0; k < total_modes; ++k) { |
| int tabs_next_level; |
| |
| if (dim_of_cts == 2) |
| fprintf(probsfile, "%*c{ ", tabs * SPACES_PER_TAB, ' '); |
| else |
| fprintf(probsfile, "%*c{\n", tabs * SPACES_PER_TAB, ' '); |
| tabs_next_level = dim_of_cts == 2 ? 0 : tabs + 1; |
| |
| if (parse_counts_for_cdf_opt(ct_ptr, probsfile, tabs_next_level, |
| dim_of_cts - 1, cts_each_dim + 1)) { |
| return 1; |
| } |
| |
| if (dim_of_cts == 2) { |
| if (k == total_modes - 1) |
| fprintf(probsfile, " }\n"); |
| else |
| fprintf(probsfile, " },\n"); |
| } else { |
| if (k == total_modes - 1) |
| fprintf(probsfile, "%*c}\n", tabs * SPACES_PER_TAB, ' '); |
| else |
| fprintf(probsfile, "%*c},\n", tabs * SPACES_PER_TAB, ' '); |
| } |
| } |
| } |
| return 0; |
| } |
| |
| static void optimize_cdf_table(aom_count_type *counts, FILE *const probsfile, |
| int dim_of_cts, int *cts_each_dim, |
| char *prefix) { |
| aom_count_type *ct_ptr = counts; |
| |
| fprintf(probsfile, "%s = {\n", prefix); |
| fprintf(logfile, "%s\n", prefix); |
| if (parse_counts_for_cdf_opt(&ct_ptr, probsfile, 1, dim_of_cts, |
| cts_each_dim)) { |
| fprintf(probsfile, "Optimizer failed!\n"); |
| } |
| fprintf(probsfile, "};\n\n"); |
| fprintf(logfile, "============================\n"); |
| } |
| |
| static void optimize_uv_mode(aom_count_type *counts, FILE *const probsfile, |
| int dim_of_cts, int *cts_each_dim, char *prefix) { |
| aom_count_type *ct_ptr = counts; |
| |
| fprintf(probsfile, "%s = {\n", prefix); |
| fprintf(probsfile, "%*c{\n", SPACES_PER_TAB, ' '); |
| fprintf(logfile, "%s\n", prefix); |
| cts_each_dim[2] = UV_INTRA_MODES - 1; |
| for (int k = 0; k < cts_each_dim[1]; ++k) { |
| fprintf(probsfile, "%*c{ ", 2 * SPACES_PER_TAB, ' '); |
| parse_counts_for_cdf_opt(&ct_ptr, probsfile, 0, dim_of_cts - 2, |
| cts_each_dim + 2); |
| if (k + 1 == cts_each_dim[1]) { |
| fprintf(probsfile, " }\n"); |
| } else { |
| fprintf(probsfile, " },\n"); |
| } |
| ++ct_ptr; |
| } |
| fprintf(probsfile, "%*c},\n", SPACES_PER_TAB, ' '); |
| fprintf(probsfile, "%*c{\n", SPACES_PER_TAB, ' '); |
| cts_each_dim[2] = UV_INTRA_MODES; |
| parse_counts_for_cdf_opt(&ct_ptr, probsfile, 2, dim_of_cts - 1, |
| cts_each_dim + 1); |
| fprintf(probsfile, "%*c}\n", SPACES_PER_TAB, ' '); |
| fprintf(probsfile, "};\n\n"); |
| fprintf(logfile, "============================\n"); |
| } |
| |
| static void optimize_cdf_table_var_modes_2d(aom_count_type *counts, |
| FILE *const probsfile, |
| int dim_of_cts, int *cts_each_dim, |
| int *modes_each_ctx, char *prefix) { |
| aom_count_type *ct_ptr = counts; |
| |
| assert(dim_of_cts == 2); |
| (void)dim_of_cts; |
| |
| fprintf(probsfile, "%s = {\n", prefix); |
| fprintf(logfile, "%s\n", prefix); |
| |
| for (int d0_idx = 0; d0_idx < cts_each_dim[0]; ++d0_idx) { |
| int num_of_modes = modes_each_ctx[d0_idx]; |
| |
| if (num_of_modes > 0) { |
| fprintf(probsfile, "%*c{ ", SPACES_PER_TAB, ' '); |
| parse_counts_for_cdf_opt(&ct_ptr, probsfile, 0, 1, &num_of_modes); |
| ct_ptr += cts_each_dim[1] - num_of_modes; |
| fprintf(probsfile, " },\n"); |
| } else { |
| fprintf(probsfile, "%*c{ 0 },\n", SPACES_PER_TAB, ' '); |
| fprintf(logfile, "dummy cdf, no need to optimize\n"); |
| ct_ptr += cts_each_dim[1]; |
| } |
| } |
| fprintf(probsfile, "};\n\n"); |
| fprintf(logfile, "============================\n"); |
| } |
| |
| static void optimize_cdf_table_var_modes_3d(aom_count_type *counts, |
| FILE *const probsfile, |
| int dim_of_cts, int *cts_each_dim, |
| int *modes_each_ctx, char *prefix) { |
| aom_count_type *ct_ptr = counts; |
| |
| assert(dim_of_cts == 3); |
| (void)dim_of_cts; |
| |
| fprintf(probsfile, "%s = {\n", prefix); |
| fprintf(logfile, "%s\n", prefix); |
| |
| for (int d0_idx = 0; d0_idx < cts_each_dim[0]; ++d0_idx) { |
| fprintf(probsfile, "%*c{\n", SPACES_PER_TAB, ' '); |
| for (int d1_idx = 0; d1_idx < cts_each_dim[1]; ++d1_idx) { |
| int num_of_modes = modes_each_ctx[d0_idx]; |
| |
| if (num_of_modes > 0) { |
| fprintf(probsfile, "%*c{ ", 2 * SPACES_PER_TAB, ' '); |
| parse_counts_for_cdf_opt(&ct_ptr, probsfile, 0, 1, &num_of_modes); |
| ct_ptr += cts_each_dim[2] - num_of_modes; |
| fprintf(probsfile, " },\n"); |
| } else { |
| fprintf(probsfile, "%*c{ 0 },\n", 2 * SPACES_PER_TAB, ' '); |
| fprintf(logfile, "dummy cdf, no need to optimize\n"); |
| ct_ptr += cts_each_dim[2]; |
| } |
| } |
| fprintf(probsfile, "%*c},\n", SPACES_PER_TAB, ' '); |
| } |
| fprintf(probsfile, "};\n\n"); |
| fprintf(logfile, "============================\n"); |
| } |
| |
| static void optimize_cdf_table_var_modes_4d(aom_count_type *counts, |
| FILE *const probsfile, |
| int dim_of_cts, int *cts_each_dim, |
| int *modes_each_ctx, char *prefix) { |
| aom_count_type *ct_ptr = counts; |
| |
| assert(dim_of_cts == 4); |
| (void)dim_of_cts; |
| |
| fprintf(probsfile, "%s = {\n", prefix); |
| fprintf(logfile, "%s\n", prefix); |
| |
| for (int d0_idx = 0; d0_idx < cts_each_dim[0]; ++d0_idx) { |
| fprintf(probsfile, "%*c{\n", SPACES_PER_TAB, ' '); |
| for (int d1_idx = 0; d1_idx < cts_each_dim[1]; ++d1_idx) { |
| fprintf(probsfile, "%*c{\n", 2 * SPACES_PER_TAB, ' '); |
| for (int d2_idx = 0; d2_idx < cts_each_dim[2]; ++d2_idx) { |
| int num_of_modes = modes_each_ctx[d0_idx]; |
| |
| if (num_of_modes > 0) { |
| fprintf(probsfile, "%*c{ ", 3 * SPACES_PER_TAB, ' '); |
| parse_counts_for_cdf_opt(&ct_ptr, probsfile, 0, 1, &num_of_modes); |
| ct_ptr += cts_each_dim[3] - num_of_modes; |
| fprintf(probsfile, " },\n"); |
| } else { |
| fprintf(probsfile, "%*c{ 0 },\n", 3 * SPACES_PER_TAB, ' '); |
| fprintf(logfile, "dummy cdf, no need to optimize\n"); |
| ct_ptr += cts_each_dim[3]; |
| } |
| } |
| fprintf(probsfile, "%*c},\n", 2 * SPACES_PER_TAB, ' '); |
| } |
| fprintf(probsfile, "%*c},\n", SPACES_PER_TAB, ' '); |
| } |
| fprintf(probsfile, "};\n\n"); |
| fprintf(logfile, "============================\n"); |
| } |
| |
| // Like optimize_cdf_table_var_modes_3d, but the number of modes varies across |
| // the context dimension. |
| static void optimize_cdf_table_var_modes_3d_inner( |
| aom_count_type *counts, FILE *const probsfile, int dim_of_cts, |
| int *cts_each_dim, int *modes_each_ctx, char *prefix) { |
| aom_count_type *ct_ptr = counts; |
| |
| assert(dim_of_cts == 3); |
| (void)dim_of_cts; |
| |
| fprintf(probsfile, "%s = {\n", prefix); |
| fprintf(logfile, "%s\n", prefix); |
| |
| for (int d0_idx = 0; d0_idx < cts_each_dim[0]; ++d0_idx) { |
| fprintf(probsfile, "%*c{\n", SPACES_PER_TAB, ' '); |
| for (int d1_idx = 0; d1_idx < cts_each_dim[1]; ++d1_idx) { |
| int num_of_modes = modes_each_ctx[d1_idx]; |
| |
| if (num_of_modes > 0) { |
| fprintf(probsfile, "%*c{ ", 2 * SPACES_PER_TAB, ' '); |
| parse_counts_for_cdf_opt(&ct_ptr, probsfile, 0, 1, &num_of_modes); |
| ct_ptr += cts_each_dim[2] - num_of_modes; |
| fprintf(probsfile, " },\n"); |
| } else { |
| fprintf(probsfile, "%*c{ 0 },\n", 2 * SPACES_PER_TAB, ' '); |
| fprintf(logfile, "dummy cdf, no need to optimize\n"); |
| ct_ptr += cts_each_dim[2]; |
| } |
| } |
| fprintf(probsfile, "%*c},\n", SPACES_PER_TAB, ' '); |
| } |
| fprintf(probsfile, "};\n\n"); |
| fprintf(logfile, "============================\n"); |
| } |
| |
| // Like optimize_cdf_table_var_modes_4d, but the number of modes varies across |
| // the last dimension. |
| static void optimize_cdf_table_var_modes_4d_inner( |
| aom_count_type *counts, FILE *const probsfile, int dim_of_cts, |
| int *cts_each_dim, int *modes_each_ctx, char *prefix) { |
| aom_count_type *ct_ptr = counts; |
| |
| assert(dim_of_cts == 4); |
| (void)dim_of_cts; |
| |
| fprintf(probsfile, "%s = {\n", prefix); |
| fprintf(logfile, "%s\n", prefix); |
| |
| for (int d0_idx = 0; d0_idx < cts_each_dim[0]; ++d0_idx) { |
| fprintf(probsfile, "%*c{\n", SPACES_PER_TAB, ' '); |
| for (int d1_idx = 0; d1_idx < cts_each_dim[1]; ++d1_idx) { |
| fprintf(probsfile, "%*c{\n", 2 * SPACES_PER_TAB, ' '); |
| for (int d2_idx = 0; d2_idx < cts_each_dim[2]; ++d2_idx) { |
| int num_of_modes = modes_each_ctx[d2_idx]; |
| |
| if (num_of_modes > 0) { |
| fprintf(probsfile, "%*c{ ", 3 * SPACES_PER_TAB, ' '); |
| parse_counts_for_cdf_opt(&ct_ptr, probsfile, 0, 1, &num_of_modes); |
| ct_ptr += cts_each_dim[3] - num_of_modes; |
| fprintf(probsfile, " },\n"); |
| } else { |
| fprintf(probsfile, "%*c{ 0 },\n", 3 * SPACES_PER_TAB, ' '); |
| fprintf(logfile, "dummy cdf, no need to optimize\n"); |
| ct_ptr += cts_each_dim[3]; |
| } |
| } |
| fprintf(probsfile, "%*c},\n", 2 * SPACES_PER_TAB, ' '); |
| } |
| fprintf(probsfile, "%*c},\n", SPACES_PER_TAB, ' '); |
| } |
| fprintf(probsfile, "};\n\n"); |
| fprintf(logfile, "============================\n"); |
| } |
| |
| int main(int argc, const char **argv) { |
| if (argc < 2) { |
| fprintf(stderr, "Please specify the input stats file!\n"); |
| exit(EXIT_FAILURE); |
| } |
| |
| FILE *const statsfile = fopen(argv[1], "rb"); |
| if (statsfile == NULL) { |
| fprintf(stderr, "Failed to open input file!\n"); |
| exit(EXIT_FAILURE); |
| } |
| |
| FRAME_COUNTS fc; |
| const size_t bytes = fread(&fc, sizeof(FRAME_COUNTS), 1, statsfile); |
| if (!bytes) { |
| fclose(statsfile); |
| return 1; |
| } |
| |
| FILE *const probsfile = fopen("optimized_probs.c", "w"); |
| if (probsfile == NULL) { |
| fprintf(stderr, |
| "Failed to create output file for optimized entropy tables!\n"); |
| exit(EXIT_FAILURE); |
| } |
| |
| logfile = fopen("aom_entropy_optimizer_parsed_counts.log", "w"); |
| if (logfile == NULL) { |
| fprintf(stderr, "Failed to create log file for parsed counts!\n"); |
| exit(EXIT_FAILURE); |
| } |
| |
| int cts_each_dim[10]; |
| #if CONFIG_AIMC |
| cts_each_dim[0] = INTRA_MODE_SETS; |
| optimize_cdf_table(&fc.y_mode_set_idx[0], probsfile, 1, cts_each_dim, |
| "const aom_cdf_prob\n" |
| "default_y_mode_set_cdf[CDF_SIZE(INTRA_MODE_SETS)]"); |
| cts_each_dim[0] = Y_MODE_CONTEXTS; |
| cts_each_dim[1] = FIRST_MODE_COUNT; |
| optimize_cdf_table( |
| &fc.y_mode_idx_0[0][0], probsfile, 2, cts_each_dim, |
| "const aom_cdf_prob\n" |
| "default_y_first_mode_cdf[Y_MODE_CONTEXTS][CDF_SIZE(FIRST_MODE_COUNT)]"); |
| cts_each_dim[0] = Y_MODE_CONTEXTS; |
| cts_each_dim[1] = SECOND_MODE_COUNT; |
| optimize_cdf_table(&fc.y_mode_idx_1[0][0], probsfile, 2, cts_each_dim, |
| "const aom_cdf_prob\n" |
| "default_y_second_mode_cdf[Y_MODE_CONTEXTS][CDF_SIZE(" |
| "SECOND_MODE_COUNT)]"); |
| #else |
| /* Intra mode (keyframe luma) */ |
| cts_each_dim[0] = KF_MODE_CONTEXTS; |
| cts_each_dim[1] = KF_MODE_CONTEXTS; |
| cts_each_dim[2] = INTRA_MODES; |
| optimize_cdf_table(&fc.kf_y_mode[0][0][0], probsfile, 3, cts_each_dim, |
| "const aom_cdf_prob\n" |
| "default_kf_y_mode_cdf[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS]" |
| "[CDF_SIZE(INTRA_MODES)]"); |
| |
| cts_each_dim[0] = DIRECTIONAL_MODES; |
| cts_each_dim[1] = 2 * MAX_ANGLE_DELTA + 1; |
| optimize_cdf_table(&fc.angle_delta[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob default_angle_delta_cdf" |
| "[DIRECTIONAL_MODES][CDF_SIZE(2 * MAX_ANGLE_DELTA + 1)]"); |
| |
| /* Intra mode (non-keyframe luma) */ |
| cts_each_dim[0] = BLOCK_SIZE_GROUPS; |
| cts_each_dim[1] = INTRA_MODES; |
| optimize_cdf_table( |
| &fc.y_mode[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_if_y_mode_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(INTRA_MODES)]"); |
| #endif |
| /* Intra mode (chroma) */ |
| cts_each_dim[0] = CFL_ALLOWED_TYPES; |
| #if CONFIG_AIMC |
| cts_each_dim[1] = UV_MODE_CONTEXTS; |
| #else |
| cts_each_dim[1] = INTRA_MODES; |
| #endif |
| cts_each_dim[2] = UV_INTRA_MODES; |
| optimize_uv_mode(&fc.uv_mode[0][0][0], probsfile, 3, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_uv_mode_cdf[CFL_ALLOWED_TYPES][INTRA_MODES]" |
| "[CDF_SIZE(UV_INTRA_MODES)]"); |
| |
| /* block partition */ |
| cts_each_dim[0] = PARTITION_STRUCTURE_NUM; |
| cts_each_dim[1] = PARTITION_CONTEXTS; |
| cts_each_dim[2] = EXT_PARTITION_TYPES; |
| #if CONFIG_EXT_RECUR_PARTITIONS |
| int part_types_each_ctx[PARTITION_CONTEXTS] = { |
| 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3 |
| }; |
| #else |
| int part_types_each_ctx[PARTITION_CONTEXTS] = { 4, 4, 4, 4, 10, 10, 10, |
| 10, 10, 10, 10, 10, 10, 10, |
| 10, 10, 8, 8, 8, 8 }; |
| #endif // CONFIG_EXT_RECUR_PARTITIONS |
| optimize_cdf_table_var_modes_3d_inner( |
| &fc.partition[0][0][0], probsfile, 3, cts_each_dim, part_types_each_ctx, |
| "static const aom_cdf_prob " |
| "default_partition_cdf[PARTITION_STRUCTURE_NUM][PARTITION_CONTEXTS]" |
| "[CDF_SIZE(EXT_PARTITION_TYPES)]"); |
| |
| #if CONFIG_CROSS_CHROMA_TX |
| /* cctx type */ |
| cts_each_dim[0] = EXT_TX_SIZES; |
| cts_each_dim[1] = CCTX_CONTEXTS; |
| cts_each_dim[2] = CCTX_TYPES; |
| optimize_cdf_table(&fc.cctx_type[0][0][0], probsfile, 3, cts_each_dim, |
| "static const aom_cdf_prob default_cctx_type[EXT_TX_SIZES]" |
| "[CCTX_CONTEXTS][CDF_SIZE(CCTX_TYPES)]"); |
| #endif // CONFIG_CROSS_CHROMA_TX |
| |
| #if CONFIG_EXT_RECUR_PARTITIONS |
| cts_each_dim[0] = PARTITION_STRUCTURE_NUM; |
| cts_each_dim[1] = NUM_LIMITED_PARTITION_PARENTS; |
| cts_each_dim[2] = PARTITION_CONTEXTS; |
| cts_each_dim[3] = LIMITED_EXT_PARTITION_TYPES; |
| int part_types_each_ctx_limited_part[PARTITION_CONTEXTS] = { |
| 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2 |
| }; |
| optimize_cdf_table_var_modes_4d_inner( |
| &fc.limited_partition[0][0][0][0], probsfile, 4, cts_each_dim, |
| part_types_each_ctx_limited_part, |
| "static const aom_cdf_prob default_limited_partition_cdf " |
| "[PARTITION_STRUCTURE_NUM][NUM_LIMITED_PARTITION_PARENTS]" |
| "[PARTITION_CONTEXTS][CDF_SIZE(LIMITED_EXT_PARTITION_TYPES)]"); |
| |
| cts_each_dim[0] = PARTITION_CONTEXTS_REC; |
| cts_each_dim[1] = PARTITION_TYPES_REC; |
| int part_types_each_ctx_rec[PARTITION_CONTEXTS_REC] = { 2, 2, 2, 2, 4, 4, 4, |
| 4, 4, 4, 4, 4, 4, 4, |
| 4, 4, 2, 2, 2, 2 }; |
| optimize_cdf_table_var_modes_2d( |
| &fc.partition_rec[0][0], probsfile, 2, cts_each_dim, |
| part_types_each_ctx_rec, |
| "static const aom_cdf_prob " |
| "default_partition_rec_cdf[PARTITION_CONTEXTS_REC]" |
| "[CDF_SIZE(PARTITION_TYPES_REC)]"); |
| |
| cts_each_dim[0] = PARTITION_CONTEXTS_REC; |
| cts_each_dim[1] = PARTITION_TYPES_MIDDLE_REC; |
| int part_types_each_ctx_middle_rec[PARTITION_CONTEXTS_REC] = { |
| 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 |
| }; |
| optimize_cdf_table_var_modes_2d( |
| &fc.partition_middle_rec[0][0], probsfile, 2, cts_each_dim, |
| part_types_each_ctx_middle_rec, |
| "static const aom_cdf_prob " |
| "default_partition_middle_rec_cdf[PARTITION_CONTEXTS_REC]" |
| "[CDF_SIZE(PARTITION_TYPES_MIDDLE_REC)]"); |
| #endif // CONFIG_EXT_RECUR_PARTITIONS |
| |
| /* tx type */ |
| cts_each_dim[0] = EXT_TX_SETS_INTRA; |
| cts_each_dim[1] = EXT_TX_SIZES; |
| cts_each_dim[2] = INTRA_MODES; |
| cts_each_dim[3] = TX_TYPES; |
| #if CONFIG_ATC_NEWTXSETS |
| int intra_ext_tx_types_each_ctx[EXT_TX_SETS_INTRA] = { 0, INTRA_TX_SET1 }; |
| optimize_cdf_table_var_modes_4d( |
| &fc.intra_ext_tx[0][0][0][0], probsfile, 4, cts_each_dim, |
| intra_ext_tx_types_each_ctx, |
| "static const aom_cdf_prob default_intra_ext_tx_cdf[EXT_TX_SETS_INTRA]" |
| "[EXT_TX_SIZES][INTRA_MODES][CDF_SIZE(TX_TYPES)]"); |
| #else |
| int intra_ext_tx_types_each_ctx[EXT_TX_SETS_INTRA] = { 0, INTRA_TX_SET1, |
| INTRA_TX_SET2 }; |
| optimize_cdf_table_var_modes_4d( |
| &fc.intra_ext_tx[0][0][0][0], probsfile, 4, cts_each_dim, |
| intra_ext_tx_types_each_ctx, |
| "static const aom_cdf_prob default_intra_ext_tx_cdf[EXT_TX_SETS_INTRA]" |
| "[EXT_TX_SIZES][INTRA_MODES][CDF_SIZE(TX_TYPES)]"); |
| #endif |
| |
| cts_each_dim[0] = EXT_TX_SETS_INTER; |
| cts_each_dim[1] = EXT_TX_SIZES; |
| cts_each_dim[2] = TX_TYPES; |
| int inter_ext_tx_types_each_ctx[EXT_TX_SETS_INTER] = { 0, 16, 12, 2 }; |
| optimize_cdf_table_var_modes_3d( |
| &fc.inter_ext_tx[0][0][0], probsfile, 3, cts_each_dim, |
| inter_ext_tx_types_each_ctx, |
| "static const aom_cdf_prob default_inter_ext_tx_cdf[EXT_TX_SETS_INTER]" |
| "[EXT_TX_SIZES][CDF_SIZE(TX_TYPES)]"); |
| |
| /* Chroma from Luma */ |
| #if CONFIG_IMPROVED_CFL |
| cts_each_dim[0] = CFL_TYPE_COUNT; |
| optimize_cdf_table(&fc.cfl_index[0], probsfile, 1, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_cfl_index_cdf[CDF_SIZE(CFL_TYPE_COUNT)]"); |
| #endif |
| cts_each_dim[0] = CFL_JOINT_SIGNS; |
| optimize_cdf_table(&fc.cfl_sign[0], probsfile, 1, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_cfl_sign_cdf[CDF_SIZE(CFL_JOINT_SIGNS)]"); |
| cts_each_dim[0] = CFL_ALPHA_CONTEXTS; |
| cts_each_dim[1] = CFL_ALPHABET_SIZE; |
| optimize_cdf_table(&fc.cfl_alpha[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_cfl_alpha_cdf[CFL_ALPHA_CONTEXTS]" |
| "[CDF_SIZE(CFL_ALPHABET_SIZE)]"); |
| |
| /* Interpolation filter */ |
| cts_each_dim[0] = SWITCHABLE_FILTER_CONTEXTS; |
| cts_each_dim[1] = SWITCHABLE_FILTERS; |
| optimize_cdf_table(&fc.switchable_interp[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_switchable_interp_cdf[SWITCHABLE_FILTER_CONTEXTS]" |
| "[CDF_SIZE(SWITCHABLE_FILTERS)]"); |
| |
| /* Motion vector referencing */ |
| cts_each_dim[0] = INTER_SINGLE_MODE_CONTEXTS; |
| cts_each_dim[1] = INTER_SINGLE_MODES; |
| optimize_cdf_table(&fc.inter_single_mode[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_inter_single_mode_cdf" |
| "[INTER_SINGLE_MODE_CONTEXTS][CDF_SIZE(" |
| "INTER_SINGLE_MODES)]"); |
| |
| cts_each_dim[0] = DRL_MODE_CONTEXTS; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.drl_mode[0][0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_drl0_cdf[DRL_MODE_CONTEXTS][CDF_SIZE(2)]"); |
| optimize_cdf_table(&fc.drl_mode[1][0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_drl1_cdf[DRL_MODE_CONTEXTS][CDF_SIZE(2)]"); |
| optimize_cdf_table(&fc.drl_mode[2][0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_drl2_cdf[DRL_MODE_CONTEXTS][CDF_SIZE(2)]"); |
| |
| #if CONFIG_OPTFLOW_REFINEMENT |
| /* Optical flow MV refinement */ |
| cts_each_dim[0] = INTER_COMPOUND_MODE_CONTEXTS; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.use_optflow[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\ndefault_use_optflow_cdf" |
| "[INTER_COMPOUND_MODE_CONTEXTS][CDF_SIZE(2)]"); |
| #endif // CONFIG_OPTFLOW_REFINEMENT |
| |
| /* ext_inter experiment */ |
| /* New compound mode */ |
| cts_each_dim[0] = INTER_COMPOUND_MODE_CONTEXTS; |
| #if CONFIG_OPTFLOW_REFINEMENT |
| cts_each_dim[1] = INTER_COMPOUND_REF_TYPES; |
| optimize_cdf_table(&fc.inter_compound_mode[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_inter_compound_mode_cdf" |
| "[INTER_COMPOUND_MODE_CONTEXTS][CDF_SIZE(" |
| "INTER_COMPOUND_REF_TYPES)]"); |
| #else |
| cts_each_dim[1] = INTER_COMPOUND_MODES; |
| optimize_cdf_table(&fc.inter_compound_mode[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_inter_compound_mode_cdf" |
| "[INTER_COMPOUND_MODE_CONTEXTS][CDF_SIZE(" |
| "INTER_COMPOUND_MODES)]"); |
| #endif // CONFIG_OPTFLOW_REFINEMENT |
| |
| /* Interintra */ |
| cts_each_dim[0] = BLOCK_SIZE_GROUPS; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.interintra[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_interintra_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(2)]"); |
| |
| cts_each_dim[0] = BLOCK_SIZE_GROUPS; |
| cts_each_dim[1] = INTERINTRA_MODES; |
| optimize_cdf_table(&fc.interintra_mode[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_interintra_mode_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(" |
| "INTERINTRA_MODES)]"); |
| |
| cts_each_dim[0] = BLOCK_SIZES_ALL; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table( |
| &fc.wedge_interintra[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_wedge_interintra_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)]"); |
| |
| /* Compound type */ |
| cts_each_dim[0] = BLOCK_SIZES_ALL; |
| cts_each_dim[1] = COMPOUND_TYPES - 1; |
| optimize_cdf_table(&fc.compound_type[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob default_compound_type_cdf" |
| "[BLOCK_SIZES_ALL][CDF_SIZE(COMPOUND_TYPES - 1)]"); |
| |
| #if CONFIG_WEDGE_MOD_EXT |
| cts_each_dim[0] = BLOCK_SIZES_ALL; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table( |
| &fc.wedge_angle_dir_cnt[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_wedge_angle_dir_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)]"); |
| |
| cts_each_dim[0] = BLOCK_SIZES_ALL; |
| cts_each_dim[1] = H_WEDGE_ANGLES; |
| optimize_cdf_table( |
| &fc.wedge_angle_0_cnt[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_wedge_angle_0_cdf[BLOCK_SIZES_ALL][CDF_SIZE(H_WEDGE_ANGLES)]"); |
| |
| cts_each_dim[0] = BLOCK_SIZES_ALL; |
| cts_each_dim[1] = H_WEDGE_ANGLES; |
| optimize_cdf_table( |
| &fc.wedge_angle_1_cnt[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_wedge_angle_1_cdf[BLOCK_SIZES_ALL][CDF_SIZE(H_WEDGE_ANGLES)]"); |
| |
| cts_each_dim[0] = BLOCK_SIZES_ALL; |
| cts_each_dim[1] = NUM_WEDGE_DIST; |
| optimize_cdf_table( |
| &fc.wedge_dist_cnt[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_wedge_dist_cdf[BLOCK_SIZES_ALL][CDF_SIZE(NUM_WEDGE_DIST)]"); |
| |
| #else |
| cts_each_dim[0] = BLOCK_SIZES_ALL; |
| cts_each_dim[1] = 16; |
| optimize_cdf_table(&fc.wedge_idx[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_wedge_idx_cdf[BLOCK_SIZES_ALL][CDF_SIZE(16)]"); |
| #endif // CONFIG_WEDGE_MOD_EXT |
| |
| /* motion_var and warped_motion experiments */ |
| #if CONFIG_EXTENDED_WARP_PREDICTION |
| cts_each_dim[0] = BLOCK_SIZES_ALL; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.obmc[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_obmc_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)]"); |
| cts_each_dim[0] = BLOCK_SIZES_ALL; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.warped_causal[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_warped_causal_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)]"); |
| cts_each_dim[0] = BLOCK_SIZES_ALL; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.warp_delta[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_warp_delta_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)]"); |
| cts_each_dim[0] = 2; |
| cts_each_dim[1] = WARP_DELTA_NUM_SYMBOLS; |
| optimize_cdf_table(&fc.warp_delta_param[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob default_warp_delta_param_cdf" |
| "[2][CDF_SIZE(WARP_DELTA_NUM_SYMBOLS)]"); |
| cts_each_dim[0] = WARP_EXTEND_CTXS1; |
| cts_each_dim[1] = WARP_EXTEND_CTXS2; |
| cts_each_dim[2] = 2; |
| optimize_cdf_table( |
| &fc.warp_extend[0][0][0], probsfile, 3, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_warp_extend_cdf[WARP_EXTEND_CTXS1][WARP_EXTEND_CTXS2]" |
| "[CDF_SIZE(2)]"); |
| #else |
| cts_each_dim[0] = BLOCK_SIZES_ALL; |
| cts_each_dim[1] = MOTION_MODES; |
| optimize_cdf_table( |
| &fc.motion_mode[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_motion_mode_cdf[BLOCK_SIZES_ALL][CDF_SIZE(MOTION_MODES)]"); |
| cts_each_dim[0] = BLOCK_SIZES_ALL; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.obmc[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_obmc_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)]"); |
| #endif // CONFIG_EXTENDED_WARP_PREDICTION |
| /* Bawp flag */ |
| #if CONFIG_BAWP |
| cts_each_dim[0] = 2; |
| optimize_cdf_table(&fc.bawp[0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_bawp_cdf[CDF_SIZE(2)]"); |
| #endif |
| /* Intra/inter flag */ |
| #if CONFIG_CONTEXT_DERIVATION |
| cts_each_dim[0] = INTRA_INTER_SKIP_TXFM_CONTEXTS; |
| cts_each_dim[1] = INTRA_INTER_CONTEXTS; |
| cts_each_dim[2] = 2; |
| optimize_cdf_table(&fc.intra_inter[0][0][0], probsfile, 3, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_intra_inter_cdf[INTRA_INTER_SKIP_TXFM_CONTEXTS][" |
| "INTRA_INTER_CONTEXTS][CDF_SIZE(2)]"); |
| #else |
| cts_each_dim[0] = INTRA_INTER_CONTEXTS; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table( |
| &fc.intra_inter[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_intra_inter_cdf[INTRA_INTER_CONTEXTS][CDF_SIZE(2)]"); |
| #endif // CONFIG_CONTEXT_DERIVATION |
| /* Single/comp ref flag */ |
| cts_each_dim[0] = COMP_INTER_CONTEXTS; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table( |
| &fc.comp_inter[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_comp_inter_cdf[COMP_INTER_CONTEXTS][CDF_SIZE(2)]"); |
| |
| /* Reference frame (single ref) */ |
| cts_each_dim[0] = REF_CONTEXTS; |
| cts_each_dim[1] = INTER_REFS_PER_FRAME - 1; |
| cts_each_dim[2] = 2; |
| optimize_cdf_table(&fc.single_ref[0][0][0], probsfile, 3, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_single_ref_cdf[REF_CONTEXTS][INTER_REFS_PER_" |
| "FRAME - 1][CDF_SIZE(2)]"); |
| |
| /* ext_refs experiment */ |
| cts_each_dim[0] = REF_CONTEXTS; |
| cts_each_dim[1] = INTER_REFS_PER_FRAME - 2; |
| cts_each_dim[2] = 2; |
| optimize_cdf_table(&fc.comp_ref0[0][0][0], probsfile, 3, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_comp_ref0_cdf[REF_CONTEXTS]" |
| "[INTER_REFS_PER_FRAME - 2][CDF_SIZE(2)]"); |
| cts_each_dim[0] = REF_CONTEXTS; |
| cts_each_dim[1] = COMPREF_BIT_TYPES; |
| cts_each_dim[2] = INTER_REFS_PER_FRAME - 2; |
| cts_each_dim[3] = 2; |
| optimize_cdf_table(&fc.comp_ref1[0][0][0][0], probsfile, 4, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_comp_ref1_cdf[REF_CONTEXTS][COMPREF_BIT_TYPES]" |
| "[INTER_REFS_PER_FRAME - 2][CDF_SIZE(2)]"); |
| |
| /* palette */ |
| cts_each_dim[0] = PALATTE_BSIZE_CTXS; |
| cts_each_dim[1] = PALETTE_SIZES; |
| optimize_cdf_table(&fc.palette_y_size[0][0], probsfile, 2, cts_each_dim, |
| "const aom_cdf_prob default_palette_y_size_cdf" |
| "[PALATTE_BSIZE_CTXS][CDF_SIZE(PALETTE_SIZES)]"); |
| |
| cts_each_dim[0] = PALATTE_BSIZE_CTXS; |
| cts_each_dim[1] = PALETTE_SIZES; |
| optimize_cdf_table(&fc.palette_uv_size[0][0], probsfile, 2, cts_each_dim, |
| "const aom_cdf_prob default_palette_uv_size_cdf" |
| "[PALATTE_BSIZE_CTXS][CDF_SIZE(PALETTE_SIZES)]"); |
| |
| cts_each_dim[0] = PALATTE_BSIZE_CTXS; |
| cts_each_dim[1] = PALETTE_Y_MODE_CONTEXTS; |
| cts_each_dim[2] = 2; |
| optimize_cdf_table(&fc.palette_y_mode[0][0][0], probsfile, 3, cts_each_dim, |
| "const aom_cdf_prob default_palette_y_mode_cdf" |
| "[PALATTE_BSIZE_CTXS][PALETTE_Y_MODE_CONTEXTS]" |
| "[CDF_SIZE(2)]"); |
| |
| cts_each_dim[0] = PALETTE_UV_MODE_CONTEXTS; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.palette_uv_mode[0][0], probsfile, 2, cts_each_dim, |
| "const aom_cdf_prob default_palette_uv_mode_cdf" |
| "[PALETTE_UV_MODE_CONTEXTS][CDF_SIZE(2)]"); |
| |
| cts_each_dim[0] = PALETTE_SIZES; |
| cts_each_dim[1] = PALETTE_COLOR_INDEX_CONTEXTS; |
| cts_each_dim[2] = PALETTE_COLORS; |
| int palette_color_indexes_each_ctx[PALETTE_SIZES] = { 2, 3, 4, 5, 6, 7, 8 }; |
| optimize_cdf_table_var_modes_3d( |
| &fc.palette_y_color_index[0][0][0], probsfile, 3, cts_each_dim, |
| palette_color_indexes_each_ctx, |
| "const aom_cdf_prob default_palette_y_color_index_cdf[PALETTE_SIZES]" |
| "[PALETTE_COLOR_INDEX_CONTEXTS][CDF_SIZE(PALETTE_COLORS)]"); |
| |
| cts_each_dim[0] = PALETTE_SIZES; |
| cts_each_dim[1] = PALETTE_COLOR_INDEX_CONTEXTS; |
| cts_each_dim[2] = PALETTE_COLORS; |
| optimize_cdf_table_var_modes_3d( |
| &fc.palette_uv_color_index[0][0][0], probsfile, 3, cts_each_dim, |
| palette_color_indexes_each_ctx, |
| "const aom_cdf_prob default_palette_uv_color_index_cdf[PALETTE_SIZES]" |
| "[PALETTE_COLOR_INDEX_CONTEXTS][CDF_SIZE(PALETTE_COLORS)]"); |
| |
| /* Transform size */ |
| #if CONFIG_NEW_TX_PARTITION |
| cts_each_dim[0] = 2; |
| cts_each_dim[1] = TXFM_PARTITION_INTER_CONTEXTS; |
| cts_each_dim[2] = 4; |
| optimize_cdf_table( |
| &fc.inter_4way_txfm_partition[0][0][0], probsfile, 3, cts_each_dim, |
| "static const aom_cdf_prob default_inter_4way_txfm_partition_cdf\n" |
| "[2][TXFM_PARTITION_INTER_CONTEXTS][CDF_SIZE(4)]"); |
| |
| cts_each_dim[0] = 2; |
| optimize_cdf_table( |
| &fc.inter_2way_txfm_partition[0], probsfile, 1, cts_each_dim, |
| "static const aom_cdf_prob default_inter_2way_txfm_partition_cdf\n" |
| "[CDF_SIZE(2)]"); |
| |
| cts_each_dim[0] = 2; |
| cts_each_dim[1] = TX_SIZE_CONTEXTS; |
| cts_each_dim[2] = 4; |
| optimize_cdf_table( |
| &fc.intra_4way_txfm_partition[0][0][0], probsfile, 3, cts_each_dim, |
| "static const aom_cdf_prob default_intra_4way_txfm_partition_cdf\n" |
| "[2][TX_SIZE_CONTEXTS][CDF_SIZE(4)]"); |
| |
| cts_each_dim[0] = 2; |
| optimize_cdf_table( |
| &fc.intra_2way_txfm_partition[0], probsfile, 1, cts_each_dim, |
| "static const aom_cdf_prob default_intra_2way_txfm_partition_cdf\n" |
| "[CDF_SIZE(2)]"); |
| #else // CONFIG_NEW_TX_PARTITION |
| cts_each_dim[0] = TXFM_PARTITION_CONTEXTS; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table( |
| &fc.txfm_partition[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_txfm_partition_cdf[TXFM_PARTITION_CONTEXTS][CDF_SIZE(2)]"); |
| #endif // CONFIG_NEW_TX_PARTITION |
| |
| /* Skip flag */ |
| cts_each_dim[0] = SKIP_CONTEXTS; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.skip_txfm[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_skip_txfm_cdfs[SKIP_CONTEXTS][CDF_SIZE(2)]"); |
| |
| /* Skip mode flag */ |
| cts_each_dim[0] = SKIP_MODE_CONTEXTS; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.skip_mode[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_skip_mode_cdfs[SKIP_MODE_CONTEXTS][CDF_SIZE(2)]"); |
| |
| #if CONFIG_TIP |
| /* TIP ref flag */ |
| cts_each_dim[0] = TIP_CONTEXTS; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.tip_ref[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_tip_cdf[TIP_CONTEXTS][CDF_SIZE(2)]"); |
| #endif // CONFIG_TIP |
| |
| /* joint compound group index */ |
| cts_each_dim[0] = COMP_GROUP_IDX_CONTEXTS; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.comp_group_idx[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob default_comp_group_idx_cdfs" |
| "[COMP_GROUP_IDX_CONTEXTS][CDF_SIZE(2)]"); |
| |
| /* intrabc */ |
| #if CONFIG_NEW_CONTEXT_MODELING |
| cts_each_dim[0] = INTRABC_CONTEXTS; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.intrabc[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob\n" |
| "default_intrabc_cdf[INTRABC_CONTEXTS][CDF_SIZE(2)]"); |
| #else |
| cts_each_dim[0] = 2; |
| optimize_cdf_table( |
| &fc.intrabc[0], probsfile, 1, cts_each_dim, |
| "static const aom_cdf_prob default_intrabc_cdf[CDF_SIZE(2)]"); |
| #endif // CONFIG_NEW_CONTEXT_MODELING |
| |
| #if CONFIG_BVP_IMPROVEMENT |
| /* intrabc mode flag*/ |
| cts_each_dim[0] = 2; |
| optimize_cdf_table(&fc.intrabc_mode[0], probsfile, 1, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_intrabc_mode_cdf[CDF_SIZE(2)]"); |
| |
| /* intrabc drl index*/ |
| cts_each_dim[0] = MAX_REF_BV_STACK_SIZE - 1; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.intrabc_drl_idx[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob default_intrabc_drl_idx_cdf" |
| "[MAX_REF_BV_STACK_SIZE - 1][CDF_SIZE(2)]"); |
| #endif |
| |
| /* filter_intra experiment */ |
| cts_each_dim[0] = FILTER_INTRA_MODES; |
| optimize_cdf_table( |
| &fc.filter_intra_mode[0], probsfile, 1, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_filter_intra_mode_cdf[CDF_SIZE(FILTER_INTRA_MODES)]"); |
| |
| cts_each_dim[0] = BLOCK_SIZES_ALL; |
| cts_each_dim[1] = 2; |
| optimize_cdf_table(&fc.filter_intra[0][0], probsfile, 2, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_filter_intra_cdfs[BLOCK_SIZES_ALL][CDF_SIZE(2)]"); |
| |
| /* forward skip coding flag */ |
| cts_each_dim[0] = FSC_MODE_CONTEXTS; |
| cts_each_dim[1] = FSC_BSIZE_CONTEXTS; |
| cts_each_dim[2] = FSC_MODES; |
| optimize_cdf_table(&fc.fsc_mode[0][0][0], probsfile, 3, cts_each_dim, |
| "static const aom_cdf_prob " |
| "default_fsc_mode_cdf[FSC_MODE_CONTEXTS]" |
| "[FSC_BSIZE_CONTEXTS][CDF_SIZE(FSC_MODES)]"); |
| |
| /* restoration type */ |
| cts_each_dim[0] = RESTORE_SWITCHABLE_TYPES; |
| optimize_cdf_table(&fc.switchable_restore[0], probsfile, 1, cts_each_dim, |
| "static const aom_cdf_prob default_switchable_restore_cdf" |
| "[CDF_SIZE(RESTORE_SWITCHABLE_TYPES)]"); |
| |
| cts_each_dim[0] = 2; |
| optimize_cdf_table(&fc.wiener_restore[0], probsfile, 1, cts_each_dim, |
| "static const aom_cdf_prob default_wiener_restore_cdf" |
| "[CDF_SIZE(2)]"); |
| |
| cts_each_dim[0] = 2; |
| optimize_cdf_table(&fc.sgrproj_restore[0], probsfile, 1, cts_each_dim, |
| "static const aom_cdf_prob default_sgrproj_restore_cdf" |
| "[CDF_SIZE(2)]"); |
| |
| /* intra tx size */ |
| #if !CONFIG_NEW_TX_PARTITION |
| cts_each_dim[0] = MAX_TX_CATS; |
| cts_each_dim[1] = TX_SIZE_CONTEXTS; |
| cts_each_dim[2] = MAX_TX_DEPTH + 1; |
| int intra_tx_sizes_each_ctx[MAX_TX_CATS] = { 2, 3, 3, 3 }; |
| optimize_cdf_table_var_modes_3d( |
| &fc.intra_tx_size[0][0][0], probsfile, 3, cts_each_dim, |
| intra_tx_sizes_each_ctx, |
| "static const aom_cdf_prob default_tx_size_cdf" |
| "[MAX_TX_CATS][TX_SIZE_CONTEXTS][CDF_SIZE(MAX_TX_DEPTH + 1)]"); |
| #endif // !CONFIG_NEW_TX_PARTITION |
| |
| /* transform coding */ |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = TX_SIZES; |
| cts_each_dim[2] = TXB_SKIP_CONTEXTS; |
| cts_each_dim[3] = 2; |
| optimize_cdf_table(&fc.txb_skip[0][0][0][0], probsfile, 4, cts_each_dim, |
| "static const aom_cdf_prob " |
| "av1_default_txb_skip_cdfs[TOKEN_CDF_Q_CTXS][TX_SIZES]" |
| "[TXB_SKIP_CONTEXTS][CDF_SIZE(2)]"); |
| |
| /* forward skip sign bit */ |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = IDTX_SIGN_CONTEXTS; |
| cts_each_dim[2] = 2; |
| optimize_cdf_table(&fc.idtx_sign[0][0][0], probsfile, 3, cts_each_dim, |
| "static const aom_cdf_prob " |
| "av1_default_idtx_sign_cdfs[TOKEN_CDF_Q_CTXS]" |
| "[IDTX_SIGN_CONTEXTS][CDF_SIZE(2)]"); |
| |
| #if CONFIG_CONTEXT_DERIVATION |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = V_TXB_SKIP_CONTEXTS; |
| cts_each_dim[2] = 2; |
| optimize_cdf_table(&fc.v_txb_skip[0][0][0], probsfile, 3, cts_each_dim, |
| "static const aom_cdf_prob " |
| "av1_default_v_txb_skip_cdfs[TOKEN_CDF_Q_CTXS]" |
| "[V_TXB_SKIP_CONTEXTS][CDF_SIZE(2)]"); |
| #endif // CONFIG_CONTEXT_DERIVATION |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = TX_SIZES; |
| cts_each_dim[2] = PLANE_TYPES; |
| cts_each_dim[3] = EOB_COEF_CONTEXTS; |
| cts_each_dim[4] = 2; |
| optimize_cdf_table( |
| &fc.eob_extra[0][0][0][0][0], probsfile, 5, cts_each_dim, |
| "static const aom_cdf_prob av1_default_eob_extra_cdfs " |
| "[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS]" |
| "[CDF_SIZE(2)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = PLANE_TYPES; |
| cts_each_dim[2] = 2; |
| cts_each_dim[3] = 5; |
| optimize_cdf_table(&fc.eob_multi16[0][0][0][0], probsfile, 4, cts_each_dim, |
| "static const aom_cdf_prob av1_default_eob_multi16_cdfs" |
| "[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][CDF_SIZE(5)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = PLANE_TYPES; |
| cts_each_dim[2] = 2; |
| cts_each_dim[3] = 6; |
| optimize_cdf_table(&fc.eob_multi32[0][0][0][0], probsfile, 4, cts_each_dim, |
| "static const aom_cdf_prob av1_default_eob_multi32_cdfs" |
| "[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][CDF_SIZE(6)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = PLANE_TYPES; |
| cts_each_dim[2] = 2; |
| cts_each_dim[3] = 7; |
| optimize_cdf_table(&fc.eob_multi64[0][0][0][0], probsfile, 4, cts_each_dim, |
| "static const aom_cdf_prob av1_default_eob_multi64_cdfs" |
| "[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][CDF_SIZE(7)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = PLANE_TYPES; |
| cts_each_dim[2] = 2; |
| cts_each_dim[3] = 8; |
| optimize_cdf_table(&fc.eob_multi128[0][0][0][0], probsfile, 4, cts_each_dim, |
| "static const aom_cdf_prob av1_default_eob_multi128_cdfs" |
| "[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][CDF_SIZE(8)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = PLANE_TYPES; |
| cts_each_dim[2] = 2; |
| cts_each_dim[3] = 9; |
| optimize_cdf_table(&fc.eob_multi256[0][0][0][0], probsfile, 4, cts_each_dim, |
| "static const aom_cdf_prob av1_default_eob_multi256_cdfs" |
| "[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][CDF_SIZE(9)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = PLANE_TYPES; |
| cts_each_dim[2] = 2; |
| cts_each_dim[3] = 10; |
| optimize_cdf_table(&fc.eob_multi512[0][0][0][0], probsfile, 4, cts_each_dim, |
| "static const aom_cdf_prob av1_default_eob_multi512_cdfs" |
| "[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][CDF_SIZE(10)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = PLANE_TYPES; |
| cts_each_dim[2] = 2; |
| cts_each_dim[3] = 11; |
| optimize_cdf_table(&fc.eob_multi1024[0][0][0][0], probsfile, 4, cts_each_dim, |
| "static const aom_cdf_prob av1_default_eob_multi1024_cdfs" |
| "[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][CDF_SIZE(11)]"); |
| |
| #if CONFIG_ATC_COEFCODING |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = TX_SIZES; |
| cts_each_dim[2] = PLANE_TYPES; |
| cts_each_dim[3] = LF_SIG_COEF_CONTEXTS; |
| cts_each_dim[4] = LF_BASE_SYMBOLS; |
| optimize_cdf_table( |
| &fc.coeff_base_lf_multi[0][0][0][0][0], probsfile, 5, cts_each_dim, |
| "static const aom_cdf_prob av1_default_coeff_base_lf_multi_cdfs" |
| "[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES][LF_SIG_COEF_CONTEXTS]" |
| "[CDF_SIZE(LF_BASE_SYMBOLS)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = TX_SIZES; |
| cts_each_dim[2] = PLANE_TYPES; |
| cts_each_dim[3] = SIG_COEF_CONTEXTS_EOB; |
| cts_each_dim[4] = LF_BASE_SYMBOLS - 1; |
| optimize_cdf_table( |
| &fc.coeff_base_lf_eob_multi[0][0][0][0][0], probsfile, 5, cts_each_dim, |
| "static const aom_cdf_prob av1_default_coeff_base_lf_eob_multi_cdfs" |
| "[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS_EOB]" |
| "[CDF_SIZE(LF_BASE_SYMBOLS - 1)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = PLANE_TYPES; |
| cts_each_dim[2] = LF_LEVEL_CONTEXTS; |
| cts_each_dim[3] = BR_CDF_SIZE; |
| optimize_cdf_table(&fc.coeff_lps_lf_multi[0][0][0][0], probsfile, 4, |
| cts_each_dim, |
| "static const aom_cdf_prob " |
| "av1_default_coeff_lps_lf_multi_cdfs[TOKEN_CDF_Q_CTXS]" |
| "[PLANE_TYPES][LF_LEVEL_CONTEXTS]" |
| "[CDF_SIZE(BR_CDF_SIZE)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = PLANE_TYPES; |
| cts_each_dim[2] = LEVEL_CONTEXTS; |
| cts_each_dim[3] = BR_CDF_SIZE; |
| optimize_cdf_table(&fc.coeff_lps_multi[0][0][0][0], probsfile, 4, |
| cts_each_dim, |
| "static const aom_cdf_prob " |
| "av1_default_coeff_lps_multi_cdfs[TOKEN_CDF_Q_CTXS]" |
| "[PLANE_TYPES][LEVEL_CONTEXTS]" |
| "[CDF_SIZE(BR_CDF_SIZE)]"); |
| #else |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = TX_SIZES; |
| cts_each_dim[2] = PLANE_TYPES; |
| cts_each_dim[3] = LEVEL_CONTEXTS; |
| cts_each_dim[4] = BR_CDF_SIZE; |
| optimize_cdf_table(&fc.coeff_lps_multi[0][0][0][0][0], probsfile, 5, |
| cts_each_dim, |
| "static const aom_cdf_prob " |
| "av1_default_coeff_lps_multi_cdfs[TOKEN_CDF_Q_CTXS]" |
| "[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS]" |
| "[CDF_SIZE(BR_CDF_SIZE)]"); |
| #endif |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = TX_SIZES; |
| cts_each_dim[2] = PLANE_TYPES; |
| cts_each_dim[3] = SIG_COEF_CONTEXTS; |
| cts_each_dim[4] = NUM_BASE_LEVELS + 2; |
| optimize_cdf_table( |
| &fc.coeff_base_multi[0][0][0][0][0], probsfile, 5, cts_each_dim, |
| "static const aom_cdf_prob av1_default_coeff_base_multi_cdfs" |
| "[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS]" |
| "[CDF_SIZE(NUM_BASE_LEVELS + 2)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = IDTX_LEVEL_CONTEXTS; |
| cts_each_dim[2] = BR_CDF_SIZE; |
| optimize_cdf_table(&fc.coeff_lps_multi_skip[0][0][0], probsfile, 3, |
| cts_each_dim, |
| "static const aom_cdf_prob " |
| "av1_default_coeff_lps_multi_cdfs_idtx" |
| "[TOKEN_CDF_Q_CTXS][IDTX_LEVEL_CONTEXTS]" |
| "[CDF_SIZE(BR_CDF_SIZE)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = IDTX_SIG_COEF_CONTEXTS; |
| cts_each_dim[2] = NUM_BASE_LEVELS + 2; |
| optimize_cdf_table( |
| &fc.coeff_base_multi_skip[0][0][0], probsfile, 3, cts_each_dim, |
| "static const aom_cdf_prob av1_default_coeff_base_multi_cdfs_idtx" |
| "[TOKEN_CDF_Q_CTXS][IDTX_SIG_COEF_CONTEXTS]" |
| "[CDF_SIZE(NUM_BASE_LEVELS + 2)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = TX_SIZES; |
| cts_each_dim[2] = PLANE_TYPES; |
| cts_each_dim[3] = SIG_COEF_CONTEXTS_EOB; |
| cts_each_dim[4] = NUM_BASE_LEVELS + 1; |
| optimize_cdf_table( |
| &fc.coeff_base_eob_multi[0][0][0][0][0], probsfile, 5, cts_each_dim, |
| "static const aom_cdf_prob av1_default_coeff_base_eob_multi_cdfs" |
| "[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS_EOB]" |
| "[CDF_SIZE(NUM_BASE_LEVELS + 1)]"); |
| #if CONFIG_CONTEXT_DERIVATION |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = PLANE_TYPES; |
| cts_each_dim[2] = DC_SIGN_CONTEXTS; |
| cts_each_dim[3] = 2; |
| optimize_cdf_table(&fc.dc_sign[0][0][0][0], probsfile, 4, cts_each_dim, |
| "static const aom_cdf_prob av1_default_dc_sign_cdfs" |
| "[TOKEN_CDF_Q_CTXS][PLANE_TYPES][DC_SIGN_CONTEXTS]" |
| "[CDF_SIZE(2)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = CROSS_COMPONENT_CONTEXTS; |
| cts_each_dim[2] = DC_SIGN_CONTEXTS; |
| cts_each_dim[3] = 2; |
| optimize_cdf_table( |
| &fc.v_dc_sign[0][0][0][0], probsfile, 4, cts_each_dim, |
| "static const aom_cdf_prob av1_default_v_dc_sign_cdfs" |
| "[TOKEN_CDF_Q_CTXS][CROSS_COMPONENT_CONTEXTS][DC_SIGN_CONTEXTS]" |
| "[CDF_SIZE(2)]"); |
| |
| cts_each_dim[0] = TOKEN_CDF_Q_CTXS; |
| cts_each_dim[1] = CROSS_COMPONENT_CONTEXTS; |
| cts_each_dim[2] = 2; |
| optimize_cdf_table(&fc.v_ac_sign[0][0][0], probsfile, 3, cts_each_dim, |
| "static const aom_cdf_prob av1_default_v_ac_sign_cdfs" |
| "[TOKEN_CDF_Q_CTXS][CROSS_COMPONENT_CONTEXTS]" |
| "[CDF_SIZE(2)]"); |
| #endif // CONFIG_CONTEXT_DERIVATION |
| |
| fclose(statsfile); |
| fclose(logfile); |
| fclose(probsfile); |
| |
| return 0; |
| } |