mirror of https://git.ffmpeg.org/ffmpeg.git
ffmpeg: fallback to codecpar parameters on input filter eof
Fixes ticket #6854 and the following simpler case: ffmpeg -f lavfi -i testsrc=d=1 -f lavfi -i testsrc=d=0 -filter_complex overlay -f null none Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parent
0dc11d8bbd
commit
60c9a25530
|
@ -1829,6 +1829,19 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
|
|||
print_final_stats(total_size);
|
||||
}
|
||||
|
||||
static void ifilter_parameters_from_codecpar(InputFilter *ifilter, AVCodecParameters *par)
|
||||
{
|
||||
// We never got any input. Set a fake format, which will
|
||||
// come from libavformat.
|
||||
ifilter->format = par->format;
|
||||
ifilter->sample_rate = par->sample_rate;
|
||||
ifilter->channels = par->channels;
|
||||
ifilter->channel_layout = par->channel_layout;
|
||||
ifilter->width = par->width;
|
||||
ifilter->height = par->height;
|
||||
ifilter->sample_aspect_ratio = par->sample_aspect_ratio;
|
||||
}
|
||||
|
||||
static void flush_encoders(void)
|
||||
{
|
||||
int i, ret;
|
||||
|
@ -1855,18 +1868,8 @@ static void flush_encoders(void)
|
|||
int x;
|
||||
for (x = 0; x < fg->nb_inputs; x++) {
|
||||
InputFilter *ifilter = fg->inputs[x];
|
||||
if (ifilter->format < 0) {
|
||||
AVCodecParameters *par = ifilter->ist->st->codecpar;
|
||||
// We never got any input. Set a fake format, which will
|
||||
// come from libavformat.
|
||||
ifilter->format = par->format;
|
||||
ifilter->sample_rate = par->sample_rate;
|
||||
ifilter->channels = par->channels;
|
||||
ifilter->channel_layout = par->channel_layout;
|
||||
ifilter->width = par->width;
|
||||
ifilter->height = par->height;
|
||||
ifilter->sample_aspect_ratio = par->sample_aspect_ratio;
|
||||
}
|
||||
if (ifilter->format < 0)
|
||||
ifilter_parameters_from_codecpar(ifilter, ifilter->ist->st->codecpar);
|
||||
}
|
||||
|
||||
if (!ifilter_has_all_input_formats(fg))
|
||||
|
@ -2196,6 +2199,12 @@ static int ifilter_send_eof(InputFilter *ifilter, int64_t pts)
|
|||
} else {
|
||||
// the filtergraph was never configured
|
||||
FilterGraph *fg = ifilter->graph;
|
||||
if (ifilter->format < 0)
|
||||
ifilter_parameters_from_codecpar(ifilter, ifilter->ist->st->codecpar);
|
||||
if (ifilter->format < 0 && (ifilter->type == AVMEDIA_TYPE_AUDIO || ifilter->type == AVMEDIA_TYPE_VIDEO)) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Cannot determine format of input stream %d:%d after EOF\n", ifilter->ist->file_index, ifilter->ist->st->index);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
for (i = 0; i < fg->nb_inputs; i++)
|
||||
if (!fg->inputs[i]->eof)
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue