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数据部分是不可写、只能读的;
/说在前面,从字面意思上来讲,这个函数只是要产生一个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数据部分是不可写、只能读的;
相关文章推荐
- int av_packet_ref(AVPacket *dst, const AVPacket *src)源码分析
- int av_packet_ref(AVPacket *dst, const AVPacket *src)源码分析
- int av_dup_packet(AVPacket *pkt)
- 不要使用库函数,写出void *memcpy(void *dst, const void *src, size_t count),其中dst是目标地址,src是源地址。
- nutch v1.9源码分析(2)——nutch bin和src目录解析及编译
- av_register_all,avcodec_register_all的源码分析
- void *memcpy(void *dst,void const *src,size_t len):从src的起始位置复制len个字节到dst的内存起始位置。可以用这种方法复制任何类型的值。
- c语言库函数【string.h】之strcpy_(char * dst,const char * src)
- 从零开始学C++之STL(九):函数适配器bind2nd 、mem_fun_ref 源码分析、函数适配器应用举例
- java.lang.ref包源码分析(一):类结构
- ffmpeg源码分析之av_register_all()
- go(golang) dns 解析源码 go/src/net/dnsclient_unix.go 分析
- ffmpeg框架阅读笔记一:读取数据帧函数 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
- ffmpeg中av_interleaved_write_frame函数的源码分析及其用法
- 分析av_read_frame、av_read_frame_internal和av_read_packet的主要步骤
- x264源码分析 -- get_ref
- 不调用库函数,实现字符串复制函数char * strcpy(char * dst, const char * src) C/C++软件开发求职面试题 必备考点(二)
- [osg]源码分析:OSG中的智能指针osg::ref_ptr
- boost 源码 ref 库分析
- void* memcpy(void* dst, const void* src, int size)