int av_packet_ref(AVPacket *dst, const AVPacket *src)源码分析
2016-01-10 17:32
288 查看
不废话,直接开搞。个人分析部分以注释的形式体现;
//说在前面,从字面意思上来讲,这个函数只是要产生一个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数据部分是不可写、只能读的;
相关文章推荐
- eCharts画图断点连线的解决方案
- iOS---实现简书和知乎的上滑隐藏导航栏下拉显示导航栏效果
- vi快捷键全览
- 忘记Mysql的root密码怎么办?
- 【宏芸老师】梦想,创造奇迹
- 获取document对象除了getElement方法,居然还可以使用css选择器方法!!!
- Iframe浮动框架中使用超链页面跳转问题
- orm2 中文文档 8. 聚合
- C/C++学习指南(语法篇) - 邵发
- eclipse 下调整jdk和tomcat的jvm参数
- 天猫魔盒屏蔽升级
- 蓝桥杯 入门训练 Fibonacci数列
- 加载.properties方式
- 蓝桥杯 历届试题 回文数字
- Android中shape定义控件的使用
- android 视频文件不能进行幻灯片的播放
- 图像运算小结
- Retrofit1切换到Retrofit2的注意事项
- Java中的阻塞和非阻塞IO包各自的优劣思考
- Mysql入门实战中