You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
fftools/ffmpeg_filter: return error codes from fg_create() instead of aborting
This commit is contained in:
@@ -751,7 +751,7 @@ int ofilter_bind_ost(OutputFilter *ofilter, OutputStream *ost);
|
|||||||
* @param graph_desc Graph description; an av_malloc()ed string, filtergraph
|
* @param graph_desc Graph description; an av_malloc()ed string, filtergraph
|
||||||
* takes ownership of it.
|
* takes ownership of it.
|
||||||
*/
|
*/
|
||||||
FilterGraph *fg_create(char *graph_desc);
|
int fg_create(FilterGraph **pfg, char *graph_desc);
|
||||||
|
|
||||||
void fg_free(FilterGraph **pfg);
|
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;
|
AVFilterContext *ctx = inout->filter_ctx;
|
||||||
AVFilterPad *pads = in ? ctx->input_pads : ctx->output_pads;
|
AVFilterPad *pads = in ? ctx->input_pads : ctx->output_pads;
|
||||||
int nb_pads = in ? ctx->nb_inputs : ctx->nb_outputs;
|
int nb_pads = in ? ctx->nb_inputs : ctx->nb_outputs;
|
||||||
char *res;
|
|
||||||
|
|
||||||
if (nb_pads > 1)
|
if (nb_pads > 1)
|
||||||
res = av_strdup(ctx->filter->name);
|
return av_strdup(ctx->filter->name);
|
||||||
else
|
return av_asprintf("%s:%s", ctx->filter->name,
|
||||||
res = av_asprintf("%s:%s", ctx->filter->name,
|
avfilter_pad_get_name(pads, inout->pad_idx));
|
||||||
avfilter_pad_get_name(pads, inout->pad_idx));
|
|
||||||
if (!res)
|
|
||||||
report_and_exit(AVERROR(ENOMEM));
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static OutputFilter *ofilter_alloc(FilterGraph *fg)
|
static OutputFilter *ofilter_alloc(FilterGraph *fg)
|
||||||
@@ -799,7 +794,7 @@ static const AVClass fg_class = {
|
|||||||
.category = AV_CLASS_CATEGORY_FILTER,
|
.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);
|
FilterGraphPriv *fgp = allocate_array_elem(&filtergraphs, sizeof(*fgp), &nb_filtergraphs);
|
||||||
FilterGraph *fg = &fgp->fg;
|
FilterGraph *fg = &fgp->fg;
|
||||||
@@ -808,6 +803,9 @@ FilterGraph *fg_create(char *graph_desc)
|
|||||||
AVFilterGraph *graph;
|
AVFilterGraph *graph;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
if (pfg)
|
||||||
|
*pfg = fg;
|
||||||
|
|
||||||
fg->class = &fg_class;
|
fg->class = &fg_class;
|
||||||
fg->index = nb_filtergraphs - 1;
|
fg->index = nb_filtergraphs - 1;
|
||||||
fgp->graph_desc = graph_desc;
|
fgp->graph_desc = graph_desc;
|
||||||
@@ -817,13 +815,13 @@ FilterGraph *fg_create(char *graph_desc)
|
|||||||
|
|
||||||
fgp->frame = av_frame_alloc();
|
fgp->frame = av_frame_alloc();
|
||||||
if (!fgp->frame)
|
if (!fgp->frame)
|
||||||
report_and_exit(AVERROR(ENOMEM));
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
/* this graph is only used for determining the kinds of inputs
|
/* this graph is only used for determining the kinds of inputs
|
||||||
* and outputs we have, and is discarded on exit from this function */
|
* and outputs we have, and is discarded on exit from this function */
|
||||||
graph = avfilter_graph_alloc();
|
graph = avfilter_graph_alloc();
|
||||||
if (!graph)
|
if (!graph)
|
||||||
report_and_exit(AVERROR(ENOMEM));
|
return AVERROR(ENOMEM);;
|
||||||
graph->nb_threads = 1;
|
graph->nb_threads = 1;
|
||||||
|
|
||||||
ret = graph_parse(graph, fgp->graph_desc, &inputs, &outputs, NULL);
|
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,
|
ifp->type = avfilter_pad_get_type(cur->filter_ctx->input_pads,
|
||||||
cur->pad_idx);
|
cur->pad_idx);
|
||||||
ifilter->name = describe_filter_link(fg, cur, 1);
|
ifilter->name = describe_filter_link(fg, cur, 1);
|
||||||
|
if (!ifilter->name) {
|
||||||
|
ret = AVERROR(ENOMEM);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (AVFilterInOut *cur = outputs; cur; cur = cur->next) {
|
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,
|
ofilter->type = avfilter_pad_get_type(cur->filter_ctx->output_pads,
|
||||||
cur->pad_idx);
|
cur->pad_idx);
|
||||||
ofilter->name = describe_filter_link(fg, cur, 0);
|
ofilter->name = describe_filter_link(fg, cur, 0);
|
||||||
|
if (!ofilter->name) {
|
||||||
|
ret = AVERROR(ENOMEM);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fg->nb_outputs) {
|
if (!fg->nb_outputs) {
|
||||||
@@ -865,9 +871,9 @@ fail:
|
|||||||
avfilter_graph_free(&graph);
|
avfilter_graph_free(&graph);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
report_and_exit(ret);
|
return ret;
|
||||||
|
|
||||||
return fg;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int init_simple_filtergraph(InputStream *ist, OutputStream *ost,
|
int init_simple_filtergraph(InputStream *ist, OutputStream *ost,
|
||||||
@@ -877,9 +883,9 @@ int init_simple_filtergraph(InputStream *ist, OutputStream *ost,
|
|||||||
FilterGraphPriv *fgp;
|
FilterGraphPriv *fgp;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
fg = fg_create(graph_desc);
|
ret = fg_create(&fg, graph_desc);
|
||||||
if (!fg)
|
if (ret < 0)
|
||||||
report_and_exit(AVERROR(ENOMEM));
|
return ret;
|
||||||
fgp = fgp_from_fg(fg);
|
fgp = fgp_from_fg(fg);
|
||||||
|
|
||||||
fgp->is_simple = 1;
|
fgp->is_simple = 1;
|
||||||
|
@@ -1112,9 +1112,7 @@ static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
|
|||||||
if (!graph_desc)
|
if (!graph_desc)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
fg_create(graph_desc);
|
return fg_create(NULL, graph_desc);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
|
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)
|
if (!graph_desc)
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
|
|
||||||
fg_create(graph_desc);
|
return fg_create(NULL, graph_desc);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_help_default(const char *opt, const char *arg)
|
void show_help_default(const char *opt, const char *arg)
|
||||||
|
Reference in New Issue
Block a user