---
 libavcodec/mpeg12dec.c |   21 ++++++++++++++++++++-
 libavutil/frame.h      |    4 ++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
index 0bf3c20..a7a0fd2 100644
--- a/libavcodec/mpeg12dec.c
+++ b/libavcodec/mpeg12dec.c
@@ -54,6 +54,8 @@ typedef struct Mpeg1Context {
     int has_stereo3d;
     uint8_t *a53_caption;
     int a53_caption_size;
+    uint8_t afd;
+    int has_afd;
     int slice_count;
     int save_aspect_info;
     int save_width, save_height, save_progressive_seq;
@@ -1631,6 +1633,18 @@ static int mpeg_field_start(MpegEncContext *s, const 
uint8_t *buf, int buf_size)
             *stereo = s1->stereo3d;
             s1->has_stereo3d = 0;
         }
+        
+        if (s1->has_afd) {
+            AVFrameSideData *sd = av_frame_new_side_data(
+                s->current_picture_ptr->f, AV_FRAME_DATA_AFD,
+                1);
+            if (!sd)
+                return AVERROR(ENOMEM);
+
+            sd->data = s1->afd;
+            s1->has_afd = 0;
+        }
+        
         if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_FRAME))
             ff_thread_finish_setup(avctx);
     } else { // second field
@@ -2221,6 +2235,7 @@ static void mpeg_decode_user_data(AVCodecContext *avctx,
                                   const uint8_t *p, int buf_size)
 {
     const uint8_t *buf_end = p + buf_size;
+    Mpeg1Context *s1   = avctx->priv_data;
 
     /* we parse the DTG active format information */
     if (buf_end - p >= 5 &&
@@ -2234,7 +2249,12 @@ static void mpeg_decode_user_data(AVCodecContext *avctx,
         if (flags & 0x40) {
             if (buf_end - p < 1)
                 return;
+#if FF_API_AFD
             avctx->dtg_active_format = p[0] & 0x0f;
+#else
+            s1->has_afd = 1;
+            s1->afd = p[0] & 0x0f;
+#endif
         }
     } else if (buf_end - p >= 6 &&
                p[0] == 'J' && p[1] == 'P' && p[2] == '3' && p[3] == 'D' &&
@@ -2246,7 +2266,6 @@ static void mpeg_decode_user_data(AVCodecContext *avctx,
             S3D_video_format_type == 0x04 ||
             S3D_video_format_type == 0x08 ||
             S3D_video_format_type == 0x23) {
-            Mpeg1Context *s1   = avctx->priv_data;
 
             s1->has_stereo3d = 1;
 
diff --git a/libavutil/frame.h b/libavutil/frame.h
index b2159d3..0d76f1d 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -82,6 +82,10 @@ enum AVFrameSideDataType {
      * See libavutil/display.h for a detailed description of the data.
      */
     AV_FRAME_DATA_DISPLAYMATRIX,
+    /** 
+     * Active Format Description data as specified in ETSI TS 101 154
+     */
+    AV_FRAME_DATA_AFD,    
 };
 
 typedef struct AVFrameSideData {
-- 
1.7.9.5

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to