summaryrefslogtreecommitdiff
path: root/libavcodec/cbs_mpeg2.h
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2017-05-04 23:03:03 +0100
committerMark Thompson <sw@jkqxz.net>2017-10-17 20:56:29 +0100
commit686e388bbb6aeef077095a83f84b53d143d44d63 (patch)
treecfcd19745c52c01c4ecba66863e818d349f5ab59 /libavcodec/cbs_mpeg2.h
parent9b0c7aa0e446eceec96ba8f4009e004fad29fba3 (diff)
downloadffmpeg-686e388bbb6aeef077095a83f84b53d143d44d63.tar.gz
lavc: Add coded bitstream read/write support for MPEG-2
(cherry picked from commit 2bc9ba8d3c41f3a8e56484bd67b05040c7909a01) (cherry picked from commit a41b69b5eb950c10d8ede472bcc4e88ce4246db9)
Diffstat (limited to 'libavcodec/cbs_mpeg2.h')
-rw-r--r--libavcodec/cbs_mpeg2.h224
1 files changed, 224 insertions, 0 deletions
diff --git a/libavcodec/cbs_mpeg2.h b/libavcodec/cbs_mpeg2.h
new file mode 100644
index 0000000000..a8f12b2e75
--- /dev/null
+++ b/libavcodec/cbs_mpeg2.h
@@ -0,0 +1,224 @@
+/*
+ * 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>
+
+
+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_CAMAERA_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;
+ 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 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;
+
+ uint8_t extra_bit_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 {
+ uint16_t frame_centre_horizontal_offset[3];
+ uint16_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;
+
+ uint8_t extra_bit_slice;
+
+ size_t extra_information_length;
+ uint8_t *extra_information;
+} MPEG2RawSliceHeader;
+
+typedef struct MPEG2RawSlice {
+ MPEG2RawSliceHeader header;
+
+ uint8_t *data;
+ size_t data_size;
+ int data_bit_start;
+} MPEG2RawSlice;
+
+
+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;
+
+ // Write buffer.
+ uint8_t *write_buffer;
+ size_t write_buffer_size;
+} CodedBitstreamMPEG2Context;
+
+
+#endif /* AVCODEC_CBS_MPEG2_H */