|
|
@@ -230,6 +230,25 @@ int init_simple_filtergraph(InputStream *ist, OutputStream *ost) |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
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; |
|
|
|
AVIOContext *pb; |
|
|
|
uint8_t *res = NULL; |
|
|
|
|
|
|
|
if (avio_open_dyn_buf(&pb) < 0) |
|
|
|
exit_program(1); |
|
|
|
|
|
|
|
avio_printf(pb, "%s", ctx->filter->name); |
|
|
|
if (nb_pads > 1) |
|
|
|
avio_printf(pb, ":%s", avfilter_pad_get_name(pads, inout->pad_idx)); |
|
|
|
avio_w8(pb, 0); |
|
|
|
avio_close_dyn_buf(pb, &res); |
|
|
|
return res; |
|
|
|
} |
|
|
|
|
|
|
|
static void init_input_filter(FilterGraph *fg, AVFilterInOut *in) |
|
|
|
{ |
|
|
|
InputStream *ist = NULL; |
|
|
@@ -300,6 +319,7 @@ static void init_input_filter(FilterGraph *fg, AVFilterInOut *in) |
|
|
|
fg->inputs[fg->nb_inputs - 1]->graph = fg; |
|
|
|
fg->inputs[fg->nb_inputs - 1]->format = -1; |
|
|
|
fg->inputs[fg->nb_inputs - 1]->type = ist->st->codecpar->codec_type; |
|
|
|
fg->inputs[fg->nb_inputs - 1]->name = describe_filter_link(fg, in, 1); |
|
|
|
|
|
|
|
fg->inputs[fg->nb_inputs - 1]->frame_queue = av_fifo_alloc(8 * sizeof(AVFrame*)); |
|
|
|
if (!fg->inputs[fg->nb_inputs - 1]->frame_queue) |
|
|
@@ -338,6 +358,7 @@ int init_complex_filtergraph(FilterGraph *fg) |
|
|
|
fg->outputs[fg->nb_outputs - 1]->out_tmp = cur; |
|
|
|
fg->outputs[fg->nb_outputs - 1]->type = avfilter_pad_get_type(cur->filter_ctx->output_pads, |
|
|
|
cur->pad_idx); |
|
|
|
fg->outputs[fg->nb_outputs - 1]->name = describe_filter_link(fg, cur, 0); |
|
|
|
cur = cur->next; |
|
|
|
fg->outputs[fg->nb_outputs - 1]->out_tmp->next = NULL; |
|
|
|
} |
|
|
@@ -643,28 +664,8 @@ static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter, |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
#define DESCRIBE_FILTER_LINK(f, inout, 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; \ |
|
|
|
AVIOContext *pb; \ |
|
|
|
\ |
|
|
|
if (avio_open_dyn_buf(&pb) < 0) \ |
|
|
|
exit_program(1); \ |
|
|
|
\ |
|
|
|
avio_printf(pb, "%s", ctx->filter->name); \ |
|
|
|
if (nb_pads > 1) \ |
|
|
|
avio_printf(pb, ":%s", avfilter_pad_get_name(pads, inout->pad_idx));\ |
|
|
|
avio_w8(pb, 0); \ |
|
|
|
avio_close_dyn_buf(pb, &f->name); \ |
|
|
|
} |
|
|
|
|
|
|
|
int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out) |
|
|
|
{ |
|
|
|
av_freep(&ofilter->name); |
|
|
|
DESCRIBE_FILTER_LINK(ofilter, out, 0); |
|
|
|
|
|
|
|
if (!ofilter->ost) { |
|
|
|
av_log(NULL, AV_LOG_FATAL, "Filter %s has an unconnected output\n", ofilter->name); |
|
|
|
exit_program(1); |
|
|
@@ -970,9 +971,6 @@ static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter, |
|
|
|
static int configure_input_filter(FilterGraph *fg, InputFilter *ifilter, |
|
|
|
AVFilterInOut *in) |
|
|
|
{ |
|
|
|
av_freep(&ifilter->name); |
|
|
|
DESCRIBE_FILTER_LINK(ifilter, in, 1); |
|
|
|
|
|
|
|
if (!ifilter->ist->dec) { |
|
|
|
av_log(NULL, AV_LOG_ERROR, |
|
|
|
"No decoder for stream #%d:%d, filtering impossible\n", |
|
|
|