av_dup_Packet(AVPacket*pkt)関数解析

1233 ワード

AVPacketのdataがメモリ内でbufferする場合は2つあります.
1)からav_mallocが申請した独立したbuffer(unshared buffer); 
2)は、他のAVPacketまたは他のreuseableメモリの一部である. 
av_dup_packet、av_を呼び出すmalloc、memcpy、memsetなどの関数は、shared bufferのAVPacket duplicate(コピー)を独立したbufferにコピーします.そしてAVPacketの解析関数ポインタav_を修正するdestruct_pkt.
av_dup_packetソース:
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 }