[FFmpeg-devel] [RFC] avfilter_request_frame() crash
Vitor Sessak
vitor1001
Sun Jan 25 14:52:24 CET 2009
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)...
-Vitor
More information about the ffmpeg-devel
mailing list