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);
|
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)
|
static void flush_encoders(void)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
@ -1855,18 +1868,8 @@ static void flush_encoders(void)
|
||||||
int x;
|
int x;
|
||||||
for (x = 0; x < fg->nb_inputs; x++) {
|
for (x = 0; x < fg->nb_inputs; x++) {
|
||||||
InputFilter *ifilter = fg->inputs[x];
|
InputFilter *ifilter = fg->inputs[x];
|
||||||
if (ifilter->format < 0) {
|
if (ifilter->format < 0)
|
||||||
AVCodecParameters *par = ifilter->ist->st->codecpar;
|
ifilter_parameters_from_codecpar(ifilter, 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_has_all_input_formats(fg))
|
if (!ifilter_has_all_input_formats(fg))
|
||||||
|
@ -2196,6 +2199,12 @@ static int ifilter_send_eof(InputFilter *ifilter, int64_t pts)
|
||||||
} else {
|
} else {
|
||||||
// the filtergraph was never configured
|
// the filtergraph was never configured
|
||||||
FilterGraph *fg = ifilter->graph;
|
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++)
|
for (i = 0; i < fg->nb_inputs; i++)
|
||||||
if (!fg->inputs[i]->eof)
|
if (!fg->inputs[i]->eof)
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue