AVPacket 的data 在内存中buffer有两种状况: 函数
1)由av_malloc申请的独立的buffer(unshared buffer); ui
2)是其余AVPacket或者其余reuseable 内存的一部分(shared buffer); spa
av_dup_packet, 经过调用 av_malloc、memcpy、memset等函数, 将shared buffer 的AVPacket duplicate(复制)到独立的buffer中。而且修改AVPacket的析构函数指针av_destruct_pkt。 指针
av_dup_packet源码: code
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; // 从新设置pkt->data终于有本身的独立内存了,不用共享别的AVPacket的内存 00106 pkt->destruct = av_destruct_packet; //设置析构函数指针 00107 } 00108 return 0; 00109 }