AVPacket 相关API 定义是在avcodec.h 中, 但是函数实体在avpacket.c 中。需要注意的是av_packet_alloc() 申请的是AVPacket 本身struct 的空间,data buff 需要单独申请,比如av_new_packet()。data buff 通过av_packet_unref() 释放,当refcount 为1 时,buff 才真正释放,av_packet_ref() refcountf 加1, av_packet_unref() refcount 减1。packet_side_data 是packet 一些附加信息,例如在编码结束时,更新一些流的参数。
|
函数原型 |
作用 |
|
AVPacket *av_packet_alloc(void); |
alloc avpacket struct,但是没有给data 开辟空间,可通过av_new_packet() 去为data 开辟空间 |
|
AVPacket *av_packet_clone(const AVPacket *src) |
根据src clone 一个avpacket,等于av_packet_alloc() + av_packet_ref() |
|
void av_packet_free(AVPacket **pkt); |
free avpacket, 如果ref 被计数,将先unref |
|
void av_init_packet(AVPacket *pkt) |
初始化avpacket 成默认值 |
|
int av_new_packet(AVPacket *pkt,int size) |
为avpacket date 开辟空间 |
|
void av_shrink_packet(AVPacket *pkt,int size); |
将AVPacket 的size减小到设置的size |
|
int avgrow_packet(AVPacket *pkt,int grow_by); |
通过realloc 增加grow_by 的空间 |
|
int av_packet_from_data(*pkt,data,size) |
将malloc 过的data 传递给avpacket |
|
av_packet_new_side_data(pkt,sideDateType,size) |
alloc side data |
|
av_packet_add_side_data(pkt,sideDateTyoe,*data,size) |
添加side_data 信息 |
|
u8 *av_packet_pack_dictionary(dict,size) |
pack a dictionary for use in side_date |
|
int av_packet_unpack_dictionary(data,size,dict) |
unpack adictionary from side_data |
|
av_packet_free_side_data(avpacket *data) |
free all the side data |
|
int av_packet_ref(AVPacket *dst,const AVPacket *src) |
相当于将AVPacket软链接 |
|
void av_packet_unref(AVPakct* pkt) |
当unref count 到1 时,data将被清空 |
|
void av_packet_move_ref(AVPackt *dst,AVPackt*src) |
将 src move 到dst , src 被清空,ref count 不变 |
|
int av_packet_copy_props(AVPackt *dst,AVPackt*src) |
只仅仅将properties copy |
|
int av_packet_make_refcounted(AVPacket *pkt) |
确保data buf 存在 |
|
int av_packet_make_writeable(AVPacket *pkt) |
与上差不多,都是确保data buf空间的存在 |
|
void av_packet_rescale_ts(pkt,RationaSrc.RationalDst) |
将pts,dts,duration时间信息进行转换 |
本文详细介绍了FFmpeg中AVPacket的相关API,包括如何分配、初始化、复制、调整大小等操作,并解释了AVPacket的数据管理机制。
577

被折叠的 条评论
为什么被折叠?



