[FFmpeg-devel] [PATCH 39/49] fftools/ffmpeg_mux: return errors from of_submit_packet()

Anton Khirnov anton at khirnov.net
Mon Apr 4 14:30:27 EEST 2022


---
 fftools/ffmpeg.c     | 54 +++++++++++++++++++++++++++++++-------------
 fftools/ffmpeg.h     |  2 +-
 fftools/ffmpeg_mux.c | 12 ++++++----
 3 files changed, 46 insertions(+), 22 deletions(-)

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 7e9ac943de..9987b15888 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -712,6 +712,7 @@ static void close_output_stream(OutputStream *ost)
 static void output_packet(OutputFile *of, AVPacket *pkt,
                           OutputStream *ost, int eof)
 {
+    const char *err_msg;
     int ret = 0;
 
     if (!eof && pkt->dts != AV_NOPTS_VALUE)
@@ -719,25 +720,46 @@ static void output_packet(OutputFile *of, AVPacket *pkt,
 
     /* apply the output bitstream filters */
     if (ost->bsf_ctx) {
+        int bsf_eof = 0;
+
         ret = av_bsf_send_packet(ost->bsf_ctx, eof ? NULL : pkt);
-        if (ret < 0)
-            goto finish;
-        while ((ret = av_bsf_receive_packet(ost->bsf_ctx, pkt)) >= 0)
-            of_submit_packet(of, pkt, ost, 0);
-        if (ret == AVERROR_EOF)
-            of_submit_packet(of, pkt, ost, 1);
-        if (ret == AVERROR(EAGAIN))
-            ret = 0;
-    } else
-        of_submit_packet(of, pkt, ost, eof);
+        if (ret < 0) {
+            err_msg = "submitting a packet for bitstream filtering";
+            goto fail;
+        }
 
-finish:
-    if (ret < 0 && ret != AVERROR_EOF) {
-        av_log(NULL, AV_LOG_ERROR, "Error applying bitstream filters to an output "
-               "packet for stream #%d:%d.\n", ost->file_index, ost->index);
-        if(exit_on_error)
-            exit_program(1);
+        while (!bsf_eof) {
+            ret = av_bsf_receive_packet(ost->bsf_ctx, pkt);
+            if (ret == AVERROR(EAGAIN))
+                return;
+            else if (ret == AVERROR_EOF)
+                bsf_eof = 1;
+            else if (ret < 0) {
+                err_msg = "applying bitstream filters to a packet";
+                goto fail;
+            }
+
+            ret = of_submit_packet(of, pkt, ost, ret == AVERROR_EOF);
+            if (ret < 0)
+                goto mux_fail;
+        }
+    } else {
+        ret = of_submit_packet(of, pkt, ost, eof);
+        if (ret < 0)
+            goto mux_fail;
     }
+
+    return;
+
+mux_fail:
+    err_msg = "submitting a packet to the muxer";
+
+fail:
+    av_log(NULL, AV_LOG_ERROR, "Error %s for output stream #%d:%d.\n",
+           err_msg, ost->file_index, ost->index);
+    if (exit_on_error)
+        exit_program(1);
+
 }
 
 static int check_recording_time(OutputStream *ost)
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 2ba58b492f..fef66c2325 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -704,7 +704,7 @@ int of_check_init(OutputFile *of);
 int of_write_trailer(OutputFile *of);
 void of_close(OutputFile **pof);
 
-void of_submit_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int eof);
+int of_submit_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int eof);
 int of_finished(OutputFile *of);
 int64_t of_filesize(OutputFile *of);
 AVChapter * const *
diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c
index 0a8bdc36d9..3ea7636380 100644
--- a/fftools/ffmpeg_mux.c
+++ b/fftools/ffmpeg_mux.c
@@ -269,7 +269,7 @@ static void submit_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost)
     }
 }
 
-void of_submit_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int eof)
+int of_submit_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int eof)
 {
     if (ost->sq_idx_mux >= 0) {
         int ret = sq_send(of->sq_mux, ost->sq_idx_mux,
@@ -278,22 +278,24 @@ void of_submit_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int eof)
             av_packet_unref(pkt);
             if (ret == AVERROR_EOF) {
                 ost->finished |= MUXER_FINISHED;
-                return;
+                return 0;
             } else
-                exit_program(1);
+                return ret;
         }
 
         while (1) {
             ret = sq_receive(of->sq_mux, -1, SQPKT(pkt));
             if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN))
-                return;
+                return 0;
             else if (ret < 0)
-                exit_program(1);
+                return ret;
 
             submit_packet(of, pkt, output_streams[of->ost_index + ret]);
         }
     } else if (!eof)
         submit_packet(of, pkt, ost);
+
+    return 0;
 }
 
 static int print_sdp(void)
-- 
2.34.1



More information about the ffmpeg-devel mailing list