]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/mpeg12dec.c
Use av_frame_copy() to simplify code where appropriate.
[ffmpeg] / libavcodec / mpeg12dec.c
index 149d5f49ef87a453ad9d0021851d948ed51b53ca..cb713fdf500f26222981eb611cf16e2618117900 100644 (file)
@@ -46,6 +46,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;
@@ -1614,6 +1616,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
@@ -2231,24 +2242,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 =
-                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;
             }
         }