avformat/mux: Only prepare input packet if there is a packet
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Fri, 9 Aug 2019 01:19:42 +0000 (03:19 +0200)
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Wed, 1 Apr 2020 02:31:39 +0000 (04:31 +0200)
It is unnecessary to call prepare_input_packet if there is no packet as
it doesn't do anything, except when the currently inactive code guarded
by !FF_API_COMPUTE_PKT_FIELDS2 || !FF_API_LAVF_AVCTX becomes active:
Then attempting to access pkt->stream_index will crash.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
libavformat/mux.c

index bfd1bf4..cc2d1e2 100644 (file)
@@ -771,9 +771,6 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
 
 static int check_packet(AVFormatContext *s, AVPacket *pkt)
 {
-    if (!pkt)
-        return 0;
-
     if (pkt->stream_index < 0 || pkt->stream_index >= s->nb_streams) {
         av_log(s, AV_LOG_ERROR, "Invalid packet stream index: %d\n",
                pkt->stream_index);
@@ -887,10 +884,6 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt)
 {
     int ret;
 
-    ret = prepare_input_packet(s, pkt);
-    if (ret < 0)
-        return ret;
-
     if (!pkt) {
         if (s->oformat->flags & AVFMT_ALLOW_FLUSH) {
             ret = s->oformat->write_packet(s, NULL);
@@ -902,6 +895,10 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt)
         return 1;
     }
 
+    ret = prepare_input_packet(s, pkt);
+    if (ret < 0)
+        return ret;
+
     ret = do_packet_auto_bsf(s, pkt);
     if (ret <= 0)
         return ret;
@@ -1191,13 +1188,13 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt)
 {
     int ret, flush = 0;
 
-    ret = prepare_input_packet(s, pkt);
-    if (ret < 0)
-        goto fail;
-
     if (pkt) {
         AVStream *st = s->streams[pkt->stream_index];
 
+        ret = prepare_input_packet(s, pkt);
+        if (ret < 0)
+            goto fail;
+
         ret = do_packet_auto_bsf(s, pkt);
         if (ret == 0)
             return 0;