[FFmpeg-devel] [RFC] avfilter_request_frame() crash

Michael Niedermayer michaelni
Sun Jan 25 23:41:16 CET 2009


On Sun, Jan 25, 2009 at 02:52:24PM +0100, Vitor Sessak wrote:
> Stefano Sabatini wrote:
> > On date Friday 2009-01-16 01:49:12 +0100, Stefano Sabatini encoded:
> >> On date Thursday 2009-01-15 23:12:12 +0100, Michael Niedermayer encoded:
> >>> On Thu, Jan 15, 2009 at 09:37:39PM +0100, Vitor Sessak wrote:
> >>>> Stefano Sabatini wrote:
> >>>>> Hi all,
> >>>>>
> >>>>> when calling avfilter_request_frame() on a link with no source it
> >>>>> crashes, for example with:
> >>>>>
> >>>>> ffplay -f video4linux -s 320x240 /dev/video -vfilters "[in] setpts=PTS-STARTPTS, hflip, setpts=PTS-STARTPTS [foo]"
> >>>>>
> >>>>> Should we:
> >>>>> 1) add a check in avfilter_request_frame(), so that it will return -1
> >>>>>    if the link source is NULL
> >>>>> 2) ensure that no dangling links exist before to start to extract
> >>>>>    filters from the filterchain
> >>>>> 3) both 1) and 2)
> >>>> I'd say (2) or (3), I don't think "[in] setpts=PTS-STARTPTS, hflip, 
> >>>> setpts=PTS-STARTPTS [foo]" should be considered a valid description of a 
> >>>> filter chain.
> >>> agree
> >> With the patch:
> >>
> >> stefano at geppetto ~/s/l/ffmpeg> ffplay -f video4linux -s 320x240 /dev/video -vfilters "[in] setpts=PTS-STARTPTS, hflip, setpts=PTS-STARTPTS [foo]"
> >> FFplay version SVN-r16562, Copyright (c) 2003-2009 Fabrice Bellard, et al.
> >> [...]
> >> Output pad "default" for the filter "Parsed filter 2" of type "setpts" not connected to any destination
> >>
> >> If we want to avoid 1) we can request the user to call the function
> >> before to start any actual processing, saying that in the docs should
> >> be sufficient.
> >>
> >> Regards.
> >> -- 
> >> FFmpeg = Faboulous Friendly Mind-dumbing Prodigious Everlasting Guide
> > 
> >> Index: libavfilter-soc/ffmpeg/libavfilter/avfiltergraph.c
> >> ===================================================================
> >> --- libavfilter-soc.orig/ffmpeg/libavfilter/avfiltergraph.c	2009-01-16 00:49:00.000000000 +0100
> >> +++ libavfilter-soc/ffmpeg/libavfilter/avfiltergraph.c	2009-01-16 01:45:33.000000000 +0100
> >> @@ -46,6 +46,36 @@
> >>      return 0;
> >>  }
> >>  
> >> +int avfilter_graph_check_validity(AVFilterGraph *graph, AVClass *log_ctx)
> >> +{
> >> +    AVFilterContext *filt;
> >> +    int i, j;
> >> +
> >> +    for (i=0; i < graph->filter_count; i++) {
> >> +        filt = graph->filters[i];
> >> +
> >> +        for (j = 0; j < filt->input_count; j++) {
> >> +            if (!filt->inputs[j] || !filt->inputs[j]->src) {
> >> +                av_log(log_ctx, AV_LOG_ERROR,
> >> +                       "Input pad \"%s\" for the filter \"%s\" of type \"%s\" not connected to any source\n",
> >> +                       filt->input_pads[j].name, filt->name, filt->filter->name);
> >> +                return -1;
> >> +            }
> >> +        }
> >> +
> >> +        for (j = 0; j < filt->output_count; j++) {
> >> +            if (!filt->outputs[j] || !filt->outputs[j]->dst) {
> >> +                av_log(log_ctx, AV_LOG_ERROR,
> >> +                       "Output pad \"%s\" for the filter \"%s\" of type \"%s\" not connected to any destination\n",
> >> +                       filt->output_pads[j].name, filt->name, filt->filter->name);
> >> +                return -1;
> >> +            }
> >> +        }
> >> +    }
> >> +
> >> +    return 0;
> >> +}
> >> +
> >>  AVFilterContext *avfilter_graph_get_filter(AVFilterGraph *graph, char *name)
> >>  {
> >>      int i;
> >> Index: libavfilter-soc/ffmpeg/libavfilter/avfiltergraph.h
> >> ===================================================================
> >> --- libavfilter-soc.orig/ffmpeg/libavfilter/avfiltergraph.h	2009-01-16 00:49:00.000000000 +0100
> >> +++ libavfilter-soc/ffmpeg/libavfilter/avfiltergraph.h	2009-01-16 01:06:39.000000000 +0100
> >> @@ -45,6 +45,16 @@
> >>  int avfilter_graph_add_filter(AVFilterGraph *graphctx, AVFilterContext *filter);
> >>  
> >>  /**
> >> + * Check for the validity of \p graph.
> >> + *
> >> + * A graph is considered valid if all the input pads and all the
> >> + * output pads of it are connected.
> >> + *
> >> + * @return 0 in case of success, a negative value otherwise
> >> + */
> >> +int avfilter_graph_check_validity(AVFilterGraph *graphctx, AVClass *log_ctx);
> >> +
> >> +/**
> >>   * Configure the formats of all the links in the graph.
> >>   */
> >>  int avfilter_graph_config_formats(AVFilterGraph *graphctx);
> > 
> >> Index: libavfilter-soc/ffmpeg/ffplay.c
> >> ===================================================================
> >> --- libavfilter-soc.orig/ffmpeg/ffplay.c	2009-01-16 01:35:41.000000000 +0100
> >> +++ libavfilter-soc/ffmpeg/ffplay.c	2009-01-16 01:40:43.000000000 +0100
> >> @@ -1624,6 +1624,8 @@
> >>      }
> >>      avfilter_graph_add_filter(graph, filt_src);
> >>      avfilter_graph_add_filter(graph, filt_out);
> >> +
> >> +    if(avfilter_graph_check_validity(graph, NULL))           goto the_end;
> >>      if(avfilter_graph_config_formats(graph))                 goto the_end;
> >>      if(avfilter_config_links(filt_out))                      goto the_end;
> >>  
> > 
> > Ping?
> 
> I like it (don't know if Michael would want to comment, though)...

i like it as well


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Good people do not need laws to tell them to act responsibly, while bad
people will find a way around the laws. -- Plato
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090125/7fb48646/attachment.pgp>



More information about the ffmpeg-devel mailing list