int av_dup_packet(AVPacket *pkt)
2011-06-16 18:27
239 查看
AVPacket 的data 在内存中buffer有两种情况:
1)由av_malloc申请的独立的buffer(unshared buffer);
2)是其他AVPacket或者其他reuseable 内存的一部分(shared buffer);
av_dup_packet, 通过调用 av_malloc、memcpy、memset等函数, 将shared buffer 的AVPacket duplicate(复制)到独立的buffer中。并且修改AVPacket的析构函数指针av_destruct_pkt。
参考:
博客 :http://web.archiveorange.com/archive/v/yR2T4x4OSETwVhwQpvlB
源代码 :http://cekirdek.pardus.org.tr/~ismail/ffmpeg-docs/avpacket_8c-source.html#l00092
1)由av_malloc申请的独立的buffer(unshared buffer);
2)是其他AVPacket或者其他reuseable 内存的一部分(shared buffer);
av_dup_packet, 通过调用 av_malloc、memcpy、memset等函数, 将shared buffer 的AVPacket duplicate(复制)到独立的buffer中。并且修改AVPacket的析构函数指针av_destruct_pkt。
参考:
博客 :http://web.archiveorange.com/archive/v/yR2T4x4OSETwVhwQpvlB
源代码 :http://cekirdek.pardus.org.tr/~ismail/ffmpeg-docs/avpacket_8c-source.html#l00092
00092 int av_dup_packet(AVPacket *pkt) 00093 { 00094 if (((pkt->destruct == av_destruct_packet_nofree) || (pkt->destruct == NULL)) && pkt->data) { 00095 uint8_t *data; 00096 /* We duplicate the packet and don't forget to add the padding again. */ 00097 if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE) 00098 return AVERROR(ENOMEM); 00099 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE); 00100 if (!data) { 00101 return AVERROR(ENOMEM); 00102 } 00103 memcpy(data, pkt->data, pkt->size); 00104 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE); 00105 pkt->data = data; 00106 pkt->destruct = av_destruct_packet; 00107 } 00108 return 0; 00109 }
相关文章推荐
- int av_dup_packet(AVPacket *pkt)
- ffmpeg框架阅读笔记一:读取数据帧函数 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
- ffmpeg框架阅读笔记一:读取数据帧函数 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
- int av_packet_ref(AVPacket *dst, const AVPacket *src)源码分析
- int av_packet_ref(AVPacket *dst, const AVPacket *src)源码分析
- 关于 ffmpeg 中av_rescale_rnd 和avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt, 的含义
- int av_packet_ref(AVPacket *dst, const AVPacket *src)源码分析
- ffmpeg AVPacket & AVFrame
- AVpacket AVframe
- ubuntu 10.10 drcom成功上网 好不容易。附:_recv_dialog_packet(PKT_CHALLENGE) failed解决之道
- ffmpeg AVPacket & AVFrame
- RTMPPacket与AVData之间的转换
- av_packet_free error
- FFmpeg AVPacket和AVFrame区别
- FFmpeg中av_init_packet()和av_packet_alloc()以及av_new_packet()三者的区别以及用法
- ffmpeg AVPacket & AVFrame
- FFmpeg中AVPacket处理函数av_free_packet()和av_packet_free()的区别以及用法
- FFmpeg 错误 C4996: "avcodec_alloc_frame"或者"av_free_packet"等函数被声明为已否决的解决方法
- C/C++音视频库ffmpeg的数据包AVPacket分析
- 分析av_read_frame、av_read_frame_internal和av_read_packet的主要步骤