关于AVFrame的理解

玩FFMpeg绕不开AVFrame,AVFrame结构体复杂,咱们不做深究,搞懂怎么用就可以了。下面几个相关函数至关重要:

1、av_frame_alloc():申请AVFrame结构体空间,同时会对申请的结构体初始化。注意哦,这个函数只是创建AVFrame结构的空间,AVFrame中的uint8_t *data[AV_NUM_DATA_POINTERS]空间此时NULL,不会创建的。

2、av_frame_free():释放AVFrame的结构体空间。这个函数就有点意思了。因为他不仅仅释放结构体空间,还涉及到AVFrame中的uint8_t *data[AV_NUM_DATA_POINTERS];字段的释放问题。,如果AVFrame中的uint8_t *data[AV_NUM_DATA_POINTERS]中的引用==1,则释放data的空间。

3、int av_frame_ref(AVFrame *dst, const AVFrame *src):对已有AVFrame的引用,这个引用做了两个动作:1、将src属性内容复制到dst,2、对AVFrame中的uint8_t *data[AV_NUM_DATA_POINTERS]字段引用计数+1。

4、void av_frame_unref(AVFrame *frame);对frame释放引用,做了两个动作:1、将frame的各个属性初始化,2、如果AVFrame中的uint8_t *data[AV_NUM_DATA_POINTERS]中的引用==1,则释放data的空间。当然,如果data的引用计数>1则由别的frame去检测释放。

5、av_frame_get_buffer():这个函数是建立AVFrame中的uint8_t *data[AV_NUM_DATA_POINTERS]内存空间,使用这个函数之前frame结构中的format、width、height:必须赋值,要不然函数怎么知道创建多少字节的空间呢!

 

 

关于

int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);

有两点需要注意:

1、The decoder may create a reference to the packet data (or copy it if the packet is not reference-counted).:decoder可能会对packet data建立引用,或者 copy packet当这个 packet没有被引用计数的情况下。

2、avpkt可以为:null,目的是flush解码缓冲区中的数据

由上面可以看出:avpkt:有调用者负责清理。调用者可以av_packet_unref 清理data

 

 

 

你可能感兴趣的:(FFMPEG)