@@ -38,6 +38,10 @@
#include "libavformat/avformat.h"
#include "libavformat/avio.h"
+typedef struct MuxThreadContext {
+ AVPacket *pkt;
+} MuxThreadContext;
+
int want_sdp = 1;
static Muxer *mux_from_of(OutputFile *of)
@@ -209,18 +213,40 @@ static void thread_set_name(OutputFile *of)
ff_thread_setname(name);
}
+static void mux_thread_uninit(MuxThreadContext *mt)
+{
+ av_packet_free(&mt->pkt);
+
+ memset(mt, 0, sizeof(*mt));
+}
+
+static int mux_thread_init(MuxThreadContext *mt)
+{
+ memset(mt, 0, sizeof(*mt));
+
+ mt->pkt = av_packet_alloc();
+ if (!mt->pkt)
+ goto fail;
+
+ return 0;
+
+fail:
+ mux_thread_uninit(mt);
+ return AVERROR(ENOMEM);
+}
+
static void *muxer_thread(void *arg)
{
Muxer *mux = arg;
OutputFile *of = &mux->of;
- AVPacket *pkt = NULL;
+
+ MuxThreadContext mt;
+
int ret = 0;
- pkt = av_packet_alloc();
- if (!pkt) {
- ret = AVERROR(ENOMEM);
+ ret = mux_thread_init(&mt);
+ if (ret < 0)
goto finish;
- }
thread_set_name(of);
@@ -228,7 +254,7 @@ static void *muxer_thread(void *arg)
OutputStream *ost;
int stream_idx, stream_eof = 0;
- ret = tq_receive(mux->tq, &stream_idx, pkt);
+ ret = tq_receive(mux->tq, &stream_idx, mt.pkt);
if (stream_idx < 0) {
av_log(mux, AV_LOG_VERBOSE, "All streams finished\n");
ret = 0;
@@ -236,8 +262,8 @@ static void *muxer_thread(void *arg)
}
ost = of->streams[stream_idx];
- ret = sync_queue_process(mux, ost, ret < 0 ? NULL : pkt, &stream_eof);
- av_packet_unref(pkt);
+ ret = sync_queue_process(mux, ost, ret < 0 ? NULL : mt.pkt, &stream_eof);
+ av_packet_unref(mt.pkt);
if (ret == AVERROR_EOF) {
if (stream_eof) {
tq_receive_finish(mux->tq, stream_idx);
@@ -253,7 +279,7 @@ static void *muxer_thread(void *arg)
}
finish:
- av_packet_free(&pkt);
+ mux_thread_uninit(&mt);
for (unsigned int i = 0; i < mux->fc->nb_streams; i++)
tq_receive_finish(mux->tq, i);