您的位置:首页 > 其它

int av_packet_ref(AVPacket *dst, const AVPacket *src)源码分析

2017-06-09 22:23 465 查看
转自http://blog.csdn.net/fernandowei/article/details/50492815

/说在前面,从字面意思上来讲,这个函数只是要产生一个AVPacket的reference(引用);

//个人觉得,这个函数从一定程度上可以很有效的帮助你我理解AVPacket结构体的各个参数的含义;

int av_packet_ref(AVPacket *dst, const AVPacket *src)

{

    int ret;

    ret = av_packet_copy_props(dst, src);      
 //这个函数内部只是做一些数值拷贝(pts dts stream_index等)以及side_data的深拷贝;

    if (ret < 0)

        return ret;

    if (!src->buf)
  //这里的if-else是关键部分;这里意思是,如果源packet(即src)本身不是一个ref,则这里相当于要生成它的第一个ref;

                          //由此也可知道,AVPacket里面的buf成员是否为null,表明的就是这个packet是否是一个ref

    {

        ret = packet_alloc(&dst->buf, src->size);

        if (ret < 0)

            goto fail;

        memcpy(dst->buf->data, src->data, src->size);   //最终的结果是,这个新生成的源packet的ref(即dst),

                                                                                 
   //它对数据的存储是在dst->buf->data中,大小是dst->buf->size,也是src->size

    }

    else
  //如果源packet(即src)本身就是某个packet的ref,则很简单,直接浅拷贝指针即可, 

             //当然其中要申请一个AVBufferRef结构体的内存空间

    {

        dst->buf = av_buffer_ref(src->buf);

        if (!dst->buf) {

            ret = AVERROR(ENOMEM);

            goto fail;

        }

    }

    dst->size = src->size;

    dst->data = dst->buf->data;
 //从这句也可看到,在一个packet的ref packet中,data指针跟buf->data指针是相同的

    return 0;

fail:

    av_packet_free_side_data(dst);

    return ret;

}

//从这个函数也可以看到,如果某个packet有多个ref,那么这个packet的数据其实有两份存储位置,一份就是这个packet自己data指针所指向,另一份是这个packet的其他所有ref

//的buf->data指针所指向,而且当有多个ref时,buf->data数据部分是不可写、只能读的;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐