AVPacket常用API:

AVPacket *av_packet_alloc(void); //分配AVPacket

int av_new_packet(AVPacket *pkt, int size); // 给AVPacket的buf分配内存, 引用计数初始化为1

int av_packet_ref(AVPacket *dst, const AVPacket *src);
// 引用计数+1

void av_packet_move_ref(AVPacket *dst, AVPacket *src); // 转移引用计数

void av_packet_unref(AVPacket *pkt); // 引用计数-1

void av_frame_free(AVFrame ** frame); // 释放AVFrame
, 内部已调用av_packet_unref 函数

代码分析:

  1. int av_new_packet(AVPacket *pkt, int size);
    如果该Packet有引用计数(packet->buf不为空),则先调用av_packet_unref(&packet),只有当引用计数为0时,才会在调用av_packet_free()时释放data的缓存
	AVPacket *pkt = NULL;
    int ret = 0;
    pkt = av_packet_alloc();
    ret = av_new_packet(pkt, MEM_ITEM_SIZE); // 引用计数初始化为1
    memccpy(pkt->data, (void *)&av_packet_test1, 1, MEM_ITEM_SIZE);
    av_packet_unref(pkt);      
    av_packet_free(&pkt);       
    

  1. void av_packet_move_ref(AVPacket *dst, AVPacket *src);
    把src整个结构体直接赋值给dst,所以引用计数没有发生变化,并且src被av_init_packet重置
	AVPacket *pkt = NULL;
    AVPacket *pkt2 = NULL;
    int ret = 0;

    pkt = av_packet_alloc();
    ret = av_new_packet(pkt, MEM_ITEM_SIZE);
    memccpy(pkt->data, (void *)&av_packet_test1, 1, MEM_ITEM_SIZE);
    pkt2 = av_packet_alloc();   // 必须先alloc
    av_packet_move_ref(pkt2, pkt);//内部其实也调用了av_init_packet
    av_packet_free(&pkt);
    av_packet_free(&pkt2);
  1. AVPacket *av_packet_clone(const AVPacket *src);
    其功能是 av_packet_alloc() + av_packet_ref();
	AVPacket *pkt = NULL;
    AVPacket *pkt2 = NULL;
    int ret = 0;

    pkt = av_packet_alloc();
    ret = av_new_packet(pkt, MEM_ITEM_SIZE);
    memccpy(pkt->data, (void *)&av_packet_test1, 1, MEM_ITEM_SIZE);
    pkt2 = av_packet_clone(pkt); 
    av_packet_free(&pkt);
    av_packet_free(&pkt2);
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐