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(frame_sync_code)(CodedBitstreamContext *ctx, RWContext *rw, 20cabdff1aSopenharmony_ci VP9RawFrameHeader *current) 21cabdff1aSopenharmony_ci{ 22cabdff1aSopenharmony_ci int err; 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci fixed(8, frame_sync_byte_0, VP9_FRAME_SYNC_0); 25cabdff1aSopenharmony_ci fixed(8, frame_sync_byte_1, VP9_FRAME_SYNC_1); 26cabdff1aSopenharmony_ci fixed(8, frame_sync_byte_2, VP9_FRAME_SYNC_2); 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci return 0; 29cabdff1aSopenharmony_ci} 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_cistatic int FUNC(color_config)(CodedBitstreamContext *ctx, RWContext *rw, 32cabdff1aSopenharmony_ci VP9RawFrameHeader *current, int profile) 33cabdff1aSopenharmony_ci{ 34cabdff1aSopenharmony_ci CodedBitstreamVP9Context *vp9 = ctx->priv_data; 35cabdff1aSopenharmony_ci int err; 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_ci if (profile >= 2) { 38cabdff1aSopenharmony_ci f(1, ten_or_twelve_bit); 39cabdff1aSopenharmony_ci vp9->bit_depth = current->ten_or_twelve_bit ? 12 : 10; 40cabdff1aSopenharmony_ci } else 41cabdff1aSopenharmony_ci vp9->bit_depth = 8; 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci f(3, color_space); 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_ci if (current->color_space != VP9_CS_RGB) { 46cabdff1aSopenharmony_ci f(1, color_range); 47cabdff1aSopenharmony_ci if (profile == 1 || profile == 3) { 48cabdff1aSopenharmony_ci f(1, subsampling_x); 49cabdff1aSopenharmony_ci f(1, subsampling_y); 50cabdff1aSopenharmony_ci fixed(1, reserved_zero, 0); 51cabdff1aSopenharmony_ci } else { 52cabdff1aSopenharmony_ci infer(subsampling_x, 1); 53cabdff1aSopenharmony_ci infer(subsampling_y, 1); 54cabdff1aSopenharmony_ci } 55cabdff1aSopenharmony_ci } else { 56cabdff1aSopenharmony_ci infer(color_range, 1); 57cabdff1aSopenharmony_ci if (profile == 1 || profile == 3) { 58cabdff1aSopenharmony_ci infer(subsampling_x, 0); 59cabdff1aSopenharmony_ci infer(subsampling_y, 0); 60cabdff1aSopenharmony_ci fixed(1, reserved_zero, 0); 61cabdff1aSopenharmony_ci } 62cabdff1aSopenharmony_ci } 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci vp9->subsampling_x = current->subsampling_x; 65cabdff1aSopenharmony_ci vp9->subsampling_y = current->subsampling_y; 66cabdff1aSopenharmony_ci 67cabdff1aSopenharmony_ci return 0; 68cabdff1aSopenharmony_ci} 69cabdff1aSopenharmony_ci 70cabdff1aSopenharmony_cistatic int FUNC(frame_size)(CodedBitstreamContext *ctx, RWContext *rw, 71cabdff1aSopenharmony_ci VP9RawFrameHeader *current) 72cabdff1aSopenharmony_ci{ 73cabdff1aSopenharmony_ci CodedBitstreamVP9Context *vp9 = ctx->priv_data; 74cabdff1aSopenharmony_ci int err; 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_ci f(16, frame_width_minus_1); 77cabdff1aSopenharmony_ci f(16, frame_height_minus_1); 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci vp9->frame_width = current->frame_width_minus_1 + 1; 80cabdff1aSopenharmony_ci vp9->frame_height = current->frame_height_minus_1 + 1; 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_ci vp9->mi_cols = (vp9->frame_width + 7) >> 3; 83cabdff1aSopenharmony_ci vp9->mi_rows = (vp9->frame_height + 7) >> 3; 84cabdff1aSopenharmony_ci vp9->sb64_cols = (vp9->mi_cols + 7) >> 3; 85cabdff1aSopenharmony_ci vp9->sb64_rows = (vp9->mi_rows + 7) >> 3; 86cabdff1aSopenharmony_ci 87cabdff1aSopenharmony_ci return 0; 88cabdff1aSopenharmony_ci} 89cabdff1aSopenharmony_ci 90cabdff1aSopenharmony_cistatic int FUNC(render_size)(CodedBitstreamContext *ctx, RWContext *rw, 91cabdff1aSopenharmony_ci VP9RawFrameHeader *current) 92cabdff1aSopenharmony_ci{ 93cabdff1aSopenharmony_ci int err; 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_ci f(1, render_and_frame_size_different); 96cabdff1aSopenharmony_ci 97cabdff1aSopenharmony_ci if (current->render_and_frame_size_different) { 98cabdff1aSopenharmony_ci f(16, render_width_minus_1); 99cabdff1aSopenharmony_ci f(16, render_height_minus_1); 100cabdff1aSopenharmony_ci } 101cabdff1aSopenharmony_ci 102cabdff1aSopenharmony_ci return 0; 103cabdff1aSopenharmony_ci} 104cabdff1aSopenharmony_ci 105cabdff1aSopenharmony_cistatic int FUNC(frame_size_with_refs)(CodedBitstreamContext *ctx, RWContext *rw, 106cabdff1aSopenharmony_ci VP9RawFrameHeader *current) 107cabdff1aSopenharmony_ci{ 108cabdff1aSopenharmony_ci CodedBitstreamVP9Context *vp9 = ctx->priv_data; 109cabdff1aSopenharmony_ci int err, i; 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_ci for (i = 0; i < VP9_REFS_PER_FRAME; i++) { 112cabdff1aSopenharmony_ci fs(1, found_ref[i], 1, i); 113cabdff1aSopenharmony_ci if (current->found_ref[i]) { 114cabdff1aSopenharmony_ci VP9ReferenceFrameState *ref = 115cabdff1aSopenharmony_ci &vp9->ref[current->ref_frame_idx[i]]; 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_ci vp9->frame_width = ref->frame_width; 118cabdff1aSopenharmony_ci vp9->frame_height = ref->frame_height; 119cabdff1aSopenharmony_ci 120cabdff1aSopenharmony_ci vp9->subsampling_x = ref->subsampling_x; 121cabdff1aSopenharmony_ci vp9->subsampling_y = ref->subsampling_y; 122cabdff1aSopenharmony_ci vp9->bit_depth = ref->bit_depth; 123cabdff1aSopenharmony_ci 124cabdff1aSopenharmony_ci break; 125cabdff1aSopenharmony_ci } 126cabdff1aSopenharmony_ci } 127cabdff1aSopenharmony_ci if (i >= VP9_REFS_PER_FRAME) 128cabdff1aSopenharmony_ci CHECK(FUNC(frame_size)(ctx, rw, current)); 129cabdff1aSopenharmony_ci else { 130cabdff1aSopenharmony_ci vp9->mi_cols = (vp9->frame_width + 7) >> 3; 131cabdff1aSopenharmony_ci vp9->mi_rows = (vp9->frame_height + 7) >> 3; 132cabdff1aSopenharmony_ci vp9->sb64_cols = (vp9->mi_cols + 7) >> 3; 133cabdff1aSopenharmony_ci vp9->sb64_rows = (vp9->mi_rows + 7) >> 3; 134cabdff1aSopenharmony_ci } 135cabdff1aSopenharmony_ci CHECK(FUNC(render_size)(ctx, rw, current)); 136cabdff1aSopenharmony_ci 137cabdff1aSopenharmony_ci return 0; 138cabdff1aSopenharmony_ci} 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_cistatic int FUNC(interpolation_filter)(CodedBitstreamContext *ctx, RWContext *rw, 141cabdff1aSopenharmony_ci VP9RawFrameHeader *current) 142cabdff1aSopenharmony_ci{ 143cabdff1aSopenharmony_ci int err; 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ci f(1, is_filter_switchable); 146cabdff1aSopenharmony_ci if (!current->is_filter_switchable) 147cabdff1aSopenharmony_ci f(2, raw_interpolation_filter_type); 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_ci return 0; 150cabdff1aSopenharmony_ci} 151cabdff1aSopenharmony_ci 152cabdff1aSopenharmony_cistatic int FUNC(loop_filter_params)(CodedBitstreamContext *ctx, RWContext *rw, 153cabdff1aSopenharmony_ci VP9RawFrameHeader *current) 154cabdff1aSopenharmony_ci{ 155cabdff1aSopenharmony_ci int err, i; 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ci f(6, loop_filter_level); 158cabdff1aSopenharmony_ci f(3, loop_filter_sharpness); 159cabdff1aSopenharmony_ci 160cabdff1aSopenharmony_ci f(1, loop_filter_delta_enabled); 161cabdff1aSopenharmony_ci if (current->loop_filter_delta_enabled) { 162cabdff1aSopenharmony_ci f(1, loop_filter_delta_update); 163cabdff1aSopenharmony_ci if (current->loop_filter_delta_update) { 164cabdff1aSopenharmony_ci for (i = 0; i < VP9_MAX_REF_FRAMES; i++) { 165cabdff1aSopenharmony_ci fs(1, update_ref_delta[i], 1, i); 166cabdff1aSopenharmony_ci if (current->update_ref_delta[i]) 167cabdff1aSopenharmony_ci ss(6, loop_filter_ref_deltas[i], 1, i); 168cabdff1aSopenharmony_ci } 169cabdff1aSopenharmony_ci for (i = 0; i < 2; i++) { 170cabdff1aSopenharmony_ci fs(1, update_mode_delta[i], 1, i); 171cabdff1aSopenharmony_ci if (current->update_mode_delta[i]) 172cabdff1aSopenharmony_ci ss(6, loop_filter_mode_deltas[i], 1, i); 173cabdff1aSopenharmony_ci } 174cabdff1aSopenharmony_ci } 175cabdff1aSopenharmony_ci } 176cabdff1aSopenharmony_ci 177cabdff1aSopenharmony_ci return 0; 178cabdff1aSopenharmony_ci} 179cabdff1aSopenharmony_ci 180cabdff1aSopenharmony_cistatic int FUNC(quantization_params)(CodedBitstreamContext *ctx, RWContext *rw, 181cabdff1aSopenharmony_ci VP9RawFrameHeader *current) 182cabdff1aSopenharmony_ci{ 183cabdff1aSopenharmony_ci int err; 184cabdff1aSopenharmony_ci 185cabdff1aSopenharmony_ci f(8, base_q_idx); 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_ci delta_q(delta_q_y_dc); 188cabdff1aSopenharmony_ci delta_q(delta_q_uv_dc); 189cabdff1aSopenharmony_ci delta_q(delta_q_uv_ac); 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci return 0; 192cabdff1aSopenharmony_ci} 193cabdff1aSopenharmony_ci 194cabdff1aSopenharmony_cistatic int FUNC(segmentation_params)(CodedBitstreamContext *ctx, RWContext *rw, 195cabdff1aSopenharmony_ci VP9RawFrameHeader *current) 196cabdff1aSopenharmony_ci{ 197cabdff1aSopenharmony_ci static const uint8_t segmentation_feature_bits[VP9_SEG_LVL_MAX] = { 8, 6, 2, 0 }; 198cabdff1aSopenharmony_ci static const uint8_t segmentation_feature_signed[VP9_SEG_LVL_MAX] = { 1, 1, 0, 0 }; 199cabdff1aSopenharmony_ci 200cabdff1aSopenharmony_ci int err, i, j; 201cabdff1aSopenharmony_ci 202cabdff1aSopenharmony_ci f(1, segmentation_enabled); 203cabdff1aSopenharmony_ci 204cabdff1aSopenharmony_ci if (current->segmentation_enabled) { 205cabdff1aSopenharmony_ci f(1, segmentation_update_map); 206cabdff1aSopenharmony_ci if (current->segmentation_update_map) { 207cabdff1aSopenharmony_ci for (i = 0; i < 7; i++) 208cabdff1aSopenharmony_ci prob(segmentation_tree_probs[i], 1, i); 209cabdff1aSopenharmony_ci f(1, segmentation_temporal_update); 210cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) { 211cabdff1aSopenharmony_ci if (current->segmentation_temporal_update) 212cabdff1aSopenharmony_ci prob(segmentation_pred_prob[i], 1, i); 213cabdff1aSopenharmony_ci else 214cabdff1aSopenharmony_ci infer(segmentation_pred_prob[i], 255); 215cabdff1aSopenharmony_ci } 216cabdff1aSopenharmony_ci } 217cabdff1aSopenharmony_ci 218cabdff1aSopenharmony_ci f(1, segmentation_update_data); 219cabdff1aSopenharmony_ci if (current->segmentation_update_data) { 220cabdff1aSopenharmony_ci f(1, segmentation_abs_or_delta_update); 221cabdff1aSopenharmony_ci for (i = 0; i < VP9_MAX_SEGMENTS; i++) { 222cabdff1aSopenharmony_ci for (j = 0; j < VP9_SEG_LVL_MAX; j++) { 223cabdff1aSopenharmony_ci fs(1, feature_enabled[i][j], 2, i, j); 224cabdff1aSopenharmony_ci if (current->feature_enabled[i][j] && 225cabdff1aSopenharmony_ci segmentation_feature_bits[j]) { 226cabdff1aSopenharmony_ci fs(segmentation_feature_bits[j], 227cabdff1aSopenharmony_ci feature_value[i][j], 2, i, j); 228cabdff1aSopenharmony_ci if (segmentation_feature_signed[j]) 229cabdff1aSopenharmony_ci fs(1, feature_sign[i][j], 2, i, j); 230cabdff1aSopenharmony_ci else 231cabdff1aSopenharmony_ci infer(feature_sign[i][j], 0); 232cabdff1aSopenharmony_ci } else { 233cabdff1aSopenharmony_ci infer(feature_value[i][j], 0); 234cabdff1aSopenharmony_ci infer(feature_sign[i][j], 0); 235cabdff1aSopenharmony_ci } 236cabdff1aSopenharmony_ci } 237cabdff1aSopenharmony_ci } 238cabdff1aSopenharmony_ci } 239cabdff1aSopenharmony_ci } 240cabdff1aSopenharmony_ci 241cabdff1aSopenharmony_ci return 0; 242cabdff1aSopenharmony_ci} 243cabdff1aSopenharmony_ci 244cabdff1aSopenharmony_cistatic int FUNC(tile_info)(CodedBitstreamContext *ctx, RWContext *rw, 245cabdff1aSopenharmony_ci VP9RawFrameHeader *current) 246cabdff1aSopenharmony_ci{ 247cabdff1aSopenharmony_ci CodedBitstreamVP9Context *vp9 = ctx->priv_data; 248cabdff1aSopenharmony_ci int min_log2_tile_cols, max_log2_tile_cols; 249cabdff1aSopenharmony_ci int err; 250cabdff1aSopenharmony_ci 251cabdff1aSopenharmony_ci min_log2_tile_cols = 0; 252cabdff1aSopenharmony_ci while ((VP9_MAX_TILE_WIDTH_B64 << min_log2_tile_cols) < vp9->sb64_cols) 253cabdff1aSopenharmony_ci ++min_log2_tile_cols; 254cabdff1aSopenharmony_ci max_log2_tile_cols = 0; 255cabdff1aSopenharmony_ci while ((vp9->sb64_cols >> (max_log2_tile_cols + 1)) >= VP9_MIN_TILE_WIDTH_B64) 256cabdff1aSopenharmony_ci ++max_log2_tile_cols; 257cabdff1aSopenharmony_ci 258cabdff1aSopenharmony_ci increment(tile_cols_log2, min_log2_tile_cols, max_log2_tile_cols); 259cabdff1aSopenharmony_ci 260cabdff1aSopenharmony_ci increment(tile_rows_log2, 0, 2); 261cabdff1aSopenharmony_ci 262cabdff1aSopenharmony_ci return 0; 263cabdff1aSopenharmony_ci} 264cabdff1aSopenharmony_ci 265cabdff1aSopenharmony_cistatic int FUNC(uncompressed_header)(CodedBitstreamContext *ctx, RWContext *rw, 266cabdff1aSopenharmony_ci VP9RawFrameHeader *current) 267cabdff1aSopenharmony_ci{ 268cabdff1aSopenharmony_ci CodedBitstreamVP9Context *vp9 = ctx->priv_data; 269cabdff1aSopenharmony_ci int err, i; 270cabdff1aSopenharmony_ci 271cabdff1aSopenharmony_ci f(2, frame_marker); 272cabdff1aSopenharmony_ci 273cabdff1aSopenharmony_ci f(1, profile_low_bit); 274cabdff1aSopenharmony_ci f(1, profile_high_bit); 275cabdff1aSopenharmony_ci vp9->profile = (current->profile_high_bit << 1) + current->profile_low_bit; 276cabdff1aSopenharmony_ci if (vp9->profile == 3) 277cabdff1aSopenharmony_ci fixed(1, reserved_zero, 0); 278cabdff1aSopenharmony_ci 279cabdff1aSopenharmony_ci f(1, show_existing_frame); 280cabdff1aSopenharmony_ci if (current->show_existing_frame) { 281cabdff1aSopenharmony_ci f(3, frame_to_show_map_idx); 282cabdff1aSopenharmony_ci infer(header_size_in_bytes, 0); 283cabdff1aSopenharmony_ci infer(refresh_frame_flags, 0x00); 284cabdff1aSopenharmony_ci infer(loop_filter_level, 0); 285cabdff1aSopenharmony_ci return 0; 286cabdff1aSopenharmony_ci } 287cabdff1aSopenharmony_ci 288cabdff1aSopenharmony_ci f(1, frame_type); 289cabdff1aSopenharmony_ci f(1, show_frame); 290cabdff1aSopenharmony_ci f(1, error_resilient_mode); 291cabdff1aSopenharmony_ci 292cabdff1aSopenharmony_ci if (current->frame_type == VP9_KEY_FRAME) { 293cabdff1aSopenharmony_ci CHECK(FUNC(frame_sync_code)(ctx, rw, current)); 294cabdff1aSopenharmony_ci CHECK(FUNC(color_config)(ctx, rw, current, vp9->profile)); 295cabdff1aSopenharmony_ci CHECK(FUNC(frame_size)(ctx, rw, current)); 296cabdff1aSopenharmony_ci CHECK(FUNC(render_size)(ctx, rw, current)); 297cabdff1aSopenharmony_ci 298cabdff1aSopenharmony_ci infer(refresh_frame_flags, 0xff); 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_ci } else { 301cabdff1aSopenharmony_ci if (current->show_frame == 0) 302cabdff1aSopenharmony_ci f(1, intra_only); 303cabdff1aSopenharmony_ci else 304cabdff1aSopenharmony_ci infer(intra_only, 0); 305cabdff1aSopenharmony_ci 306cabdff1aSopenharmony_ci if (current->error_resilient_mode == 0) 307cabdff1aSopenharmony_ci f(2, reset_frame_context); 308cabdff1aSopenharmony_ci else 309cabdff1aSopenharmony_ci infer(reset_frame_context, 0); 310cabdff1aSopenharmony_ci 311cabdff1aSopenharmony_ci if (current->intra_only == 1) { 312cabdff1aSopenharmony_ci CHECK(FUNC(frame_sync_code)(ctx, rw, current)); 313cabdff1aSopenharmony_ci 314cabdff1aSopenharmony_ci if (vp9->profile > 0) { 315cabdff1aSopenharmony_ci CHECK(FUNC(color_config)(ctx, rw, current, vp9->profile)); 316cabdff1aSopenharmony_ci } else { 317cabdff1aSopenharmony_ci infer(color_space, 1); 318cabdff1aSopenharmony_ci infer(subsampling_x, 1); 319cabdff1aSopenharmony_ci infer(subsampling_y, 1); 320cabdff1aSopenharmony_ci vp9->bit_depth = 8; 321cabdff1aSopenharmony_ci 322cabdff1aSopenharmony_ci vp9->subsampling_x = current->subsampling_x; 323cabdff1aSopenharmony_ci vp9->subsampling_y = current->subsampling_y; 324cabdff1aSopenharmony_ci } 325cabdff1aSopenharmony_ci 326cabdff1aSopenharmony_ci f(8, refresh_frame_flags); 327cabdff1aSopenharmony_ci 328cabdff1aSopenharmony_ci CHECK(FUNC(frame_size)(ctx, rw, current)); 329cabdff1aSopenharmony_ci CHECK(FUNC(render_size)(ctx, rw, current)); 330cabdff1aSopenharmony_ci } else { 331cabdff1aSopenharmony_ci f(8, refresh_frame_flags); 332cabdff1aSopenharmony_ci 333cabdff1aSopenharmony_ci for (i = 0; i < VP9_REFS_PER_FRAME; i++) { 334cabdff1aSopenharmony_ci fs(3, ref_frame_idx[i], 1, i); 335cabdff1aSopenharmony_ci fs(1, ref_frame_sign_bias[VP9_LAST_FRAME + i], 336cabdff1aSopenharmony_ci 1, VP9_LAST_FRAME + i); 337cabdff1aSopenharmony_ci } 338cabdff1aSopenharmony_ci 339cabdff1aSopenharmony_ci CHECK(FUNC(frame_size_with_refs)(ctx, rw, current)); 340cabdff1aSopenharmony_ci f(1, allow_high_precision_mv); 341cabdff1aSopenharmony_ci CHECK(FUNC(interpolation_filter)(ctx, rw, current)); 342cabdff1aSopenharmony_ci } 343cabdff1aSopenharmony_ci } 344cabdff1aSopenharmony_ci 345cabdff1aSopenharmony_ci if (current->error_resilient_mode == 0) { 346cabdff1aSopenharmony_ci f(1, refresh_frame_context); 347cabdff1aSopenharmony_ci f(1, frame_parallel_decoding_mode); 348cabdff1aSopenharmony_ci } else { 349cabdff1aSopenharmony_ci infer(refresh_frame_context, 0); 350cabdff1aSopenharmony_ci infer(frame_parallel_decoding_mode, 1); 351cabdff1aSopenharmony_ci } 352cabdff1aSopenharmony_ci 353cabdff1aSopenharmony_ci f(2, frame_context_idx); 354cabdff1aSopenharmony_ci 355cabdff1aSopenharmony_ci CHECK(FUNC(loop_filter_params)(ctx, rw, current)); 356cabdff1aSopenharmony_ci CHECK(FUNC(quantization_params)(ctx, rw, current)); 357cabdff1aSopenharmony_ci CHECK(FUNC(segmentation_params)(ctx, rw, current)); 358cabdff1aSopenharmony_ci CHECK(FUNC(tile_info)(ctx, rw, current)); 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_ci f(16, header_size_in_bytes); 361cabdff1aSopenharmony_ci 362cabdff1aSopenharmony_ci for (i = 0; i < VP9_NUM_REF_FRAMES; i++) { 363cabdff1aSopenharmony_ci if (current->refresh_frame_flags & (1 << i)) { 364cabdff1aSopenharmony_ci vp9->ref[i] = (VP9ReferenceFrameState) { 365cabdff1aSopenharmony_ci .frame_width = vp9->frame_width, 366cabdff1aSopenharmony_ci .frame_height = vp9->frame_height, 367cabdff1aSopenharmony_ci .subsampling_x = vp9->subsampling_x, 368cabdff1aSopenharmony_ci .subsampling_y = vp9->subsampling_y, 369cabdff1aSopenharmony_ci .bit_depth = vp9->bit_depth, 370cabdff1aSopenharmony_ci }; 371cabdff1aSopenharmony_ci } 372cabdff1aSopenharmony_ci } 373cabdff1aSopenharmony_ci 374cabdff1aSopenharmony_ci av_log(ctx->log_ctx, AV_LOG_DEBUG, "Frame: size %dx%d " 375cabdff1aSopenharmony_ci "subsample %dx%d bit_depth %d tiles %dx%d.\n", 376cabdff1aSopenharmony_ci vp9->frame_width, vp9->frame_height, 377cabdff1aSopenharmony_ci vp9->subsampling_x, vp9->subsampling_y, 378cabdff1aSopenharmony_ci vp9->bit_depth, 1 << current->tile_cols_log2, 379cabdff1aSopenharmony_ci 1 << current->tile_rows_log2); 380cabdff1aSopenharmony_ci 381cabdff1aSopenharmony_ci return 0; 382cabdff1aSopenharmony_ci} 383cabdff1aSopenharmony_ci 384cabdff1aSopenharmony_cistatic int FUNC(trailing_bits)(CodedBitstreamContext *ctx, RWContext *rw) 385cabdff1aSopenharmony_ci{ 386cabdff1aSopenharmony_ci int err; 387cabdff1aSopenharmony_ci while (byte_alignment(rw) != 0) 388cabdff1aSopenharmony_ci fixed(1, zero_bit, 0); 389cabdff1aSopenharmony_ci 390cabdff1aSopenharmony_ci return 0; 391cabdff1aSopenharmony_ci} 392cabdff1aSopenharmony_ci 393cabdff1aSopenharmony_cistatic int FUNC(frame)(CodedBitstreamContext *ctx, RWContext *rw, 394cabdff1aSopenharmony_ci VP9RawFrame *current) 395cabdff1aSopenharmony_ci{ 396cabdff1aSopenharmony_ci int err; 397cabdff1aSopenharmony_ci 398cabdff1aSopenharmony_ci HEADER("Frame"); 399cabdff1aSopenharmony_ci 400cabdff1aSopenharmony_ci CHECK(FUNC(uncompressed_header)(ctx, rw, ¤t->header)); 401cabdff1aSopenharmony_ci 402cabdff1aSopenharmony_ci CHECK(FUNC(trailing_bits)(ctx, rw)); 403cabdff1aSopenharmony_ci 404cabdff1aSopenharmony_ci return 0; 405cabdff1aSopenharmony_ci} 406cabdff1aSopenharmony_ci 407cabdff1aSopenharmony_cistatic int FUNC(superframe_index)(CodedBitstreamContext *ctx, RWContext *rw, 408cabdff1aSopenharmony_ci VP9RawSuperframeIndex *current) 409cabdff1aSopenharmony_ci{ 410cabdff1aSopenharmony_ci int err, i; 411cabdff1aSopenharmony_ci 412cabdff1aSopenharmony_ci HEADER("Superframe Index"); 413cabdff1aSopenharmony_ci 414cabdff1aSopenharmony_ci f(3, superframe_marker); 415cabdff1aSopenharmony_ci f(2, bytes_per_framesize_minus_1); 416cabdff1aSopenharmony_ci f(3, frames_in_superframe_minus_1); 417cabdff1aSopenharmony_ci 418cabdff1aSopenharmony_ci for (i = 0; i <= current->frames_in_superframe_minus_1; i++) { 419cabdff1aSopenharmony_ci // Surprise little-endian! 420cabdff1aSopenharmony_ci fle(8 * (current->bytes_per_framesize_minus_1 + 1), 421cabdff1aSopenharmony_ci frame_sizes[i], 1, i); 422cabdff1aSopenharmony_ci } 423cabdff1aSopenharmony_ci 424cabdff1aSopenharmony_ci f(3, superframe_marker); 425cabdff1aSopenharmony_ci f(2, bytes_per_framesize_minus_1); 426cabdff1aSopenharmony_ci f(3, frames_in_superframe_minus_1); 427cabdff1aSopenharmony_ci 428cabdff1aSopenharmony_ci return 0; 429cabdff1aSopenharmony_ci} 430