[FFmpeg-devel] [PATCH] avformat/tee: signal EOF if no more output is to be published.

Marton Balint cus at passwd.hu
Fri Feb 3 00:47:51 EET 2023



On Thu, 2 Feb 2023, Gyan Doshi wrote:

> Prior to 2d924b3a630, ffmpeg.c would exit if any packet write failed. tee's
> write_packet seemingly relied on that to enforce its abort failure policy.
>> From 2d924b3a630, ffmpeg only closes that OutputStream and keeps on
> sending packets of other streams.

Hmm, are you sure? I glanced at the code and it seems to me that any 
failure of av_interleaved_write_frame() will cause the muxing thread to 
exit. So I don't quite see how other streams can receive packets.

Thanks,
Marton

This breaks the abort behaviour
> with the tee muxer when there are multiple streams, leaving the ffmpeg
> process running beyond the intended point of abortion.
>
> Fixed by signaling EOF in tee's write_packet if an abort is required.
> ---
> libavformat/tee.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/libavformat/tee.c b/libavformat/tee.c
> index dd408dd096..8362cdc972 100644
> --- a/libavformat/tee.c
> +++ b/libavformat/tee.c
> @@ -54,6 +54,7 @@ typedef struct TeeContext {
>     const AVClass *class;
>     unsigned nb_slaves;
>     unsigned nb_alive;
> +    int abort;
>     TeeSlave *slaves;
>     int use_fifo;
>     AVDictionary *fifo_options;
> @@ -438,6 +439,7 @@ static int tee_process_slave_failure(AVFormatContext *avf, unsigned slave_idx, i
>         return err_n;
>     } else if (tee_slave->on_fail == ON_SLAVE_FAILURE_ABORT) {
>         av_log(avf, AV_LOG_ERROR, "Slave muxer #%u failed, aborting.\n", slave_idx);
> +        tee->abort = 1;
>         return err_n;
>     } else {
>         av_log(avf, AV_LOG_ERROR, "Slave muxer #%u failed: %s, continuing with %u/%u slaves.\n",
> @@ -599,7 +601,7 @@ static int tee_write_packet(AVFormatContext *avf, AVPacket *pkt)
>                 ret_all = ret;
>         }
>     }
> -    return ret_all;
> +    return (tee->abort || !tee->nb_alive) ? AVERROR_EOF : ret_all;
> }
>
> const AVOutputFormat ff_tee_muxer = {
> -- 
> 2.39.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>


More information about the ffmpeg-devel mailing list