|
@@ -1242,6 +1242,34 @@ static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame) |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int ifilter_send_eof(InputFilter *ifilter) |
|
|
|
|
|
{ |
|
|
|
|
|
int i, j, ret; |
|
|
|
|
|
|
|
|
|
|
|
ifilter->eof = 1; |
|
|
|
|
|
|
|
|
|
|
|
if (ifilter->filter) { |
|
|
|
|
|
ret = av_buffersrc_add_frame(ifilter->filter, NULL); |
|
|
|
|
|
if (ret < 0) |
|
|
|
|
|
return ret; |
|
|
|
|
|
} else { |
|
|
|
|
|
// the filtergraph was never configured |
|
|
|
|
|
FilterGraph *fg = ifilter->graph; |
|
|
|
|
|
for (i = 0; i < fg->nb_inputs; i++) |
|
|
|
|
|
if (!fg->inputs[i]->eof) |
|
|
|
|
|
break; |
|
|
|
|
|
if (i == fg->nb_inputs) { |
|
|
|
|
|
// All the input streams have finished without the filtergraph |
|
|
|
|
|
// ever being configured. |
|
|
|
|
|
// Mark the output streams as finished. |
|
|
|
|
|
for (j = 0; j < fg->nb_outputs; j++) |
|
|
|
|
|
finish_output_stream(fg->outputs[j]->ost); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// This does not quite work like avcodec_decode_audio4/avcodec_decode_video2. |
|
|
// This does not quite work like avcodec_decode_audio4/avcodec_decode_video2. |
|
|
// There is the following difference: if you got a frame, you must call |
|
|
// There is the following difference: if you got a frame, you must call |
|
|
// it again with pkt=NULL. pkt==NULL is treated differently from pkt.size==0 |
|
|
// it again with pkt=NULL. pkt==NULL is treated differently from pkt.size==0 |
|
@@ -1415,18 +1443,11 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output) |
|
|
|
|
|
|
|
|
static int send_filter_eof(InputStream *ist) |
|
|
static int send_filter_eof(InputStream *ist) |
|
|
{ |
|
|
{ |
|
|
int i, j, ret; |
|
|
|
|
|
|
|
|
int i, ret; |
|
|
for (i = 0; i < ist->nb_filters; i++) { |
|
|
for (i = 0; i < ist->nb_filters; i++) { |
|
|
if (ist->filters[i]->filter) { |
|
|
|
|
|
ret = av_buffersrc_add_frame(ist->filters[i]->filter, NULL); |
|
|
|
|
|
if (ret < 0) |
|
|
|
|
|
return ret; |
|
|
|
|
|
} else { |
|
|
|
|
|
// the filtergraph was never configured |
|
|
|
|
|
FilterGraph *fg = ist->filters[i]->graph; |
|
|
|
|
|
for (j = 0; j < fg->nb_outputs; j++) |
|
|
|
|
|
finish_output_stream(fg->outputs[j]->ost); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
ret = ifilter_send_eof(ist->filters[i]); |
|
|
|
|
|
if (ret < 0) |
|
|
|
|
|
return ret; |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|