[FFmpeg-cvslog] lavf/dv: make returning the video packet optional

Anton Khirnov git at videolan.org
Mon Sep 5 10:01:11 EEST 2022


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Tue Aug 23 12:12:34 2022 +0200| [090f12b15750bc3eb81b2d892cd980e9285cfe48] | committer: Anton Khirnov

lavf/dv: make returning the video packet optional

The mov demuxer only returns DV audio, video packets are discarded.

It first reads the data to be parsed into a packet. Then both this
packet and the pointer to its data are passed together to
avpriv_dv_produce_packet(), which parses the data and partially
overwrites the packet. This is confusing and potentially dangerous, so
just pass NULL and avoid pointless packet modification.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=090f12b15750bc3eb81b2d892cd980e9285cfe48
---

 libavformat/dv.c  | 19 +++++++++++--------
 libavformat/mov.c |  2 +-
 2 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/libavformat/dv.c b/libavformat/dv.c
index 303cecf9bb..f88fe62349 100644
--- a/libavformat/dv.c
+++ b/libavformat/dv.c
@@ -430,14 +430,17 @@ int avpriv_dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
         }
     }
 
-    /* Now it's time to return video packet */
-    size = dv_extract_video_info(c, buf);
-    pkt->data         = buf;
-    pkt->pos          = pos;
-    pkt->size         = size;
-    pkt->flags       |= AV_PKT_FLAG_KEY;
-    pkt->stream_index = c->vst->index;
-    pkt->pts          = c->frames;
+    /* return the video packet, if the caller wants it */
+    if (pkt) {
+        size = dv_extract_video_info(c, buf);
+
+        pkt->data         = buf;
+        pkt->pos          = pos;
+        pkt->size         = size;
+        pkt->flags       |= AV_PKT_FLAG_KEY;
+        pkt->stream_index = c->vst->index;
+        pkt->pts          = c->frames;
+    }
 
     c->frames++;
 
diff --git a/libavformat/mov.c b/libavformat/mov.c
index df45408060..b93facf7e0 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -8777,7 +8777,7 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
         }
 #if CONFIG_DV_DEMUXER
         if (mov->dv_demux && sc->dv_audio_container) {
-            ret = avpriv_dv_produce_packet(mov->dv_demux, pkt, pkt->data, pkt->size, pkt->pos);
+            ret = avpriv_dv_produce_packet(mov->dv_demux, NULL, pkt->data, pkt->size, pkt->pos);
             av_packet_unref(pkt);
             if (ret < 0)
                 return ret;



More information about the ffmpeg-cvslog mailing list