FFmpeg中AVPacket處理函數av_free_packet()和av_packet_free()的區別以及用法


在AVPacket中有兩個比較相近的函數av_packet_free和av_free_packet,在看api的時候有些迷茫,不知道如何使用,之后特意看了一下源碼,在此記錄一下


不多說,直接上源碼


//av_free_packet其實就是清空pkt中data以及buf的內容,並沒有把pkt的指針清空,我們可以看到其函數內部調用了av_buffer_unref
void av_free_packet(AVPacket *pkt)
{
    if (pkt) {
        if (pkt->buf)
            av_buffer_unref(&pkt->buf);
        pkt->data            = NULL;
        pkt->size            = 0;
 
        av_packet_free_side_data(pkt);
    }
}

//簡單來說,av_buffer_unref只是把pkt的buf置NULL
void av_buffer_unref(AVBufferRef **buf)
{
    if (!buf || !*buf)
        return;
 
    buffer_replace(buf, NULL);
}

//而其中的sidedata是把額外信息清除了,如果這里不理解,建議深入了解一下AVPacket的sidedata,他是一個類似於數組的東西,在這里就不多說了
void av_packet_free_side_data(AVPacket *pkt)
{
    int i;
    for (i = 0; i < pkt->side_data_elems; i++)
        av_freep(&pkt->side_data[i].data);
    av_freep(&pkt->side_data);
    pkt->side_data_elems = 0;
}

//而av_packet_free是先把pkt中的內容清空,然后再把指針清空,讓pkt徹底無法使用了,如果需要重新使用,需要重新分配內存
void av_packet_free(AVPacket **pkt)
{
    if (!pkt || !*pkt)
        return;
 
    av_packet_unref(*pkt);
    av_freep(pkt);
}


關於二者的使用:

av_free_packet是清空里邊的數據,如果不清空會發生什么情況呢,舉個簡單的例子,一個char數組大小為128,里邊有100個字節的內容,第二次使用你沒有清空第一次的內容,第二次數據的大小為60,那么第一次的最后40個字節的數據仍會保留,造成數據冗余,極大可能對你的處理造成影響(這個跟自己的處理也有關系,並不一定,只是個簡單的例子,大家可以寫一個簡單的例子測試一下)

av_packet_free類似於free(p;)p=NULL;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM