mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-31 11:53:24 +00:00
ffmpeg: factor out sending frame to filters
Video doesn't exit ffmpeg on error anymore, and audio now prints an error.
This commit is contained in:
parent
b9c26aed4e
commit
825f6fbfac
64
ffmpeg.c
64
ffmpeg.c
@ -2065,9 +2065,35 @@ static int decode(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacke
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int send_frame_to_filters(InputStream *ist, AVFrame *decoded_frame)
|
||||
{
|
||||
int i, ret;
|
||||
AVFrame *f;
|
||||
|
||||
for (i = 0; i < ist->nb_filters; i++) {
|
||||
if (i < ist->nb_filters - 1) {
|
||||
f = ist->filter_frame;
|
||||
ret = av_frame_ref(f, decoded_frame);
|
||||
if (ret < 0)
|
||||
break;
|
||||
} else
|
||||
f = decoded_frame;
|
||||
ret = av_buffersrc_add_frame_flags(ist->filters[i]->filter, f,
|
||||
AV_BUFFERSRC_FLAG_PUSH);
|
||||
if (ret == AVERROR_EOF)
|
||||
ret = 0; /* ignore */
|
||||
if (ret < 0) {
|
||||
av_log(NULL, AV_LOG_ERROR,
|
||||
"Failed to inject frame into filter network: %s\n", av_err2str(ret));
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||
{
|
||||
AVFrame *decoded_frame, *f;
|
||||
AVFrame *decoded_frame;
|
||||
AVCodecContext *avctx = ist->dec_ctx;
|
||||
int i, ret, err = 0, resample_changed;
|
||||
AVRational decoded_frame_tb;
|
||||
@ -2172,21 +2198,7 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||
(AVRational){1, avctx->sample_rate}, decoded_frame->nb_samples, &ist->filter_in_rescale_delta_last,
|
||||
(AVRational){1, avctx->sample_rate});
|
||||
ist->nb_samples = decoded_frame->nb_samples;
|
||||
for (i = 0; i < ist->nb_filters; i++) {
|
||||
if (i < ist->nb_filters - 1) {
|
||||
f = ist->filter_frame;
|
||||
err = av_frame_ref(f, decoded_frame);
|
||||
if (err < 0)
|
||||
break;
|
||||
} else
|
||||
f = decoded_frame;
|
||||
err = av_buffersrc_add_frame_flags(ist->filters[i]->filter, f,
|
||||
AV_BUFFERSRC_FLAG_PUSH);
|
||||
if (err == AVERROR_EOF)
|
||||
err = 0; /* ignore */
|
||||
if (err < 0)
|
||||
break;
|
||||
}
|
||||
err = send_frame_to_filters(ist, decoded_frame);
|
||||
decoded_frame->pts = AV_NOPTS_VALUE;
|
||||
|
||||
fail:
|
||||
@ -2197,7 +2209,7 @@ fail:
|
||||
|
||||
static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int eof)
|
||||
{
|
||||
AVFrame *decoded_frame, *f;
|
||||
AVFrame *decoded_frame;
|
||||
int i, ret = 0, err = 0, resample_changed;
|
||||
int64_t best_effort_timestamp;
|
||||
int64_t dts = AV_NOPTS_VALUE;
|
||||
@ -2346,23 +2358,7 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int eo
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < ist->nb_filters; i++) {
|
||||
if (i < ist->nb_filters - 1) {
|
||||
f = ist->filter_frame;
|
||||
err = av_frame_ref(f, decoded_frame);
|
||||
if (err < 0)
|
||||
break;
|
||||
} else
|
||||
f = decoded_frame;
|
||||
err = av_buffersrc_add_frame_flags(ist->filters[i]->filter, f, AV_BUFFERSRC_FLAG_PUSH);
|
||||
if (err == AVERROR_EOF) {
|
||||
err = 0; /* ignore */
|
||||
} else if (err < 0) {
|
||||
av_log(NULL, AV_LOG_FATAL,
|
||||
"Failed to inject frame into filter network: %s\n", av_err2str(err));
|
||||
exit_program(1);
|
||||
}
|
||||
}
|
||||
err = send_frame_to_filters(ist, decoded_frame);
|
||||
|
||||
fail:
|
||||
av_frame_unref(ist->filter_frame);
|
||||
|
Loading…
Reference in New Issue
Block a user