av_dup_packet(AVPacket *pkt)函數分析

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 }
相關文章
相關標籤/搜索