level.h (6981B)
1 /* 2 * Copyright (c) 2019, Alliance for Open Media. All rights reserved. 3 * 4 * This source code is subject to the terms of the BSD 2 Clause License and 5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License 6 * was not distributed with this source code in the LICENSE file, you can 7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open 8 * Media Patent License 1.0 was not distributed with this source code in the 9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent. 10 */ 11 12 #ifndef AOM_AV1_ENCODER_LEVEL_H_ 13 #define AOM_AV1_ENCODER_LEVEL_H_ 14 15 #include "av1/common/enums.h" 16 17 struct AV1_COMP; 18 19 // AV1 Level Specifications 20 typedef struct { 21 AV1_LEVEL level; 22 int max_picture_size; 23 int max_h_size; 24 int max_v_size; 25 int max_header_rate; 26 int max_tile_rate; 27 int max_tiles; 28 int max_tile_cols; 29 int64_t max_display_rate; 30 int64_t max_decode_rate; 31 double main_mbps; 32 double high_mbps; 33 double main_cr; 34 double high_cr; 35 } AV1LevelSpec; 36 37 typedef struct { 38 int64_t ts_start; 39 int64_t ts_end; 40 size_t encoded_size_in_bytes; 41 int pic_size; 42 int frame_header_count; 43 int tiles; 44 int show_frame; 45 int show_existing_frame; 46 } FrameRecord; 47 48 // Record frame info. in a rolling window. 49 #define FRAME_WINDOW_SIZE 256 50 typedef struct { 51 FrameRecord buf[FRAME_WINDOW_SIZE]; 52 int num; // Number of FrameRecord stored in the buffer. 53 int start; // Buffer index of the first FrameRecord. 54 } FrameWindowBuffer; 55 56 typedef struct { 57 int max_bitrate; // Max bitrate in any 1-second window, in bps. 58 int max_tile_size; 59 int max_superres_tile_width; 60 int min_cropped_tile_width; 61 int min_cropped_tile_height; 62 int tile_width_is_valid; 63 int min_frame_width; 64 int min_frame_height; 65 double total_compressed_size; // In bytes. 66 double total_time_encoded; // In seconds. 67 double min_cr; 68 } AV1LevelStats; 69 70 // The following data structures are for the decoder model. 71 typedef struct { 72 int decoder_ref_count; 73 int player_ref_count; 74 int display_index; 75 FRAME_TYPE frame_type; 76 double presentation_time; 77 } FRAME_BUFFER; 78 79 // Interval of bits transmission for a DFG(Decodable Frame Group). 80 typedef struct { 81 double first_bit_arrival_time; // Time when the first bit arrives. 82 double last_bit_arrival_time; // Time when the last bit arrives. 83 // Removal time means the time when the bits to be decoded are removed from 84 // the smoothing buffer. Removal time is essentially the time when the 85 // decoding of the frame starts. 86 double removal_time; 87 } DFG_INTERVAL; 88 89 #define DFG_INTERVAL_QUEUE_SIZE 64 90 typedef struct { 91 int head; 92 int size; 93 double total_interval; 94 DFG_INTERVAL buf[DFG_INTERVAL_QUEUE_SIZE]; 95 } DFG_INTERVAL_QUEUE; 96 97 enum { 98 RESOURCE_MODE = 0, // Resource availability mode. 99 SCHEDULE_MODE // Decoding schedule mode. 100 } UENUM1BYTE(DECODER_MODEL_MODE); 101 102 enum { 103 DECODER_MODEL_OK = 0, 104 DECODE_BUFFER_AVAILABLE_LATE, 105 DECODE_FRAME_BUF_UNAVAILABLE, 106 DECODE_EXISTING_FRAME_BUF_EMPTY, 107 DISPLAY_FRAME_LATE, 108 SMOOTHING_BUFFER_UNDERFLOW, 109 SMOOTHING_BUFFER_OVERFLOW, 110 DECODER_MODEL_DISABLED 111 } UENUM1BYTE(DECODER_MODEL_STATUS); 112 113 #define BUFFER_POOL_MAX_SIZE 10 114 typedef struct { 115 DECODER_MODEL_STATUS status; 116 DECODER_MODEL_MODE mode; 117 bool is_low_delay_mode; 118 AV1_LEVEL level; 119 int encoder_buffer_delay; // In units of 1/90000 seconds. 120 int decoder_buffer_delay; // In units of 1/90000 seconds. 121 int num_ticks_per_picture; 122 int initial_display_delay; // In units of frames. 123 int64_t decode_rate; 124 double display_clock_tick; // In units of seconds. 125 double current_time; // In units of seconds. 126 double initial_presentation_delay; // In units of seconds. 127 double bit_rate; // Bits per second. 128 129 int num_frame; 130 int num_decoded_frame; 131 int num_shown_frame; 132 int vbi[REF_FRAMES]; // Virtual buffer index. 133 FRAME_BUFFER frame_buffer_pool[BUFFER_POOL_MAX_SIZE]; 134 DFG_INTERVAL_QUEUE dfg_interval_queue; 135 136 // Information for the DFG(Decodable Frame Group) being processed. 137 double first_bit_arrival_time; 138 double last_bit_arrival_time; 139 size_t coded_bits; 140 141 // Information for the frame being processed. 142 double removal_time; 143 double presentation_time; 144 int decode_samples; 145 int display_samples; 146 147 double max_display_rate; 148 double max_decode_rate; 149 } DECODER_MODEL; 150 151 typedef struct { 152 AV1LevelStats level_stats; 153 AV1LevelSpec level_spec; 154 FrameWindowBuffer frame_window_buffer; 155 DECODER_MODEL decoder_models[SEQ_LEVELS]; 156 } AV1LevelInfo; 157 158 typedef struct AV1LevelParams { 159 // Specifies the level that the coded video sequence conforms to for each 160 // operating point. 161 AV1_LEVEL target_seq_level_idx[MAX_NUM_OPERATING_POINTS]; 162 // Bit mask to indicate whether to keep level stats for corresponding 163 // operating points. 164 uint32_t keep_level_stats; 165 // Level information for each operating point. 166 AV1LevelInfo *level_info[MAX_NUM_OPERATING_POINTS]; 167 } AV1LevelParams; 168 169 static inline int is_in_operating_point(int operating_point, 170 int temporal_layer_id, 171 int spatial_layer_id) { 172 if (!operating_point) return 1; 173 174 return ((operating_point >> temporal_layer_id) & 1) && 175 ((operating_point >> (spatial_layer_id + 8)) & 1); 176 } 177 178 void av1_init_level_info(struct AV1_COMP *cpi); 179 180 void av1_update_level_info(struct AV1_COMP *cpi, size_t size, int64_t ts_start, 181 int64_t ts_end); 182 183 // Return sequence level indices in seq_level_idx[MAX_NUM_OPERATING_POINTS]. 184 aom_codec_err_t av1_get_seq_level_idx(const SequenceHeader *seq_params, 185 const AV1LevelParams *level_params, 186 int *seq_level_idx); 187 188 aom_codec_err_t av1_get_target_seq_level_idx(const SequenceHeader *seq_params, 189 const AV1LevelParams *level_params, 190 int *target_seq_level_idx); 191 192 // This function uses the decoder model to check whether there could be 193 // SMOOTHING_BUFFER_UNDERFLOW or SMOOTHING_BUFFER_OVERFLOW. It does not 194 // update the content of decoder_model, and can be used to target certain 195 // encoding level in the recode loop. 196 DECODER_MODEL_STATUS av1_decoder_model_try_smooth_buf( 197 const struct AV1_COMP *const cpi, size_t coded_bits, 198 const DECODER_MODEL *const decoder_model); 199 200 // Return max bitrate(bps) for given level. 201 double av1_get_max_bitrate_for_level(AV1_LEVEL level_index, int tier, 202 BITSTREAM_PROFILE profile); 203 204 // Get max number of tiles and tile columns for given level. 205 void av1_get_max_tiles_for_level(AV1_LEVEL level_index, int *const max_tiles, 206 int *const max_tile_cols); 207 208 // Return minimum compression ratio for given level. 209 double av1_get_min_cr_for_level(AV1_LEVEL level_index, int tier, 210 int is_still_picture); 211 #endif // AOM_AV1_ENCODER_LEVEL_H_