[FFmpeg-devel] [PATCH 2/2] RFC ffmpeg: exit demuxers earlier after signal received

Andriy Gelman andriy.gelman at gmail.com
Sat Mar 13 16:32:33 EET 2021


On Sun, 07. Feb 15:04, Andriy Gelman wrote:
> On Sat, 28. Nov 14:46, Andriy Gelman wrote:
> > From: Andriy Gelman <andriy.gelman at gmail.com>
> > 
> > We currently use the same interrupt_callback function for both muxers
> > and demuxers to break out of potential infinite loops.
> > 
> > The function decode_interrupt_cb() checks for how many SIGINT/SIGTERM
> > interrupts have been received, and (usually) two interrupts are needed to
> > break out of an infinite loop.
> > 
> > If this condition is seen on the muxer, however, we will fail to flush the
> > avio buffers (see retry_transfer_wrapper()).
> > An example of this issue is seen in Ticket #9009 (which would be fixed
> > by this patch).
> > 
> > A more robust alternative maybe to break out of demuxers with one
> > interrupt. The error should propagate through, close the muxers and
> > allow them to flush properly.
> > (If the infinite loop is present on the muxer then a second interrupt would
> > cause it break out and have the same behavior as before.)
> > 
> > This patch adds this behavior. I've labelled it RFC because it
> > potentially touches many demuxers.
> > ---
> >  fftools/ffmpeg.c     | 6 ++++++
> >  fftools/ffmpeg.h     | 1 +
> >  fftools/ffmpeg_opt.c | 2 +-
> >  3 files changed, 8 insertions(+), 1 deletion(-)
> > 
> > diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
> > index 01f4ef15d8..bb27eec879 100644
> > --- a/fftools/ffmpeg.c
> > +++ b/fftools/ffmpeg.c
> > @@ -510,7 +510,13 @@ static int decode_interrupt_cb(void *ctx)
> >      return received_nb_signals > atomic_load(&transcode_init_done);
> >  }
> >  
> > +static int decode_interrupt_one_sig_cb(void *ctx)
> > +{
> > +    return received_nb_signals > 0;
> > +}
> > +
> >  const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
> > +const AVIOInterruptCB int_one_sig_cb = { decode_interrupt_one_sig_cb, NULL };
> >  
> >  static void ffmpeg_cleanup(int ret)
> >  {
> > diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
> > index 3b54dab7fc..c49af30009 100644
> > --- a/fftools/ffmpeg.h
> > +++ b/fftools/ffmpeg.h
> > @@ -627,6 +627,7 @@ extern int vstats_version;
> >  extern int auto_conversion_filters;
> >  
> >  extern const AVIOInterruptCB int_cb;
> > +extern const AVIOInterruptCB int_one_sig_cb;
> >  
> >  extern const OptionDef options[];
> >  extern const HWAccel hwaccels[];
> > diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
> > index 7ee034c9c9..2908f23010 100644
> > --- a/fftools/ffmpeg_opt.c
> > +++ b/fftools/ffmpeg_opt.c
> > @@ -1156,7 +1156,7 @@ static int open_input_file(OptionsContext *o, const char *filename)
> >      ic->flags |= AVFMT_FLAG_NONBLOCK;
> >      if (o->bitexact)
> >          ic->flags |= AVFMT_FLAG_BITEXACT;
> > -    ic->interrupt_callback = int_cb;
> > +    ic->interrupt_callback = int_one_sig_cb;
> >  
> >      if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
> >          av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
> > -- 
> > 2.28.0
> > 
> 
> ping
> 

ping

-- 
Andriy


More information about the ffmpeg-devel mailing list