diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c index bcc8e05495..dd3b516bef 100644 --- a/libavfilter/src_movie.c +++ b/libavfilter/src_movie.c @@ -63,7 +63,6 @@ typedef struct MovieContext { AVFormatContext *format_ctx; int eof; AVPacket pkt, pkt0; - AVFrame *frame; ///< video frame to store the decoded images in int max_stream_index; /**< max stream # actually used for output */ MovieStream *st; /**< array of all streams, one per output */ @@ -325,7 +324,6 @@ static av_cold void movie_uninit(AVFilterContext *ctx) } av_freep(&movie->st); av_freep(&movie->out_index); - av_frame_free(&movie->frame); if (movie->format_ctx) avformat_close_input(&movie->format_ctx); } @@ -453,6 +451,7 @@ static int movie_push_frame(AVFilterContext *ctx, unsigned out_id) MovieStream *st; int ret, got_frame = 0, pkt_out_id; AVFilterLink *outlink; + AVFrame *frame; if (!pkt->size) { if (movie->eof) { @@ -495,17 +494,17 @@ static int movie_push_frame(AVFilterContext *ctx, unsigned out_id) st = &movie->st[pkt_out_id]; outlink = ctx->outputs[pkt_out_id]; - movie->frame = av_frame_alloc(); - if (!movie->frame) + frame = av_frame_alloc(); + if (!frame) return AVERROR(ENOMEM); frame_type = st->st->codec->codec_type; switch (frame_type) { case AVMEDIA_TYPE_VIDEO: - ret = avcodec_decode_video2(st->st->codec, movie->frame, &got_frame, pkt); + ret = avcodec_decode_video2(st->st->codec, frame, &got_frame, pkt); break; case AVMEDIA_TYPE_AUDIO: - ret = avcodec_decode_audio4(st->st->codec, movie->frame, &got_frame, pkt); + ret = avcodec_decode_audio4(st->st->codec, frame, &got_frame, pkt); break; default: ret = AVERROR(ENOSYS); @@ -513,7 +512,7 @@ static int movie_push_frame(AVFilterContext *ctx, unsigned out_id) } if (ret < 0) { av_log(ctx, AV_LOG_WARNING, "Decode error: %s\n", av_err2str(ret)); - av_frame_free(&movie->frame); + av_frame_free(&frame); av_free_packet(&movie->pkt0); movie->pkt.size = 0; movie->pkt.data = NULL; @@ -532,26 +531,25 @@ static int movie_push_frame(AVFilterContext *ctx, unsigned out_id) if (!got_frame) { if (!ret) st->done = 1; - av_frame_free(&movie->frame); + av_frame_free(&frame); return 0; } - movie->frame->pts = av_frame_get_best_effort_timestamp(movie->frame); + frame->pts = av_frame_get_best_effort_timestamp(frame); av_dlog(ctx, "movie_push_frame(): file:'%s' %s\n", movie->file_name, - describe_frame_to_str((char[1024]){0}, 1024, movie->frame, frame_type, outlink)); + describe_frame_to_str((char[1024]){0}, 1024, frame, frame_type, outlink)); if (st->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { - if (movie->frame->format != outlink->format) { + if (frame->format != outlink->format) { av_log(ctx, AV_LOG_ERROR, "Format changed %s -> %s, discarding frame\n", av_get_pix_fmt_name(outlink->format), - av_get_pix_fmt_name(movie->frame->format) + av_get_pix_fmt_name(frame->format) ); - av_frame_free(&movie->frame); + av_frame_free(&frame); return 0; } } - ret = ff_filter_frame(outlink, movie->frame); - movie->frame = NULL; + ret = ff_filter_frame(outlink, frame); if (ret < 0) return ret;