examples/transcode: flush decoder on EOF

Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
This commit is contained in:
Zhao Zhili 2023-08-11 00:54:27 +08:00
parent 2387328fa2
commit 67d392b979
1 changed files with 29 additions and 2 deletions

View File

@ -585,11 +585,38 @@ int main(int argc, char **argv)
av_packet_unref(packet);
}
/* flush filters and encoders */
/* flush decoders, filters and encoders */
for (i = 0; i < ifmt_ctx->nb_streams; i++) {
/* flush filter */
StreamContext *stream;
if (!filter_ctx[i].filter_graph)
continue;
stream = &stream_ctx[i];
av_log(NULL, AV_LOG_INFO, "Flushing stream %u decoder\n", i);
/* flush decoder */
ret = avcodec_send_packet(stream->dec_ctx, NULL);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Flushing decoding failed\n");
goto end;
}
while (ret >= 0) {
ret = avcodec_receive_frame(stream->dec_ctx, stream->dec_frame);
if (ret == AVERROR_EOF)
break;
else if (ret < 0)
goto end;
stream->dec_frame->pts = stream->dec_frame->best_effort_timestamp;
ret = filter_encode_write_frame(stream->dec_frame, i);
if (ret < 0)
goto end;
}
/* flush filter */
ret = filter_encode_write_frame(NULL, i);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Flushing filter failed\n");