diff options
author | Mark Thompson <sw@jkqxz.net> | 2017-09-09 23:30:32 +0100 |
---|---|---|
committer | Mark Thompson <sw@jkqxz.net> | 2017-09-12 22:11:56 +0100 |
commit | a41b69b5eb950c10d8ede472bcc4e88ce4246db9 (patch) | |
tree | 1bb6d24bdbffade76642900de62a3883b829a3d2 /libavcodec/cbs_mpeg2_syntax_template.c | |
parent | 067a9ddeb8feff1f724856f0054930c55219f76b (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.c | 44 |
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, ¤t->data.quant_matrix); + case 7: + return FUNC(picture_display_extension) + (ctx, rw, ¤t->data.picture_display); case 8: return FUNC(picture_coding_extension) (ctx, rw, ¤t->data.picture_coding); |