fftools/ffmpeg_filter: treat apad filter as a source

Ideally lavfi should have a dedicated API for detecting this.

Fixes #11168 and #11061

(cherry picked from commit 9e2a231236)
Signed-off-by: Anton Khirnov <anton@khirnov.net>
release/7.1
Anton Khirnov 3 months ago
parent 020d9f2b48
commit 87ccf995cb
  1. 21
      fftools/ffmpeg_filter.c

@ -1101,8 +1101,9 @@ int fg_create(FilterGraph **pfg, char *graph_desc, Scheduler *sch)
for (unsigned i = 0; i < graph->nb_filters; i++) { for (unsigned i = 0; i < graph->nb_filters; i++) {
const AVFilter *f = graph->filters[i]->filter; const AVFilter *f = graph->filters[i]->filter;
if (!avfilter_filter_pad_count(f, 0) && if ((!avfilter_filter_pad_count(f, 0) &&
!(f->flags & AVFILTER_FLAG_DYNAMIC_INPUTS)) { !(f->flags & AVFILTER_FLAG_DYNAMIC_INPUTS)) ||
!strcmp(f->name, "apad")) {
fgp->have_sources = 1; fgp->have_sources = 1;
break; break;
} }
@ -1497,7 +1498,7 @@ static int insert_filter(AVFilterContext **last_filter, int *pad_idx,
return 0; return 0;
} }
static int configure_output_video_filter(FilterGraph *fg, AVFilterGraph *graph, static int configure_output_video_filter(FilterGraphPriv *fgp, AVFilterGraph *graph,
OutputFilter *ofilter, AVFilterInOut *out) OutputFilter *ofilter, AVFilterInOut *out)
{ {
OutputFilterPriv *ofp = ofp_from_ofilter(ofilter); OutputFilterPriv *ofp = ofp_from_ofilter(ofilter);
@ -1576,7 +1577,7 @@ static int configure_output_video_filter(FilterGraph *fg, AVFilterGraph *graph,
return 0; return 0;
} }
static int configure_output_audio_filter(FilterGraph *fg, AVFilterGraph *graph, static int configure_output_audio_filter(FilterGraphPriv *fgp, AVFilterGraph *graph,
OutputFilter *ofilter, AVFilterInOut *out) OutputFilter *ofilter, AVFilterInOut *out)
{ {
OutputFilterPriv *ofp = ofp_from_ofilter(ofilter); OutputFilterPriv *ofp = ofp_from_ofilter(ofilter);
@ -1641,8 +1642,10 @@ static int configure_output_audio_filter(FilterGraph *fg, AVFilterGraph *graph,
pad_idx = 0; pad_idx = 0;
} }
if (ofilter->apad) if (ofilter->apad) {
AUTO_INSERT_FILTER("-apad", "apad", ofilter->apad); AUTO_INSERT_FILTER("-apad", "apad", ofilter->apad);
fgp->have_sources = 1;
}
snprintf(name, sizeof(name), "trim for output %s", ofp->name); snprintf(name, sizeof(name), "trim for output %s", ofp->name);
ret = insert_trim(ofp->trim_start_us, ofp->trim_duration_us, ret = insert_trim(ofp->trim_start_us, ofp->trim_duration_us,
@ -1658,12 +1661,12 @@ fail:
return ret; return ret;
} }
static int configure_output_filter(FilterGraph *fg, AVFilterGraph *graph, static int configure_output_filter(FilterGraphPriv *fgp, AVFilterGraph *graph,
OutputFilter *ofilter, AVFilterInOut *out) OutputFilter *ofilter, AVFilterInOut *out)
{ {
switch (ofilter->type) { switch (ofilter->type) {
case AVMEDIA_TYPE_VIDEO: return configure_output_video_filter(fg, graph, ofilter, out); case AVMEDIA_TYPE_VIDEO: return configure_output_video_filter(fgp, graph, ofilter, out);
case AVMEDIA_TYPE_AUDIO: return configure_output_audio_filter(fg, graph, ofilter, out); case AVMEDIA_TYPE_AUDIO: return configure_output_audio_filter(fgp, graph, ofilter, out);
default: av_assert0(0); return 0; default: av_assert0(0); return 0;
} }
} }
@ -1940,7 +1943,7 @@ static int configure_filtergraph(FilterGraph *fg, FilterGraphThread *fgt)
avfilter_inout_free(&inputs); avfilter_inout_free(&inputs);
for (cur = outputs, i = 0; cur; cur = cur->next, i++) { for (cur = outputs, i = 0; cur; cur = cur->next, i++) {
ret = configure_output_filter(fg, fgt->graph, fg->outputs[i], cur); ret = configure_output_filter(fgp, fgt->graph, fg->outputs[i], cur);
if (ret < 0) { if (ret < 0) {
avfilter_inout_free(&outputs); avfilter_inout_free(&outputs);
goto fail; goto fail;

Loading…
Cancel
Save