diff options
author | Vittorio Giovara <vittorio.giovara@gmail.com> | 2013-08-01 16:58:27 +0200 |
---|---|---|
committer | Vittorio Giovara <vittorio.giovara@gmail.com> | 2013-12-09 16:02:43 +0100 |
commit | 3d1d175367f1f22e0c4952299a258272e2e2acf1 (patch) | |
tree | c862d658ae9579d014ac7df362dba8b0d22d495e | |
parent | bacc2869f37b17b2a89e1083289fdaf7f95f27bc (diff) | |
download | ffmpeg-3d1d175367f1f22e0c4952299a258272e2e2acf1.tar.gz |
mpeg12enc: set frame packing information when relevant metadata is found
-rw-r--r-- | libavcodec/mpeg12enc.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c index 2e03ce3ccc..6c4ef6d7e4 100644 --- a/libavcodec/mpeg12enc.c +++ b/libavcodec/mpeg12enc.c @@ -30,6 +30,8 @@ #include "libavutil/attributes.h" #include "libavutil/log.h" #include "libavutil/opt.h" +#include "libavutil/stereo3d.h" + #include "avcodec.h" #include "bytestream.h" #include "mathops.h" @@ -350,6 +352,7 @@ void ff_mpeg1_encode_slice_header(MpegEncContext *s) void ff_mpeg1_encode_picture_header(MpegEncContext *s, int picture_number) { + AVFrameSideData *side_data; mpeg1_encode_sequence_header(s); /* mpeg1 picture header */ @@ -433,6 +436,44 @@ void ff_mpeg1_encode_picture_header(MpegEncContext *s, int picture_number) for (i = 0; i < sizeof(svcd_scan_offset_placeholder); i++) put_bits(&s->pb, 8, svcd_scan_offset_placeholder[i]); } + side_data = av_frame_get_side_data(&s->current_picture_ptr->f, + AV_FRAME_DATA_STEREO3D); + if (side_data) { + AVStereo3D *stereo = (AVStereo3D *)side_data->data; + uint8_t fpa_type; + + switch (stereo->type) { + case AV_STEREO3D_SIDEBYSIDE: + fpa_type = 0x03; + break; + case AV_STEREO3D_TOPBOTTOM: + fpa_type = 0x04; + break; + case AV_STEREO3D_2D: + fpa_type = 0x08; + break; + case AV_STEREO3D_SIDEBYSIDE_QUINCUNX: + fpa_type = 0x23; + break; + default: + fpa_type = 0; + break; + } + + if (fpa_type != 0) { + put_header(s, USER_START_CODE); + put_bits(&s->pb, 8, 'J'); // S3D_video_format_signaling_identifier + put_bits(&s->pb, 8, 'P'); + put_bits(&s->pb, 8, '3'); + put_bits(&s->pb, 8, 'D'); + put_bits(&s->pb, 8, 0x03); // S3D_video_format_length + + put_bits(&s->pb, 1, 1); // reserved_bit + put_bits(&s->pb, 7, fpa_type); // S3D_video_format_type + put_bits(&s->pb, 8, 0x04); // reserved_data[0] + put_bits(&s->pb, 8, 0xFF); // reserved_data[1] + } + } s->mb_y = 0; ff_mpeg1_encode_slice_header(s); |