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时间信息进行转换 |