avcodec_alloc_context3,avcodec_open2,avcodec_free_context,avcodec_close

avcodec_alloc_context3 是创建编解码器上下文,需要使用 avcodec_free_context释放

需要使用avcodec_free_context 释放

/**

* Allocate an AVCodecContext and set its fields to default values. The

* resulting struct should be freed with avcodec_free_context().

*

* @param codec if non-NULL, allocate private data and initialize defaults

* for the given codec. It is illegal to then call avcodec_open2()

* with a different codec.

* If NULL, then the codec-specific defaults won't be initialized,

* which may result in suboptimal default settings (this is

* important mainly for encoders, e.g. libx264).

*

* @return An AVCodecContext filled with default values or NULL on failure.

*/

AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);

/**

* Free the codec context and everything associated with it and write NULL to

* the provided pointer.

*/

void avcodec_free_context(AVCodecContext **avctx);

avcodec_open2 打开编解码器上下文,需要使用 avcodec_free_context 释放

实际上更加合理是说:avcodec_open2 需要使用avcodec_close释放。avcodec_close函数的说明是:只会释放 avcodecContext 内部的元素,但是不会释放 avcodecContext自己。因此也需要使用 avcodec_free_context释放,avcodec_free_context的内部有用的第一句代码就是调用 avcodec_close函数。

/**

* Initialize the AVCodecContext to use the given AVCodec. Prior to using this

* function the context has to be allocated with avcodec_alloc_context3().

*

* The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(),

* avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for

* retrieving a codec.

*

* @note Always call this function before using decoding routines (such as

* @ref avcodec_receive_frame()).

*

* @code

* av_dict_set(&opts, "b", "2.5M", 0);

* codec = avcodec_find_decoder(AV_CODEC_ID_H264);

* if (!codec)

* exit(1);

*

* context = avcodec_alloc_context3(codec);

*

* if (avcodec_open2(context, codec, opts) < 0)

* exit(1);

* @endcode

*

* @param avctx The context to initialize.

* @param codec The codec to open this context for. If a non-NULL codec has been

* previously passed to avcodec_alloc_context3() or

* for this context, then this parameter MUST be either NULL or

* equal to the previously passed codec.

* @param options A dictionary filled with AVCodecContext and codec-private options.

* On return this object will be filled with options that were not found.

*

* @return zero on success, a negative value on error

* @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(),

* av_dict_set(), av_opt_find().

*/

int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);

/**

* Close a given AVCodecContext and free all the data associated with it

* (but not the AVCodecContext itself).

*

* Calling this function on an AVCodecContext that hasn't been opened will free

* the codec-specific data allocated in avcodec_alloc_context3() with a non-NULL

* codec. Subsequent calls will do nothing.

*

* @note Do not use this function. Use avcodec_free_context() to destroy a

* codec context (either open or closed). Opening and closing a codec context

* multiple times is not supported anymore -- use multiple codec contexts

* instead.

*/

int avcodec_close(AVCodecContext *avctx);

void avcodec_free_context(AVCodecContext **pavctx)

{

AVCodecContext *avctx = *pavctx;

if (!avctx)

return;

avcodec_close(avctx);

av_freep(&avctx->extradata);

av_freep(&avctx->subtitle_header);

av_freep(&avctx->intra_matrix);

av_freep(&avctx->inter_matrix);

av_freep(&avctx->rc_override);

av_channel_layout_uninit(&avctx->ch_layout);

av_freep(pavctx);

}

相关推荐
雨中飘荡的记忆3 小时前
ElasticJob分布式调度从入门到实战
java·后端
考虑考虑12 小时前
JDK25模块导入声明
java·后端·java ee
_小马快跑_13 小时前
Java 的 8 大基本数据类型:为何是不可或缺的设计?
java
Re_zero15 小时前
线上日志被清空?这段仅10行的 IO 代码里竟然藏着3个毒瘤
java·后端
洋洋技术笔记15 小时前
Spring Boot条件注解详解
java·spring boot
程序员清风1 天前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林5511 天前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
华仔啊2 天前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端
SimonKing2 天前
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
java·后端·程序员
日月云棠2 天前
各版本JDK对比:JDK 25 特性详解
java