|  | /* | 
|  | * 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/. | 
|  | */ | 
|  | #ifndef AOM_AV1_DECODER_ACCOUNTING_H_ | 
|  | #define AOM_AV1_DECODER_ACCOUNTING_H_ | 
|  | #include <stdlib.h> | 
|  | #include "aom/aomdx.h" | 
|  | #include "av1/common/enums.h" | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | extern "C" { | 
|  | #endif  // __cplusplus | 
|  |  | 
|  | #define AOM_ACCOUNTING_HASH_SIZE (1021) | 
|  |  | 
|  | /* Max number of entries for symbol types in the dictionary (increase as | 
|  | necessary). */ | 
|  | #define MAX_SYMBOL_TYPES (256) | 
|  |  | 
|  | /*The resolution of fractional-precision bit usage measurements, i.e., | 
|  | 16 => 1/65536th bits.*/ | 
|  | #define AOM_ACCT_BITRES (16) | 
|  |  | 
|  | #define AOM_ACCOUNTING_MAX_TAGS (4) | 
|  |  | 
|  | enum { | 
|  | SYMBOL_BIT, | 
|  | SYMBOL_BIT_BYPASS, | 
|  | SYMBOL_LITERAL_BYPASS, | 
|  | SYMBOL_UNARY, | 
|  | SYMBOL_CDF, | 
|  | } UENUM1BYTE(SYMBOL_CODING_MODE); | 
|  |  | 
|  | typedef struct { | 
|  | int16_t x; | 
|  | int16_t y; | 
|  | TREE_TYPE tree_type; | 
|  | } AccountingSymbolContext; | 
|  |  | 
|  | typedef struct { | 
|  | AccountingSymbolContext context; | 
|  | uint32_t id; | 
|  | /** Number of bits in units of 1/65536 bit. */ | 
|  | uint64_t bits; | 
|  | int value; | 
|  | SYMBOL_CODING_MODE coding_mode; | 
|  | int coding_type; | 
|  | } AccountingSymbol; | 
|  |  | 
|  | typedef struct { | 
|  | const char *c_func; | 
|  | const char *c_file; | 
|  | int c_line; | 
|  | const char *tags[AOM_ACCOUNTING_MAX_TAGS]; | 
|  | } AccountingSymbolInfo; | 
|  |  | 
|  | AccountingSymbolInfo aom_accounting_make_info( | 
|  | const char *c_func, const char *c_file, int c_line, const char *tag0, | 
|  | const char *tag1, const char *tag2, const char *tag3); | 
|  |  | 
|  | #define ACCT_INFO0() \ | 
|  | aom_accounting_make_info(__func__, __FILE__, __LINE__, NULL, NULL, NULL, NULL) | 
|  | #define ACCT_INFO1(tag0) \ | 
|  | aom_accounting_make_info(__func__, __FILE__, __LINE__, tag0, NULL, NULL, NULL) | 
|  | #define ACCT_INFO2(tag0, tag1) \ | 
|  | aom_accounting_make_info(__func__, __FILE__, __LINE__, tag0, tag1, NULL, NULL) | 
|  | #define ACCT_INFO3(tag0, tag1, tag2) \ | 
|  | aom_accounting_make_info(__func__, __FILE__, __LINE__, tag0, tag1, tag2, NULL) | 
|  | #define ACCT_INFO4(tag0, tag1, tag2, tag3) \ | 
|  | aom_accounting_make_info(__func__, __FILE__, __LINE__, tag0, tag1, tag2, tag3) | 
|  |  | 
|  | #define GET_ACCT_INFO_MACRO(_0, _1, _2, _3, _4, NAME, ...) NAME | 
|  | #define ACCT_INFO(...)                                                       \ | 
|  | GET_ACCT_INFO_MACRO(_0 __VA_OPT__(, ) __VA_ARGS__, ACCT_INFO4, ACCT_INFO3, \ | 
|  | ACCT_INFO2, ACCT_INFO1, ACCT_INFO0)                    \ | 
|  | (__VA_ARGS__) | 
|  |  | 
|  | /** Dictionary for translating strings into id. */ | 
|  | typedef struct { | 
|  | AccountingSymbolInfo acct_infos[MAX_SYMBOL_TYPES]; | 
|  | int num_strs; | 
|  | } AccountingDictionary; | 
|  |  | 
|  | typedef struct { | 
|  | /** All recorded symbols decoded. */ | 
|  | AccountingSymbol *syms; | 
|  | /** Number of syntax actually recorded. */ | 
|  | int num_syms; | 
|  | /** Raw symbol decoding calls for non-binary values. */ | 
|  | int num_multi_syms; | 
|  | /** Raw binary symbol decoding calls. */ | 
|  | int num_binary_syms; | 
|  | /** Bypass coded. */ | 
|  | int num_bypass_coded; | 
|  | /** Context coded. */ | 
|  | int num_ctx_coded; | 
|  | /** Estimate bins coded. */ | 
|  | int num_symlen_minus1; | 
|  | int num_ctx_log2; | 
|  | int num_bypass_log2; | 
|  | uint16_t *prev_context_id; | 
|  | int context_switch; | 
|  | int total_hits; | 
|  | /** Dictionary for translating strings into id. */ | 
|  | AccountingDictionary dictionary; | 
|  | } AccountingSymbols; | 
|  |  | 
|  | struct Accounting { | 
|  | AccountingSymbols syms; | 
|  | /** Size allocated for symbols (not all may be used). */ | 
|  | int num_syms_allocated; | 
|  | int16_t hash_dictionary[AOM_ACCOUNTING_HASH_SIZE]; | 
|  | AccountingSymbolContext context; | 
|  | uint64_t last_tell_frac; | 
|  | }; | 
|  |  | 
|  | void aom_accounting_init(Accounting *accounting); | 
|  | void aom_accounting_reset(Accounting *accounting); | 
|  | void aom_accounting_clear(Accounting *accounting); | 
|  |  | 
|  | void aom_accounting_set_context(Accounting *accounting, int16_t x, int16_t y, | 
|  | TREE_TYPE tree_type); | 
|  | int aom_accounting_dictionary_lookup(Accounting *accounting, | 
|  | AccountingSymbolInfo *acct_info); | 
|  | void aom_accounting_record(Accounting *accounting, int value, | 
|  | SYMBOL_CODING_MODE coding_mode, | 
|  | AccountingSymbolInfo acct_info, uint64_t bits); | 
|  | void aom_accounting_dump(Accounting *accounting); | 
|  | #ifdef __cplusplus | 
|  | }  // extern "C" | 
|  | #endif  // __cplusplus | 
|  | #endif  // AOM_AV1_DECODER_ACCOUNTING_H_ |