簡體   English   中英

如何新建和刪除 AVPacket?

[英]How to new & delete AVPacket?

我現在正在處理一個 FFmpeg 項目,我必須存儲來自av_read_frameAVPacket數據,並將數據填充到新的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_PACKETFF_DISABLE_DEPRECATION_WARNINGSFF_ENABLE_DEPRECATION_WARNINGS

某種原因導致av_free_packet泄漏破壞

根據源代碼, av_init_packet被稱為av_new_packetav_new_packet已經分配AVBuffer ,所以如果你想將數據設置為新AVPacket

只需將內存復制到AVPacket數據,並在完成后調用av_free_packet

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM