| /* | |
| * This file is part of FFmpeg. | |
| * | |
| * FFmpeg is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * FFmpeg is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with FFmpeg; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
| */ | |
| #ifndef AVCODEC_CBS_MPEG2_H | |
| #define AVCODEC_CBS_MPEG2_H | |
| #include <stddef.h> | |
| #include <stdint.h> | |
| #include "libavutil/buffer.h" | |
| enum { | |
| MPEG2_START_PICTURE = 0x00, | |
| MPEG2_START_SLICE_MIN = 0x01, | |
| MPEG2_START_SLICE_MAX = 0xaf, | |
| MPEG2_START_USER_DATA = 0xb2, | |
| MPEG2_START_SEQUENCE_HEADER = 0xb3, | |
| MPEG2_START_SEQUENCE_ERROR = 0xb4, | |
| MPEG2_START_EXTENSION = 0xb5, | |
| MPEG2_START_SEQUENCE_END = 0xb7, | |
| MPEG2_START_GROUP = 0xb8, | |
| }; | |
| #define MPEG2_START_IS_SLICE(type) \ | |
| ((type) >= MPEG2_START_SLICE_MIN && \ | |
| (type) <= MPEG2_START_SLICE_MAX) | |
| enum { | |
| MPEG2_EXTENSION_SEQUENCE = 0x1, | |
| MPEG2_EXTENSION_SEQUENCE_DISPLAY = 0x2, | |
| MPEG2_EXTENSION_QUANT_MATRIX = 0x3, | |
| MPEG2_EXTENSION_COPYRIGHT = 0x4, | |
| MPEG2_EXTENSION_SEQUENCE_SCALABLE = 0x5, | |
| MPEG2_EXTENSION_PICTURE_DISPLAY = 0x7, | |
| MPEG2_EXTENSION_PICTURE_CODING = 0x8, | |
| MPEG2_EXTENSION_PICTURE_SPATIAL_SCALABLE = 0x9, | |
| MPEG2_EXTENSION_PICTURE_TEMPORAL_SCALABLE = 0xa, | |
| MPEG2_EXTENSION_CAMERA_PARAMETERS = 0xb, | |
| MPEG2_EXTENSION_ITU_T = 0xc, | |
| }; | |
| typedef struct MPEG2RawSequenceHeader { | |
| uint8_t sequence_header_code; | |
| uint16_t horizontal_size_value; | |
| uint16_t vertical_size_value; | |
| uint8_t aspect_ratio_information; | |
| uint8_t frame_rate_code; | |
| uint32_t bit_rate_value; | |
| uint16_t vbv_buffer_size_value; | |
| uint8_t constrained_parameters_flag; | |
| uint8_t load_intra_quantiser_matrix; | |
| uint8_t intra_quantiser_matrix[64]; | |
| uint8_t load_non_intra_quantiser_matrix; | |
| uint8_t non_intra_quantiser_matrix[64]; | |
| } MPEG2RawSequenceHeader; | |
| typedef struct MPEG2RawUserData { | |
| uint8_t user_data_start_code; | |
| uint8_t *user_data; | |
| AVBufferRef *user_data_ref; | |
| size_t user_data_length; | |
| } MPEG2RawUserData; | |
| typedef struct MPEG2RawSequenceExtension { | |
| uint8_t profile_and_level_indication; | |
| uint8_t progressive_sequence; | |
| uint8_t chroma_format; | |
| uint8_t horizontal_size_extension; | |
| uint8_t vertical_size_extension; | |
| uint16_t bit_rate_extension; | |
| uint8_t vbv_buffer_size_extension; | |
| uint8_t low_delay; | |
| uint8_t frame_rate_extension_n; | |
| uint8_t frame_rate_extension_d; | |
| } MPEG2RawSequenceExtension; | |
| typedef struct MPEG2RawSequenceDisplayExtension { | |
| uint8_t video_format; | |
| uint8_t colour_description; | |
| uint8_t colour_primaries; | |
| uint8_t transfer_characteristics; | |
| uint8_t matrix_coefficients; | |
| uint16_t display_horizontal_size; | |
| uint16_t display_vertical_size; | |
| } MPEG2RawSequenceDisplayExtension; | |
| typedef struct MPEG2RawGroupOfPicturesHeader { | |
| uint8_t group_start_code; | |
| uint32_t time_code; | |
| uint8_t closed_gop; | |
| uint8_t broken_link; | |
| } MPEG2RawGroupOfPicturesHeader; | |
| typedef struct MPEG2RawExtraInformation { | |
| uint8_t *extra_information; | |
| AVBufferRef *extra_information_ref; | |
| size_t extra_information_length; | |
| } MPEG2RawExtraInformation; | |
| typedef struct MPEG2RawPictureHeader { | |
| uint8_t picture_start_code; | |
| uint16_t temporal_reference; | |
| uint8_t picture_coding_type; | |
| uint16_t vbv_delay; | |
| uint8_t full_pel_forward_vector; | |
| uint8_t forward_f_code; | |
| uint8_t full_pel_backward_vector; | |
| uint8_t backward_f_code; | |
| MPEG2RawExtraInformation extra_information_picture; | |
| } MPEG2RawPictureHeader; | |
| typedef struct MPEG2RawPictureCodingExtension { | |
| uint8_t f_code[2][2]; | |
| uint8_t intra_dc_precision; | |
| uint8_t picture_structure; | |
| uint8_t top_field_first; | |
| uint8_t frame_pred_frame_dct; | |
| uint8_t concealment_motion_vectors; | |
| uint8_t q_scale_type; | |
| uint8_t intra_vlc_format; | |
| uint8_t alternate_scan; | |
| uint8_t repeat_first_field; | |
| uint8_t chroma_420_type; | |
| uint8_t progressive_frame; | |
| uint8_t composite_display_flag; | |
| uint8_t v_axis; | |
| uint8_t field_sequence; | |
| uint8_t sub_carrier; | |
| uint8_t burst_amplitude; | |
| uint8_t sub_carrier_phase; | |
| } MPEG2RawPictureCodingExtension; | |
| typedef struct MPEG2RawQuantMatrixExtension { | |
| uint8_t load_intra_quantiser_matrix; | |
| uint8_t intra_quantiser_matrix[64]; | |
| uint8_t load_non_intra_quantiser_matrix; | |
| uint8_t non_intra_quantiser_matrix[64]; | |
| uint8_t load_chroma_intra_quantiser_matrix; | |
| uint8_t chroma_intra_quantiser_matrix[64]; | |
| uint8_t load_chroma_non_intra_quantiser_matrix; | |
| uint8_t chroma_non_intra_quantiser_matrix[64]; | |
| } MPEG2RawQuantMatrixExtension; | |
| typedef struct MPEG2RawPictureDisplayExtension { | |
| int16_t frame_centre_horizontal_offset[3]; | |
| int16_t frame_centre_vertical_offset[3]; | |
| } MPEG2RawPictureDisplayExtension; | |
| typedef struct MPEG2RawExtensionData { | |
| uint8_t extension_start_code; | |
| uint8_t extension_start_code_identifier; | |
| union { | |
| MPEG2RawSequenceExtension sequence; | |
| MPEG2RawSequenceDisplayExtension sequence_display; | |
| MPEG2RawQuantMatrixExtension quant_matrix; | |
| MPEG2RawPictureCodingExtension picture_coding; | |
| MPEG2RawPictureDisplayExtension picture_display; | |
| } data; | |
| } MPEG2RawExtensionData; | |
| typedef struct MPEG2RawSliceHeader { | |
| uint8_t slice_vertical_position; | |
| uint8_t slice_vertical_position_extension; | |
| uint8_t priority_breakpoint; | |
| uint8_t quantiser_scale_code; | |
| uint8_t slice_extension_flag; | |
| uint8_t intra_slice; | |
| uint8_t slice_picture_id_enable; | |
| uint8_t slice_picture_id; | |
| MPEG2RawExtraInformation extra_information_slice; | |
| } MPEG2RawSliceHeader; | |
| typedef struct MPEG2RawSlice { | |
| MPEG2RawSliceHeader header; | |
| uint8_t *data; | |
| AVBufferRef *data_ref; | |
| size_t data_size; | |
| int data_bit_start; | |
| } MPEG2RawSlice; | |
| typedef struct MPEG2RawSequenceEnd { | |
| uint8_t sequence_end_code; | |
| } MPEG2RawSequenceEnd; | |
| typedef struct CodedBitstreamMPEG2Context { | |
| // Elements stored in headers which are required for other decoding. | |
| uint16_t horizontal_size; | |
| uint16_t vertical_size; | |
| uint8_t scalable; | |
| uint8_t scalable_mode; | |
| uint8_t progressive_sequence; | |
| uint8_t number_of_frame_centre_offsets; | |
| } CodedBitstreamMPEG2Context; | |
| #endif /* AVCODEC_CBS_MPEG2_H */ |