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

}

相关推荐
aramae10 分钟前
数据结构与算法(递归)
开发语言·经验分享·笔记·算法
秉承初心14 分钟前
Java 23种设计模式的详细解析
java·设计模式
千码君201618 分钟前
Go语言:记录一下Go语言系统学习的第一天
java·开发语言·学习·golang·gin·并发编程·编译语言
聪明的笨猪猪20 分钟前
Java 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
MrSYJ39 分钟前
学完涨工资的技巧2:Spring Authorization Server如何签发JWTToken
java·spring boot·微服务
珹洺40 分钟前
Java-Spring入门指南(二十六)Android Studio下载与安装
java·spring·android studio
JAVA学习通41 分钟前
JDK高版本特性总结与ZGC实践
java·jvm·算法
Lxinccode1 小时前
python(48) : 命名截图[Windows工具(3)]
开发语言·python·截图·快速截图
cxyxiaokui0011 小时前
JDK 动态代理 vs CGLIB:原理、区别与 Spring AOP 底层揭秘
java·后端·spring