X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Fvf_mcdeint.c;h=1a49829d5b4dc6130ab63ea913301b235c10e783;hb=3f27021143f1bc6a55be5bac37f4c2d3c742e023;hp=9cdec6308d80f473cb2b9cb9f847743a842c583f;hpb=c0a647644f2703e1da980dcf988cefd81528d8c9;p=ffmpeg diff --git a/libavfilter/vf_mcdeint.c b/libavfilter/vf_mcdeint.c index 9cdec6308d8..1a49829d5b4 100644 --- a/libavfilter/vf_mcdeint.c +++ b/libavfilter/vf_mcdeint.c @@ -74,6 +74,7 @@ typedef struct MCDeintContext { int mode; ///< MCDeintMode int parity; ///< MCDeintParity int qp; + AVPacket *pkt; AVCodecContext *enc_ctx; } MCDeintContext; @@ -102,7 +103,7 @@ static int config_props(AVFilterLink *inlink) { AVFilterContext *ctx = inlink->dst; MCDeintContext *mcdeint = ctx->priv; - AVCodec *enc; + const AVCodec *enc; AVCodecContext *enc_ctx; AVDictionary *opts = NULL; int ret; @@ -112,6 +113,9 @@ static int config_props(AVFilterLink *inlink) return AVERROR(EINVAL); } + mcdeint->pkt = av_packet_alloc(); + if (!mcdeint->pkt) + return AVERROR(ENOMEM); mcdeint->enc_ctx = avcodec_alloc_context3(enc); if (!mcdeint->enc_ctx) return AVERROR(ENOMEM); @@ -154,6 +158,7 @@ static av_cold void uninit(AVFilterContext *ctx) { MCDeintContext *mcdeint = ctx->priv; + av_packet_free(&mcdeint->pkt); avcodec_free_context(&mcdeint->enc_ctx); } @@ -173,7 +178,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic) MCDeintContext *mcdeint = inlink->dst->priv; AVFilterLink *outlink = inlink->dst->outputs[0]; AVFrame *outpic, *frame_dec; - AVPacket pkt = {0}; + AVPacket *pkt = mcdeint->pkt; int x, y, i, ret, got_frame = 0; outpic = ff_get_video_buffer(outlink, outlink->w, outlink->h); @@ -184,9 +189,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic) av_frame_copy_props(outpic, inpic); inpic->quality = mcdeint->qp * FF_QP2LAMBDA; - av_init_packet(&pkt); - - ret = avcodec_encode_video2(mcdeint->enc_ctx, &pkt, inpic, &got_frame); + ret = avcodec_encode_video2(mcdeint->enc_ctx, pkt, inpic, &got_frame); if (ret < 0) goto end; @@ -274,7 +277,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic) mcdeint->parity ^= 1; end: - av_packet_unref(&pkt); + av_packet_unref(pkt); av_frame_free(&inpic); if (ret < 0) { av_frame_free(&outpic); @@ -301,7 +304,7 @@ static const AVFilterPad mcdeint_outputs[] = { { NULL } }; -AVFilter ff_vf_mcdeint = { +const AVFilter ff_vf_mcdeint = { .name = "mcdeint", .description = NULL_IF_CONFIG_SMALL("Apply motion compensating deinterlacing."), .priv_size = sizeof(MCDeintContext),