/* * 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 */
/*
* 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 */