[英]How to new & delete AVPacket?
我現在正在處理一個 FFmpeg 項目,我必須存儲來自av_read_frame
的AVPacket
數據,並將數據填充到新的AVPacket
以進行后續解碼。
這是我的問題:當我嘗試新建和釋放AVPacket
,總是會發生內存泄漏。
我只是在做一個簡單的測試:
for(;;) {
AVPacket pkt;
av_new_packet(&pkt, 1000);
av_init_packet(&pkt);
av_free_packet(&pkt);
}
我究竟做錯了什么?
av_new_packet
創建數據包並分配數據av_init_packet
將所有數據包成員設置為默認值,並將數據指針設置為NULL
,泄漏就在這里av_free_packet
清除所有可見成員,但你的數據已經泄露如果您希望 FFmpeg 為您分配數據,請不要調用av_init_packet
。 如果您想自己處理數據,請在堆棧上分配數據包對象並自行設置其數據(並自行釋放):
AVPacket pkt;
av_init_packet(&pkt);
pkt.data = dataBuffer;
pkt.size = dataBufferSize;
// use your packet
// free your dataBuffer
我剛剛閱讀了 FFmpeg 2.2 AVPacket.c
源代碼。
int av_new_packet(AVPacket *pkt, int size) {
AVBufferRef *buf = NULL;
int ret = packet_alloc(&buf, size);
if (ret < 0)
return ret;
av_init_packet(pkt);
pkt->buf = buf;
pkt->data = buf->data;
pkt->size = size;
#if FF_API_DESTRUCT_PACKET
FF_DISABLE_DEPRECATION_WARNINGS
pkt->destruct = dummy_destruct_packet;
FF_ENABLE_DEPRECATION_WARNINGS
#endif
return 0;
}
void av_init_packet(AVPacket *pkt) {
pkt->pts = AV_NOPTS_VALUE;
pkt->dts = AV_NOPTS_VALUE;
pkt->pos = -1;
pkt->duration = 0;
pkt->convergence_duration = 0;
pkt->flags = 0;
pkt->stream_index = 0;
#if FF_API_DESTRUCT_PACKET
FF_DISABLE_DEPRECATION_WARNINGS
pkt->destruct = NULL;
FF_ENABLE_DEPRECATION_WARNINGS
#endif
pkt->buf = NULL;
pkt->side_data = NULL;
pkt->side_data_elems = 0;
}
我真的不知道定義FF_API_DESTRUCT_PACKET
, FF_DISABLE_DEPRECATION_WARNINGS
, FF_ENABLE_DEPRECATION_WARNINGS
某種原因導致av_free_packet
泄漏破壞
根據源代碼, av_init_packet
被稱為av_new_packet
和av_new_packet
已經分配AVBuffer
,所以如果你想將數據設置為新AVPacket
。
只需將內存復制到AVPacket
數據,並在完成后調用av_free_packet
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.