diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-02-14 07:06:57 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-02-14 07:11:37 +0400 |
commit | abe3f79d62f4f6d0175310a01fa18935f8fae3ef (patch) | |
tree | dfee16082fe6cbe6065204faa35ec43c4eebe0cb /libavcodec/mpeg12dec.c | |
parent | 8dc5a46466de29fd146599d99a19132a21253012 (diff) | |
parent | 73eca738acd0770c4c415cba55371e984d27b03f (diff) |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
mpeg12dec: do not add stereo3D side data to a non-existing frame
Conflicts:
libavcodec/mpeg12dec.c
See: fe285b04bbad23ddfac164e22034b5ee76e039a6
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/mpeg12dec.c')
-rw-r--r-- | libavcodec/mpeg12dec.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index 7552f39bbc..1f89830519 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -48,6 +48,8 @@ typedef struct Mpeg1Context { int mpeg_enc_ctx_allocated; /* true if decoding context allocated */ int repeat_field; /* true if we must repeat the field */ AVPanScan pan_scan; /* some temporary storage for the panscan */ + AVStereo3D stereo3d; + int has_stereo3d; uint8_t *a53_caption; int a53_caption_size; int slice_count; @@ -1642,6 +1644,15 @@ static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size) memcpy(sd->data, s1->a53_caption, s1->a53_caption_size); av_freep(&s1->a53_caption); } + + if (s1->has_stereo3d) { + AVStereo3D *stereo = av_stereo3d_create_side_data(&s->current_picture_ptr->f); + if (!stereo) + return AVERROR(ENOMEM); + + *stereo = s1->stereo3d; + s1->has_stereo3d = 0; + } if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_FRAME)) ff_thread_finish_setup(avctx); } else { // second field @@ -2272,28 +2283,21 @@ static void mpeg_decode_user_data(AVCodecContext *avctx, S3D_video_format_type == 0x08 || S3D_video_format_type == 0x23) { Mpeg1Context *s1 = avctx->priv_data; - MpegEncContext *s = &s1->mpeg_enc_ctx; - AVStereo3D *stereo; - if (!s->current_picture_ptr) - return; - stereo = - av_stereo3d_create_side_data(&s->current_picture_ptr->f); - if (!stereo) - return; + s1->has_stereo3d = 1; switch (S3D_video_format_type) { case 0x03: - stereo->type = AV_STEREO3D_SIDEBYSIDE; + s1->stereo3d.type = AV_STEREO3D_SIDEBYSIDE; break; case 0x04: - stereo->type = AV_STEREO3D_TOPBOTTOM; + s1->stereo3d.type = AV_STEREO3D_TOPBOTTOM; break; case 0x08: - stereo->type = AV_STEREO3D_2D; + s1->stereo3d.type = AV_STEREO3D_2D; break; case 0x23: - stereo->type = AV_STEREO3D_SIDEBYSIDE_QUINCUNX; + s1->stereo3d.type = AV_STEREO3D_SIDEBYSIDE_QUINCUNX; break; } } |