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ソース:
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 }