[FFmpeg-devel] [PATCH] fftools/ffmpeg_mux: keep write_header and write_packet in the same thread

angus.chen at intel.com angus.chen at intel.com
Wed Nov 1 11:01:15 EET 2023


From: "Chen, Angus" <angus.chen at intel.com>

sdl2_muxer(wayland):
In ffmpeg6, we create a separate thread for muxer after calling avformat_write_header().
It may generate EGL_BAD_ACCESS when we call write_packet. This is because egl_context
is bound to previous thread.
>From EGL spec: If ctx is current to some other thread, or if either draw or read are
bound to contexts in another thread, an EGL_BAD_ACCESS error is generated.

Signed-off-by: Chen, Angus <angus.chen at intel.com>
---
 fftools/ffmpeg_mux.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c
index 7a924dba6c..d9eee3bb6d 100644
--- a/fftools/ffmpeg_mux.c
+++ b/fftools/ffmpeg_mux.c
@@ -215,12 +215,21 @@ static void *muxer_thread(void *arg)
     OutputFile *of = &mux->of;
     AVPacket  *pkt = NULL;
     int        ret = 0;
+    AVFormatContext *fc = mux->fc;
 
     pkt = av_packet_alloc();
     if (!pkt) {
         ret = AVERROR(ENOMEM);
         goto finish;
     }
+    ret = avformat_write_header(fc, &mux->opts);
+    if (ret < 0) {
+        av_log(mux, AV_LOG_ERROR, "Could not write header (incorrect codec "
+               "parameters ?): %s\n", av_err2str(ret));
+        goto finish;
+    }
+    //assert_avoptions(of->opts);
+    mux->header_written = 1;
 
     thread_set_name(of);
 
@@ -599,15 +608,6 @@ int mux_check_init(Muxer *mux)
             return 0;
     }
 
-    ret = avformat_write_header(fc, &mux->opts);
-    if (ret < 0) {
-        av_log(mux, AV_LOG_ERROR, "Could not write header (incorrect codec "
-               "parameters ?): %s\n", av_err2str(ret));
-        return ret;
-    }
-    //assert_avoptions(of->opts);
-    mux->header_written = 1;
-
     av_dump_format(fc, of->index, fc->url, 1);
     nb_output_dumped++;
 
-- 
2.29.0



More information about the ffmpeg-devel mailing list