在开发到退出一个视频播放功能时,看到对AVCodec*这个指针做了初始化,但是突然有一个好奇的疑问,这个AVCodec到底是否需要人工手动销毁?
我在初始化的时候这样用的:
可以看到在av_find_best_stream内部针对const AVCodec *指针做了初始化,然后把初始化后的AVCodec传递给了avcodec_alloc_context3()函数,对AVCodecContext *指针做初始化。
先来看下av_find_best_stream如何对AVCodec进行初始化的:
libavformat/avformat.c #av_find_best_stream:
最终会调用到av_codec_iterate:
在av_codec_iterate函数中可以看到是对一个结构体做了&取地址,然后返回的:
p就是AVCodec的结构体变量:
再来看下avcodec_alloc_context3函数:
libavcodec/options.c #avcodec_alloc_context3:
调用了init_context_defaults,在init_context_defaults函数中对codec进行了赋值:
在avcodec_alloc_context3函数中可以看到malloc了一个AVCodecContext,然后返回的:
所以这个AVCodecContext指针是必定要free的。
为了一探究竟,AVCodec到底是否需要销毁?我们再追一下销毁AVCodecContext的函数avcodec_free_context:
libavcodec/options.c #avcodec_free_context:
再看avcodec_close函数:
调用了AVCodec的close函数,最后把AVCodecContext中的codec赋值为了NULL
拿flv的encoder来说:最终AVCodecContext中的codec就长下面这样:
可以看到在封装的close函数中做了很多free的操作:
所以真香大白了,总的来说: