1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_cistatic int FUNC(obu_header)(CodedBitstreamContext *ctx, RWContext *rw, 20cabdff1aSopenharmony_ci AV1RawOBUHeader *current) 21cabdff1aSopenharmony_ci{ 22cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 23cabdff1aSopenharmony_ci int err; 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci HEADER("OBU header"); 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci fc(1, obu_forbidden_bit, 0, 0); 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci fc(4, obu_type, 0, AV1_OBU_PADDING); 30cabdff1aSopenharmony_ci flag(obu_extension_flag); 31cabdff1aSopenharmony_ci flag(obu_has_size_field); 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_ci fc(1, obu_reserved_1bit, 0, 0); 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_ci if (current->obu_extension_flag) { 36cabdff1aSopenharmony_ci fb(3, temporal_id); 37cabdff1aSopenharmony_ci fb(2, spatial_id); 38cabdff1aSopenharmony_ci fc(3, extension_header_reserved_3bits, 0, 0); 39cabdff1aSopenharmony_ci } else { 40cabdff1aSopenharmony_ci infer(temporal_id, 0); 41cabdff1aSopenharmony_ci infer(spatial_id, 0); 42cabdff1aSopenharmony_ci } 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci priv->temporal_id = current->temporal_id; 45cabdff1aSopenharmony_ci priv->spatial_id = current->spatial_id; 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_ci return 0; 48cabdff1aSopenharmony_ci} 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_cistatic int FUNC(trailing_bits)(CodedBitstreamContext *ctx, RWContext *rw, int nb_bits) 51cabdff1aSopenharmony_ci{ 52cabdff1aSopenharmony_ci int err; 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ci av_assert0(nb_bits > 0); 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ci fixed(1, trailing_one_bit, 1); 57cabdff1aSopenharmony_ci --nb_bits; 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_ci while (nb_bits > 0) { 60cabdff1aSopenharmony_ci fixed(1, trailing_zero_bit, 0); 61cabdff1aSopenharmony_ci --nb_bits; 62cabdff1aSopenharmony_ci } 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci return 0; 65cabdff1aSopenharmony_ci} 66cabdff1aSopenharmony_ci 67cabdff1aSopenharmony_cistatic int FUNC(byte_alignment)(CodedBitstreamContext *ctx, RWContext *rw) 68cabdff1aSopenharmony_ci{ 69cabdff1aSopenharmony_ci int err; 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ci while (byte_alignment(rw) != 0) 72cabdff1aSopenharmony_ci fixed(1, zero_bit, 0); 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci return 0; 75cabdff1aSopenharmony_ci} 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_cistatic int FUNC(color_config)(CodedBitstreamContext *ctx, RWContext *rw, 78cabdff1aSopenharmony_ci AV1RawColorConfig *current, int seq_profile) 79cabdff1aSopenharmony_ci{ 80cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 81cabdff1aSopenharmony_ci int err; 82cabdff1aSopenharmony_ci 83cabdff1aSopenharmony_ci flag(high_bitdepth); 84cabdff1aSopenharmony_ci 85cabdff1aSopenharmony_ci if (seq_profile == FF_PROFILE_AV1_PROFESSIONAL && 86cabdff1aSopenharmony_ci current->high_bitdepth) { 87cabdff1aSopenharmony_ci flag(twelve_bit); 88cabdff1aSopenharmony_ci priv->bit_depth = current->twelve_bit ? 12 : 10; 89cabdff1aSopenharmony_ci } else { 90cabdff1aSopenharmony_ci priv->bit_depth = current->high_bitdepth ? 10 : 8; 91cabdff1aSopenharmony_ci } 92cabdff1aSopenharmony_ci 93cabdff1aSopenharmony_ci if (seq_profile == FF_PROFILE_AV1_HIGH) 94cabdff1aSopenharmony_ci infer(mono_chrome, 0); 95cabdff1aSopenharmony_ci else 96cabdff1aSopenharmony_ci flag(mono_chrome); 97cabdff1aSopenharmony_ci priv->num_planes = current->mono_chrome ? 1 : 3; 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ci flag(color_description_present_flag); 100cabdff1aSopenharmony_ci if (current->color_description_present_flag) { 101cabdff1aSopenharmony_ci fb(8, color_primaries); 102cabdff1aSopenharmony_ci fb(8, transfer_characteristics); 103cabdff1aSopenharmony_ci fb(8, matrix_coefficients); 104cabdff1aSopenharmony_ci } else { 105cabdff1aSopenharmony_ci infer(color_primaries, AVCOL_PRI_UNSPECIFIED); 106cabdff1aSopenharmony_ci infer(transfer_characteristics, AVCOL_TRC_UNSPECIFIED); 107cabdff1aSopenharmony_ci infer(matrix_coefficients, AVCOL_SPC_UNSPECIFIED); 108cabdff1aSopenharmony_ci } 109cabdff1aSopenharmony_ci 110cabdff1aSopenharmony_ci if (current->mono_chrome) { 111cabdff1aSopenharmony_ci flag(color_range); 112cabdff1aSopenharmony_ci 113cabdff1aSopenharmony_ci infer(subsampling_x, 1); 114cabdff1aSopenharmony_ci infer(subsampling_y, 1); 115cabdff1aSopenharmony_ci infer(chroma_sample_position, AV1_CSP_UNKNOWN); 116cabdff1aSopenharmony_ci infer(separate_uv_delta_q, 0); 117cabdff1aSopenharmony_ci 118cabdff1aSopenharmony_ci } else if (current->color_primaries == AVCOL_PRI_BT709 && 119cabdff1aSopenharmony_ci current->transfer_characteristics == AVCOL_TRC_IEC61966_2_1 && 120cabdff1aSopenharmony_ci current->matrix_coefficients == AVCOL_SPC_RGB) { 121cabdff1aSopenharmony_ci infer(color_range, 1); 122cabdff1aSopenharmony_ci infer(subsampling_x, 0); 123cabdff1aSopenharmony_ci infer(subsampling_y, 0); 124cabdff1aSopenharmony_ci flag(separate_uv_delta_q); 125cabdff1aSopenharmony_ci 126cabdff1aSopenharmony_ci } else { 127cabdff1aSopenharmony_ci flag(color_range); 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ci if (seq_profile == FF_PROFILE_AV1_MAIN) { 130cabdff1aSopenharmony_ci infer(subsampling_x, 1); 131cabdff1aSopenharmony_ci infer(subsampling_y, 1); 132cabdff1aSopenharmony_ci } else if (seq_profile == FF_PROFILE_AV1_HIGH) { 133cabdff1aSopenharmony_ci infer(subsampling_x, 0); 134cabdff1aSopenharmony_ci infer(subsampling_y, 0); 135cabdff1aSopenharmony_ci } else { 136cabdff1aSopenharmony_ci if (priv->bit_depth == 12) { 137cabdff1aSopenharmony_ci fb(1, subsampling_x); 138cabdff1aSopenharmony_ci if (current->subsampling_x) 139cabdff1aSopenharmony_ci fb(1, subsampling_y); 140cabdff1aSopenharmony_ci else 141cabdff1aSopenharmony_ci infer(subsampling_y, 0); 142cabdff1aSopenharmony_ci } else { 143cabdff1aSopenharmony_ci infer(subsampling_x, 1); 144cabdff1aSopenharmony_ci infer(subsampling_y, 0); 145cabdff1aSopenharmony_ci } 146cabdff1aSopenharmony_ci } 147cabdff1aSopenharmony_ci if (current->subsampling_x && current->subsampling_y) { 148cabdff1aSopenharmony_ci fc(2, chroma_sample_position, AV1_CSP_UNKNOWN, 149cabdff1aSopenharmony_ci AV1_CSP_COLOCATED); 150cabdff1aSopenharmony_ci } 151cabdff1aSopenharmony_ci 152cabdff1aSopenharmony_ci flag(separate_uv_delta_q); 153cabdff1aSopenharmony_ci } 154cabdff1aSopenharmony_ci 155cabdff1aSopenharmony_ci return 0; 156cabdff1aSopenharmony_ci} 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_cistatic int FUNC(timing_info)(CodedBitstreamContext *ctx, RWContext *rw, 159cabdff1aSopenharmony_ci AV1RawTimingInfo *current) 160cabdff1aSopenharmony_ci{ 161cabdff1aSopenharmony_ci int err; 162cabdff1aSopenharmony_ci 163cabdff1aSopenharmony_ci fc(32, num_units_in_display_tick, 1, MAX_UINT_BITS(32)); 164cabdff1aSopenharmony_ci fc(32, time_scale, 1, MAX_UINT_BITS(32)); 165cabdff1aSopenharmony_ci 166cabdff1aSopenharmony_ci flag(equal_picture_interval); 167cabdff1aSopenharmony_ci if (current->equal_picture_interval) 168cabdff1aSopenharmony_ci uvlc(num_ticks_per_picture_minus_1, 0, MAX_UINT_BITS(32) - 1); 169cabdff1aSopenharmony_ci 170cabdff1aSopenharmony_ci return 0; 171cabdff1aSopenharmony_ci} 172cabdff1aSopenharmony_ci 173cabdff1aSopenharmony_cistatic int FUNC(decoder_model_info)(CodedBitstreamContext *ctx, RWContext *rw, 174cabdff1aSopenharmony_ci AV1RawDecoderModelInfo *current) 175cabdff1aSopenharmony_ci{ 176cabdff1aSopenharmony_ci int err; 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci fb(5, buffer_delay_length_minus_1); 179cabdff1aSopenharmony_ci fb(32, num_units_in_decoding_tick); 180cabdff1aSopenharmony_ci fb(5, buffer_removal_time_length_minus_1); 181cabdff1aSopenharmony_ci fb(5, frame_presentation_time_length_minus_1); 182cabdff1aSopenharmony_ci 183cabdff1aSopenharmony_ci return 0; 184cabdff1aSopenharmony_ci} 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_cistatic int FUNC(sequence_header_obu)(CodedBitstreamContext *ctx, RWContext *rw, 187cabdff1aSopenharmony_ci AV1RawSequenceHeader *current) 188cabdff1aSopenharmony_ci{ 189cabdff1aSopenharmony_ci int i, err; 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci HEADER("Sequence Header"); 192cabdff1aSopenharmony_ci 193cabdff1aSopenharmony_ci fc(3, seq_profile, FF_PROFILE_AV1_MAIN, 194cabdff1aSopenharmony_ci FF_PROFILE_AV1_PROFESSIONAL); 195cabdff1aSopenharmony_ci flag(still_picture); 196cabdff1aSopenharmony_ci flag(reduced_still_picture_header); 197cabdff1aSopenharmony_ci 198cabdff1aSopenharmony_ci if (current->reduced_still_picture_header) { 199cabdff1aSopenharmony_ci infer(timing_info_present_flag, 0); 200cabdff1aSopenharmony_ci infer(decoder_model_info_present_flag, 0); 201cabdff1aSopenharmony_ci infer(initial_display_delay_present_flag, 0); 202cabdff1aSopenharmony_ci infer(operating_points_cnt_minus_1, 0); 203cabdff1aSopenharmony_ci infer(operating_point_idc[0], 0); 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_ci fb(5, seq_level_idx[0]); 206cabdff1aSopenharmony_ci 207cabdff1aSopenharmony_ci infer(seq_tier[0], 0); 208cabdff1aSopenharmony_ci infer(decoder_model_present_for_this_op[0], 0); 209cabdff1aSopenharmony_ci infer(initial_display_delay_present_for_this_op[0], 0); 210cabdff1aSopenharmony_ci 211cabdff1aSopenharmony_ci } else { 212cabdff1aSopenharmony_ci flag(timing_info_present_flag); 213cabdff1aSopenharmony_ci if (current->timing_info_present_flag) { 214cabdff1aSopenharmony_ci CHECK(FUNC(timing_info)(ctx, rw, ¤t->timing_info)); 215cabdff1aSopenharmony_ci 216cabdff1aSopenharmony_ci flag(decoder_model_info_present_flag); 217cabdff1aSopenharmony_ci if (current->decoder_model_info_present_flag) { 218cabdff1aSopenharmony_ci CHECK(FUNC(decoder_model_info) 219cabdff1aSopenharmony_ci (ctx, rw, ¤t->decoder_model_info)); 220cabdff1aSopenharmony_ci } 221cabdff1aSopenharmony_ci } else { 222cabdff1aSopenharmony_ci infer(decoder_model_info_present_flag, 0); 223cabdff1aSopenharmony_ci } 224cabdff1aSopenharmony_ci 225cabdff1aSopenharmony_ci flag(initial_display_delay_present_flag); 226cabdff1aSopenharmony_ci 227cabdff1aSopenharmony_ci fb(5, operating_points_cnt_minus_1); 228cabdff1aSopenharmony_ci for (i = 0; i <= current->operating_points_cnt_minus_1; i++) { 229cabdff1aSopenharmony_ci fbs(12, operating_point_idc[i], 1, i); 230cabdff1aSopenharmony_ci fbs(5, seq_level_idx[i], 1, i); 231cabdff1aSopenharmony_ci 232cabdff1aSopenharmony_ci if (current->seq_level_idx[i] > 7) 233cabdff1aSopenharmony_ci flags(seq_tier[i], 1, i); 234cabdff1aSopenharmony_ci else 235cabdff1aSopenharmony_ci infer(seq_tier[i], 0); 236cabdff1aSopenharmony_ci 237cabdff1aSopenharmony_ci if (current->decoder_model_info_present_flag) { 238cabdff1aSopenharmony_ci flags(decoder_model_present_for_this_op[i], 1, i); 239cabdff1aSopenharmony_ci if (current->decoder_model_present_for_this_op[i]) { 240cabdff1aSopenharmony_ci int n = current->decoder_model_info.buffer_delay_length_minus_1 + 1; 241cabdff1aSopenharmony_ci fbs(n, decoder_buffer_delay[i], 1, i); 242cabdff1aSopenharmony_ci fbs(n, encoder_buffer_delay[i], 1, i); 243cabdff1aSopenharmony_ci flags(low_delay_mode_flag[i], 1, i); 244cabdff1aSopenharmony_ci } 245cabdff1aSopenharmony_ci } else { 246cabdff1aSopenharmony_ci infer(decoder_model_present_for_this_op[i], 0); 247cabdff1aSopenharmony_ci } 248cabdff1aSopenharmony_ci 249cabdff1aSopenharmony_ci if (current->initial_display_delay_present_flag) { 250cabdff1aSopenharmony_ci flags(initial_display_delay_present_for_this_op[i], 1, i); 251cabdff1aSopenharmony_ci if (current->initial_display_delay_present_for_this_op[i]) 252cabdff1aSopenharmony_ci fbs(4, initial_display_delay_minus_1[i], 1, i); 253cabdff1aSopenharmony_ci } 254cabdff1aSopenharmony_ci } 255cabdff1aSopenharmony_ci } 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci fb(4, frame_width_bits_minus_1); 258cabdff1aSopenharmony_ci fb(4, frame_height_bits_minus_1); 259cabdff1aSopenharmony_ci 260cabdff1aSopenharmony_ci fb(current->frame_width_bits_minus_1 + 1, max_frame_width_minus_1); 261cabdff1aSopenharmony_ci fb(current->frame_height_bits_minus_1 + 1, max_frame_height_minus_1); 262cabdff1aSopenharmony_ci 263cabdff1aSopenharmony_ci if (current->reduced_still_picture_header) 264cabdff1aSopenharmony_ci infer(frame_id_numbers_present_flag, 0); 265cabdff1aSopenharmony_ci else 266cabdff1aSopenharmony_ci flag(frame_id_numbers_present_flag); 267cabdff1aSopenharmony_ci if (current->frame_id_numbers_present_flag) { 268cabdff1aSopenharmony_ci fb(4, delta_frame_id_length_minus_2); 269cabdff1aSopenharmony_ci fb(3, additional_frame_id_length_minus_1); 270cabdff1aSopenharmony_ci } 271cabdff1aSopenharmony_ci 272cabdff1aSopenharmony_ci flag(use_128x128_superblock); 273cabdff1aSopenharmony_ci flag(enable_filter_intra); 274cabdff1aSopenharmony_ci flag(enable_intra_edge_filter); 275cabdff1aSopenharmony_ci 276cabdff1aSopenharmony_ci if (current->reduced_still_picture_header) { 277cabdff1aSopenharmony_ci infer(enable_interintra_compound, 0); 278cabdff1aSopenharmony_ci infer(enable_masked_compound, 0); 279cabdff1aSopenharmony_ci infer(enable_warped_motion, 0); 280cabdff1aSopenharmony_ci infer(enable_dual_filter, 0); 281cabdff1aSopenharmony_ci infer(enable_order_hint, 0); 282cabdff1aSopenharmony_ci infer(enable_jnt_comp, 0); 283cabdff1aSopenharmony_ci infer(enable_ref_frame_mvs, 0); 284cabdff1aSopenharmony_ci 285cabdff1aSopenharmony_ci infer(seq_force_screen_content_tools, 286cabdff1aSopenharmony_ci AV1_SELECT_SCREEN_CONTENT_TOOLS); 287cabdff1aSopenharmony_ci infer(seq_force_integer_mv, 288cabdff1aSopenharmony_ci AV1_SELECT_INTEGER_MV); 289cabdff1aSopenharmony_ci } else { 290cabdff1aSopenharmony_ci flag(enable_interintra_compound); 291cabdff1aSopenharmony_ci flag(enable_masked_compound); 292cabdff1aSopenharmony_ci flag(enable_warped_motion); 293cabdff1aSopenharmony_ci flag(enable_dual_filter); 294cabdff1aSopenharmony_ci 295cabdff1aSopenharmony_ci flag(enable_order_hint); 296cabdff1aSopenharmony_ci if (current->enable_order_hint) { 297cabdff1aSopenharmony_ci flag(enable_jnt_comp); 298cabdff1aSopenharmony_ci flag(enable_ref_frame_mvs); 299cabdff1aSopenharmony_ci } else { 300cabdff1aSopenharmony_ci infer(enable_jnt_comp, 0); 301cabdff1aSopenharmony_ci infer(enable_ref_frame_mvs, 0); 302cabdff1aSopenharmony_ci } 303cabdff1aSopenharmony_ci 304cabdff1aSopenharmony_ci flag(seq_choose_screen_content_tools); 305cabdff1aSopenharmony_ci if (current->seq_choose_screen_content_tools) 306cabdff1aSopenharmony_ci infer(seq_force_screen_content_tools, 307cabdff1aSopenharmony_ci AV1_SELECT_SCREEN_CONTENT_TOOLS); 308cabdff1aSopenharmony_ci else 309cabdff1aSopenharmony_ci fb(1, seq_force_screen_content_tools); 310cabdff1aSopenharmony_ci if (current->seq_force_screen_content_tools > 0) { 311cabdff1aSopenharmony_ci flag(seq_choose_integer_mv); 312cabdff1aSopenharmony_ci if (current->seq_choose_integer_mv) 313cabdff1aSopenharmony_ci infer(seq_force_integer_mv, 314cabdff1aSopenharmony_ci AV1_SELECT_INTEGER_MV); 315cabdff1aSopenharmony_ci else 316cabdff1aSopenharmony_ci fb(1, seq_force_integer_mv); 317cabdff1aSopenharmony_ci } else { 318cabdff1aSopenharmony_ci infer(seq_force_integer_mv, AV1_SELECT_INTEGER_MV); 319cabdff1aSopenharmony_ci } 320cabdff1aSopenharmony_ci 321cabdff1aSopenharmony_ci if (current->enable_order_hint) 322cabdff1aSopenharmony_ci fb(3, order_hint_bits_minus_1); 323cabdff1aSopenharmony_ci } 324cabdff1aSopenharmony_ci 325cabdff1aSopenharmony_ci flag(enable_superres); 326cabdff1aSopenharmony_ci flag(enable_cdef); 327cabdff1aSopenharmony_ci flag(enable_restoration); 328cabdff1aSopenharmony_ci 329cabdff1aSopenharmony_ci CHECK(FUNC(color_config)(ctx, rw, ¤t->color_config, 330cabdff1aSopenharmony_ci current->seq_profile)); 331cabdff1aSopenharmony_ci 332cabdff1aSopenharmony_ci flag(film_grain_params_present); 333cabdff1aSopenharmony_ci 334cabdff1aSopenharmony_ci return 0; 335cabdff1aSopenharmony_ci} 336cabdff1aSopenharmony_ci 337cabdff1aSopenharmony_cistatic int FUNC(temporal_delimiter_obu)(CodedBitstreamContext *ctx, RWContext *rw) 338cabdff1aSopenharmony_ci{ 339cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_ci HEADER("Temporal Delimiter"); 342cabdff1aSopenharmony_ci 343cabdff1aSopenharmony_ci priv->seen_frame_header = 0; 344cabdff1aSopenharmony_ci 345cabdff1aSopenharmony_ci return 0; 346cabdff1aSopenharmony_ci} 347cabdff1aSopenharmony_ci 348cabdff1aSopenharmony_cistatic int FUNC(set_frame_refs)(CodedBitstreamContext *ctx, RWContext *rw, 349cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 350cabdff1aSopenharmony_ci{ 351cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 352cabdff1aSopenharmony_ci const AV1RawSequenceHeader *seq = priv->sequence_header; 353cabdff1aSopenharmony_ci static const uint8_t ref_frame_list[AV1_NUM_REF_FRAMES - 2] = { 354cabdff1aSopenharmony_ci AV1_REF_FRAME_LAST2, AV1_REF_FRAME_LAST3, AV1_REF_FRAME_BWDREF, 355cabdff1aSopenharmony_ci AV1_REF_FRAME_ALTREF2, AV1_REF_FRAME_ALTREF 356cabdff1aSopenharmony_ci }; 357cabdff1aSopenharmony_ci int8_t ref_frame_idx[AV1_REFS_PER_FRAME], used_frame[AV1_NUM_REF_FRAMES]; 358cabdff1aSopenharmony_ci int16_t shifted_order_hints[AV1_NUM_REF_FRAMES]; 359cabdff1aSopenharmony_ci int cur_frame_hint, latest_order_hint, earliest_order_hint, ref; 360cabdff1aSopenharmony_ci int i, j; 361cabdff1aSopenharmony_ci 362cabdff1aSopenharmony_ci for (i = 0; i < AV1_REFS_PER_FRAME; i++) 363cabdff1aSopenharmony_ci ref_frame_idx[i] = -1; 364cabdff1aSopenharmony_ci ref_frame_idx[AV1_REF_FRAME_LAST - AV1_REF_FRAME_LAST] = current->last_frame_idx; 365cabdff1aSopenharmony_ci ref_frame_idx[AV1_REF_FRAME_GOLDEN - AV1_REF_FRAME_LAST] = current->golden_frame_idx; 366cabdff1aSopenharmony_ci 367cabdff1aSopenharmony_ci for (i = 0; i < AV1_NUM_REF_FRAMES; i++) 368cabdff1aSopenharmony_ci used_frame[i] = 0; 369cabdff1aSopenharmony_ci used_frame[current->last_frame_idx] = 1; 370cabdff1aSopenharmony_ci used_frame[current->golden_frame_idx] = 1; 371cabdff1aSopenharmony_ci 372cabdff1aSopenharmony_ci cur_frame_hint = 1 << (seq->order_hint_bits_minus_1); 373cabdff1aSopenharmony_ci for (i = 0; i < AV1_NUM_REF_FRAMES; i++) 374cabdff1aSopenharmony_ci shifted_order_hints[i] = cur_frame_hint + 375cabdff1aSopenharmony_ci cbs_av1_get_relative_dist(seq, priv->ref[i].order_hint, 376cabdff1aSopenharmony_ci priv->order_hint); 377cabdff1aSopenharmony_ci 378cabdff1aSopenharmony_ci latest_order_hint = shifted_order_hints[current->last_frame_idx]; 379cabdff1aSopenharmony_ci earliest_order_hint = shifted_order_hints[current->golden_frame_idx]; 380cabdff1aSopenharmony_ci 381cabdff1aSopenharmony_ci ref = -1; 382cabdff1aSopenharmony_ci for (i = 0; i < AV1_NUM_REF_FRAMES; i++) { 383cabdff1aSopenharmony_ci int hint = shifted_order_hints[i]; 384cabdff1aSopenharmony_ci if (!used_frame[i] && hint >= cur_frame_hint && 385cabdff1aSopenharmony_ci (ref < 0 || hint >= latest_order_hint)) { 386cabdff1aSopenharmony_ci ref = i; 387cabdff1aSopenharmony_ci latest_order_hint = hint; 388cabdff1aSopenharmony_ci } 389cabdff1aSopenharmony_ci } 390cabdff1aSopenharmony_ci if (ref >= 0) { 391cabdff1aSopenharmony_ci ref_frame_idx[AV1_REF_FRAME_ALTREF - AV1_REF_FRAME_LAST] = ref; 392cabdff1aSopenharmony_ci used_frame[ref] = 1; 393cabdff1aSopenharmony_ci } 394cabdff1aSopenharmony_ci 395cabdff1aSopenharmony_ci ref = -1; 396cabdff1aSopenharmony_ci for (i = 0; i < AV1_NUM_REF_FRAMES; i++) { 397cabdff1aSopenharmony_ci int hint = shifted_order_hints[i]; 398cabdff1aSopenharmony_ci if (!used_frame[i] && hint >= cur_frame_hint && 399cabdff1aSopenharmony_ci (ref < 0 || hint < earliest_order_hint)) { 400cabdff1aSopenharmony_ci ref = i; 401cabdff1aSopenharmony_ci earliest_order_hint = hint; 402cabdff1aSopenharmony_ci } 403cabdff1aSopenharmony_ci } 404cabdff1aSopenharmony_ci if (ref >= 0) { 405cabdff1aSopenharmony_ci ref_frame_idx[AV1_REF_FRAME_BWDREF - AV1_REF_FRAME_LAST] = ref; 406cabdff1aSopenharmony_ci used_frame[ref] = 1; 407cabdff1aSopenharmony_ci } 408cabdff1aSopenharmony_ci 409cabdff1aSopenharmony_ci ref = -1; 410cabdff1aSopenharmony_ci for (i = 0; i < AV1_NUM_REF_FRAMES; i++) { 411cabdff1aSopenharmony_ci int hint = shifted_order_hints[i]; 412cabdff1aSopenharmony_ci if (!used_frame[i] && hint >= cur_frame_hint && 413cabdff1aSopenharmony_ci (ref < 0 || hint < earliest_order_hint)) { 414cabdff1aSopenharmony_ci ref = i; 415cabdff1aSopenharmony_ci earliest_order_hint = hint; 416cabdff1aSopenharmony_ci } 417cabdff1aSopenharmony_ci } 418cabdff1aSopenharmony_ci if (ref >= 0) { 419cabdff1aSopenharmony_ci ref_frame_idx[AV1_REF_FRAME_ALTREF2 - AV1_REF_FRAME_LAST] = ref; 420cabdff1aSopenharmony_ci used_frame[ref] = 1; 421cabdff1aSopenharmony_ci } 422cabdff1aSopenharmony_ci 423cabdff1aSopenharmony_ci for (i = 0; i < AV1_REFS_PER_FRAME - 2; i++) { 424cabdff1aSopenharmony_ci int ref_frame = ref_frame_list[i]; 425cabdff1aSopenharmony_ci if (ref_frame_idx[ref_frame - AV1_REF_FRAME_LAST] < 0 ) { 426cabdff1aSopenharmony_ci ref = -1; 427cabdff1aSopenharmony_ci for (j = 0; j < AV1_NUM_REF_FRAMES; j++) { 428cabdff1aSopenharmony_ci int hint = shifted_order_hints[j]; 429cabdff1aSopenharmony_ci if (!used_frame[j] && hint < cur_frame_hint && 430cabdff1aSopenharmony_ci (ref < 0 || hint >= latest_order_hint)) { 431cabdff1aSopenharmony_ci ref = j; 432cabdff1aSopenharmony_ci latest_order_hint = hint; 433cabdff1aSopenharmony_ci } 434cabdff1aSopenharmony_ci } 435cabdff1aSopenharmony_ci if (ref >= 0) { 436cabdff1aSopenharmony_ci ref_frame_idx[ref_frame - AV1_REF_FRAME_LAST] = ref; 437cabdff1aSopenharmony_ci used_frame[ref] = 1; 438cabdff1aSopenharmony_ci } 439cabdff1aSopenharmony_ci } 440cabdff1aSopenharmony_ci } 441cabdff1aSopenharmony_ci 442cabdff1aSopenharmony_ci ref = -1; 443cabdff1aSopenharmony_ci for (i = 0; i < AV1_NUM_REF_FRAMES; i++) { 444cabdff1aSopenharmony_ci int hint = shifted_order_hints[i]; 445cabdff1aSopenharmony_ci if (ref < 0 || hint < earliest_order_hint) { 446cabdff1aSopenharmony_ci ref = i; 447cabdff1aSopenharmony_ci earliest_order_hint = hint; 448cabdff1aSopenharmony_ci } 449cabdff1aSopenharmony_ci } 450cabdff1aSopenharmony_ci for (i = 0; i < AV1_REFS_PER_FRAME; i++) { 451cabdff1aSopenharmony_ci if (ref_frame_idx[i] < 0) 452cabdff1aSopenharmony_ci ref_frame_idx[i] = ref; 453cabdff1aSopenharmony_ci infer(ref_frame_idx[i], ref_frame_idx[i]); 454cabdff1aSopenharmony_ci } 455cabdff1aSopenharmony_ci 456cabdff1aSopenharmony_ci return 0; 457cabdff1aSopenharmony_ci} 458cabdff1aSopenharmony_ci 459cabdff1aSopenharmony_cistatic int FUNC(superres_params)(CodedBitstreamContext *ctx, RWContext *rw, 460cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 461cabdff1aSopenharmony_ci{ 462cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 463cabdff1aSopenharmony_ci const AV1RawSequenceHeader *seq = priv->sequence_header; 464cabdff1aSopenharmony_ci int denom, err; 465cabdff1aSopenharmony_ci 466cabdff1aSopenharmony_ci if (seq->enable_superres) 467cabdff1aSopenharmony_ci flag(use_superres); 468cabdff1aSopenharmony_ci else 469cabdff1aSopenharmony_ci infer(use_superres, 0); 470cabdff1aSopenharmony_ci 471cabdff1aSopenharmony_ci if (current->use_superres) { 472cabdff1aSopenharmony_ci fb(3, coded_denom); 473cabdff1aSopenharmony_ci denom = current->coded_denom + AV1_SUPERRES_DENOM_MIN; 474cabdff1aSopenharmony_ci } else { 475cabdff1aSopenharmony_ci denom = AV1_SUPERRES_NUM; 476cabdff1aSopenharmony_ci } 477cabdff1aSopenharmony_ci 478cabdff1aSopenharmony_ci priv->upscaled_width = priv->frame_width; 479cabdff1aSopenharmony_ci priv->frame_width = (priv->upscaled_width * AV1_SUPERRES_NUM + 480cabdff1aSopenharmony_ci denom / 2) / denom; 481cabdff1aSopenharmony_ci 482cabdff1aSopenharmony_ci return 0; 483cabdff1aSopenharmony_ci} 484cabdff1aSopenharmony_ci 485cabdff1aSopenharmony_cistatic int FUNC(frame_size)(CodedBitstreamContext *ctx, RWContext *rw, 486cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 487cabdff1aSopenharmony_ci{ 488cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 489cabdff1aSopenharmony_ci const AV1RawSequenceHeader *seq = priv->sequence_header; 490cabdff1aSopenharmony_ci int err; 491cabdff1aSopenharmony_ci 492cabdff1aSopenharmony_ci if (current->frame_size_override_flag) { 493cabdff1aSopenharmony_ci fb(seq->frame_width_bits_minus_1 + 1, frame_width_minus_1); 494cabdff1aSopenharmony_ci fb(seq->frame_height_bits_minus_1 + 1, frame_height_minus_1); 495cabdff1aSopenharmony_ci } else { 496cabdff1aSopenharmony_ci infer(frame_width_minus_1, seq->max_frame_width_minus_1); 497cabdff1aSopenharmony_ci infer(frame_height_minus_1, seq->max_frame_height_minus_1); 498cabdff1aSopenharmony_ci } 499cabdff1aSopenharmony_ci 500cabdff1aSopenharmony_ci priv->frame_width = current->frame_width_minus_1 + 1; 501cabdff1aSopenharmony_ci priv->frame_height = current->frame_height_minus_1 + 1; 502cabdff1aSopenharmony_ci 503cabdff1aSopenharmony_ci CHECK(FUNC(superres_params)(ctx, rw, current)); 504cabdff1aSopenharmony_ci 505cabdff1aSopenharmony_ci return 0; 506cabdff1aSopenharmony_ci} 507cabdff1aSopenharmony_ci 508cabdff1aSopenharmony_cistatic int FUNC(render_size)(CodedBitstreamContext *ctx, RWContext *rw, 509cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 510cabdff1aSopenharmony_ci{ 511cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 512cabdff1aSopenharmony_ci int err; 513cabdff1aSopenharmony_ci 514cabdff1aSopenharmony_ci flag(render_and_frame_size_different); 515cabdff1aSopenharmony_ci 516cabdff1aSopenharmony_ci if (current->render_and_frame_size_different) { 517cabdff1aSopenharmony_ci fb(16, render_width_minus_1); 518cabdff1aSopenharmony_ci fb(16, render_height_minus_1); 519cabdff1aSopenharmony_ci } else { 520cabdff1aSopenharmony_ci infer(render_width_minus_1, current->frame_width_minus_1); 521cabdff1aSopenharmony_ci infer(render_height_minus_1, current->frame_height_minus_1); 522cabdff1aSopenharmony_ci } 523cabdff1aSopenharmony_ci 524cabdff1aSopenharmony_ci priv->render_width = current->render_width_minus_1 + 1; 525cabdff1aSopenharmony_ci priv->render_height = current->render_height_minus_1 + 1; 526cabdff1aSopenharmony_ci 527cabdff1aSopenharmony_ci return 0; 528cabdff1aSopenharmony_ci} 529cabdff1aSopenharmony_ci 530cabdff1aSopenharmony_cistatic int FUNC(frame_size_with_refs)(CodedBitstreamContext *ctx, RWContext *rw, 531cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 532cabdff1aSopenharmony_ci{ 533cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 534cabdff1aSopenharmony_ci int i, err; 535cabdff1aSopenharmony_ci 536cabdff1aSopenharmony_ci for (i = 0; i < AV1_REFS_PER_FRAME; i++) { 537cabdff1aSopenharmony_ci flags(found_ref[i], 1, i); 538cabdff1aSopenharmony_ci if (current->found_ref[i]) { 539cabdff1aSopenharmony_ci AV1ReferenceFrameState *ref = 540cabdff1aSopenharmony_ci &priv->ref[current->ref_frame_idx[i]]; 541cabdff1aSopenharmony_ci 542cabdff1aSopenharmony_ci if (!ref->valid) { 543cabdff1aSopenharmony_ci av_log(ctx->log_ctx, AV_LOG_ERROR, 544cabdff1aSopenharmony_ci "Missing reference frame needed for frame size " 545cabdff1aSopenharmony_ci "(ref = %d, ref_frame_idx = %d).\n", 546cabdff1aSopenharmony_ci i, current->ref_frame_idx[i]); 547cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 548cabdff1aSopenharmony_ci } 549cabdff1aSopenharmony_ci 550cabdff1aSopenharmony_ci infer(frame_width_minus_1, ref->upscaled_width - 1); 551cabdff1aSopenharmony_ci infer(frame_height_minus_1, ref->frame_height - 1); 552cabdff1aSopenharmony_ci infer(render_width_minus_1, ref->render_width - 1); 553cabdff1aSopenharmony_ci infer(render_height_minus_1, ref->render_height - 1); 554cabdff1aSopenharmony_ci 555cabdff1aSopenharmony_ci priv->upscaled_width = ref->upscaled_width; 556cabdff1aSopenharmony_ci priv->frame_width = priv->upscaled_width; 557cabdff1aSopenharmony_ci priv->frame_height = ref->frame_height; 558cabdff1aSopenharmony_ci priv->render_width = ref->render_width; 559cabdff1aSopenharmony_ci priv->render_height = ref->render_height; 560cabdff1aSopenharmony_ci break; 561cabdff1aSopenharmony_ci } 562cabdff1aSopenharmony_ci } 563cabdff1aSopenharmony_ci 564cabdff1aSopenharmony_ci if (i >= AV1_REFS_PER_FRAME) { 565cabdff1aSopenharmony_ci CHECK(FUNC(frame_size)(ctx, rw, current)); 566cabdff1aSopenharmony_ci CHECK(FUNC(render_size)(ctx, rw, current)); 567cabdff1aSopenharmony_ci } else { 568cabdff1aSopenharmony_ci CHECK(FUNC(superres_params)(ctx, rw, current)); 569cabdff1aSopenharmony_ci } 570cabdff1aSopenharmony_ci 571cabdff1aSopenharmony_ci return 0; 572cabdff1aSopenharmony_ci} 573cabdff1aSopenharmony_ci 574cabdff1aSopenharmony_cistatic int FUNC(interpolation_filter)(CodedBitstreamContext *ctx, RWContext *rw, 575cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 576cabdff1aSopenharmony_ci{ 577cabdff1aSopenharmony_ci int err; 578cabdff1aSopenharmony_ci 579cabdff1aSopenharmony_ci flag(is_filter_switchable); 580cabdff1aSopenharmony_ci if (current->is_filter_switchable) 581cabdff1aSopenharmony_ci infer(interpolation_filter, 582cabdff1aSopenharmony_ci AV1_INTERPOLATION_FILTER_SWITCHABLE); 583cabdff1aSopenharmony_ci else 584cabdff1aSopenharmony_ci fb(2, interpolation_filter); 585cabdff1aSopenharmony_ci 586cabdff1aSopenharmony_ci return 0; 587cabdff1aSopenharmony_ci} 588cabdff1aSopenharmony_ci 589cabdff1aSopenharmony_cistatic int FUNC(tile_info)(CodedBitstreamContext *ctx, RWContext *rw, 590cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 591cabdff1aSopenharmony_ci{ 592cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 593cabdff1aSopenharmony_ci const AV1RawSequenceHeader *seq = priv->sequence_header; 594cabdff1aSopenharmony_ci int mi_cols, mi_rows, sb_cols, sb_rows, sb_shift, sb_size; 595cabdff1aSopenharmony_ci int max_tile_width_sb, max_tile_height_sb, max_tile_area_sb; 596cabdff1aSopenharmony_ci int min_log2_tile_cols, max_log2_tile_cols, max_log2_tile_rows; 597cabdff1aSopenharmony_ci int min_log2_tiles, min_log2_tile_rows; 598cabdff1aSopenharmony_ci int i, err; 599cabdff1aSopenharmony_ci 600cabdff1aSopenharmony_ci mi_cols = 2 * ((priv->frame_width + 7) >> 3); 601cabdff1aSopenharmony_ci mi_rows = 2 * ((priv->frame_height + 7) >> 3); 602cabdff1aSopenharmony_ci 603cabdff1aSopenharmony_ci sb_cols = seq->use_128x128_superblock ? ((mi_cols + 31) >> 5) 604cabdff1aSopenharmony_ci : ((mi_cols + 15) >> 4); 605cabdff1aSopenharmony_ci sb_rows = seq->use_128x128_superblock ? ((mi_rows + 31) >> 5) 606cabdff1aSopenharmony_ci : ((mi_rows + 15) >> 4); 607cabdff1aSopenharmony_ci 608cabdff1aSopenharmony_ci sb_shift = seq->use_128x128_superblock ? 5 : 4; 609cabdff1aSopenharmony_ci sb_size = sb_shift + 2; 610cabdff1aSopenharmony_ci 611cabdff1aSopenharmony_ci max_tile_width_sb = AV1_MAX_TILE_WIDTH >> sb_size; 612cabdff1aSopenharmony_ci max_tile_area_sb = AV1_MAX_TILE_AREA >> (2 * sb_size); 613cabdff1aSopenharmony_ci 614cabdff1aSopenharmony_ci min_log2_tile_cols = cbs_av1_tile_log2(max_tile_width_sb, sb_cols); 615cabdff1aSopenharmony_ci max_log2_tile_cols = cbs_av1_tile_log2(1, FFMIN(sb_cols, AV1_MAX_TILE_COLS)); 616cabdff1aSopenharmony_ci max_log2_tile_rows = cbs_av1_tile_log2(1, FFMIN(sb_rows, AV1_MAX_TILE_ROWS)); 617cabdff1aSopenharmony_ci min_log2_tiles = FFMAX(min_log2_tile_cols, 618cabdff1aSopenharmony_ci cbs_av1_tile_log2(max_tile_area_sb, sb_rows * sb_cols)); 619cabdff1aSopenharmony_ci 620cabdff1aSopenharmony_ci flag(uniform_tile_spacing_flag); 621cabdff1aSopenharmony_ci 622cabdff1aSopenharmony_ci if (current->uniform_tile_spacing_flag) { 623cabdff1aSopenharmony_ci int tile_width_sb, tile_height_sb; 624cabdff1aSopenharmony_ci 625cabdff1aSopenharmony_ci increment(tile_cols_log2, min_log2_tile_cols, max_log2_tile_cols); 626cabdff1aSopenharmony_ci 627cabdff1aSopenharmony_ci tile_width_sb = (sb_cols + (1 << current->tile_cols_log2) - 1) >> 628cabdff1aSopenharmony_ci current->tile_cols_log2; 629cabdff1aSopenharmony_ci current->tile_cols = (sb_cols + tile_width_sb - 1) / tile_width_sb; 630cabdff1aSopenharmony_ci 631cabdff1aSopenharmony_ci min_log2_tile_rows = FFMAX(min_log2_tiles - current->tile_cols_log2, 0); 632cabdff1aSopenharmony_ci 633cabdff1aSopenharmony_ci increment(tile_rows_log2, min_log2_tile_rows, max_log2_tile_rows); 634cabdff1aSopenharmony_ci 635cabdff1aSopenharmony_ci tile_height_sb = (sb_rows + (1 << current->tile_rows_log2) - 1) >> 636cabdff1aSopenharmony_ci current->tile_rows_log2; 637cabdff1aSopenharmony_ci current->tile_rows = (sb_rows + tile_height_sb - 1) / tile_height_sb; 638cabdff1aSopenharmony_ci 639cabdff1aSopenharmony_ci for (i = 0; i < current->tile_cols - 1; i++) 640cabdff1aSopenharmony_ci infer(width_in_sbs_minus_1[i], tile_width_sb - 1); 641cabdff1aSopenharmony_ci infer(width_in_sbs_minus_1[i], 642cabdff1aSopenharmony_ci sb_cols - (current->tile_cols - 1) * tile_width_sb - 1); 643cabdff1aSopenharmony_ci for (i = 0; i < current->tile_rows - 1; i++) 644cabdff1aSopenharmony_ci infer(height_in_sbs_minus_1[i], tile_height_sb - 1); 645cabdff1aSopenharmony_ci infer(height_in_sbs_minus_1[i], 646cabdff1aSopenharmony_ci sb_rows - (current->tile_rows - 1) * tile_height_sb - 1); 647cabdff1aSopenharmony_ci 648cabdff1aSopenharmony_ci } else { 649cabdff1aSopenharmony_ci int widest_tile_sb, start_sb, size_sb, max_width, max_height; 650cabdff1aSopenharmony_ci 651cabdff1aSopenharmony_ci widest_tile_sb = 0; 652cabdff1aSopenharmony_ci 653cabdff1aSopenharmony_ci start_sb = 0; 654cabdff1aSopenharmony_ci for (i = 0; start_sb < sb_cols && i < AV1_MAX_TILE_COLS; i++) { 655cabdff1aSopenharmony_ci max_width = FFMIN(sb_cols - start_sb, max_tile_width_sb); 656cabdff1aSopenharmony_ci ns(max_width, width_in_sbs_minus_1[i], 1, i); 657cabdff1aSopenharmony_ci size_sb = current->width_in_sbs_minus_1[i] + 1; 658cabdff1aSopenharmony_ci widest_tile_sb = FFMAX(size_sb, widest_tile_sb); 659cabdff1aSopenharmony_ci start_sb += size_sb; 660cabdff1aSopenharmony_ci } 661cabdff1aSopenharmony_ci current->tile_cols_log2 = cbs_av1_tile_log2(1, i); 662cabdff1aSopenharmony_ci current->tile_cols = i; 663cabdff1aSopenharmony_ci 664cabdff1aSopenharmony_ci if (min_log2_tiles > 0) 665cabdff1aSopenharmony_ci max_tile_area_sb = (sb_rows * sb_cols) >> (min_log2_tiles + 1); 666cabdff1aSopenharmony_ci else 667cabdff1aSopenharmony_ci max_tile_area_sb = sb_rows * sb_cols; 668cabdff1aSopenharmony_ci max_tile_height_sb = FFMAX(max_tile_area_sb / widest_tile_sb, 1); 669cabdff1aSopenharmony_ci 670cabdff1aSopenharmony_ci start_sb = 0; 671cabdff1aSopenharmony_ci for (i = 0; start_sb < sb_rows && i < AV1_MAX_TILE_ROWS; i++) { 672cabdff1aSopenharmony_ci max_height = FFMIN(sb_rows - start_sb, max_tile_height_sb); 673cabdff1aSopenharmony_ci ns(max_height, height_in_sbs_minus_1[i], 1, i); 674cabdff1aSopenharmony_ci size_sb = current->height_in_sbs_minus_1[i] + 1; 675cabdff1aSopenharmony_ci start_sb += size_sb; 676cabdff1aSopenharmony_ci } 677cabdff1aSopenharmony_ci current->tile_rows_log2 = cbs_av1_tile_log2(1, i); 678cabdff1aSopenharmony_ci current->tile_rows = i; 679cabdff1aSopenharmony_ci } 680cabdff1aSopenharmony_ci 681cabdff1aSopenharmony_ci if (current->tile_cols_log2 > 0 || 682cabdff1aSopenharmony_ci current->tile_rows_log2 > 0) { 683cabdff1aSopenharmony_ci fb(current->tile_cols_log2 + current->tile_rows_log2, 684cabdff1aSopenharmony_ci context_update_tile_id); 685cabdff1aSopenharmony_ci fb(2, tile_size_bytes_minus1); 686cabdff1aSopenharmony_ci } else { 687cabdff1aSopenharmony_ci infer(context_update_tile_id, 0); 688cabdff1aSopenharmony_ci } 689cabdff1aSopenharmony_ci 690cabdff1aSopenharmony_ci priv->tile_cols = current->tile_cols; 691cabdff1aSopenharmony_ci priv->tile_rows = current->tile_rows; 692cabdff1aSopenharmony_ci 693cabdff1aSopenharmony_ci return 0; 694cabdff1aSopenharmony_ci} 695cabdff1aSopenharmony_ci 696cabdff1aSopenharmony_cistatic int FUNC(quantization_params)(CodedBitstreamContext *ctx, RWContext *rw, 697cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 698cabdff1aSopenharmony_ci{ 699cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 700cabdff1aSopenharmony_ci const AV1RawSequenceHeader *seq = priv->sequence_header; 701cabdff1aSopenharmony_ci int err; 702cabdff1aSopenharmony_ci 703cabdff1aSopenharmony_ci fb(8, base_q_idx); 704cabdff1aSopenharmony_ci 705cabdff1aSopenharmony_ci delta_q(delta_q_y_dc); 706cabdff1aSopenharmony_ci 707cabdff1aSopenharmony_ci if (priv->num_planes > 1) { 708cabdff1aSopenharmony_ci if (seq->color_config.separate_uv_delta_q) 709cabdff1aSopenharmony_ci flag(diff_uv_delta); 710cabdff1aSopenharmony_ci else 711cabdff1aSopenharmony_ci infer(diff_uv_delta, 0); 712cabdff1aSopenharmony_ci 713cabdff1aSopenharmony_ci delta_q(delta_q_u_dc); 714cabdff1aSopenharmony_ci delta_q(delta_q_u_ac); 715cabdff1aSopenharmony_ci 716cabdff1aSopenharmony_ci if (current->diff_uv_delta) { 717cabdff1aSopenharmony_ci delta_q(delta_q_v_dc); 718cabdff1aSopenharmony_ci delta_q(delta_q_v_ac); 719cabdff1aSopenharmony_ci } else { 720cabdff1aSopenharmony_ci infer(delta_q_v_dc, current->delta_q_u_dc); 721cabdff1aSopenharmony_ci infer(delta_q_v_ac, current->delta_q_u_ac); 722cabdff1aSopenharmony_ci } 723cabdff1aSopenharmony_ci } else { 724cabdff1aSopenharmony_ci infer(delta_q_u_dc, 0); 725cabdff1aSopenharmony_ci infer(delta_q_u_ac, 0); 726cabdff1aSopenharmony_ci infer(delta_q_v_dc, 0); 727cabdff1aSopenharmony_ci infer(delta_q_v_ac, 0); 728cabdff1aSopenharmony_ci } 729cabdff1aSopenharmony_ci 730cabdff1aSopenharmony_ci flag(using_qmatrix); 731cabdff1aSopenharmony_ci if (current->using_qmatrix) { 732cabdff1aSopenharmony_ci fb(4, qm_y); 733cabdff1aSopenharmony_ci fb(4, qm_u); 734cabdff1aSopenharmony_ci if (seq->color_config.separate_uv_delta_q) 735cabdff1aSopenharmony_ci fb(4, qm_v); 736cabdff1aSopenharmony_ci else 737cabdff1aSopenharmony_ci infer(qm_v, current->qm_u); 738cabdff1aSopenharmony_ci } 739cabdff1aSopenharmony_ci 740cabdff1aSopenharmony_ci return 0; 741cabdff1aSopenharmony_ci} 742cabdff1aSopenharmony_ci 743cabdff1aSopenharmony_cistatic int FUNC(segmentation_params)(CodedBitstreamContext *ctx, RWContext *rw, 744cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 745cabdff1aSopenharmony_ci{ 746cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 747cabdff1aSopenharmony_ci static const uint8_t bits[AV1_SEG_LVL_MAX] = { 8, 6, 6, 6, 6, 3, 0, 0 }; 748cabdff1aSopenharmony_ci static const uint8_t sign[AV1_SEG_LVL_MAX] = { 1, 1, 1, 1, 1, 0, 0, 0 }; 749cabdff1aSopenharmony_ci static const uint8_t default_feature_enabled[AV1_SEG_LVL_MAX] = { 0 }; 750cabdff1aSopenharmony_ci static const int16_t default_feature_value[AV1_SEG_LVL_MAX] = { 0 }; 751cabdff1aSopenharmony_ci int i, j, err; 752cabdff1aSopenharmony_ci 753cabdff1aSopenharmony_ci flag(segmentation_enabled); 754cabdff1aSopenharmony_ci 755cabdff1aSopenharmony_ci if (current->segmentation_enabled) { 756cabdff1aSopenharmony_ci if (current->primary_ref_frame == AV1_PRIMARY_REF_NONE) { 757cabdff1aSopenharmony_ci infer(segmentation_update_map, 1); 758cabdff1aSopenharmony_ci infer(segmentation_temporal_update, 0); 759cabdff1aSopenharmony_ci infer(segmentation_update_data, 1); 760cabdff1aSopenharmony_ci } else { 761cabdff1aSopenharmony_ci flag(segmentation_update_map); 762cabdff1aSopenharmony_ci if (current->segmentation_update_map) 763cabdff1aSopenharmony_ci flag(segmentation_temporal_update); 764cabdff1aSopenharmony_ci else 765cabdff1aSopenharmony_ci infer(segmentation_temporal_update, 0); 766cabdff1aSopenharmony_ci flag(segmentation_update_data); 767cabdff1aSopenharmony_ci } 768cabdff1aSopenharmony_ci 769cabdff1aSopenharmony_ci for (i = 0; i < AV1_MAX_SEGMENTS; i++) { 770cabdff1aSopenharmony_ci const uint8_t *ref_feature_enabled; 771cabdff1aSopenharmony_ci const int16_t *ref_feature_value; 772cabdff1aSopenharmony_ci 773cabdff1aSopenharmony_ci if (current->primary_ref_frame == AV1_PRIMARY_REF_NONE) { 774cabdff1aSopenharmony_ci ref_feature_enabled = default_feature_enabled; 775cabdff1aSopenharmony_ci ref_feature_value = default_feature_value; 776cabdff1aSopenharmony_ci } else { 777cabdff1aSopenharmony_ci ref_feature_enabled = 778cabdff1aSopenharmony_ci priv->ref[current->ref_frame_idx[current->primary_ref_frame]].feature_enabled[i]; 779cabdff1aSopenharmony_ci ref_feature_value = 780cabdff1aSopenharmony_ci priv->ref[current->ref_frame_idx[current->primary_ref_frame]].feature_value[i]; 781cabdff1aSopenharmony_ci } 782cabdff1aSopenharmony_ci 783cabdff1aSopenharmony_ci for (j = 0; j < AV1_SEG_LVL_MAX; j++) { 784cabdff1aSopenharmony_ci if (current->segmentation_update_data) { 785cabdff1aSopenharmony_ci flags(feature_enabled[i][j], 2, i, j); 786cabdff1aSopenharmony_ci 787cabdff1aSopenharmony_ci if (current->feature_enabled[i][j] && bits[j] > 0) { 788cabdff1aSopenharmony_ci if (sign[j]) 789cabdff1aSopenharmony_ci sus(1 + bits[j], feature_value[i][j], 2, i, j); 790cabdff1aSopenharmony_ci else 791cabdff1aSopenharmony_ci fbs(bits[j], feature_value[i][j], 2, i, j); 792cabdff1aSopenharmony_ci } else { 793cabdff1aSopenharmony_ci infer(feature_value[i][j], 0); 794cabdff1aSopenharmony_ci } 795cabdff1aSopenharmony_ci } else { 796cabdff1aSopenharmony_ci infer(feature_enabled[i][j], ref_feature_enabled[j]); 797cabdff1aSopenharmony_ci infer(feature_value[i][j], ref_feature_value[j]); 798cabdff1aSopenharmony_ci } 799cabdff1aSopenharmony_ci } 800cabdff1aSopenharmony_ci } 801cabdff1aSopenharmony_ci } else { 802cabdff1aSopenharmony_ci for (i = 0; i < AV1_MAX_SEGMENTS; i++) { 803cabdff1aSopenharmony_ci for (j = 0; j < AV1_SEG_LVL_MAX; j++) { 804cabdff1aSopenharmony_ci infer(feature_enabled[i][j], 0); 805cabdff1aSopenharmony_ci infer(feature_value[i][j], 0); 806cabdff1aSopenharmony_ci } 807cabdff1aSopenharmony_ci } 808cabdff1aSopenharmony_ci } 809cabdff1aSopenharmony_ci 810cabdff1aSopenharmony_ci return 0; 811cabdff1aSopenharmony_ci} 812cabdff1aSopenharmony_ci 813cabdff1aSopenharmony_cistatic int FUNC(delta_q_params)(CodedBitstreamContext *ctx, RWContext *rw, 814cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 815cabdff1aSopenharmony_ci{ 816cabdff1aSopenharmony_ci int err; 817cabdff1aSopenharmony_ci 818cabdff1aSopenharmony_ci if (current->base_q_idx > 0) 819cabdff1aSopenharmony_ci flag(delta_q_present); 820cabdff1aSopenharmony_ci else 821cabdff1aSopenharmony_ci infer(delta_q_present, 0); 822cabdff1aSopenharmony_ci 823cabdff1aSopenharmony_ci if (current->delta_q_present) 824cabdff1aSopenharmony_ci fb(2, delta_q_res); 825cabdff1aSopenharmony_ci 826cabdff1aSopenharmony_ci return 0; 827cabdff1aSopenharmony_ci} 828cabdff1aSopenharmony_ci 829cabdff1aSopenharmony_cistatic int FUNC(delta_lf_params)(CodedBitstreamContext *ctx, RWContext *rw, 830cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 831cabdff1aSopenharmony_ci{ 832cabdff1aSopenharmony_ci int err; 833cabdff1aSopenharmony_ci 834cabdff1aSopenharmony_ci if (current->delta_q_present) { 835cabdff1aSopenharmony_ci if (!current->allow_intrabc) 836cabdff1aSopenharmony_ci flag(delta_lf_present); 837cabdff1aSopenharmony_ci else 838cabdff1aSopenharmony_ci infer(delta_lf_present, 0); 839cabdff1aSopenharmony_ci if (current->delta_lf_present) { 840cabdff1aSopenharmony_ci fb(2, delta_lf_res); 841cabdff1aSopenharmony_ci flag(delta_lf_multi); 842cabdff1aSopenharmony_ci } else { 843cabdff1aSopenharmony_ci infer(delta_lf_res, 0); 844cabdff1aSopenharmony_ci infer(delta_lf_multi, 0); 845cabdff1aSopenharmony_ci } 846cabdff1aSopenharmony_ci } else { 847cabdff1aSopenharmony_ci infer(delta_lf_present, 0); 848cabdff1aSopenharmony_ci infer(delta_lf_res, 0); 849cabdff1aSopenharmony_ci infer(delta_lf_multi, 0); 850cabdff1aSopenharmony_ci } 851cabdff1aSopenharmony_ci 852cabdff1aSopenharmony_ci return 0; 853cabdff1aSopenharmony_ci} 854cabdff1aSopenharmony_ci 855cabdff1aSopenharmony_cistatic int FUNC(loop_filter_params)(CodedBitstreamContext *ctx, RWContext *rw, 856cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 857cabdff1aSopenharmony_ci{ 858cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 859cabdff1aSopenharmony_ci static const int8_t default_loop_filter_ref_deltas[AV1_TOTAL_REFS_PER_FRAME] = 860cabdff1aSopenharmony_ci { 1, 0, 0, 0, -1, 0, -1, -1 }; 861cabdff1aSopenharmony_ci static const int8_t default_loop_filter_mode_deltas[2] = { 0, 0 }; 862cabdff1aSopenharmony_ci int i, err; 863cabdff1aSopenharmony_ci 864cabdff1aSopenharmony_ci if (priv->coded_lossless || current->allow_intrabc) { 865cabdff1aSopenharmony_ci infer(loop_filter_level[0], 0); 866cabdff1aSopenharmony_ci infer(loop_filter_level[1], 0); 867cabdff1aSopenharmony_ci infer(loop_filter_ref_deltas[AV1_REF_FRAME_INTRA], 1); 868cabdff1aSopenharmony_ci infer(loop_filter_ref_deltas[AV1_REF_FRAME_LAST], 0); 869cabdff1aSopenharmony_ci infer(loop_filter_ref_deltas[AV1_REF_FRAME_LAST2], 0); 870cabdff1aSopenharmony_ci infer(loop_filter_ref_deltas[AV1_REF_FRAME_LAST3], 0); 871cabdff1aSopenharmony_ci infer(loop_filter_ref_deltas[AV1_REF_FRAME_BWDREF], 0); 872cabdff1aSopenharmony_ci infer(loop_filter_ref_deltas[AV1_REF_FRAME_GOLDEN], -1); 873cabdff1aSopenharmony_ci infer(loop_filter_ref_deltas[AV1_REF_FRAME_ALTREF], -1); 874cabdff1aSopenharmony_ci infer(loop_filter_ref_deltas[AV1_REF_FRAME_ALTREF2], -1); 875cabdff1aSopenharmony_ci for (i = 0; i < 2; i++) 876cabdff1aSopenharmony_ci infer(loop_filter_mode_deltas[i], 0); 877cabdff1aSopenharmony_ci return 0; 878cabdff1aSopenharmony_ci } 879cabdff1aSopenharmony_ci 880cabdff1aSopenharmony_ci fb(6, loop_filter_level[0]); 881cabdff1aSopenharmony_ci fb(6, loop_filter_level[1]); 882cabdff1aSopenharmony_ci 883cabdff1aSopenharmony_ci if (priv->num_planes > 1) { 884cabdff1aSopenharmony_ci if (current->loop_filter_level[0] || 885cabdff1aSopenharmony_ci current->loop_filter_level[1]) { 886cabdff1aSopenharmony_ci fb(6, loop_filter_level[2]); 887cabdff1aSopenharmony_ci fb(6, loop_filter_level[3]); 888cabdff1aSopenharmony_ci } 889cabdff1aSopenharmony_ci } 890cabdff1aSopenharmony_ci 891cabdff1aSopenharmony_ci fb(3, loop_filter_sharpness); 892cabdff1aSopenharmony_ci 893cabdff1aSopenharmony_ci flag(loop_filter_delta_enabled); 894cabdff1aSopenharmony_ci if (current->loop_filter_delta_enabled) { 895cabdff1aSopenharmony_ci const int8_t *ref_loop_filter_ref_deltas, *ref_loop_filter_mode_deltas; 896cabdff1aSopenharmony_ci 897cabdff1aSopenharmony_ci if (current->primary_ref_frame == AV1_PRIMARY_REF_NONE) { 898cabdff1aSopenharmony_ci ref_loop_filter_ref_deltas = default_loop_filter_ref_deltas; 899cabdff1aSopenharmony_ci ref_loop_filter_mode_deltas = default_loop_filter_mode_deltas; 900cabdff1aSopenharmony_ci } else { 901cabdff1aSopenharmony_ci ref_loop_filter_ref_deltas = 902cabdff1aSopenharmony_ci priv->ref[current->ref_frame_idx[current->primary_ref_frame]].loop_filter_ref_deltas; 903cabdff1aSopenharmony_ci ref_loop_filter_mode_deltas = 904cabdff1aSopenharmony_ci priv->ref[current->ref_frame_idx[current->primary_ref_frame]].loop_filter_mode_deltas; 905cabdff1aSopenharmony_ci } 906cabdff1aSopenharmony_ci 907cabdff1aSopenharmony_ci flag(loop_filter_delta_update); 908cabdff1aSopenharmony_ci for (i = 0; i < AV1_TOTAL_REFS_PER_FRAME; i++) { 909cabdff1aSopenharmony_ci if (current->loop_filter_delta_update) 910cabdff1aSopenharmony_ci flags(update_ref_delta[i], 1, i); 911cabdff1aSopenharmony_ci else 912cabdff1aSopenharmony_ci infer(update_ref_delta[i], 0); 913cabdff1aSopenharmony_ci if (current->update_ref_delta[i]) 914cabdff1aSopenharmony_ci sus(1 + 6, loop_filter_ref_deltas[i], 1, i); 915cabdff1aSopenharmony_ci else 916cabdff1aSopenharmony_ci infer(loop_filter_ref_deltas[i], ref_loop_filter_ref_deltas[i]); 917cabdff1aSopenharmony_ci } 918cabdff1aSopenharmony_ci for (i = 0; i < 2; i++) { 919cabdff1aSopenharmony_ci if (current->loop_filter_delta_update) 920cabdff1aSopenharmony_ci flags(update_mode_delta[i], 1, i); 921cabdff1aSopenharmony_ci else 922cabdff1aSopenharmony_ci infer(update_mode_delta[i], 0); 923cabdff1aSopenharmony_ci if (current->update_mode_delta[i]) 924cabdff1aSopenharmony_ci sus(1 + 6, loop_filter_mode_deltas[i], 1, i); 925cabdff1aSopenharmony_ci else 926cabdff1aSopenharmony_ci infer(loop_filter_mode_deltas[i], ref_loop_filter_mode_deltas[i]); 927cabdff1aSopenharmony_ci } 928cabdff1aSopenharmony_ci } else { 929cabdff1aSopenharmony_ci for (i = 0; i < AV1_TOTAL_REFS_PER_FRAME; i++) 930cabdff1aSopenharmony_ci infer(loop_filter_ref_deltas[i], default_loop_filter_ref_deltas[i]); 931cabdff1aSopenharmony_ci for (i = 0; i < 2; i++) 932cabdff1aSopenharmony_ci infer(loop_filter_mode_deltas[i], default_loop_filter_mode_deltas[i]); 933cabdff1aSopenharmony_ci } 934cabdff1aSopenharmony_ci 935cabdff1aSopenharmony_ci return 0; 936cabdff1aSopenharmony_ci} 937cabdff1aSopenharmony_ci 938cabdff1aSopenharmony_cistatic int FUNC(cdef_params)(CodedBitstreamContext *ctx, RWContext *rw, 939cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 940cabdff1aSopenharmony_ci{ 941cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 942cabdff1aSopenharmony_ci const AV1RawSequenceHeader *seq = priv->sequence_header; 943cabdff1aSopenharmony_ci int i, err; 944cabdff1aSopenharmony_ci 945cabdff1aSopenharmony_ci if (priv->coded_lossless || current->allow_intrabc || 946cabdff1aSopenharmony_ci !seq->enable_cdef) { 947cabdff1aSopenharmony_ci infer(cdef_damping_minus_3, 0); 948cabdff1aSopenharmony_ci infer(cdef_bits, 0); 949cabdff1aSopenharmony_ci infer(cdef_y_pri_strength[0], 0); 950cabdff1aSopenharmony_ci infer(cdef_y_sec_strength[0], 0); 951cabdff1aSopenharmony_ci infer(cdef_uv_pri_strength[0], 0); 952cabdff1aSopenharmony_ci infer(cdef_uv_sec_strength[0], 0); 953cabdff1aSopenharmony_ci 954cabdff1aSopenharmony_ci return 0; 955cabdff1aSopenharmony_ci } 956cabdff1aSopenharmony_ci 957cabdff1aSopenharmony_ci fb(2, cdef_damping_minus_3); 958cabdff1aSopenharmony_ci fb(2, cdef_bits); 959cabdff1aSopenharmony_ci 960cabdff1aSopenharmony_ci for (i = 0; i < (1 << current->cdef_bits); i++) { 961cabdff1aSopenharmony_ci fbs(4, cdef_y_pri_strength[i], 1, i); 962cabdff1aSopenharmony_ci fbs(2, cdef_y_sec_strength[i], 1, i); 963cabdff1aSopenharmony_ci 964cabdff1aSopenharmony_ci if (priv->num_planes > 1) { 965cabdff1aSopenharmony_ci fbs(4, cdef_uv_pri_strength[i], 1, i); 966cabdff1aSopenharmony_ci fbs(2, cdef_uv_sec_strength[i], 1, i); 967cabdff1aSopenharmony_ci } 968cabdff1aSopenharmony_ci } 969cabdff1aSopenharmony_ci 970cabdff1aSopenharmony_ci return 0; 971cabdff1aSopenharmony_ci} 972cabdff1aSopenharmony_ci 973cabdff1aSopenharmony_cistatic int FUNC(lr_params)(CodedBitstreamContext *ctx, RWContext *rw, 974cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 975cabdff1aSopenharmony_ci{ 976cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 977cabdff1aSopenharmony_ci const AV1RawSequenceHeader *seq = priv->sequence_header; 978cabdff1aSopenharmony_ci int uses_lr, uses_chroma_lr; 979cabdff1aSopenharmony_ci int i, err; 980cabdff1aSopenharmony_ci 981cabdff1aSopenharmony_ci if (priv->all_lossless || current->allow_intrabc || 982cabdff1aSopenharmony_ci !seq->enable_restoration) { 983cabdff1aSopenharmony_ci return 0; 984cabdff1aSopenharmony_ci } 985cabdff1aSopenharmony_ci 986cabdff1aSopenharmony_ci uses_lr = uses_chroma_lr = 0; 987cabdff1aSopenharmony_ci for (i = 0; i < priv->num_planes; i++) { 988cabdff1aSopenharmony_ci fbs(2, lr_type[i], 1, i); 989cabdff1aSopenharmony_ci 990cabdff1aSopenharmony_ci if (current->lr_type[i] != AV1_RESTORE_NONE) { 991cabdff1aSopenharmony_ci uses_lr = 1; 992cabdff1aSopenharmony_ci if (i > 0) 993cabdff1aSopenharmony_ci uses_chroma_lr = 1; 994cabdff1aSopenharmony_ci } 995cabdff1aSopenharmony_ci } 996cabdff1aSopenharmony_ci 997cabdff1aSopenharmony_ci if (uses_lr) { 998cabdff1aSopenharmony_ci if (seq->use_128x128_superblock) 999cabdff1aSopenharmony_ci increment(lr_unit_shift, 1, 2); 1000cabdff1aSopenharmony_ci else 1001cabdff1aSopenharmony_ci increment(lr_unit_shift, 0, 2); 1002cabdff1aSopenharmony_ci 1003cabdff1aSopenharmony_ci if(seq->color_config.subsampling_x && 1004cabdff1aSopenharmony_ci seq->color_config.subsampling_y && uses_chroma_lr) { 1005cabdff1aSopenharmony_ci fb(1, lr_uv_shift); 1006cabdff1aSopenharmony_ci } else { 1007cabdff1aSopenharmony_ci infer(lr_uv_shift, 0); 1008cabdff1aSopenharmony_ci } 1009cabdff1aSopenharmony_ci } 1010cabdff1aSopenharmony_ci 1011cabdff1aSopenharmony_ci return 0; 1012cabdff1aSopenharmony_ci} 1013cabdff1aSopenharmony_ci 1014cabdff1aSopenharmony_cistatic int FUNC(read_tx_mode)(CodedBitstreamContext *ctx, RWContext *rw, 1015cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 1016cabdff1aSopenharmony_ci{ 1017cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 1018cabdff1aSopenharmony_ci int err; 1019cabdff1aSopenharmony_ci 1020cabdff1aSopenharmony_ci if (priv->coded_lossless) 1021cabdff1aSopenharmony_ci infer(tx_mode, 0); 1022cabdff1aSopenharmony_ci else 1023cabdff1aSopenharmony_ci increment(tx_mode, 1, 2); 1024cabdff1aSopenharmony_ci 1025cabdff1aSopenharmony_ci return 0; 1026cabdff1aSopenharmony_ci} 1027cabdff1aSopenharmony_ci 1028cabdff1aSopenharmony_cistatic int FUNC(frame_reference_mode)(CodedBitstreamContext *ctx, RWContext *rw, 1029cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 1030cabdff1aSopenharmony_ci{ 1031cabdff1aSopenharmony_ci int err; 1032cabdff1aSopenharmony_ci 1033cabdff1aSopenharmony_ci if (current->frame_type == AV1_FRAME_INTRA_ONLY || 1034cabdff1aSopenharmony_ci current->frame_type == AV1_FRAME_KEY) 1035cabdff1aSopenharmony_ci infer(reference_select, 0); 1036cabdff1aSopenharmony_ci else 1037cabdff1aSopenharmony_ci flag(reference_select); 1038cabdff1aSopenharmony_ci 1039cabdff1aSopenharmony_ci return 0; 1040cabdff1aSopenharmony_ci} 1041cabdff1aSopenharmony_ci 1042cabdff1aSopenharmony_cistatic int FUNC(skip_mode_params)(CodedBitstreamContext *ctx, RWContext *rw, 1043cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 1044cabdff1aSopenharmony_ci{ 1045cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 1046cabdff1aSopenharmony_ci const AV1RawSequenceHeader *seq = priv->sequence_header; 1047cabdff1aSopenharmony_ci int skip_mode_allowed; 1048cabdff1aSopenharmony_ci int err; 1049cabdff1aSopenharmony_ci 1050cabdff1aSopenharmony_ci if (current->frame_type == AV1_FRAME_KEY || 1051cabdff1aSopenharmony_ci current->frame_type == AV1_FRAME_INTRA_ONLY || 1052cabdff1aSopenharmony_ci !current->reference_select || !seq->enable_order_hint) { 1053cabdff1aSopenharmony_ci skip_mode_allowed = 0; 1054cabdff1aSopenharmony_ci } else { 1055cabdff1aSopenharmony_ci int forward_idx, backward_idx; 1056cabdff1aSopenharmony_ci int forward_hint, backward_hint; 1057cabdff1aSopenharmony_ci int ref_hint, dist, i; 1058cabdff1aSopenharmony_ci 1059cabdff1aSopenharmony_ci forward_idx = -1; 1060cabdff1aSopenharmony_ci backward_idx = -1; 1061cabdff1aSopenharmony_ci for (i = 0; i < AV1_REFS_PER_FRAME; i++) { 1062cabdff1aSopenharmony_ci ref_hint = priv->ref[current->ref_frame_idx[i]].order_hint; 1063cabdff1aSopenharmony_ci dist = cbs_av1_get_relative_dist(seq, ref_hint, 1064cabdff1aSopenharmony_ci priv->order_hint); 1065cabdff1aSopenharmony_ci if (dist < 0) { 1066cabdff1aSopenharmony_ci if (forward_idx < 0 || 1067cabdff1aSopenharmony_ci cbs_av1_get_relative_dist(seq, ref_hint, 1068cabdff1aSopenharmony_ci forward_hint) > 0) { 1069cabdff1aSopenharmony_ci forward_idx = i; 1070cabdff1aSopenharmony_ci forward_hint = ref_hint; 1071cabdff1aSopenharmony_ci } 1072cabdff1aSopenharmony_ci } else if (dist > 0) { 1073cabdff1aSopenharmony_ci if (backward_idx < 0 || 1074cabdff1aSopenharmony_ci cbs_av1_get_relative_dist(seq, ref_hint, 1075cabdff1aSopenharmony_ci backward_hint) < 0) { 1076cabdff1aSopenharmony_ci backward_idx = i; 1077cabdff1aSopenharmony_ci backward_hint = ref_hint; 1078cabdff1aSopenharmony_ci } 1079cabdff1aSopenharmony_ci } 1080cabdff1aSopenharmony_ci } 1081cabdff1aSopenharmony_ci 1082cabdff1aSopenharmony_ci if (forward_idx < 0) { 1083cabdff1aSopenharmony_ci skip_mode_allowed = 0; 1084cabdff1aSopenharmony_ci } else if (backward_idx >= 0) { 1085cabdff1aSopenharmony_ci skip_mode_allowed = 1; 1086cabdff1aSopenharmony_ci // Frames for skip mode are forward_idx and backward_idx. 1087cabdff1aSopenharmony_ci } else { 1088cabdff1aSopenharmony_ci int second_forward_idx; 1089cabdff1aSopenharmony_ci int second_forward_hint; 1090cabdff1aSopenharmony_ci 1091cabdff1aSopenharmony_ci second_forward_idx = -1; 1092cabdff1aSopenharmony_ci for (i = 0; i < AV1_REFS_PER_FRAME; i++) { 1093cabdff1aSopenharmony_ci ref_hint = priv->ref[current->ref_frame_idx[i]].order_hint; 1094cabdff1aSopenharmony_ci if (cbs_av1_get_relative_dist(seq, ref_hint, 1095cabdff1aSopenharmony_ci forward_hint) < 0) { 1096cabdff1aSopenharmony_ci if (second_forward_idx < 0 || 1097cabdff1aSopenharmony_ci cbs_av1_get_relative_dist(seq, ref_hint, 1098cabdff1aSopenharmony_ci second_forward_hint) > 0) { 1099cabdff1aSopenharmony_ci second_forward_idx = i; 1100cabdff1aSopenharmony_ci second_forward_hint = ref_hint; 1101cabdff1aSopenharmony_ci } 1102cabdff1aSopenharmony_ci } 1103cabdff1aSopenharmony_ci } 1104cabdff1aSopenharmony_ci 1105cabdff1aSopenharmony_ci if (second_forward_idx < 0) { 1106cabdff1aSopenharmony_ci skip_mode_allowed = 0; 1107cabdff1aSopenharmony_ci } else { 1108cabdff1aSopenharmony_ci skip_mode_allowed = 1; 1109cabdff1aSopenharmony_ci // Frames for skip mode are forward_idx and second_forward_idx. 1110cabdff1aSopenharmony_ci } 1111cabdff1aSopenharmony_ci } 1112cabdff1aSopenharmony_ci } 1113cabdff1aSopenharmony_ci 1114cabdff1aSopenharmony_ci if (skip_mode_allowed) 1115cabdff1aSopenharmony_ci flag(skip_mode_present); 1116cabdff1aSopenharmony_ci else 1117cabdff1aSopenharmony_ci infer(skip_mode_present, 0); 1118cabdff1aSopenharmony_ci 1119cabdff1aSopenharmony_ci return 0; 1120cabdff1aSopenharmony_ci} 1121cabdff1aSopenharmony_ci 1122cabdff1aSopenharmony_cistatic int FUNC(global_motion_param)(CodedBitstreamContext *ctx, RWContext *rw, 1123cabdff1aSopenharmony_ci AV1RawFrameHeader *current, 1124cabdff1aSopenharmony_ci int type, int ref, int idx) 1125cabdff1aSopenharmony_ci{ 1126cabdff1aSopenharmony_ci uint32_t abs_bits, prec_bits, num_syms; 1127cabdff1aSopenharmony_ci int err; 1128cabdff1aSopenharmony_ci 1129cabdff1aSopenharmony_ci if (idx < 2) { 1130cabdff1aSopenharmony_ci if (type == AV1_WARP_MODEL_TRANSLATION) { 1131cabdff1aSopenharmony_ci abs_bits = AV1_GM_ABS_TRANS_ONLY_BITS - !current->allow_high_precision_mv; 1132cabdff1aSopenharmony_ci prec_bits = AV1_GM_TRANS_ONLY_PREC_BITS - !current->allow_high_precision_mv; 1133cabdff1aSopenharmony_ci } else { 1134cabdff1aSopenharmony_ci abs_bits = AV1_GM_ABS_TRANS_BITS; 1135cabdff1aSopenharmony_ci prec_bits = AV1_GM_TRANS_PREC_BITS; 1136cabdff1aSopenharmony_ci } 1137cabdff1aSopenharmony_ci } else { 1138cabdff1aSopenharmony_ci abs_bits = AV1_GM_ABS_ALPHA_BITS; 1139cabdff1aSopenharmony_ci prec_bits = AV1_GM_ALPHA_PREC_BITS; 1140cabdff1aSopenharmony_ci } 1141cabdff1aSopenharmony_ci 1142cabdff1aSopenharmony_ci num_syms = 2 * (1 << abs_bits) + 1; 1143cabdff1aSopenharmony_ci subexp(gm_params[ref][idx], num_syms, 2, ref, idx); 1144cabdff1aSopenharmony_ci 1145cabdff1aSopenharmony_ci // Actual gm_params value is not reconstructed here. 1146cabdff1aSopenharmony_ci (void)prec_bits; 1147cabdff1aSopenharmony_ci 1148cabdff1aSopenharmony_ci return 0; 1149cabdff1aSopenharmony_ci} 1150cabdff1aSopenharmony_ci 1151cabdff1aSopenharmony_cistatic int FUNC(global_motion_params)(CodedBitstreamContext *ctx, RWContext *rw, 1152cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 1153cabdff1aSopenharmony_ci{ 1154cabdff1aSopenharmony_ci int ref, type; 1155cabdff1aSopenharmony_ci int err; 1156cabdff1aSopenharmony_ci 1157cabdff1aSopenharmony_ci if (current->frame_type == AV1_FRAME_KEY || 1158cabdff1aSopenharmony_ci current->frame_type == AV1_FRAME_INTRA_ONLY) 1159cabdff1aSopenharmony_ci return 0; 1160cabdff1aSopenharmony_ci 1161cabdff1aSopenharmony_ci for (ref = AV1_REF_FRAME_LAST; ref <= AV1_REF_FRAME_ALTREF; ref++) { 1162cabdff1aSopenharmony_ci flags(is_global[ref], 1, ref); 1163cabdff1aSopenharmony_ci if (current->is_global[ref]) { 1164cabdff1aSopenharmony_ci flags(is_rot_zoom[ref], 1, ref); 1165cabdff1aSopenharmony_ci if (current->is_rot_zoom[ref]) { 1166cabdff1aSopenharmony_ci type = AV1_WARP_MODEL_ROTZOOM; 1167cabdff1aSopenharmony_ci } else { 1168cabdff1aSopenharmony_ci flags(is_translation[ref], 1, ref); 1169cabdff1aSopenharmony_ci type = current->is_translation[ref] ? AV1_WARP_MODEL_TRANSLATION 1170cabdff1aSopenharmony_ci : AV1_WARP_MODEL_AFFINE; 1171cabdff1aSopenharmony_ci } 1172cabdff1aSopenharmony_ci } else { 1173cabdff1aSopenharmony_ci type = AV1_WARP_MODEL_IDENTITY; 1174cabdff1aSopenharmony_ci } 1175cabdff1aSopenharmony_ci 1176cabdff1aSopenharmony_ci if (type >= AV1_WARP_MODEL_ROTZOOM) { 1177cabdff1aSopenharmony_ci CHECK(FUNC(global_motion_param)(ctx, rw, current, type, ref, 2)); 1178cabdff1aSopenharmony_ci CHECK(FUNC(global_motion_param)(ctx, rw, current, type, ref, 3)); 1179cabdff1aSopenharmony_ci if (type == AV1_WARP_MODEL_AFFINE) { 1180cabdff1aSopenharmony_ci CHECK(FUNC(global_motion_param)(ctx, rw, current, type, ref, 4)); 1181cabdff1aSopenharmony_ci CHECK(FUNC(global_motion_param)(ctx, rw, current, type, ref, 5)); 1182cabdff1aSopenharmony_ci } else { 1183cabdff1aSopenharmony_ci // gm_params[ref][4] = -gm_params[ref][3] 1184cabdff1aSopenharmony_ci // gm_params[ref][5] = gm_params[ref][2] 1185cabdff1aSopenharmony_ci } 1186cabdff1aSopenharmony_ci } 1187cabdff1aSopenharmony_ci if (type >= AV1_WARP_MODEL_TRANSLATION) { 1188cabdff1aSopenharmony_ci CHECK(FUNC(global_motion_param)(ctx, rw, current, type, ref, 0)); 1189cabdff1aSopenharmony_ci CHECK(FUNC(global_motion_param)(ctx, rw, current, type, ref, 1)); 1190cabdff1aSopenharmony_ci } 1191cabdff1aSopenharmony_ci } 1192cabdff1aSopenharmony_ci 1193cabdff1aSopenharmony_ci return 0; 1194cabdff1aSopenharmony_ci} 1195cabdff1aSopenharmony_ci 1196cabdff1aSopenharmony_cistatic int FUNC(film_grain_params)(CodedBitstreamContext *ctx, RWContext *rw, 1197cabdff1aSopenharmony_ci AV1RawFilmGrainParams *current, 1198cabdff1aSopenharmony_ci AV1RawFrameHeader *frame_header) 1199cabdff1aSopenharmony_ci{ 1200cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 1201cabdff1aSopenharmony_ci const AV1RawSequenceHeader *seq = priv->sequence_header; 1202cabdff1aSopenharmony_ci int num_pos_luma, num_pos_chroma; 1203cabdff1aSopenharmony_ci int i, err; 1204cabdff1aSopenharmony_ci 1205cabdff1aSopenharmony_ci if (!seq->film_grain_params_present || 1206cabdff1aSopenharmony_ci (!frame_header->show_frame && !frame_header->showable_frame)) 1207cabdff1aSopenharmony_ci return 0; 1208cabdff1aSopenharmony_ci 1209cabdff1aSopenharmony_ci flag(apply_grain); 1210cabdff1aSopenharmony_ci 1211cabdff1aSopenharmony_ci if (!current->apply_grain) 1212cabdff1aSopenharmony_ci return 0; 1213cabdff1aSopenharmony_ci 1214cabdff1aSopenharmony_ci fb(16, grain_seed); 1215cabdff1aSopenharmony_ci 1216cabdff1aSopenharmony_ci if (frame_header->frame_type == AV1_FRAME_INTER) 1217cabdff1aSopenharmony_ci flag(update_grain); 1218cabdff1aSopenharmony_ci else 1219cabdff1aSopenharmony_ci infer(update_grain, 1); 1220cabdff1aSopenharmony_ci 1221cabdff1aSopenharmony_ci if (!current->update_grain) { 1222cabdff1aSopenharmony_ci fb(3, film_grain_params_ref_idx); 1223cabdff1aSopenharmony_ci return 0; 1224cabdff1aSopenharmony_ci } 1225cabdff1aSopenharmony_ci 1226cabdff1aSopenharmony_ci fc(4, num_y_points, 0, 14); 1227cabdff1aSopenharmony_ci for (i = 0; i < current->num_y_points; i++) { 1228cabdff1aSopenharmony_ci fcs(8, point_y_value[i], 1229cabdff1aSopenharmony_ci i ? current->point_y_value[i - 1] + 1 : 0, 1230cabdff1aSopenharmony_ci MAX_UINT_BITS(8) - (current->num_y_points - i - 1), 1231cabdff1aSopenharmony_ci 1, i); 1232cabdff1aSopenharmony_ci fbs(8, point_y_scaling[i], 1, i); 1233cabdff1aSopenharmony_ci } 1234cabdff1aSopenharmony_ci 1235cabdff1aSopenharmony_ci if (seq->color_config.mono_chrome) 1236cabdff1aSopenharmony_ci infer(chroma_scaling_from_luma, 0); 1237cabdff1aSopenharmony_ci else 1238cabdff1aSopenharmony_ci flag(chroma_scaling_from_luma); 1239cabdff1aSopenharmony_ci 1240cabdff1aSopenharmony_ci if (seq->color_config.mono_chrome || 1241cabdff1aSopenharmony_ci current->chroma_scaling_from_luma || 1242cabdff1aSopenharmony_ci (seq->color_config.subsampling_x == 1 && 1243cabdff1aSopenharmony_ci seq->color_config.subsampling_y == 1 && 1244cabdff1aSopenharmony_ci current->num_y_points == 0)) { 1245cabdff1aSopenharmony_ci infer(num_cb_points, 0); 1246cabdff1aSopenharmony_ci infer(num_cr_points, 0); 1247cabdff1aSopenharmony_ci } else { 1248cabdff1aSopenharmony_ci fc(4, num_cb_points, 0, 10); 1249cabdff1aSopenharmony_ci for (i = 0; i < current->num_cb_points; i++) { 1250cabdff1aSopenharmony_ci fcs(8, point_cb_value[i], 1251cabdff1aSopenharmony_ci i ? current->point_cb_value[i - 1] + 1 : 0, 1252cabdff1aSopenharmony_ci MAX_UINT_BITS(8) - (current->num_cb_points - i - 1), 1253cabdff1aSopenharmony_ci 1, i); 1254cabdff1aSopenharmony_ci fbs(8, point_cb_scaling[i], 1, i); 1255cabdff1aSopenharmony_ci } 1256cabdff1aSopenharmony_ci fc(4, num_cr_points, 0, 10); 1257cabdff1aSopenharmony_ci for (i = 0; i < current->num_cr_points; i++) { 1258cabdff1aSopenharmony_ci fcs(8, point_cr_value[i], 1259cabdff1aSopenharmony_ci i ? current->point_cr_value[i - 1] + 1 : 0, 1260cabdff1aSopenharmony_ci MAX_UINT_BITS(8) - (current->num_cr_points - i - 1), 1261cabdff1aSopenharmony_ci 1, i); 1262cabdff1aSopenharmony_ci fbs(8, point_cr_scaling[i], 1, i); 1263cabdff1aSopenharmony_ci } 1264cabdff1aSopenharmony_ci } 1265cabdff1aSopenharmony_ci 1266cabdff1aSopenharmony_ci fb(2, grain_scaling_minus_8); 1267cabdff1aSopenharmony_ci fb(2, ar_coeff_lag); 1268cabdff1aSopenharmony_ci num_pos_luma = 2 * current->ar_coeff_lag * (current->ar_coeff_lag + 1); 1269cabdff1aSopenharmony_ci if (current->num_y_points) { 1270cabdff1aSopenharmony_ci num_pos_chroma = num_pos_luma + 1; 1271cabdff1aSopenharmony_ci for (i = 0; i < num_pos_luma; i++) 1272cabdff1aSopenharmony_ci fbs(8, ar_coeffs_y_plus_128[i], 1, i); 1273cabdff1aSopenharmony_ci } else { 1274cabdff1aSopenharmony_ci num_pos_chroma = num_pos_luma; 1275cabdff1aSopenharmony_ci } 1276cabdff1aSopenharmony_ci if (current->chroma_scaling_from_luma || current->num_cb_points) { 1277cabdff1aSopenharmony_ci for (i = 0; i < num_pos_chroma; i++) 1278cabdff1aSopenharmony_ci fbs(8, ar_coeffs_cb_plus_128[i], 1, i); 1279cabdff1aSopenharmony_ci } 1280cabdff1aSopenharmony_ci if (current->chroma_scaling_from_luma || current->num_cr_points) { 1281cabdff1aSopenharmony_ci for (i = 0; i < num_pos_chroma; i++) 1282cabdff1aSopenharmony_ci fbs(8, ar_coeffs_cr_plus_128[i], 1, i); 1283cabdff1aSopenharmony_ci } 1284cabdff1aSopenharmony_ci fb(2, ar_coeff_shift_minus_6); 1285cabdff1aSopenharmony_ci fb(2, grain_scale_shift); 1286cabdff1aSopenharmony_ci if (current->num_cb_points) { 1287cabdff1aSopenharmony_ci fb(8, cb_mult); 1288cabdff1aSopenharmony_ci fb(8, cb_luma_mult); 1289cabdff1aSopenharmony_ci fb(9, cb_offset); 1290cabdff1aSopenharmony_ci } 1291cabdff1aSopenharmony_ci if (current->num_cr_points) { 1292cabdff1aSopenharmony_ci fb(8, cr_mult); 1293cabdff1aSopenharmony_ci fb(8, cr_luma_mult); 1294cabdff1aSopenharmony_ci fb(9, cr_offset); 1295cabdff1aSopenharmony_ci } 1296cabdff1aSopenharmony_ci 1297cabdff1aSopenharmony_ci flag(overlap_flag); 1298cabdff1aSopenharmony_ci flag(clip_to_restricted_range); 1299cabdff1aSopenharmony_ci 1300cabdff1aSopenharmony_ci return 0; 1301cabdff1aSopenharmony_ci} 1302cabdff1aSopenharmony_ci 1303cabdff1aSopenharmony_cistatic int FUNC(uncompressed_header)(CodedBitstreamContext *ctx, RWContext *rw, 1304cabdff1aSopenharmony_ci AV1RawFrameHeader *current) 1305cabdff1aSopenharmony_ci{ 1306cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 1307cabdff1aSopenharmony_ci const AV1RawSequenceHeader *seq; 1308cabdff1aSopenharmony_ci int id_len, diff_len, all_frames, frame_is_intra, order_hint_bits; 1309cabdff1aSopenharmony_ci int i, err; 1310cabdff1aSopenharmony_ci 1311cabdff1aSopenharmony_ci if (!priv->sequence_header) { 1312cabdff1aSopenharmony_ci av_log(ctx->log_ctx, AV_LOG_ERROR, "No sequence header available: " 1313cabdff1aSopenharmony_ci "unable to decode frame header.\n"); 1314cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1315cabdff1aSopenharmony_ci } 1316cabdff1aSopenharmony_ci seq = priv->sequence_header; 1317cabdff1aSopenharmony_ci 1318cabdff1aSopenharmony_ci id_len = seq->additional_frame_id_length_minus_1 + 1319cabdff1aSopenharmony_ci seq->delta_frame_id_length_minus_2 + 3; 1320cabdff1aSopenharmony_ci all_frames = (1 << AV1_NUM_REF_FRAMES) - 1; 1321cabdff1aSopenharmony_ci 1322cabdff1aSopenharmony_ci if (seq->reduced_still_picture_header) { 1323cabdff1aSopenharmony_ci infer(show_existing_frame, 0); 1324cabdff1aSopenharmony_ci infer(frame_type, AV1_FRAME_KEY); 1325cabdff1aSopenharmony_ci infer(show_frame, 1); 1326cabdff1aSopenharmony_ci infer(showable_frame, 0); 1327cabdff1aSopenharmony_ci frame_is_intra = 1; 1328cabdff1aSopenharmony_ci 1329cabdff1aSopenharmony_ci } else { 1330cabdff1aSopenharmony_ci flag(show_existing_frame); 1331cabdff1aSopenharmony_ci 1332cabdff1aSopenharmony_ci if (current->show_existing_frame) { 1333cabdff1aSopenharmony_ci AV1ReferenceFrameState *ref; 1334cabdff1aSopenharmony_ci 1335cabdff1aSopenharmony_ci fb(3, frame_to_show_map_idx); 1336cabdff1aSopenharmony_ci ref = &priv->ref[current->frame_to_show_map_idx]; 1337cabdff1aSopenharmony_ci 1338cabdff1aSopenharmony_ci if (!ref->valid) { 1339cabdff1aSopenharmony_ci av_log(ctx->log_ctx, AV_LOG_ERROR, "Missing reference frame needed for " 1340cabdff1aSopenharmony_ci "show_existing_frame (frame_to_show_map_idx = %d).\n", 1341cabdff1aSopenharmony_ci current->frame_to_show_map_idx); 1342cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1343cabdff1aSopenharmony_ci } 1344cabdff1aSopenharmony_ci 1345cabdff1aSopenharmony_ci if (seq->decoder_model_info_present_flag && 1346cabdff1aSopenharmony_ci !seq->timing_info.equal_picture_interval) { 1347cabdff1aSopenharmony_ci fb(seq->decoder_model_info.frame_presentation_time_length_minus_1 + 1, 1348cabdff1aSopenharmony_ci frame_presentation_time); 1349cabdff1aSopenharmony_ci } 1350cabdff1aSopenharmony_ci 1351cabdff1aSopenharmony_ci if (seq->frame_id_numbers_present_flag) 1352cabdff1aSopenharmony_ci fb(id_len, display_frame_id); 1353cabdff1aSopenharmony_ci 1354cabdff1aSopenharmony_ci infer(frame_type, ref->frame_type); 1355cabdff1aSopenharmony_ci if (current->frame_type == AV1_FRAME_KEY) { 1356cabdff1aSopenharmony_ci infer(refresh_frame_flags, all_frames); 1357cabdff1aSopenharmony_ci 1358cabdff1aSopenharmony_ci // Section 7.21 1359cabdff1aSopenharmony_ci infer(current_frame_id, ref->frame_id); 1360cabdff1aSopenharmony_ci priv->upscaled_width = ref->upscaled_width; 1361cabdff1aSopenharmony_ci priv->frame_width = ref->frame_width; 1362cabdff1aSopenharmony_ci priv->frame_height = ref->frame_height; 1363cabdff1aSopenharmony_ci priv->render_width = ref->render_width; 1364cabdff1aSopenharmony_ci priv->render_height = ref->render_height; 1365cabdff1aSopenharmony_ci priv->bit_depth = ref->bit_depth; 1366cabdff1aSopenharmony_ci priv->order_hint = ref->order_hint; 1367cabdff1aSopenharmony_ci } else 1368cabdff1aSopenharmony_ci infer(refresh_frame_flags, 0); 1369cabdff1aSopenharmony_ci 1370cabdff1aSopenharmony_ci infer(frame_width_minus_1, ref->upscaled_width - 1); 1371cabdff1aSopenharmony_ci infer(frame_height_minus_1, ref->frame_height - 1); 1372cabdff1aSopenharmony_ci infer(render_width_minus_1, ref->render_width - 1); 1373cabdff1aSopenharmony_ci infer(render_height_minus_1, ref->render_height - 1); 1374cabdff1aSopenharmony_ci 1375cabdff1aSopenharmony_ci // Section 7.20 1376cabdff1aSopenharmony_ci goto update_refs; 1377cabdff1aSopenharmony_ci } 1378cabdff1aSopenharmony_ci 1379cabdff1aSopenharmony_ci fb(2, frame_type); 1380cabdff1aSopenharmony_ci frame_is_intra = (current->frame_type == AV1_FRAME_INTRA_ONLY || 1381cabdff1aSopenharmony_ci current->frame_type == AV1_FRAME_KEY); 1382cabdff1aSopenharmony_ci 1383cabdff1aSopenharmony_ci flag(show_frame); 1384cabdff1aSopenharmony_ci if (current->show_frame && 1385cabdff1aSopenharmony_ci seq->decoder_model_info_present_flag && 1386cabdff1aSopenharmony_ci !seq->timing_info.equal_picture_interval) { 1387cabdff1aSopenharmony_ci fb(seq->decoder_model_info.frame_presentation_time_length_minus_1 + 1, 1388cabdff1aSopenharmony_ci frame_presentation_time); 1389cabdff1aSopenharmony_ci } 1390cabdff1aSopenharmony_ci if (current->show_frame) 1391cabdff1aSopenharmony_ci infer(showable_frame, current->frame_type != AV1_FRAME_KEY); 1392cabdff1aSopenharmony_ci else 1393cabdff1aSopenharmony_ci flag(showable_frame); 1394cabdff1aSopenharmony_ci 1395cabdff1aSopenharmony_ci if (current->frame_type == AV1_FRAME_SWITCH || 1396cabdff1aSopenharmony_ci (current->frame_type == AV1_FRAME_KEY && current->show_frame)) 1397cabdff1aSopenharmony_ci infer(error_resilient_mode, 1); 1398cabdff1aSopenharmony_ci else 1399cabdff1aSopenharmony_ci flag(error_resilient_mode); 1400cabdff1aSopenharmony_ci } 1401cabdff1aSopenharmony_ci 1402cabdff1aSopenharmony_ci if (current->frame_type == AV1_FRAME_KEY && current->show_frame) { 1403cabdff1aSopenharmony_ci for (i = 0; i < AV1_NUM_REF_FRAMES; i++) { 1404cabdff1aSopenharmony_ci priv->ref[i].valid = 0; 1405cabdff1aSopenharmony_ci priv->ref[i].order_hint = 0; 1406cabdff1aSopenharmony_ci } 1407cabdff1aSopenharmony_ci } 1408cabdff1aSopenharmony_ci 1409cabdff1aSopenharmony_ci flag(disable_cdf_update); 1410cabdff1aSopenharmony_ci 1411cabdff1aSopenharmony_ci if (seq->seq_force_screen_content_tools == 1412cabdff1aSopenharmony_ci AV1_SELECT_SCREEN_CONTENT_TOOLS) { 1413cabdff1aSopenharmony_ci flag(allow_screen_content_tools); 1414cabdff1aSopenharmony_ci } else { 1415cabdff1aSopenharmony_ci infer(allow_screen_content_tools, 1416cabdff1aSopenharmony_ci seq->seq_force_screen_content_tools); 1417cabdff1aSopenharmony_ci } 1418cabdff1aSopenharmony_ci if (current->allow_screen_content_tools) { 1419cabdff1aSopenharmony_ci if (seq->seq_force_integer_mv == AV1_SELECT_INTEGER_MV) 1420cabdff1aSopenharmony_ci flag(force_integer_mv); 1421cabdff1aSopenharmony_ci else 1422cabdff1aSopenharmony_ci infer(force_integer_mv, seq->seq_force_integer_mv); 1423cabdff1aSopenharmony_ci } else { 1424cabdff1aSopenharmony_ci infer(force_integer_mv, 0); 1425cabdff1aSopenharmony_ci } 1426cabdff1aSopenharmony_ci 1427cabdff1aSopenharmony_ci if (seq->frame_id_numbers_present_flag) { 1428cabdff1aSopenharmony_ci fb(id_len, current_frame_id); 1429cabdff1aSopenharmony_ci 1430cabdff1aSopenharmony_ci diff_len = seq->delta_frame_id_length_minus_2 + 2; 1431cabdff1aSopenharmony_ci for (i = 0; i < AV1_NUM_REF_FRAMES; i++) { 1432cabdff1aSopenharmony_ci if (current->current_frame_id > (1 << diff_len)) { 1433cabdff1aSopenharmony_ci if (priv->ref[i].frame_id > current->current_frame_id || 1434cabdff1aSopenharmony_ci priv->ref[i].frame_id < (current->current_frame_id - 1435cabdff1aSopenharmony_ci (1 << diff_len))) 1436cabdff1aSopenharmony_ci priv->ref[i].valid = 0; 1437cabdff1aSopenharmony_ci } else { 1438cabdff1aSopenharmony_ci if (priv->ref[i].frame_id > current->current_frame_id && 1439cabdff1aSopenharmony_ci priv->ref[i].frame_id < ((1 << id_len) + 1440cabdff1aSopenharmony_ci current->current_frame_id - 1441cabdff1aSopenharmony_ci (1 << diff_len))) 1442cabdff1aSopenharmony_ci priv->ref[i].valid = 0; 1443cabdff1aSopenharmony_ci } 1444cabdff1aSopenharmony_ci } 1445cabdff1aSopenharmony_ci } else { 1446cabdff1aSopenharmony_ci infer(current_frame_id, 0); 1447cabdff1aSopenharmony_ci } 1448cabdff1aSopenharmony_ci 1449cabdff1aSopenharmony_ci if (current->frame_type == AV1_FRAME_SWITCH) 1450cabdff1aSopenharmony_ci infer(frame_size_override_flag, 1); 1451cabdff1aSopenharmony_ci else if(seq->reduced_still_picture_header) 1452cabdff1aSopenharmony_ci infer(frame_size_override_flag, 0); 1453cabdff1aSopenharmony_ci else 1454cabdff1aSopenharmony_ci flag(frame_size_override_flag); 1455cabdff1aSopenharmony_ci 1456cabdff1aSopenharmony_ci order_hint_bits = 1457cabdff1aSopenharmony_ci seq->enable_order_hint ? seq->order_hint_bits_minus_1 + 1 : 0; 1458cabdff1aSopenharmony_ci if (order_hint_bits > 0) 1459cabdff1aSopenharmony_ci fb(order_hint_bits, order_hint); 1460cabdff1aSopenharmony_ci else 1461cabdff1aSopenharmony_ci infer(order_hint, 0); 1462cabdff1aSopenharmony_ci priv->order_hint = current->order_hint; 1463cabdff1aSopenharmony_ci 1464cabdff1aSopenharmony_ci if (frame_is_intra || current->error_resilient_mode) 1465cabdff1aSopenharmony_ci infer(primary_ref_frame, AV1_PRIMARY_REF_NONE); 1466cabdff1aSopenharmony_ci else 1467cabdff1aSopenharmony_ci fb(3, primary_ref_frame); 1468cabdff1aSopenharmony_ci 1469cabdff1aSopenharmony_ci if (seq->decoder_model_info_present_flag) { 1470cabdff1aSopenharmony_ci flag(buffer_removal_time_present_flag); 1471cabdff1aSopenharmony_ci if (current->buffer_removal_time_present_flag) { 1472cabdff1aSopenharmony_ci for (i = 0; i <= seq->operating_points_cnt_minus_1; i++) { 1473cabdff1aSopenharmony_ci if (seq->decoder_model_present_for_this_op[i]) { 1474cabdff1aSopenharmony_ci int op_pt_idc = seq->operating_point_idc[i]; 1475cabdff1aSopenharmony_ci int in_temporal_layer = (op_pt_idc >> priv->temporal_id ) & 1; 1476cabdff1aSopenharmony_ci int in_spatial_layer = (op_pt_idc >> (priv->spatial_id + 8)) & 1; 1477cabdff1aSopenharmony_ci if (seq->operating_point_idc[i] == 0 || 1478cabdff1aSopenharmony_ci (in_temporal_layer && in_spatial_layer)) { 1479cabdff1aSopenharmony_ci fbs(seq->decoder_model_info.buffer_removal_time_length_minus_1 + 1, 1480cabdff1aSopenharmony_ci buffer_removal_time[i], 1, i); 1481cabdff1aSopenharmony_ci } 1482cabdff1aSopenharmony_ci } 1483cabdff1aSopenharmony_ci } 1484cabdff1aSopenharmony_ci } 1485cabdff1aSopenharmony_ci } 1486cabdff1aSopenharmony_ci 1487cabdff1aSopenharmony_ci if (current->frame_type == AV1_FRAME_SWITCH || 1488cabdff1aSopenharmony_ci (current->frame_type == AV1_FRAME_KEY && current->show_frame)) 1489cabdff1aSopenharmony_ci infer(refresh_frame_flags, all_frames); 1490cabdff1aSopenharmony_ci else 1491cabdff1aSopenharmony_ci fb(8, refresh_frame_flags); 1492cabdff1aSopenharmony_ci 1493cabdff1aSopenharmony_ci if (!frame_is_intra || current->refresh_frame_flags != all_frames) { 1494cabdff1aSopenharmony_ci if (seq->enable_order_hint) { 1495cabdff1aSopenharmony_ci for (i = 0; i < AV1_NUM_REF_FRAMES; i++) { 1496cabdff1aSopenharmony_ci if (current->error_resilient_mode) 1497cabdff1aSopenharmony_ci fbs(order_hint_bits, ref_order_hint[i], 1, i); 1498cabdff1aSopenharmony_ci else 1499cabdff1aSopenharmony_ci infer(ref_order_hint[i], priv->ref[i].order_hint); 1500cabdff1aSopenharmony_ci if (current->ref_order_hint[i] != priv->ref[i].order_hint) 1501cabdff1aSopenharmony_ci priv->ref[i].valid = 0; 1502cabdff1aSopenharmony_ci } 1503cabdff1aSopenharmony_ci } 1504cabdff1aSopenharmony_ci } 1505cabdff1aSopenharmony_ci 1506cabdff1aSopenharmony_ci if (current->frame_type == AV1_FRAME_KEY || 1507cabdff1aSopenharmony_ci current->frame_type == AV1_FRAME_INTRA_ONLY) { 1508cabdff1aSopenharmony_ci CHECK(FUNC(frame_size)(ctx, rw, current)); 1509cabdff1aSopenharmony_ci CHECK(FUNC(render_size)(ctx, rw, current)); 1510cabdff1aSopenharmony_ci 1511cabdff1aSopenharmony_ci if (current->allow_screen_content_tools && 1512cabdff1aSopenharmony_ci priv->upscaled_width == priv->frame_width) 1513cabdff1aSopenharmony_ci flag(allow_intrabc); 1514cabdff1aSopenharmony_ci else 1515cabdff1aSopenharmony_ci infer(allow_intrabc, 0); 1516cabdff1aSopenharmony_ci 1517cabdff1aSopenharmony_ci } else { 1518cabdff1aSopenharmony_ci if (!seq->enable_order_hint) { 1519cabdff1aSopenharmony_ci infer(frame_refs_short_signaling, 0); 1520cabdff1aSopenharmony_ci } else { 1521cabdff1aSopenharmony_ci flag(frame_refs_short_signaling); 1522cabdff1aSopenharmony_ci if (current->frame_refs_short_signaling) { 1523cabdff1aSopenharmony_ci fb(3, last_frame_idx); 1524cabdff1aSopenharmony_ci fb(3, golden_frame_idx); 1525cabdff1aSopenharmony_ci CHECK(FUNC(set_frame_refs)(ctx, rw, current)); 1526cabdff1aSopenharmony_ci } 1527cabdff1aSopenharmony_ci } 1528cabdff1aSopenharmony_ci 1529cabdff1aSopenharmony_ci for (i = 0; i < AV1_REFS_PER_FRAME; i++) { 1530cabdff1aSopenharmony_ci if (!current->frame_refs_short_signaling) 1531cabdff1aSopenharmony_ci fbs(3, ref_frame_idx[i], 1, i); 1532cabdff1aSopenharmony_ci if (seq->frame_id_numbers_present_flag) { 1533cabdff1aSopenharmony_ci fbs(seq->delta_frame_id_length_minus_2 + 2, 1534cabdff1aSopenharmony_ci delta_frame_id_minus1[i], 1, i); 1535cabdff1aSopenharmony_ci } 1536cabdff1aSopenharmony_ci } 1537cabdff1aSopenharmony_ci 1538cabdff1aSopenharmony_ci if (current->frame_size_override_flag && 1539cabdff1aSopenharmony_ci !current->error_resilient_mode) { 1540cabdff1aSopenharmony_ci CHECK(FUNC(frame_size_with_refs)(ctx, rw, current)); 1541cabdff1aSopenharmony_ci } else { 1542cabdff1aSopenharmony_ci CHECK(FUNC(frame_size)(ctx, rw, current)); 1543cabdff1aSopenharmony_ci CHECK(FUNC(render_size)(ctx, rw, current)); 1544cabdff1aSopenharmony_ci } 1545cabdff1aSopenharmony_ci 1546cabdff1aSopenharmony_ci if (current->force_integer_mv) 1547cabdff1aSopenharmony_ci infer(allow_high_precision_mv, 0); 1548cabdff1aSopenharmony_ci else 1549cabdff1aSopenharmony_ci flag(allow_high_precision_mv); 1550cabdff1aSopenharmony_ci 1551cabdff1aSopenharmony_ci CHECK(FUNC(interpolation_filter)(ctx, rw, current)); 1552cabdff1aSopenharmony_ci 1553cabdff1aSopenharmony_ci flag(is_motion_mode_switchable); 1554cabdff1aSopenharmony_ci 1555cabdff1aSopenharmony_ci if (current->error_resilient_mode || 1556cabdff1aSopenharmony_ci !seq->enable_ref_frame_mvs) 1557cabdff1aSopenharmony_ci infer(use_ref_frame_mvs, 0); 1558cabdff1aSopenharmony_ci else 1559cabdff1aSopenharmony_ci flag(use_ref_frame_mvs); 1560cabdff1aSopenharmony_ci 1561cabdff1aSopenharmony_ci infer(allow_intrabc, 0); 1562cabdff1aSopenharmony_ci } 1563cabdff1aSopenharmony_ci 1564cabdff1aSopenharmony_ci if (!frame_is_intra) { 1565cabdff1aSopenharmony_ci // Derive reference frame sign biases. 1566cabdff1aSopenharmony_ci } 1567cabdff1aSopenharmony_ci 1568cabdff1aSopenharmony_ci if (seq->reduced_still_picture_header || current->disable_cdf_update) 1569cabdff1aSopenharmony_ci infer(disable_frame_end_update_cdf, 1); 1570cabdff1aSopenharmony_ci else 1571cabdff1aSopenharmony_ci flag(disable_frame_end_update_cdf); 1572cabdff1aSopenharmony_ci 1573cabdff1aSopenharmony_ci if (current->primary_ref_frame == AV1_PRIMARY_REF_NONE) { 1574cabdff1aSopenharmony_ci // Init non-coeff CDFs. 1575cabdff1aSopenharmony_ci // Setup past independence. 1576cabdff1aSopenharmony_ci } else { 1577cabdff1aSopenharmony_ci // Load CDF tables from previous frame. 1578cabdff1aSopenharmony_ci // Load params from previous frame. 1579cabdff1aSopenharmony_ci } 1580cabdff1aSopenharmony_ci 1581cabdff1aSopenharmony_ci if (current->use_ref_frame_mvs) { 1582cabdff1aSopenharmony_ci // Perform motion field estimation process. 1583cabdff1aSopenharmony_ci } 1584cabdff1aSopenharmony_ci 1585cabdff1aSopenharmony_ci CHECK(FUNC(tile_info)(ctx, rw, current)); 1586cabdff1aSopenharmony_ci 1587cabdff1aSopenharmony_ci CHECK(FUNC(quantization_params)(ctx, rw, current)); 1588cabdff1aSopenharmony_ci 1589cabdff1aSopenharmony_ci CHECK(FUNC(segmentation_params)(ctx, rw, current)); 1590cabdff1aSopenharmony_ci 1591cabdff1aSopenharmony_ci CHECK(FUNC(delta_q_params)(ctx, rw, current)); 1592cabdff1aSopenharmony_ci 1593cabdff1aSopenharmony_ci CHECK(FUNC(delta_lf_params)(ctx, rw, current)); 1594cabdff1aSopenharmony_ci 1595cabdff1aSopenharmony_ci // Init coeff CDFs / load previous segments. 1596cabdff1aSopenharmony_ci 1597cabdff1aSopenharmony_ci priv->coded_lossless = 1; 1598cabdff1aSopenharmony_ci for (i = 0; i < AV1_MAX_SEGMENTS; i++) { 1599cabdff1aSopenharmony_ci int qindex; 1600cabdff1aSopenharmony_ci if (current->feature_enabled[i][AV1_SEG_LVL_ALT_Q]) { 1601cabdff1aSopenharmony_ci qindex = (current->base_q_idx + 1602cabdff1aSopenharmony_ci current->feature_value[i][AV1_SEG_LVL_ALT_Q]); 1603cabdff1aSopenharmony_ci } else { 1604cabdff1aSopenharmony_ci qindex = current->base_q_idx; 1605cabdff1aSopenharmony_ci } 1606cabdff1aSopenharmony_ci qindex = av_clip_uintp2(qindex, 8); 1607cabdff1aSopenharmony_ci 1608cabdff1aSopenharmony_ci if (qindex || current->delta_q_y_dc || 1609cabdff1aSopenharmony_ci current->delta_q_u_ac || current->delta_q_u_dc || 1610cabdff1aSopenharmony_ci current->delta_q_v_ac || current->delta_q_v_dc) { 1611cabdff1aSopenharmony_ci priv->coded_lossless = 0; 1612cabdff1aSopenharmony_ci } 1613cabdff1aSopenharmony_ci } 1614cabdff1aSopenharmony_ci priv->all_lossless = priv->coded_lossless && 1615cabdff1aSopenharmony_ci priv->frame_width == priv->upscaled_width; 1616cabdff1aSopenharmony_ci 1617cabdff1aSopenharmony_ci CHECK(FUNC(loop_filter_params)(ctx, rw, current)); 1618cabdff1aSopenharmony_ci 1619cabdff1aSopenharmony_ci CHECK(FUNC(cdef_params)(ctx, rw, current)); 1620cabdff1aSopenharmony_ci 1621cabdff1aSopenharmony_ci CHECK(FUNC(lr_params)(ctx, rw, current)); 1622cabdff1aSopenharmony_ci 1623cabdff1aSopenharmony_ci CHECK(FUNC(read_tx_mode)(ctx, rw, current)); 1624cabdff1aSopenharmony_ci 1625cabdff1aSopenharmony_ci CHECK(FUNC(frame_reference_mode)(ctx, rw, current)); 1626cabdff1aSopenharmony_ci 1627cabdff1aSopenharmony_ci CHECK(FUNC(skip_mode_params)(ctx, rw, current)); 1628cabdff1aSopenharmony_ci 1629cabdff1aSopenharmony_ci if (frame_is_intra || current->error_resilient_mode || 1630cabdff1aSopenharmony_ci !seq->enable_warped_motion) 1631cabdff1aSopenharmony_ci infer(allow_warped_motion, 0); 1632cabdff1aSopenharmony_ci else 1633cabdff1aSopenharmony_ci flag(allow_warped_motion); 1634cabdff1aSopenharmony_ci 1635cabdff1aSopenharmony_ci flag(reduced_tx_set); 1636cabdff1aSopenharmony_ci 1637cabdff1aSopenharmony_ci CHECK(FUNC(global_motion_params)(ctx, rw, current)); 1638cabdff1aSopenharmony_ci 1639cabdff1aSopenharmony_ci CHECK(FUNC(film_grain_params)(ctx, rw, ¤t->film_grain, current)); 1640cabdff1aSopenharmony_ci 1641cabdff1aSopenharmony_ci av_log(ctx->log_ctx, AV_LOG_DEBUG, "Frame %d: size %dx%d " 1642cabdff1aSopenharmony_ci "upscaled %d render %dx%d subsample %dx%d " 1643cabdff1aSopenharmony_ci "bitdepth %d tiles %dx%d.\n", priv->order_hint, 1644cabdff1aSopenharmony_ci priv->frame_width, priv->frame_height, priv->upscaled_width, 1645cabdff1aSopenharmony_ci priv->render_width, priv->render_height, 1646cabdff1aSopenharmony_ci seq->color_config.subsampling_x + 1, 1647cabdff1aSopenharmony_ci seq->color_config.subsampling_y + 1, priv->bit_depth, 1648cabdff1aSopenharmony_ci priv->tile_rows, priv->tile_cols); 1649cabdff1aSopenharmony_ci 1650cabdff1aSopenharmony_ciupdate_refs: 1651cabdff1aSopenharmony_ci for (i = 0; i < AV1_NUM_REF_FRAMES; i++) { 1652cabdff1aSopenharmony_ci if (current->refresh_frame_flags & (1 << i)) { 1653cabdff1aSopenharmony_ci priv->ref[i] = (AV1ReferenceFrameState) { 1654cabdff1aSopenharmony_ci .valid = 1, 1655cabdff1aSopenharmony_ci .frame_id = current->current_frame_id, 1656cabdff1aSopenharmony_ci .upscaled_width = priv->upscaled_width, 1657cabdff1aSopenharmony_ci .frame_width = priv->frame_width, 1658cabdff1aSopenharmony_ci .frame_height = priv->frame_height, 1659cabdff1aSopenharmony_ci .render_width = priv->render_width, 1660cabdff1aSopenharmony_ci .render_height = priv->render_height, 1661cabdff1aSopenharmony_ci .frame_type = current->frame_type, 1662cabdff1aSopenharmony_ci .subsampling_x = seq->color_config.subsampling_x, 1663cabdff1aSopenharmony_ci .subsampling_y = seq->color_config.subsampling_y, 1664cabdff1aSopenharmony_ci .bit_depth = priv->bit_depth, 1665cabdff1aSopenharmony_ci .order_hint = priv->order_hint, 1666cabdff1aSopenharmony_ci }; 1667cabdff1aSopenharmony_ci memcpy(priv->ref[i].loop_filter_ref_deltas, current->loop_filter_ref_deltas, 1668cabdff1aSopenharmony_ci sizeof(current->loop_filter_ref_deltas)); 1669cabdff1aSopenharmony_ci memcpy(priv->ref[i].loop_filter_mode_deltas, current->loop_filter_mode_deltas, 1670cabdff1aSopenharmony_ci sizeof(current->loop_filter_mode_deltas)); 1671cabdff1aSopenharmony_ci memcpy(priv->ref[i].feature_enabled, current->feature_enabled, 1672cabdff1aSopenharmony_ci sizeof(current->feature_enabled)); 1673cabdff1aSopenharmony_ci memcpy(priv->ref[i].feature_value, current->feature_value, 1674cabdff1aSopenharmony_ci sizeof(current->feature_value)); 1675cabdff1aSopenharmony_ci } 1676cabdff1aSopenharmony_ci } 1677cabdff1aSopenharmony_ci 1678cabdff1aSopenharmony_ci return 0; 1679cabdff1aSopenharmony_ci} 1680cabdff1aSopenharmony_ci 1681cabdff1aSopenharmony_cistatic int FUNC(frame_header_obu)(CodedBitstreamContext *ctx, RWContext *rw, 1682cabdff1aSopenharmony_ci AV1RawFrameHeader *current, int redundant, 1683cabdff1aSopenharmony_ci AVBufferRef *rw_buffer_ref) 1684cabdff1aSopenharmony_ci{ 1685cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 1686cabdff1aSopenharmony_ci int start_pos, fh_bits, fh_bytes, err; 1687cabdff1aSopenharmony_ci uint8_t *fh_start; 1688cabdff1aSopenharmony_ci 1689cabdff1aSopenharmony_ci if (priv->seen_frame_header) { 1690cabdff1aSopenharmony_ci if (!redundant) { 1691cabdff1aSopenharmony_ci av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid repeated " 1692cabdff1aSopenharmony_ci "frame header OBU.\n"); 1693cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1694cabdff1aSopenharmony_ci } else { 1695cabdff1aSopenharmony_ci GetBitContext fh; 1696cabdff1aSopenharmony_ci size_t i, b; 1697cabdff1aSopenharmony_ci uint32_t val; 1698cabdff1aSopenharmony_ci 1699cabdff1aSopenharmony_ci HEADER("Redundant Frame Header"); 1700cabdff1aSopenharmony_ci 1701cabdff1aSopenharmony_ci av_assert0(priv->frame_header_ref && priv->frame_header); 1702cabdff1aSopenharmony_ci 1703cabdff1aSopenharmony_ci init_get_bits(&fh, priv->frame_header, 1704cabdff1aSopenharmony_ci priv->frame_header_size); 1705cabdff1aSopenharmony_ci for (i = 0; i < priv->frame_header_size; i += 8) { 1706cabdff1aSopenharmony_ci b = FFMIN(priv->frame_header_size - i, 8); 1707cabdff1aSopenharmony_ci val = get_bits(&fh, b); 1708cabdff1aSopenharmony_ci xf(b, frame_header_copy[i], 1709cabdff1aSopenharmony_ci val, val, val, 1, i / 8); 1710cabdff1aSopenharmony_ci } 1711cabdff1aSopenharmony_ci } 1712cabdff1aSopenharmony_ci } else { 1713cabdff1aSopenharmony_ci if (redundant) 1714cabdff1aSopenharmony_ci HEADER("Redundant Frame Header (used as Frame Header)"); 1715cabdff1aSopenharmony_ci else 1716cabdff1aSopenharmony_ci HEADER("Frame Header"); 1717cabdff1aSopenharmony_ci 1718cabdff1aSopenharmony_ci#ifdef READ 1719cabdff1aSopenharmony_ci start_pos = get_bits_count(rw); 1720cabdff1aSopenharmony_ci#else 1721cabdff1aSopenharmony_ci start_pos = put_bits_count(rw); 1722cabdff1aSopenharmony_ci#endif 1723cabdff1aSopenharmony_ci 1724cabdff1aSopenharmony_ci CHECK(FUNC(uncompressed_header)(ctx, rw, current)); 1725cabdff1aSopenharmony_ci 1726cabdff1aSopenharmony_ci priv->tile_num = 0; 1727cabdff1aSopenharmony_ci 1728cabdff1aSopenharmony_ci if (current->show_existing_frame) { 1729cabdff1aSopenharmony_ci priv->seen_frame_header = 0; 1730cabdff1aSopenharmony_ci } else { 1731cabdff1aSopenharmony_ci priv->seen_frame_header = 1; 1732cabdff1aSopenharmony_ci 1733cabdff1aSopenharmony_ci av_buffer_unref(&priv->frame_header_ref); 1734cabdff1aSopenharmony_ci 1735cabdff1aSopenharmony_ci#ifdef READ 1736cabdff1aSopenharmony_ci fh_bits = get_bits_count(rw) - start_pos; 1737cabdff1aSopenharmony_ci fh_start = (uint8_t*)rw->buffer + start_pos / 8; 1738cabdff1aSopenharmony_ci#else 1739cabdff1aSopenharmony_ci // Need to flush the bitwriter so that we can copy its output, 1740cabdff1aSopenharmony_ci // but use a copy so we don't affect the caller's structure. 1741cabdff1aSopenharmony_ci { 1742cabdff1aSopenharmony_ci PutBitContext tmp = *rw; 1743cabdff1aSopenharmony_ci flush_put_bits(&tmp); 1744cabdff1aSopenharmony_ci } 1745cabdff1aSopenharmony_ci 1746cabdff1aSopenharmony_ci fh_bits = put_bits_count(rw) - start_pos; 1747cabdff1aSopenharmony_ci fh_start = rw->buf + start_pos / 8; 1748cabdff1aSopenharmony_ci#endif 1749cabdff1aSopenharmony_ci fh_bytes = (fh_bits + 7) / 8; 1750cabdff1aSopenharmony_ci 1751cabdff1aSopenharmony_ci priv->frame_header_size = fh_bits; 1752cabdff1aSopenharmony_ci 1753cabdff1aSopenharmony_ci if (rw_buffer_ref) { 1754cabdff1aSopenharmony_ci priv->frame_header_ref = av_buffer_ref(rw_buffer_ref); 1755cabdff1aSopenharmony_ci if (!priv->frame_header_ref) 1756cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1757cabdff1aSopenharmony_ci priv->frame_header = fh_start; 1758cabdff1aSopenharmony_ci } else { 1759cabdff1aSopenharmony_ci priv->frame_header_ref = 1760cabdff1aSopenharmony_ci av_buffer_alloc(fh_bytes + AV_INPUT_BUFFER_PADDING_SIZE); 1761cabdff1aSopenharmony_ci if (!priv->frame_header_ref) 1762cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1763cabdff1aSopenharmony_ci priv->frame_header = priv->frame_header_ref->data; 1764cabdff1aSopenharmony_ci memcpy(priv->frame_header, fh_start, fh_bytes); 1765cabdff1aSopenharmony_ci } 1766cabdff1aSopenharmony_ci } 1767cabdff1aSopenharmony_ci } 1768cabdff1aSopenharmony_ci 1769cabdff1aSopenharmony_ci return 0; 1770cabdff1aSopenharmony_ci} 1771cabdff1aSopenharmony_ci 1772cabdff1aSopenharmony_cistatic int FUNC(tile_group_obu)(CodedBitstreamContext *ctx, RWContext *rw, 1773cabdff1aSopenharmony_ci AV1RawTileGroup *current) 1774cabdff1aSopenharmony_ci{ 1775cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 1776cabdff1aSopenharmony_ci int num_tiles, tile_bits; 1777cabdff1aSopenharmony_ci int err; 1778cabdff1aSopenharmony_ci 1779cabdff1aSopenharmony_ci HEADER("Tile Group"); 1780cabdff1aSopenharmony_ci 1781cabdff1aSopenharmony_ci num_tiles = priv->tile_cols * priv->tile_rows; 1782cabdff1aSopenharmony_ci if (num_tiles > 1) 1783cabdff1aSopenharmony_ci flag(tile_start_and_end_present_flag); 1784cabdff1aSopenharmony_ci else 1785cabdff1aSopenharmony_ci infer(tile_start_and_end_present_flag, 0); 1786cabdff1aSopenharmony_ci 1787cabdff1aSopenharmony_ci if (num_tiles == 1 || !current->tile_start_and_end_present_flag) { 1788cabdff1aSopenharmony_ci infer(tg_start, 0); 1789cabdff1aSopenharmony_ci infer(tg_end, num_tiles - 1); 1790cabdff1aSopenharmony_ci } else { 1791cabdff1aSopenharmony_ci tile_bits = cbs_av1_tile_log2(1, priv->tile_cols) + 1792cabdff1aSopenharmony_ci cbs_av1_tile_log2(1, priv->tile_rows); 1793cabdff1aSopenharmony_ci fc(tile_bits, tg_start, priv->tile_num, num_tiles - 1); 1794cabdff1aSopenharmony_ci fc(tile_bits, tg_end, current->tg_start, num_tiles - 1); 1795cabdff1aSopenharmony_ci } 1796cabdff1aSopenharmony_ci 1797cabdff1aSopenharmony_ci priv->tile_num = current->tg_end + 1; 1798cabdff1aSopenharmony_ci 1799cabdff1aSopenharmony_ci CHECK(FUNC(byte_alignment)(ctx, rw)); 1800cabdff1aSopenharmony_ci 1801cabdff1aSopenharmony_ci // Reset header for next frame. 1802cabdff1aSopenharmony_ci if (current->tg_end == num_tiles - 1) 1803cabdff1aSopenharmony_ci priv->seen_frame_header = 0; 1804cabdff1aSopenharmony_ci 1805cabdff1aSopenharmony_ci // Tile data follows. 1806cabdff1aSopenharmony_ci 1807cabdff1aSopenharmony_ci return 0; 1808cabdff1aSopenharmony_ci} 1809cabdff1aSopenharmony_ci 1810cabdff1aSopenharmony_cistatic int FUNC(frame_obu)(CodedBitstreamContext *ctx, RWContext *rw, 1811cabdff1aSopenharmony_ci AV1RawFrame *current, 1812cabdff1aSopenharmony_ci AVBufferRef *rw_buffer_ref) 1813cabdff1aSopenharmony_ci{ 1814cabdff1aSopenharmony_ci int err; 1815cabdff1aSopenharmony_ci 1816cabdff1aSopenharmony_ci CHECK(FUNC(frame_header_obu)(ctx, rw, ¤t->header, 1817cabdff1aSopenharmony_ci 0, rw_buffer_ref)); 1818cabdff1aSopenharmony_ci 1819cabdff1aSopenharmony_ci CHECK(FUNC(byte_alignment)(ctx, rw)); 1820cabdff1aSopenharmony_ci 1821cabdff1aSopenharmony_ci CHECK(FUNC(tile_group_obu)(ctx, rw, ¤t->tile_group)); 1822cabdff1aSopenharmony_ci 1823cabdff1aSopenharmony_ci return 0; 1824cabdff1aSopenharmony_ci} 1825cabdff1aSopenharmony_ci 1826cabdff1aSopenharmony_cistatic int FUNC(tile_list_obu)(CodedBitstreamContext *ctx, RWContext *rw, 1827cabdff1aSopenharmony_ci AV1RawTileList *current) 1828cabdff1aSopenharmony_ci{ 1829cabdff1aSopenharmony_ci int err; 1830cabdff1aSopenharmony_ci 1831cabdff1aSopenharmony_ci fb(8, output_frame_width_in_tiles_minus_1); 1832cabdff1aSopenharmony_ci fb(8, output_frame_height_in_tiles_minus_1); 1833cabdff1aSopenharmony_ci 1834cabdff1aSopenharmony_ci fb(16, tile_count_minus_1); 1835cabdff1aSopenharmony_ci 1836cabdff1aSopenharmony_ci // Tile data follows. 1837cabdff1aSopenharmony_ci 1838cabdff1aSopenharmony_ci return 0; 1839cabdff1aSopenharmony_ci} 1840cabdff1aSopenharmony_ci 1841cabdff1aSopenharmony_cistatic int FUNC(metadata_hdr_cll)(CodedBitstreamContext *ctx, RWContext *rw, 1842cabdff1aSopenharmony_ci AV1RawMetadataHDRCLL *current) 1843cabdff1aSopenharmony_ci{ 1844cabdff1aSopenharmony_ci int err; 1845cabdff1aSopenharmony_ci 1846cabdff1aSopenharmony_ci fb(16, max_cll); 1847cabdff1aSopenharmony_ci fb(16, max_fall); 1848cabdff1aSopenharmony_ci 1849cabdff1aSopenharmony_ci return 0; 1850cabdff1aSopenharmony_ci} 1851cabdff1aSopenharmony_ci 1852cabdff1aSopenharmony_cistatic int FUNC(metadata_hdr_mdcv)(CodedBitstreamContext *ctx, RWContext *rw, 1853cabdff1aSopenharmony_ci AV1RawMetadataHDRMDCV *current) 1854cabdff1aSopenharmony_ci{ 1855cabdff1aSopenharmony_ci int err, i; 1856cabdff1aSopenharmony_ci 1857cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) { 1858cabdff1aSopenharmony_ci fbs(16, primary_chromaticity_x[i], 1, i); 1859cabdff1aSopenharmony_ci fbs(16, primary_chromaticity_y[i], 1, i); 1860cabdff1aSopenharmony_ci } 1861cabdff1aSopenharmony_ci 1862cabdff1aSopenharmony_ci fb(16, white_point_chromaticity_x); 1863cabdff1aSopenharmony_ci fb(16, white_point_chromaticity_y); 1864cabdff1aSopenharmony_ci 1865cabdff1aSopenharmony_ci fc(32, luminance_max, 1, MAX_UINT_BITS(32)); 1866cabdff1aSopenharmony_ci // luminance_min must be lower than luminance_max. Convert luminance_max from 1867cabdff1aSopenharmony_ci // 24.8 fixed point to 18.14 fixed point in order to compare them. 1868cabdff1aSopenharmony_ci fc(32, luminance_min, 0, FFMIN(((uint64_t)current->luminance_max << 6) - 1, 1869cabdff1aSopenharmony_ci MAX_UINT_BITS(32))); 1870cabdff1aSopenharmony_ci 1871cabdff1aSopenharmony_ci return 0; 1872cabdff1aSopenharmony_ci} 1873cabdff1aSopenharmony_ci 1874cabdff1aSopenharmony_cistatic int FUNC(scalability_structure)(CodedBitstreamContext *ctx, RWContext *rw, 1875cabdff1aSopenharmony_ci AV1RawMetadataScalability *current) 1876cabdff1aSopenharmony_ci{ 1877cabdff1aSopenharmony_ci CodedBitstreamAV1Context *priv = ctx->priv_data; 1878cabdff1aSopenharmony_ci const AV1RawSequenceHeader *seq; 1879cabdff1aSopenharmony_ci int err, i, j; 1880cabdff1aSopenharmony_ci 1881cabdff1aSopenharmony_ci if (!priv->sequence_header) { 1882cabdff1aSopenharmony_ci av_log(ctx->log_ctx, AV_LOG_ERROR, "No sequence header available: " 1883cabdff1aSopenharmony_ci "unable to parse scalability metadata.\n"); 1884cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1885cabdff1aSopenharmony_ci } 1886cabdff1aSopenharmony_ci seq = priv->sequence_header; 1887cabdff1aSopenharmony_ci 1888cabdff1aSopenharmony_ci fb(2, spatial_layers_cnt_minus_1); 1889cabdff1aSopenharmony_ci flag(spatial_layer_dimensions_present_flag); 1890cabdff1aSopenharmony_ci flag(spatial_layer_description_present_flag); 1891cabdff1aSopenharmony_ci flag(temporal_group_description_present_flag); 1892cabdff1aSopenharmony_ci fc(3, scalability_structure_reserved_3bits, 0, 0); 1893cabdff1aSopenharmony_ci if (current->spatial_layer_dimensions_present_flag) { 1894cabdff1aSopenharmony_ci for (i = 0; i <= current->spatial_layers_cnt_minus_1; i++) { 1895cabdff1aSopenharmony_ci fcs(16, spatial_layer_max_width[i], 1896cabdff1aSopenharmony_ci 0, seq->max_frame_width_minus_1 + 1, 1, i); 1897cabdff1aSopenharmony_ci fcs(16, spatial_layer_max_height[i], 1898cabdff1aSopenharmony_ci 0, seq->max_frame_height_minus_1 + 1, 1, i); 1899cabdff1aSopenharmony_ci } 1900cabdff1aSopenharmony_ci } 1901cabdff1aSopenharmony_ci if (current->spatial_layer_description_present_flag) { 1902cabdff1aSopenharmony_ci for (i = 0; i <= current->spatial_layers_cnt_minus_1; i++) 1903cabdff1aSopenharmony_ci fbs(8, spatial_layer_ref_id[i], 1, i); 1904cabdff1aSopenharmony_ci } 1905cabdff1aSopenharmony_ci if (current->temporal_group_description_present_flag) { 1906cabdff1aSopenharmony_ci fb(8, temporal_group_size); 1907cabdff1aSopenharmony_ci for (i = 0; i < current->temporal_group_size; i++) { 1908cabdff1aSopenharmony_ci fbs(3, temporal_group_temporal_id[i], 1, i); 1909cabdff1aSopenharmony_ci flags(temporal_group_temporal_switching_up_point_flag[i], 1, i); 1910cabdff1aSopenharmony_ci flags(temporal_group_spatial_switching_up_point_flag[i], 1, i); 1911cabdff1aSopenharmony_ci fbs(3, temporal_group_ref_cnt[i], 1, i); 1912cabdff1aSopenharmony_ci for (j = 0; j < current->temporal_group_ref_cnt[i]; j++) { 1913cabdff1aSopenharmony_ci fbs(8, temporal_group_ref_pic_diff[i][j], 2, i, j); 1914cabdff1aSopenharmony_ci } 1915cabdff1aSopenharmony_ci } 1916cabdff1aSopenharmony_ci } 1917cabdff1aSopenharmony_ci 1918cabdff1aSopenharmony_ci return 0; 1919cabdff1aSopenharmony_ci} 1920cabdff1aSopenharmony_ci 1921cabdff1aSopenharmony_cistatic int FUNC(metadata_scalability)(CodedBitstreamContext *ctx, RWContext *rw, 1922cabdff1aSopenharmony_ci AV1RawMetadataScalability *current) 1923cabdff1aSopenharmony_ci{ 1924cabdff1aSopenharmony_ci int err; 1925cabdff1aSopenharmony_ci 1926cabdff1aSopenharmony_ci fb(8, scalability_mode_idc); 1927cabdff1aSopenharmony_ci 1928cabdff1aSopenharmony_ci if (current->scalability_mode_idc == AV1_SCALABILITY_SS) 1929cabdff1aSopenharmony_ci CHECK(FUNC(scalability_structure)(ctx, rw, current)); 1930cabdff1aSopenharmony_ci 1931cabdff1aSopenharmony_ci return 0; 1932cabdff1aSopenharmony_ci} 1933cabdff1aSopenharmony_ci 1934cabdff1aSopenharmony_cistatic int FUNC(metadata_itut_t35)(CodedBitstreamContext *ctx, RWContext *rw, 1935cabdff1aSopenharmony_ci AV1RawMetadataITUTT35 *current) 1936cabdff1aSopenharmony_ci{ 1937cabdff1aSopenharmony_ci int err; 1938cabdff1aSopenharmony_ci size_t i; 1939cabdff1aSopenharmony_ci 1940cabdff1aSopenharmony_ci fb(8, itu_t_t35_country_code); 1941cabdff1aSopenharmony_ci if (current->itu_t_t35_country_code == 0xff) 1942cabdff1aSopenharmony_ci fb(8, itu_t_t35_country_code_extension_byte); 1943cabdff1aSopenharmony_ci 1944cabdff1aSopenharmony_ci#ifdef READ 1945cabdff1aSopenharmony_ci // The payload runs up to the start of the trailing bits, but there might 1946cabdff1aSopenharmony_ci // be arbitrarily many trailing zeroes so we need to read through twice. 1947cabdff1aSopenharmony_ci current->payload_size = cbs_av1_get_payload_bytes_left(rw); 1948cabdff1aSopenharmony_ci 1949cabdff1aSopenharmony_ci current->payload_ref = av_buffer_alloc(current->payload_size); 1950cabdff1aSopenharmony_ci if (!current->payload_ref) 1951cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1952cabdff1aSopenharmony_ci current->payload = current->payload_ref->data; 1953cabdff1aSopenharmony_ci#endif 1954cabdff1aSopenharmony_ci 1955cabdff1aSopenharmony_ci for (i = 0; i < current->payload_size; i++) 1956cabdff1aSopenharmony_ci xf(8, itu_t_t35_payload_bytes[i], current->payload[i], 1957cabdff1aSopenharmony_ci 0x00, 0xff, 1, i); 1958cabdff1aSopenharmony_ci 1959cabdff1aSopenharmony_ci return 0; 1960cabdff1aSopenharmony_ci} 1961cabdff1aSopenharmony_ci 1962cabdff1aSopenharmony_cistatic int FUNC(metadata_timecode)(CodedBitstreamContext *ctx, RWContext *rw, 1963cabdff1aSopenharmony_ci AV1RawMetadataTimecode *current) 1964cabdff1aSopenharmony_ci{ 1965cabdff1aSopenharmony_ci int err; 1966cabdff1aSopenharmony_ci 1967cabdff1aSopenharmony_ci fb(5, counting_type); 1968cabdff1aSopenharmony_ci flag(full_timestamp_flag); 1969cabdff1aSopenharmony_ci flag(discontinuity_flag); 1970cabdff1aSopenharmony_ci flag(cnt_dropped_flag); 1971cabdff1aSopenharmony_ci fb(9, n_frames); 1972cabdff1aSopenharmony_ci 1973cabdff1aSopenharmony_ci if (current->full_timestamp_flag) { 1974cabdff1aSopenharmony_ci fc(6, seconds_value, 0, 59); 1975cabdff1aSopenharmony_ci fc(6, minutes_value, 0, 59); 1976cabdff1aSopenharmony_ci fc(5, hours_value, 0, 23); 1977cabdff1aSopenharmony_ci } else { 1978cabdff1aSopenharmony_ci flag(seconds_flag); 1979cabdff1aSopenharmony_ci if (current->seconds_flag) { 1980cabdff1aSopenharmony_ci fc(6, seconds_value, 0, 59); 1981cabdff1aSopenharmony_ci flag(minutes_flag); 1982cabdff1aSopenharmony_ci if (current->minutes_flag) { 1983cabdff1aSopenharmony_ci fc(6, minutes_value, 0, 59); 1984cabdff1aSopenharmony_ci flag(hours_flag); 1985cabdff1aSopenharmony_ci if (current->hours_flag) 1986cabdff1aSopenharmony_ci fc(5, hours_value, 0, 23); 1987cabdff1aSopenharmony_ci } 1988cabdff1aSopenharmony_ci } 1989cabdff1aSopenharmony_ci } 1990cabdff1aSopenharmony_ci 1991cabdff1aSopenharmony_ci fb(5, time_offset_length); 1992cabdff1aSopenharmony_ci if (current->time_offset_length > 0) 1993cabdff1aSopenharmony_ci fb(current->time_offset_length, time_offset_value); 1994cabdff1aSopenharmony_ci else 1995cabdff1aSopenharmony_ci infer(time_offset_length, 0); 1996cabdff1aSopenharmony_ci 1997cabdff1aSopenharmony_ci return 0; 1998cabdff1aSopenharmony_ci} 1999cabdff1aSopenharmony_ci 2000cabdff1aSopenharmony_cistatic int FUNC(metadata_obu)(CodedBitstreamContext *ctx, RWContext *rw, 2001cabdff1aSopenharmony_ci AV1RawMetadata *current) 2002cabdff1aSopenharmony_ci{ 2003cabdff1aSopenharmony_ci int err; 2004cabdff1aSopenharmony_ci 2005cabdff1aSopenharmony_ci leb128(metadata_type); 2006cabdff1aSopenharmony_ci 2007cabdff1aSopenharmony_ci switch (current->metadata_type) { 2008cabdff1aSopenharmony_ci case AV1_METADATA_TYPE_HDR_CLL: 2009cabdff1aSopenharmony_ci CHECK(FUNC(metadata_hdr_cll)(ctx, rw, ¤t->metadata.hdr_cll)); 2010cabdff1aSopenharmony_ci break; 2011cabdff1aSopenharmony_ci case AV1_METADATA_TYPE_HDR_MDCV: 2012cabdff1aSopenharmony_ci CHECK(FUNC(metadata_hdr_mdcv)(ctx, rw, ¤t->metadata.hdr_mdcv)); 2013cabdff1aSopenharmony_ci break; 2014cabdff1aSopenharmony_ci case AV1_METADATA_TYPE_SCALABILITY: 2015cabdff1aSopenharmony_ci CHECK(FUNC(metadata_scalability)(ctx, rw, ¤t->metadata.scalability)); 2016cabdff1aSopenharmony_ci break; 2017cabdff1aSopenharmony_ci case AV1_METADATA_TYPE_ITUT_T35: 2018cabdff1aSopenharmony_ci CHECK(FUNC(metadata_itut_t35)(ctx, rw, ¤t->metadata.itut_t35)); 2019cabdff1aSopenharmony_ci break; 2020cabdff1aSopenharmony_ci case AV1_METADATA_TYPE_TIMECODE: 2021cabdff1aSopenharmony_ci CHECK(FUNC(metadata_timecode)(ctx, rw, ¤t->metadata.timecode)); 2022cabdff1aSopenharmony_ci break; 2023cabdff1aSopenharmony_ci default: 2024cabdff1aSopenharmony_ci // Unknown metadata type. 2025cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 2026cabdff1aSopenharmony_ci } 2027cabdff1aSopenharmony_ci 2028cabdff1aSopenharmony_ci return 0; 2029cabdff1aSopenharmony_ci} 2030cabdff1aSopenharmony_ci 2031cabdff1aSopenharmony_cistatic int FUNC(padding_obu)(CodedBitstreamContext *ctx, RWContext *rw, 2032cabdff1aSopenharmony_ci AV1RawPadding *current) 2033cabdff1aSopenharmony_ci{ 2034cabdff1aSopenharmony_ci int i, err; 2035cabdff1aSopenharmony_ci 2036cabdff1aSopenharmony_ci HEADER("Padding"); 2037cabdff1aSopenharmony_ci 2038cabdff1aSopenharmony_ci#ifdef READ 2039cabdff1aSopenharmony_ci // The payload runs up to the start of the trailing bits, but there might 2040cabdff1aSopenharmony_ci // be arbitrarily many trailing zeroes so we need to read through twice. 2041cabdff1aSopenharmony_ci current->payload_size = cbs_av1_get_payload_bytes_left(rw); 2042cabdff1aSopenharmony_ci 2043cabdff1aSopenharmony_ci current->payload_ref = av_buffer_alloc(current->payload_size); 2044cabdff1aSopenharmony_ci if (!current->payload_ref) 2045cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 2046cabdff1aSopenharmony_ci current->payload = current->payload_ref->data; 2047cabdff1aSopenharmony_ci#endif 2048cabdff1aSopenharmony_ci 2049cabdff1aSopenharmony_ci for (i = 0; i < current->payload_size; i++) 2050cabdff1aSopenharmony_ci xf(8, obu_padding_byte[i], current->payload[i], 0x00, 0xff, 1, i); 2051cabdff1aSopenharmony_ci 2052cabdff1aSopenharmony_ci return 0; 2053cabdff1aSopenharmony_ci} 2054