AVPacket相关函数介绍

转载: https://www.jianshu.com/p/bb6d3905907e

操作AVPacket的函数大约有30个,主要分为:AVPacket的创建初始化,AVPacket中的data数据管理(clone,free,copy),AVPacket中的side_data数据管理。

void av_init_packet(AVPacket *pkt);

      初始化packet的值为默认值,该函数不会影响data引用的数据缓存空间和size,需要单独处理。

int av_new_packet(AVPacket *pkt, int size);

        av_init_packet的增强版,不但会初始化字段,还为data分配了存储空间

AVPacket *av_packet_alloc(void);

          创建一个AVPacket,将其字段设为默认值(data为空,没有数据缓存空间)。

void av_packet_free(AVPacket **pkt);

           释放使用av_packet_alloc创建的AVPacket,如果该Packet有引用计数(packet->buf不为空),则先调用av_packet_unref。

AVPacket *av_packet_clone(const AVPacket *src);

          其功能是av_packet_alloc和av_packet_ref

int av_copy_packet(AVPacket *dst, const AVPacket *src);

         复制一个新的packet,包括数据缓存

int av_copy_packet_side_data(AVPacket *dst, const AVPacket *src);

        初始化一个引用计数的packet,并指定了其数据缓存

int av_grow_packet(AVPacket *pkt, int grow_by);

            增大Packet->data指向的数据缓存

void av_shrink_packet(AVPacket *pkt, int size);

        减小Packet->data指向的数据缓存

3.1 废弃函数介绍 ------> av_dup_packet和av_free_packet

int av_dup_packet(AVPacket *pkt);

        复制src->data引用的数据缓存,赋值给dst。也就是创建两个独立packet,这个功能现在可用使用函数av_packet_ref来代替

void av_free_packet(AVPacket *pkt);

        释放packet,包括其data引用的数据缓存,现在可以使用av_packet_unref代替

3.2 函数对比 --------->av_free_packet和av_packet_free

void av_free_packet(AVPacket *pkt);

            只是清空里边的数据内容,内存地址仍然在。我的版本是3.3已经废弃,所以用av_packet_unref替代。

    如果不清空会发生什么情况呢,举个简单的例子,一个char数组大小为128,里面有100个自己的内容。第二次使用你没有清空第一次的内容,第二次的数据大小为60,那么第一次的最后40个字节的数据仍会保留,造成数据冗余,极大可能对你的处理造成影响(这个跟自己的处理有关系,并不一定)。

void av_packet_free(AVPacket **pkt);

            类似于free(p); p = Null;不仅清空内容还清空内存(一般就是如果用了av_packet_alloc后就要调用av_packet_free来释放。但如果有引用计数,在调用av_packet_free前一般先调用av_packet_unref)

作者:片片碎
链接:https://www.jianshu.com/p/bb6d3905907e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原文地址:https://www.cnblogs.com/nanqiang/p/13731338.html