fftools/ffmpeg_filter: return error codes from fg_create() instead of aborting

pull/389/head
Anton Khirnov 2 years ago
parent 8db96808bc
commit 5ba7aa2ce8
  1. 2
      fftools/ffmpeg.h
  2. 38
      fftools/ffmpeg_filter.c
  3. 8
      fftools/ffmpeg_opt.c

@ -751,7 +751,7 @@ int ofilter_bind_ost(OutputFilter *ofilter, OutputStream *ost);
* @param graph_desc Graph description; an av_malloc()ed string, filtergraph
* takes ownership of it.
*/
FilterGraph *fg_create(char *graph_desc);
int fg_create(FilterGraph **pfg, char *graph_desc);
void fg_free(FilterGraph **pfg);

@ -538,16 +538,11 @@ static char *describe_filter_link(FilterGraph *fg, AVFilterInOut *inout, int in)
AVFilterContext *ctx = inout->filter_ctx;
AVFilterPad *pads = in ? ctx->input_pads : ctx->output_pads;
int nb_pads = in ? ctx->nb_inputs : ctx->nb_outputs;
char *res;
if (nb_pads > 1)
res = av_strdup(ctx->filter->name);
else
res = av_asprintf("%s:%s", ctx->filter->name,
avfilter_pad_get_name(pads, inout->pad_idx));
if (!res)
report_and_exit(AVERROR(ENOMEM));
return res;
return av_strdup(ctx->filter->name);
return av_asprintf("%s:%s", ctx->filter->name,
avfilter_pad_get_name(pads, inout->pad_idx));
}
static OutputFilter *ofilter_alloc(FilterGraph *fg)
@ -799,7 +794,7 @@ static const AVClass fg_class = {
.category = AV_CLASS_CATEGORY_FILTER,
};
FilterGraph *fg_create(char *graph_desc)
int fg_create(FilterGraph **pfg, char *graph_desc)
{
FilterGraphPriv *fgp = allocate_array_elem(&filtergraphs, sizeof(*fgp), &nb_filtergraphs);
FilterGraph *fg = &fgp->fg;
@ -808,6 +803,9 @@ FilterGraph *fg_create(char *graph_desc)
AVFilterGraph *graph;
int ret = 0;
if (pfg)
*pfg = fg;
fg->class = &fg_class;
fg->index = nb_filtergraphs - 1;
fgp->graph_desc = graph_desc;
@ -817,13 +815,13 @@ FilterGraph *fg_create(char *graph_desc)
fgp->frame = av_frame_alloc();
if (!fgp->frame)
report_and_exit(AVERROR(ENOMEM));
return AVERROR(ENOMEM);
/* this graph is only used for determining the kinds of inputs
* and outputs we have, and is discarded on exit from this function */
graph = avfilter_graph_alloc();
if (!graph)
report_and_exit(AVERROR(ENOMEM));
return AVERROR(ENOMEM);;
graph->nb_threads = 1;
ret = graph_parse(graph, fgp->graph_desc, &inputs, &outputs, NULL);
@ -840,6 +838,10 @@ FilterGraph *fg_create(char *graph_desc)
ifp->type = avfilter_pad_get_type(cur->filter_ctx->input_pads,
cur->pad_idx);
ifilter->name = describe_filter_link(fg, cur, 1);
if (!ifilter->name) {
ret = AVERROR(ENOMEM);
goto fail;
}
}
for (AVFilterInOut *cur = outputs; cur; cur = cur->next) {
@ -851,6 +853,10 @@ FilterGraph *fg_create(char *graph_desc)
ofilter->type = avfilter_pad_get_type(cur->filter_ctx->output_pads,
cur->pad_idx);
ofilter->name = describe_filter_link(fg, cur, 0);
if (!ofilter->name) {
ret = AVERROR(ENOMEM);
goto fail;
}
}
if (!fg->nb_outputs) {
@ -865,9 +871,9 @@ fail:
avfilter_graph_free(&graph);
if (ret < 0)
report_and_exit(ret);
return ret;
return fg;
return 0;
}
int init_simple_filtergraph(InputStream *ist, OutputStream *ost,
@ -877,9 +883,9 @@ int init_simple_filtergraph(InputStream *ist, OutputStream *ost,
FilterGraphPriv *fgp;
int ret;
fg = fg_create(graph_desc);
if (!fg)
report_and_exit(AVERROR(ENOMEM));
ret = fg_create(&fg, graph_desc);
if (ret < 0)
return ret;
fgp = fgp_from_fg(fg);
fgp->is_simple = 1;

@ -1112,9 +1112,7 @@ static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
if (!graph_desc)
return AVERROR(ENOMEM);
fg_create(graph_desc);
return 0;
return fg_create(NULL, graph_desc);
}
static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
@ -1123,9 +1121,7 @@ static int opt_filter_complex_script(void *optctx, const char *opt, const char *
if (!graph_desc)
return AVERROR(EINVAL);
fg_create(graph_desc);
return 0;
return fg_create(NULL, graph_desc);
}
void show_help_default(const char *opt, const char *arg)

Loading…
Cancel
Save