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(sequence_header)(CodedBitstreamContext *ctx, RWContext *rw, 20cabdff1aSopenharmony_ci MPEG2RawSequenceHeader *current) 21cabdff1aSopenharmony_ci{ 22cabdff1aSopenharmony_ci CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data; 23cabdff1aSopenharmony_ci int err, i; 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci HEADER("Sequence Header"); 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci ui(8, sequence_header_code); 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci uir(12, horizontal_size_value); 30cabdff1aSopenharmony_ci uir(12, vertical_size_value); 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci mpeg2->horizontal_size = current->horizontal_size_value; 33cabdff1aSopenharmony_ci mpeg2->vertical_size = current->vertical_size_value; 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_ci uir(4, aspect_ratio_information); 36cabdff1aSopenharmony_ci uir(4, frame_rate_code); 37cabdff1aSopenharmony_ci ui(18, bit_rate_value); 38cabdff1aSopenharmony_ci 39cabdff1aSopenharmony_ci marker_bit(); 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci ui(10, vbv_buffer_size_value); 42cabdff1aSopenharmony_ci ui(1, constrained_parameters_flag); 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci ui(1, load_intra_quantiser_matrix); 45cabdff1aSopenharmony_ci if (current->load_intra_quantiser_matrix) { 46cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) 47cabdff1aSopenharmony_ci uirs(8, intra_quantiser_matrix[i], 1, i); 48cabdff1aSopenharmony_ci } 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ci ui(1, load_non_intra_quantiser_matrix); 51cabdff1aSopenharmony_ci if (current->load_non_intra_quantiser_matrix) { 52cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) 53cabdff1aSopenharmony_ci uirs(8, non_intra_quantiser_matrix[i], 1, i); 54cabdff1aSopenharmony_ci } 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ci return 0; 57cabdff1aSopenharmony_ci} 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_cistatic int FUNC(user_data)(CodedBitstreamContext *ctx, RWContext *rw, 60cabdff1aSopenharmony_ci MPEG2RawUserData *current) 61cabdff1aSopenharmony_ci{ 62cabdff1aSopenharmony_ci size_t k; 63cabdff1aSopenharmony_ci int err; 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci HEADER("User Data"); 66cabdff1aSopenharmony_ci 67cabdff1aSopenharmony_ci ui(8, user_data_start_code); 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_ci#ifdef READ 70cabdff1aSopenharmony_ci k = get_bits_left(rw); 71cabdff1aSopenharmony_ci av_assert0(k % 8 == 0); 72cabdff1aSopenharmony_ci current->user_data_length = k /= 8; 73cabdff1aSopenharmony_ci if (k > 0) { 74cabdff1aSopenharmony_ci current->user_data_ref = av_buffer_allocz(k + AV_INPUT_BUFFER_PADDING_SIZE); 75cabdff1aSopenharmony_ci if (!current->user_data_ref) 76cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 77cabdff1aSopenharmony_ci current->user_data = current->user_data_ref->data; 78cabdff1aSopenharmony_ci } 79cabdff1aSopenharmony_ci#endif 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_ci for (k = 0; k < current->user_data_length; k++) 82cabdff1aSopenharmony_ci uis(8, user_data[k], 1, k); 83cabdff1aSopenharmony_ci 84cabdff1aSopenharmony_ci return 0; 85cabdff1aSopenharmony_ci} 86cabdff1aSopenharmony_ci 87cabdff1aSopenharmony_cistatic int FUNC(sequence_extension)(CodedBitstreamContext *ctx, RWContext *rw, 88cabdff1aSopenharmony_ci MPEG2RawSequenceExtension *current) 89cabdff1aSopenharmony_ci{ 90cabdff1aSopenharmony_ci CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data; 91cabdff1aSopenharmony_ci int err; 92cabdff1aSopenharmony_ci 93cabdff1aSopenharmony_ci HEADER("Sequence Extension"); 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_ci ui(8, profile_and_level_indication); 96cabdff1aSopenharmony_ci ui(1, progressive_sequence); 97cabdff1aSopenharmony_ci ui(2, chroma_format); 98cabdff1aSopenharmony_ci ui(2, horizontal_size_extension); 99cabdff1aSopenharmony_ci ui(2, vertical_size_extension); 100cabdff1aSopenharmony_ci 101cabdff1aSopenharmony_ci mpeg2->horizontal_size = (mpeg2->horizontal_size & 0xfff) | 102cabdff1aSopenharmony_ci current->horizontal_size_extension << 12; 103cabdff1aSopenharmony_ci mpeg2->vertical_size = (mpeg2->vertical_size & 0xfff) | 104cabdff1aSopenharmony_ci current->vertical_size_extension << 12; 105cabdff1aSopenharmony_ci mpeg2->progressive_sequence = current->progressive_sequence; 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_ci ui(12, bit_rate_extension); 108cabdff1aSopenharmony_ci marker_bit(); 109cabdff1aSopenharmony_ci ui(8, vbv_buffer_size_extension); 110cabdff1aSopenharmony_ci ui(1, low_delay); 111cabdff1aSopenharmony_ci ui(2, frame_rate_extension_n); 112cabdff1aSopenharmony_ci ui(5, frame_rate_extension_d); 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ci return 0; 115cabdff1aSopenharmony_ci} 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_cistatic int FUNC(sequence_display_extension)(CodedBitstreamContext *ctx, RWContext *rw, 118cabdff1aSopenharmony_ci MPEG2RawSequenceDisplayExtension *current) 119cabdff1aSopenharmony_ci{ 120cabdff1aSopenharmony_ci int err; 121cabdff1aSopenharmony_ci 122cabdff1aSopenharmony_ci HEADER("Sequence Display Extension"); 123cabdff1aSopenharmony_ci 124cabdff1aSopenharmony_ci ui(3, video_format); 125cabdff1aSopenharmony_ci 126cabdff1aSopenharmony_ci ui(1, colour_description); 127cabdff1aSopenharmony_ci if (current->colour_description) { 128cabdff1aSopenharmony_ci#ifdef READ 129cabdff1aSopenharmony_ci#define READ_AND_PATCH(name) do { \ 130cabdff1aSopenharmony_ci ui(8, name); \ 131cabdff1aSopenharmony_ci if (current->name == 0) { \ 132cabdff1aSopenharmony_ci current->name = 2; \ 133cabdff1aSopenharmony_ci av_log(ctx->log_ctx, AV_LOG_WARNING, "%s in a sequence display " \ 134cabdff1aSopenharmony_ci "extension had the invalid value 0. Setting it to 2 " \ 135cabdff1aSopenharmony_ci "(meaning unknown) instead.\n", #name); \ 136cabdff1aSopenharmony_ci } \ 137cabdff1aSopenharmony_ci } while (0) 138cabdff1aSopenharmony_ci READ_AND_PATCH(colour_primaries); 139cabdff1aSopenharmony_ci READ_AND_PATCH(transfer_characteristics); 140cabdff1aSopenharmony_ci READ_AND_PATCH(matrix_coefficients); 141cabdff1aSopenharmony_ci#undef READ_AND_PATCH 142cabdff1aSopenharmony_ci#else 143cabdff1aSopenharmony_ci uir(8, colour_primaries); 144cabdff1aSopenharmony_ci uir(8, transfer_characteristics); 145cabdff1aSopenharmony_ci uir(8, matrix_coefficients); 146cabdff1aSopenharmony_ci#endif 147cabdff1aSopenharmony_ci } else { 148cabdff1aSopenharmony_ci infer(colour_primaries, 2); 149cabdff1aSopenharmony_ci infer(transfer_characteristics, 2); 150cabdff1aSopenharmony_ci infer(matrix_coefficients, 2); 151cabdff1aSopenharmony_ci } 152cabdff1aSopenharmony_ci 153cabdff1aSopenharmony_ci ui(14, display_horizontal_size); 154cabdff1aSopenharmony_ci marker_bit(); 155cabdff1aSopenharmony_ci ui(14, display_vertical_size); 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ci return 0; 158cabdff1aSopenharmony_ci} 159cabdff1aSopenharmony_ci 160cabdff1aSopenharmony_cistatic int FUNC(group_of_pictures_header)(CodedBitstreamContext *ctx, RWContext *rw, 161cabdff1aSopenharmony_ci MPEG2RawGroupOfPicturesHeader *current) 162cabdff1aSopenharmony_ci{ 163cabdff1aSopenharmony_ci int err; 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_ci HEADER("Group of Pictures Header"); 166cabdff1aSopenharmony_ci 167cabdff1aSopenharmony_ci ui(8, group_start_code); 168cabdff1aSopenharmony_ci 169cabdff1aSopenharmony_ci ui(25, time_code); 170cabdff1aSopenharmony_ci ui(1, closed_gop); 171cabdff1aSopenharmony_ci ui(1, broken_link); 172cabdff1aSopenharmony_ci 173cabdff1aSopenharmony_ci return 0; 174cabdff1aSopenharmony_ci} 175cabdff1aSopenharmony_ci 176cabdff1aSopenharmony_cistatic int FUNC(extra_information)(CodedBitstreamContext *ctx, RWContext *rw, 177cabdff1aSopenharmony_ci MPEG2RawExtraInformation *current, 178cabdff1aSopenharmony_ci const char *element_name, const char *marker_name) 179cabdff1aSopenharmony_ci{ 180cabdff1aSopenharmony_ci int err; 181cabdff1aSopenharmony_ci size_t k; 182cabdff1aSopenharmony_ci#ifdef READ 183cabdff1aSopenharmony_ci GetBitContext start = *rw; 184cabdff1aSopenharmony_ci uint8_t bit; 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_ci for (k = 0; nextbits(1, 1, bit); k++) 187cabdff1aSopenharmony_ci skip_bits(rw, 1 + 8); 188cabdff1aSopenharmony_ci current->extra_information_length = k; 189cabdff1aSopenharmony_ci if (k > 0) { 190cabdff1aSopenharmony_ci *rw = start; 191cabdff1aSopenharmony_ci current->extra_information_ref = 192cabdff1aSopenharmony_ci av_buffer_allocz(k + AV_INPUT_BUFFER_PADDING_SIZE); 193cabdff1aSopenharmony_ci if (!current->extra_information_ref) 194cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 195cabdff1aSopenharmony_ci current->extra_information = current->extra_information_ref->data; 196cabdff1aSopenharmony_ci } 197cabdff1aSopenharmony_ci#endif 198cabdff1aSopenharmony_ci 199cabdff1aSopenharmony_ci for (k = 0; k < current->extra_information_length; k++) { 200cabdff1aSopenharmony_ci bit(marker_name, 1); 201cabdff1aSopenharmony_ci xuia(8, element_name, 202cabdff1aSopenharmony_ci current->extra_information[k], 0, 255, 1, k); 203cabdff1aSopenharmony_ci } 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_ci bit(marker_name, 0); 206cabdff1aSopenharmony_ci 207cabdff1aSopenharmony_ci return 0; 208cabdff1aSopenharmony_ci} 209cabdff1aSopenharmony_ci 210cabdff1aSopenharmony_cistatic int FUNC(picture_header)(CodedBitstreamContext *ctx, RWContext *rw, 211cabdff1aSopenharmony_ci MPEG2RawPictureHeader *current) 212cabdff1aSopenharmony_ci{ 213cabdff1aSopenharmony_ci int err; 214cabdff1aSopenharmony_ci 215cabdff1aSopenharmony_ci HEADER("Picture Header"); 216cabdff1aSopenharmony_ci 217cabdff1aSopenharmony_ci ui(8, picture_start_code); 218cabdff1aSopenharmony_ci 219cabdff1aSopenharmony_ci ui(10, temporal_reference); 220cabdff1aSopenharmony_ci uir(3, picture_coding_type); 221cabdff1aSopenharmony_ci ui(16, vbv_delay); 222cabdff1aSopenharmony_ci 223cabdff1aSopenharmony_ci if (current->picture_coding_type == 2 || 224cabdff1aSopenharmony_ci current->picture_coding_type == 3) { 225cabdff1aSopenharmony_ci ui(1, full_pel_forward_vector); 226cabdff1aSopenharmony_ci ui(3, forward_f_code); 227cabdff1aSopenharmony_ci } 228cabdff1aSopenharmony_ci 229cabdff1aSopenharmony_ci if (current->picture_coding_type == 3) { 230cabdff1aSopenharmony_ci ui(1, full_pel_backward_vector); 231cabdff1aSopenharmony_ci ui(3, backward_f_code); 232cabdff1aSopenharmony_ci } 233cabdff1aSopenharmony_ci 234cabdff1aSopenharmony_ci CHECK(FUNC(extra_information)(ctx, rw, ¤t->extra_information_picture, 235cabdff1aSopenharmony_ci "extra_information_picture[k]", "extra_bit_picture")); 236cabdff1aSopenharmony_ci 237cabdff1aSopenharmony_ci return 0; 238cabdff1aSopenharmony_ci} 239cabdff1aSopenharmony_ci 240cabdff1aSopenharmony_cistatic int FUNC(picture_coding_extension)(CodedBitstreamContext *ctx, RWContext *rw, 241cabdff1aSopenharmony_ci MPEG2RawPictureCodingExtension *current) 242cabdff1aSopenharmony_ci{ 243cabdff1aSopenharmony_ci CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data; 244cabdff1aSopenharmony_ci int err; 245cabdff1aSopenharmony_ci 246cabdff1aSopenharmony_ci HEADER("Picture Coding Extension"); 247cabdff1aSopenharmony_ci 248cabdff1aSopenharmony_ci uir(4, f_code[0][0]); 249cabdff1aSopenharmony_ci uir(4, f_code[0][1]); 250cabdff1aSopenharmony_ci uir(4, f_code[1][0]); 251cabdff1aSopenharmony_ci uir(4, f_code[1][1]); 252cabdff1aSopenharmony_ci 253cabdff1aSopenharmony_ci ui(2, intra_dc_precision); 254cabdff1aSopenharmony_ci ui(2, picture_structure); 255cabdff1aSopenharmony_ci ui(1, top_field_first); 256cabdff1aSopenharmony_ci ui(1, frame_pred_frame_dct); 257cabdff1aSopenharmony_ci ui(1, concealment_motion_vectors); 258cabdff1aSopenharmony_ci ui(1, q_scale_type); 259cabdff1aSopenharmony_ci ui(1, intra_vlc_format); 260cabdff1aSopenharmony_ci ui(1, alternate_scan); 261cabdff1aSopenharmony_ci ui(1, repeat_first_field); 262cabdff1aSopenharmony_ci ui(1, chroma_420_type); 263cabdff1aSopenharmony_ci ui(1, progressive_frame); 264cabdff1aSopenharmony_ci 265cabdff1aSopenharmony_ci if (mpeg2->progressive_sequence) { 266cabdff1aSopenharmony_ci if (current->repeat_first_field) { 267cabdff1aSopenharmony_ci if (current->top_field_first) 268cabdff1aSopenharmony_ci mpeg2->number_of_frame_centre_offsets = 3; 269cabdff1aSopenharmony_ci else 270cabdff1aSopenharmony_ci mpeg2->number_of_frame_centre_offsets = 2; 271cabdff1aSopenharmony_ci } else { 272cabdff1aSopenharmony_ci mpeg2->number_of_frame_centre_offsets = 1; 273cabdff1aSopenharmony_ci } 274cabdff1aSopenharmony_ci } else { 275cabdff1aSopenharmony_ci if (current->picture_structure == 1 || // Top field. 276cabdff1aSopenharmony_ci current->picture_structure == 2) { // Bottom field. 277cabdff1aSopenharmony_ci mpeg2->number_of_frame_centre_offsets = 1; 278cabdff1aSopenharmony_ci } else { 279cabdff1aSopenharmony_ci if (current->repeat_first_field) 280cabdff1aSopenharmony_ci mpeg2->number_of_frame_centre_offsets = 3; 281cabdff1aSopenharmony_ci else 282cabdff1aSopenharmony_ci mpeg2->number_of_frame_centre_offsets = 2; 283cabdff1aSopenharmony_ci } 284cabdff1aSopenharmony_ci } 285cabdff1aSopenharmony_ci 286cabdff1aSopenharmony_ci ui(1, composite_display_flag); 287cabdff1aSopenharmony_ci if (current->composite_display_flag) { 288cabdff1aSopenharmony_ci ui(1, v_axis); 289cabdff1aSopenharmony_ci ui(3, field_sequence); 290cabdff1aSopenharmony_ci ui(1, sub_carrier); 291cabdff1aSopenharmony_ci ui(7, burst_amplitude); 292cabdff1aSopenharmony_ci ui(8, sub_carrier_phase); 293cabdff1aSopenharmony_ci } 294cabdff1aSopenharmony_ci 295cabdff1aSopenharmony_ci return 0; 296cabdff1aSopenharmony_ci} 297cabdff1aSopenharmony_ci 298cabdff1aSopenharmony_cistatic int FUNC(quant_matrix_extension)(CodedBitstreamContext *ctx, RWContext *rw, 299cabdff1aSopenharmony_ci MPEG2RawQuantMatrixExtension *current) 300cabdff1aSopenharmony_ci{ 301cabdff1aSopenharmony_ci int err, i; 302cabdff1aSopenharmony_ci 303cabdff1aSopenharmony_ci HEADER("Quant Matrix Extension"); 304cabdff1aSopenharmony_ci 305cabdff1aSopenharmony_ci ui(1, load_intra_quantiser_matrix); 306cabdff1aSopenharmony_ci if (current->load_intra_quantiser_matrix) { 307cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) 308cabdff1aSopenharmony_ci uirs(8, intra_quantiser_matrix[i], 1, i); 309cabdff1aSopenharmony_ci } 310cabdff1aSopenharmony_ci 311cabdff1aSopenharmony_ci ui(1, load_non_intra_quantiser_matrix); 312cabdff1aSopenharmony_ci if (current->load_non_intra_quantiser_matrix) { 313cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) 314cabdff1aSopenharmony_ci uirs(8, non_intra_quantiser_matrix[i], 1, i); 315cabdff1aSopenharmony_ci } 316cabdff1aSopenharmony_ci 317cabdff1aSopenharmony_ci ui(1, load_chroma_intra_quantiser_matrix); 318cabdff1aSopenharmony_ci if (current->load_chroma_intra_quantiser_matrix) { 319cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) 320cabdff1aSopenharmony_ci uirs(8, intra_quantiser_matrix[i], 1, i); 321cabdff1aSopenharmony_ci } 322cabdff1aSopenharmony_ci 323cabdff1aSopenharmony_ci ui(1, load_chroma_non_intra_quantiser_matrix); 324cabdff1aSopenharmony_ci if (current->load_chroma_non_intra_quantiser_matrix) { 325cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) 326cabdff1aSopenharmony_ci uirs(8, chroma_non_intra_quantiser_matrix[i], 1, i); 327cabdff1aSopenharmony_ci } 328cabdff1aSopenharmony_ci 329cabdff1aSopenharmony_ci return 0; 330cabdff1aSopenharmony_ci} 331cabdff1aSopenharmony_ci 332cabdff1aSopenharmony_cistatic int FUNC(picture_display_extension)(CodedBitstreamContext *ctx, RWContext *rw, 333cabdff1aSopenharmony_ci MPEG2RawPictureDisplayExtension *current) 334cabdff1aSopenharmony_ci{ 335cabdff1aSopenharmony_ci CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data; 336cabdff1aSopenharmony_ci int err, i; 337cabdff1aSopenharmony_ci 338cabdff1aSopenharmony_ci HEADER("Picture Display Extension"); 339cabdff1aSopenharmony_ci 340cabdff1aSopenharmony_ci for (i = 0; i < mpeg2->number_of_frame_centre_offsets; i++) { 341cabdff1aSopenharmony_ci sis(16, frame_centre_horizontal_offset[i], 1, i); 342cabdff1aSopenharmony_ci marker_bit(); 343cabdff1aSopenharmony_ci sis(16, frame_centre_vertical_offset[i], 1, i); 344cabdff1aSopenharmony_ci marker_bit(); 345cabdff1aSopenharmony_ci } 346cabdff1aSopenharmony_ci 347cabdff1aSopenharmony_ci return 0; 348cabdff1aSopenharmony_ci} 349cabdff1aSopenharmony_ci 350cabdff1aSopenharmony_cistatic int FUNC(extension_data)(CodedBitstreamContext *ctx, RWContext *rw, 351cabdff1aSopenharmony_ci MPEG2RawExtensionData *current) 352cabdff1aSopenharmony_ci{ 353cabdff1aSopenharmony_ci int err; 354cabdff1aSopenharmony_ci 355cabdff1aSopenharmony_ci HEADER("Extension Data"); 356cabdff1aSopenharmony_ci 357cabdff1aSopenharmony_ci ui(8, extension_start_code); 358cabdff1aSopenharmony_ci ui(4, extension_start_code_identifier); 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_ci switch (current->extension_start_code_identifier) { 361cabdff1aSopenharmony_ci case MPEG2_EXTENSION_SEQUENCE: 362cabdff1aSopenharmony_ci return FUNC(sequence_extension) 363cabdff1aSopenharmony_ci (ctx, rw, ¤t->data.sequence); 364cabdff1aSopenharmony_ci case MPEG2_EXTENSION_SEQUENCE_DISPLAY: 365cabdff1aSopenharmony_ci return FUNC(sequence_display_extension) 366cabdff1aSopenharmony_ci (ctx, rw, ¤t->data.sequence_display); 367cabdff1aSopenharmony_ci case MPEG2_EXTENSION_QUANT_MATRIX: 368cabdff1aSopenharmony_ci return FUNC(quant_matrix_extension) 369cabdff1aSopenharmony_ci (ctx, rw, ¤t->data.quant_matrix); 370cabdff1aSopenharmony_ci case MPEG2_EXTENSION_PICTURE_DISPLAY: 371cabdff1aSopenharmony_ci return FUNC(picture_display_extension) 372cabdff1aSopenharmony_ci (ctx, rw, ¤t->data.picture_display); 373cabdff1aSopenharmony_ci case MPEG2_EXTENSION_PICTURE_CODING: 374cabdff1aSopenharmony_ci return FUNC(picture_coding_extension) 375cabdff1aSopenharmony_ci (ctx, rw, ¤t->data.picture_coding); 376cabdff1aSopenharmony_ci default: 377cabdff1aSopenharmony_ci av_log(ctx->log_ctx, AV_LOG_ERROR, "Extension ID %d not supported.\n", 378cabdff1aSopenharmony_ci current->extension_start_code_identifier); 379cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 380cabdff1aSopenharmony_ci } 381cabdff1aSopenharmony_ci} 382cabdff1aSopenharmony_ci 383cabdff1aSopenharmony_cistatic int FUNC(slice_header)(CodedBitstreamContext *ctx, RWContext *rw, 384cabdff1aSopenharmony_ci MPEG2RawSliceHeader *current) 385cabdff1aSopenharmony_ci{ 386cabdff1aSopenharmony_ci CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data; 387cabdff1aSopenharmony_ci int err; 388cabdff1aSopenharmony_ci 389cabdff1aSopenharmony_ci HEADER("Slice Header"); 390cabdff1aSopenharmony_ci 391cabdff1aSopenharmony_ci ui(8, slice_vertical_position); 392cabdff1aSopenharmony_ci 393cabdff1aSopenharmony_ci if (mpeg2->vertical_size > 2800) 394cabdff1aSopenharmony_ci ui(3, slice_vertical_position_extension); 395cabdff1aSopenharmony_ci if (mpeg2->scalable) { 396cabdff1aSopenharmony_ci if (mpeg2->scalable_mode == 0) 397cabdff1aSopenharmony_ci ui(7, priority_breakpoint); 398cabdff1aSopenharmony_ci } 399cabdff1aSopenharmony_ci 400cabdff1aSopenharmony_ci uir(5, quantiser_scale_code); 401cabdff1aSopenharmony_ci 402cabdff1aSopenharmony_ci if (nextbits(1, 1, current->slice_extension_flag)) { 403cabdff1aSopenharmony_ci ui(1, slice_extension_flag); 404cabdff1aSopenharmony_ci ui(1, intra_slice); 405cabdff1aSopenharmony_ci ui(1, slice_picture_id_enable); 406cabdff1aSopenharmony_ci ui(6, slice_picture_id); 407cabdff1aSopenharmony_ci } 408cabdff1aSopenharmony_ci 409cabdff1aSopenharmony_ci CHECK(FUNC(extra_information)(ctx, rw, ¤t->extra_information_slice, 410cabdff1aSopenharmony_ci "extra_information_slice[k]", "extra_bit_slice")); 411cabdff1aSopenharmony_ci 412cabdff1aSopenharmony_ci return 0; 413cabdff1aSopenharmony_ci} 414cabdff1aSopenharmony_ci 415cabdff1aSopenharmony_cistatic int FUNC(sequence_end)(CodedBitstreamContext *ctx, RWContext *rw, 416cabdff1aSopenharmony_ci MPEG2RawSequenceEnd *current) 417cabdff1aSopenharmony_ci{ 418cabdff1aSopenharmony_ci int err; 419cabdff1aSopenharmony_ci 420cabdff1aSopenharmony_ci HEADER("Sequence End"); 421cabdff1aSopenharmony_ci 422cabdff1aSopenharmony_ci ui(8, sequence_end_code); 423cabdff1aSopenharmony_ci 424cabdff1aSopenharmony_ci return 0; 425cabdff1aSopenharmony_ci} 426