fftools/ffmpeg_mux: add muxing thread private data

To be used for data that never needs to be visible outside of the muxer
thread. Start by moving the muxed AVPacket in there.
This commit is contained in:
Anton Khirnov 2023-07-07 17:09:37 +02:00
parent f37a741f42
commit 1983507b6e

View File

@ -39,6 +39,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)
@ -210,18 +214,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);
@ -229,7 +255,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;
@ -237,8 +263,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);
@ -254,7 +280,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);