Message ID | 20230209155722.28285-1-anton@khirnov.net |
---|---|
State | Accepted |
Commit | b40856c905712da6d38b70766a4eb833dcc34839 |
Headers | show |
Series | [FFmpeg-devel] fftools/ffmpeg_mux: distinguish between sync queue and muxer EOF | expand |
Context | Check | Description |
---|---|---|
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
On 2023-02-09 09:27 pm, Anton Khirnov wrote: > --- > How about something like this? Yes, this works. Regards, Gyan > --- > fftools/ffmpeg_mux.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c > index dffc1410c8..cf58051949 100644 > --- a/fftools/ffmpeg_mux.c > +++ b/fftools/ffmpeg_mux.c > @@ -159,14 +159,18 @@ fail: > return ret; > } > > -static int sync_queue_process(Muxer *mux, OutputStream *ost, AVPacket *pkt) > +static int sync_queue_process(Muxer *mux, OutputStream *ost, AVPacket *pkt, int *stream_eof) > { > OutputFile *of = &mux->of; > > if (ost->sq_idx_mux >= 0) { > int ret = sq_send(mux->sq_mux, ost->sq_idx_mux, SQPKT(pkt)); > - if (ret < 0) > + if (ret < 0) { > + if (ret == AVERROR_EOF) > + *stream_eof = 1; > + > return ret; > + } > > while (1) { > ret = sq_receive(mux->sq_mux, -1, SQPKT(mux->sq_pkt)); > @@ -208,7 +212,7 @@ static void *muxer_thread(void *arg) > > while (1) { > OutputStream *ost; > - int stream_idx; > + int stream_idx, stream_eof = 0; > > ret = tq_receive(mux->tq, &stream_idx, pkt); > if (stream_idx < 0) { > @@ -218,9 +222,9 @@ static void *muxer_thread(void *arg) > } > > ost = of->streams[stream_idx]; > - ret = sync_queue_process(mux, ost, ret < 0 ? NULL : pkt); > + ret = sync_queue_process(mux, ost, ret < 0 ? NULL : pkt, &stream_eof); > av_packet_unref(pkt); > - if (ret == AVERROR_EOF) > + if (ret == AVERROR_EOF && stream_eof) > tq_receive_finish(mux->tq, stream_idx); > else if (ret < 0) { > av_log(mux, AV_LOG_ERROR, "Error muxing a packet\n");
diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c index dffc1410c8..cf58051949 100644 --- a/fftools/ffmpeg_mux.c +++ b/fftools/ffmpeg_mux.c @@ -159,14 +159,18 @@ fail: return ret; } -static int sync_queue_process(Muxer *mux, OutputStream *ost, AVPacket *pkt) +static int sync_queue_process(Muxer *mux, OutputStream *ost, AVPacket *pkt, int *stream_eof) { OutputFile *of = &mux->of; if (ost->sq_idx_mux >= 0) { int ret = sq_send(mux->sq_mux, ost->sq_idx_mux, SQPKT(pkt)); - if (ret < 0) + if (ret < 0) { + if (ret == AVERROR_EOF) + *stream_eof = 1; + return ret; + } while (1) { ret = sq_receive(mux->sq_mux, -1, SQPKT(mux->sq_pkt)); @@ -208,7 +212,7 @@ static void *muxer_thread(void *arg) while (1) { OutputStream *ost; - int stream_idx; + int stream_idx, stream_eof = 0; ret = tq_receive(mux->tq, &stream_idx, pkt); if (stream_idx < 0) { @@ -218,9 +222,9 @@ static void *muxer_thread(void *arg) } ost = of->streams[stream_idx]; - ret = sync_queue_process(mux, ost, ret < 0 ? NULL : pkt); + ret = sync_queue_process(mux, ost, ret < 0 ? NULL : pkt, &stream_eof); av_packet_unref(pkt); - if (ret == AVERROR_EOF) + if (ret == AVERROR_EOF && stream_eof) tq_receive_finish(mux->tq, stream_idx); else if (ret < 0) { av_log(mux, AV_LOG_ERROR, "Error muxing a packet\n");