| /* | |
| * 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; | |
| 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_ |