在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;
