|
@@ -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);
|