hc
2023-12-06 d38611ca164021d018c1b23eee65bbebc09c63e0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
/*
 * Copyright 2021 Rockchip Electronics Co. LTD
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
#ifndef __AV1D_CBS_H__
#define __AV1D_CBS_H__
 
#include "av1.h"
 
typedef struct AV1RawOBUHeader {
    RK_U8 obu_forbidden_bit;
    RK_U8 obu_type;
    RK_U8 obu_extension_flag;
    RK_U8 obu_has_size_field;
    RK_U8 obu_reserved_1bit;
 
    RK_U8 temporal_id;
    RK_U8 spatial_id;
    RK_U8 extension_header_reserved_3bits;
} AV1RawOBUHeader;
 
typedef struct AV1RawColorConfig {
    RK_U8 high_bitdepth;
    RK_U8 twelve_bit;
    RK_U8 mono_chrome;
 
    RK_U8 color_description_present_flag;
    RK_U8 color_primaries;
    RK_U8 transfer_characteristics;
    RK_U8 matrix_coefficients;
 
    RK_U8 color_range;
    RK_U8 subsampling_x;
    RK_U8 subsampling_y;
    RK_U8 chroma_sample_position;
    RK_U8 separate_uv_delta_q;
} AV1RawColorConfig;
 
typedef struct AV1RawTimingInfo {
    RK_U32 num_units_in_display_tick;
    RK_U32 time_scale;
 
    RK_U8 equal_picture_interval;
    RK_U32 num_ticks_per_picture_minus_1;
} AV1RawTimingInfo;
 
typedef struct AV1RawDecoderModelInfo {
    RK_U8  buffer_delay_length_minus_1;
    RK_U32 num_units_in_decoding_tick;
    RK_U8  buffer_removal_time_length_minus_1;
    RK_U8  frame_presentation_time_length_minus_1;
} AV1RawDecoderModelInfo;
 
typedef struct AV1RawSequenceHeader {
    RK_U8 seq_profile;
    RK_U8 still_picture;
    RK_U8 reduced_still_picture_header;
 
    RK_U8 timing_info_present_flag;
    RK_U8 decoder_model_info_present_flag;
    RK_U8 initial_display_delay_present_flag;
    RK_U8 operating_points_cnt_minus_1;
 
    AV1RawTimingInfo       timing_info;
    AV1RawDecoderModelInfo decoder_model_info;
 
    RK_U16 operating_point_idc[AV1_MAX_OPERATING_POINTS];
    RK_U8  seq_level_idx[AV1_MAX_OPERATING_POINTS];
    RK_U8  seq_tier[AV1_MAX_OPERATING_POINTS];
    RK_U8  decoder_model_present_for_this_op[AV1_MAX_OPERATING_POINTS];
    RK_U32 decoder_buffer_delay[AV1_MAX_OPERATING_POINTS];
    RK_U32 encoder_buffer_delay[AV1_MAX_OPERATING_POINTS];
    RK_U8  low_delay_mode_flag[AV1_MAX_OPERATING_POINTS];
    RK_U8  initial_display_delay_present_for_this_op[AV1_MAX_OPERATING_POINTS];
    RK_U8  initial_display_delay_minus_1[AV1_MAX_OPERATING_POINTS];
 
    RK_U8  frame_width_bits_minus_1;
    RK_U8  frame_height_bits_minus_1;
    RK_U16 max_frame_width_minus_1;
    RK_U16 max_frame_height_minus_1;
 
    RK_U8 frame_id_numbers_present_flag;
    RK_U8 delta_frame_id_length_minus_2;
    RK_U8 additional_frame_id_length_minus_1;
 
    RK_U8 use_128x128_superblock;
    RK_U8 enable_filter_intra;
    RK_U8 enable_intra_edge_filter;
    RK_U8 enable_interintra_compound;
    RK_U8 enable_masked_compound;
    RK_U8 enable_warped_motion;
    RK_U8 enable_dual_filter;
 
    RK_U8 enable_order_hint;
    RK_U8 enable_jnt_comp;
    RK_U8 enable_ref_frame_mvs;
 
    RK_U8 seq_choose_screen_content_tools;
    RK_U8 seq_force_screen_content_tools;
    RK_U8 seq_choose_integer_mv;
    RK_U8 seq_force_integer_mv;
 
    RK_U8 order_hint_bits_minus_1;
 
    RK_U8 enable_superres;
    RK_U8 enable_cdef;
    RK_U8 enable_restoration;
 
    AV1RawColorConfig color_config;
 
    RK_U8 film_grain_params_present;
} AV1RawSequenceHeader;
 
typedef struct AV1RawFilmGrainParams {
    RK_U8  apply_grain;
    RK_U16 grain_seed;
    RK_U8  update_grain;
    RK_U8  film_grain_params_ref_idx;
    RK_U8  num_y_points;
    RK_U8  point_y_value[14];
    RK_U8  point_y_scaling[14];
    RK_U8  chroma_scaling_from_luma;
    RK_U8  num_cb_points;
    RK_U8  point_cb_value[10];
    RK_U8  point_cb_scaling[10];
    RK_U8  num_cr_points;
    RK_U8  point_cr_value[10];
    RK_U8  point_cr_scaling[10];
    RK_U8  grain_scaling_minus_8;
    RK_U8  ar_coeff_lag;
    RK_U8  ar_coeffs_y_plus_128[24];
    RK_U8  ar_coeffs_cb_plus_128[25];
    RK_U8  ar_coeffs_cr_plus_128[25];
    RK_U8  ar_coeff_shift_minus_6;
    RK_U8  grain_scale_shift;
    RK_U8  cb_mult;
    RK_U8  cb_luma_mult;
    RK_U16 cb_offset;
    RK_U8  cr_mult;
    RK_U8  cr_luma_mult;
    RK_U16 cr_offset;
    RK_U8  overlap_flag;
    RK_U8  clip_to_restricted_range;
} AV1RawFilmGrainParams;
 
typedef struct AV1RawFrameHeader {
    RK_U8  show_existing_frame;
    RK_U8  frame_to_show_map_idx;
    RK_U32 frame_presentation_time;
    RK_U32 display_frame_id;
 
    RK_U8 frame_type;
    RK_U8 show_frame;
    RK_U8 showable_frame;
 
    RK_U8 error_resilient_mode;
    RK_U8 disable_cdf_update;
    RK_U8 allow_screen_content_tools;
    RK_U8 force_integer_mv;
 
    RK_S32 current_frame_id;
    RK_U8  frame_size_override_flag;
    RK_U8  order_hint;
 
    RK_U8  buffer_removal_time_present_flag;
    RK_U32 buffer_removal_time[AV1_MAX_OPERATING_POINTS];
 
    RK_U8  primary_ref_frame;
    RK_U16 frame_width_minus_1;
    RK_U16 frame_height_minus_1;
    RK_U8  use_superres;
    RK_U8  coded_denom;
    RK_U8  render_and_frame_size_different;
    RK_U16 render_width_minus_1;
    RK_U16 render_height_minus_1;
 
    RK_U8 found_ref[AV1_REFS_PER_FRAME];
 
    RK_U8 refresh_frame_flags;
    RK_U8 allow_intrabc;
    RK_U8 ref_order_hint[AV1_NUM_REF_FRAMES];
    RK_U8 frame_refs_short_signaling;
    RK_U8 last_frame_idx;
    RK_U8 golden_frame_idx;
    RK_S8  ref_frame_idx[AV1_REFS_PER_FRAME];
    RK_U32 delta_frame_id_minus1[AV1_REFS_PER_FRAME];
 
    RK_U8 allow_high_precision_mv;
    RK_U8 is_filter_switchable;
    RK_U8 interpolation_filter;
    RK_U8 is_motion_mode_switchable;
    RK_U8 use_ref_frame_mvs;
 
    RK_U8 disable_frame_end_update_cdf;
 
    RK_U8 uniform_tile_spacing_flag;
    RK_U8 tile_cols_log2;
    RK_U8 tile_rows_log2;
    RK_U8 width_in_sbs_minus_1[AV1_MAX_TILE_COLS];
    RK_U8 height_in_sbs_minus_1[AV1_MAX_TILE_ROWS];
    RK_U16 context_update_tile_id;
    RK_U8 tile_size_bytes_minus1;
 
    // These are derived values, but it's very unhelpful to have to
    // recalculate them all the time so we store them here.
    RK_U16 tile_cols;
    RK_U16 tile_rows;
 
    RK_U8 base_q_idx;
    RK_S8  delta_q_y_dc;
    RK_U8 diff_uv_delta;
    RK_S8  delta_q_u_dc;
    RK_S8  delta_q_u_ac;
    RK_S8  delta_q_v_dc;
    RK_S8  delta_q_v_ac;
    RK_U8 using_qmatrix;
    RK_U8 qm_y;
    RK_U8 qm_u;
    RK_U8 qm_v;
 
    RK_U8 segmentation_enabled;
    RK_U8 segmentation_update_map;
    RK_U8 segmentation_temporal_update;
    RK_U8 segmentation_update_data;
    RK_U8 feature_enabled[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX];
    RK_S16 feature_value[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX];
 
    RK_U8 delta_q_present;
    RK_U8 delta_q_res;
    RK_U8 delta_lf_present;
    RK_U8 delta_lf_res;
    RK_U8 delta_lf_multi;
 
    RK_U8 loop_filter_level[4];
    RK_U8 loop_filter_sharpness;
    RK_U8 loop_filter_delta_enabled;
    RK_U8 loop_filter_delta_update;
    RK_U8 update_ref_delta[AV1_TOTAL_REFS_PER_FRAME];
    RK_S8  loop_filter_ref_deltas[AV1_TOTAL_REFS_PER_FRAME];
    RK_U8 update_mode_delta[2];
    RK_S8  loop_filter_mode_deltas[2];
 
    RK_U8 cdef_damping_minus_3;
    RK_U8 cdef_bits;
    RK_U8 cdef_y_pri_strength[8];
    RK_U8 cdef_y_sec_strength[8];
    RK_U8 cdef_uv_pri_strength[8];
    RK_U8 cdef_uv_sec_strength[8];
 
    RK_U8 lr_type[3];
    RK_U8 lr_unit_shift;
    RK_U8 lr_uv_shift;
 
    RK_U8 tx_mode;
    RK_U8 reference_select;
    RK_U8 skip_mode_present;
 
    RK_U8 allow_warped_motion;
    RK_U8 reduced_tx_set;
 
    RK_U8 is_global[AV1_TOTAL_REFS_PER_FRAME];
    RK_U8 is_rot_zoom[AV1_TOTAL_REFS_PER_FRAME];
    RK_U8 is_translation[AV1_TOTAL_REFS_PER_FRAME];
    //AV1RawSubexp gm_params[AV1_TOTAL_REFS_PER_FRAME][6];
    RK_U32 gm_params[AV1_TOTAL_REFS_PER_FRAME][6];
 
    AV1RawFilmGrainParams film_grain;
} AV1RawFrameHeader;
 
typedef struct AV1RawTileData {
    RK_U8     *data;
    size_t       data_size;
} AV1RawTileData;
 
typedef struct AV1RawTileGroup {
    RK_U8  tile_start_and_end_present_flag;
    RK_U8 tg_start;
    RK_U8 tg_end;
 
    AV1RawTileData tile_data;
} AV1RawTileGroup;
 
typedef struct AV1RawFrame {
    AV1RawFrameHeader header;
    AV1RawTileGroup   tile_group;
} AV1RawFrame;
 
typedef struct AV1RawTileList {
    RK_U8 output_frame_width_in_tiles_minus_1;
    RK_U8 output_frame_height_in_tiles_minus_1;
    RK_U8 tile_count_minus_1;
 
    AV1RawTileData tile_data;
} AV1RawTileList;
 
typedef struct AV1RawMetadataHDRCLL {
    RK_U8 max_cll;
    RK_U8 max_fall;
} AV1RawMetadataHDRCLL;
 
typedef struct AV1RawMetadataHDRMDCV {
    RK_U8 primary_chromaticity_x[3];
    RK_U8 primary_chromaticity_y[3];
    RK_U8 white_point_chromaticity_x;
    RK_U8 white_point_chromaticity_y;
    RK_U32 luminance_max;
    RK_U32 luminance_min;
} AV1RawMetadataHDRMDCV;
 
typedef struct AV1RawMetadataScalability {
    RK_U8 scalability_mode_idc;
    RK_U8 spatial_layers_cnt_minus_1;
    RK_U8 spatial_layer_dimensions_present_flag;
    RK_U8 spatial_layer_description_present_flag;
    RK_U8 temporal_group_description_present_flag;
    RK_U8 scalability_structure_reserved_3bits;
    RK_U8 spatial_layer_max_width[4];
    RK_U8 spatial_layer_max_height[4];
    RK_U8 spatial_layer_ref_id[4];
    RK_U8 temporal_group_size;
    RK_U8 temporal_group_temporal_id[255];
    RK_U8 temporal_group_temporal_switching_up_point_flag[255];
    RK_U8 temporal_group_spatial_switching_up_point_flag[255];
    RK_U8 temporal_group_ref_cnt[255];
    RK_U8 temporal_group_ref_pic_diff[255][7];
} AV1RawMetadataScalability;
 
typedef struct AV1RawMetadataITUTT35 {
    RK_U8 itu_t_t35_country_code;
    RK_U8 itu_t_t35_country_code_extension_byte;
 
    RK_U8     *payload;
    size_t     payload_size;
} AV1RawMetadataITUTT35;
 
typedef struct AV1RawMetadataTimecode {
    RK_U8  counting_type;
    RK_U8  full_timestamp_flag;
    RK_U8  discontinuity_flag;
    RK_U8  cnt_dropped_flag;
    RK_U8  n_frames;
    RK_U8  seconds_value;
    RK_U8  minutes_value;
    RK_U8  hours_value;
    RK_U8  seconds_flag;
    RK_U8  minutes_flag;
    RK_U8  hours_flag;
    RK_U8  time_offset_length;
    RK_U32 time_offset_value;
} AV1RawMetadataTimecode;
 
typedef struct AV1RawMetadata {
    RK_U64 metadata_type;
    union {
        AV1RawMetadataHDRCLL      hdr_cll;
        AV1RawMetadataHDRMDCV     hdr_mdcv;
        AV1RawMetadataScalability scalability;
        AV1RawMetadataITUTT35     itut_t35;
        AV1RawMetadataTimecode    timecode;
    } metadata;
} AV1RawMetadata;
 
typedef struct AV1RawPadding {
    RK_U8     *payload;
    size_t       payload_size;
} AV1RawPadding;
 
 
typedef struct AV1RawOBU {
    AV1RawOBUHeader header;
 
    size_t obu_size;
 
    union {
        AV1RawSequenceHeader sequence_header;
        AV1RawFrameHeader    frame_header;
        AV1RawFrame          frame;
        AV1RawTileGroup      tile_group;
        AV1RawTileList       tile_list;
        AV1RawMetadata       metadata;
        AV1RawPadding        padding;
    } obu;
} AV1RawOBU;
 
typedef struct AV1ReferenceFrameState {
    RK_S32 valid;          // RefValid
    RK_S32 frame_id;       // RefFrameId
    RK_S32 upscaled_width; // RefUpscaledWidth
    RK_S32 frame_width;    // RefFrameWidth
    RK_S32 frame_height;   // RefFrameHeight
    RK_S32 render_width;   // RefRenderWidth
    RK_S32 render_height;  // RefRenderHeight
    RK_S32 frame_type;     // RefFrameType
    RK_S32 subsampling_x;  // RefSubsamplingX
    RK_S32 subsampling_y;  // RefSubsamplingY
    RK_S32 bit_depth;      // RefBitDepth
    RK_S32 order_hint;     // RefOrderHint
 
    RK_S8  loop_filter_ref_deltas[AV1_TOTAL_REFS_PER_FRAME];
    RK_S8  loop_filter_mode_deltas[2];
    RK_U8 feature_enabled[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX];
    RK_S16 feature_value[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX];
} AV1ReferenceFrameState;
 
 
typedef RK_U32 Av1UnitType;
 
typedef struct Av1ObuUnit_t {
    /**
     * Codec-specific type of this unit.
     */
    Av1UnitType type;
 
    /**
     * Pointer to the directly-parsable bitstream form of this unit.
     *
     * May be NULL if the unit currently only exists in decomposed form.
     */
    RK_U8 *data;
 
    size_t   data_size;
 
    void     *content;
} Av1ObuUnit;
 
typedef struct Av1UnitFragment_t {
    RK_U8    *data;
    size_t     data_size;
    int        nb_units;
    int        nb_units_allocated;
    Av1ObuUnit *units;
} Av1UnitFragment;
 
#endif //__AV1D_CBS_H__