summaryrefslogtreecommitdiff
path: root/libavcodec/cbs_mpeg2_syntax_template.c
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2017-09-09 23:30:32 +0100
committerMark Thompson <sw@jkqxz.net>2017-09-12 22:11:56 +0100
commita41b69b5eb950c10d8ede472bcc4e88ce4246db9 (patch)
tree1bb6d24bdbffade76642900de62a3883b829a3d2 /libavcodec/cbs_mpeg2_syntax_template.c
parent067a9ddeb8feff1f724856f0054930c55219f76b (diff)
cbs_mpeg2: Add support for picture display extension
Diffstat (limited to 'libavcodec/cbs_mpeg2_syntax_template.c')
-rw-r--r--libavcodec/cbs_mpeg2_syntax_template.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/libavcodec/cbs_mpeg2_syntax_template.c b/libavcodec/cbs_mpeg2_syntax_template.c
index b6dd42d2ee..4aa1eb3c06 100644
--- a/libavcodec/cbs_mpeg2_syntax_template.c
+++ b/libavcodec/cbs_mpeg2_syntax_template.c
@@ -101,6 +101,7 @@ static int FUNC(sequence_extension)(CodedBitstreamContext *ctx, RWContext *rw,
current->horizontal_size_extension << 12;
mpeg2->vertical_size = (mpeg2->vertical_size & 0xfff) |
current->vertical_size_extension << 12;
+ mpeg2->progressive_sequence = current->progressive_sequence;
ui(12, bit_rate_extension);
marker_bit();
@@ -183,6 +184,7 @@ static int FUNC(picture_header)(CodedBitstreamContext *ctx, RWContext *rw,
static int FUNC(picture_coding_extension)(CodedBitstreamContext *ctx, RWContext *rw,
MPEG2RawPictureCodingExtension *current)
{
+ CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
int err;
HEADER("Picture Coding Extension");
@@ -204,6 +206,27 @@ static int FUNC(picture_coding_extension)(CodedBitstreamContext *ctx, RWContext
ui(1, chroma_420_type);
ui(1, progressive_frame);
+ if (mpeg2->progressive_sequence) {
+ if (current->repeat_first_field) {
+ if (current->top_field_first)
+ mpeg2->number_of_frame_centre_offsets = 3;
+ else
+ mpeg2->number_of_frame_centre_offsets = 2;
+ } else {
+ mpeg2->number_of_frame_centre_offsets = 1;
+ }
+ } else {
+ if (current->picture_structure == 1 || // Top field.
+ current->picture_structure == 2) { // Bottom field.
+ mpeg2->number_of_frame_centre_offsets = 1;
+ } else {
+ if (current->repeat_first_field)
+ mpeg2->number_of_frame_centre_offsets = 3;
+ else
+ mpeg2->number_of_frame_centre_offsets = 2;
+ }
+ }
+
ui(1, composite_display_flag);
if (current->composite_display_flag) {
ui(1, v_axis);
@@ -250,6 +273,24 @@ static int FUNC(quant_matrix_extension)(CodedBitstreamContext *ctx, RWContext *r
return 0;
}
+static int FUNC(picture_display_extension)(CodedBitstreamContext *ctx, RWContext *rw,
+ MPEG2RawPictureDisplayExtension *current)
+{
+ CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
+ int err, i;
+
+ HEADER("Picture Display Extension");
+
+ for (i = 0; i < mpeg2->number_of_frame_centre_offsets; i++) {
+ ui(16, frame_centre_horizontal_offset[i]);
+ marker_bit();
+ ui(16, frame_centre_vertical_offset[i]);
+ marker_bit();
+ }
+
+ return 0;
+}
+
static int FUNC(extension_data)(CodedBitstreamContext *ctx, RWContext *rw,
MPEG2RawExtensionData *current)
{
@@ -270,6 +311,9 @@ static int FUNC(extension_data)(CodedBitstreamContext *ctx, RWContext *rw,
case 3:
return FUNC(quant_matrix_extension)
(ctx, rw, &current->data.quant_matrix);
+ case 7:
+ return FUNC(picture_display_extension)
+ (ctx, rw, &current->data.picture_display);
case 8:
return FUNC(picture_coding_extension)
(ctx, rw, &current->data.picture_coding);