如何新建和删除AVPacket?

Pat*_*Lin 6 memory-leaks ffmpeg

我现在正在使用FFmpeg项目,我必须存储来自av_read_frame的AVPacket数据,并将数据填充到新的AVPacket以进行后续解码.

这是我的问题,当我尝试新建和释放AVPacket时,内存泄漏总会发生.

我只是做了一个简单的测试:

for(;;)
{
    AVPacket pkt;

    av_new_packet(&pkt, 1000);

    av_init_packet(&pkt);

    av_free_packet(&pkt);
}
Run Code Online (Sandbox Code Playgroud)

这里有什么问题吗?

小智 9

  • 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 you packet
// free you dataBuffer
Run Code Online (Sandbox Code Playgroud)


Pat*_*Lin 1

我刚刚阅读了 FFmpeg 2.2AVPacket.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;
}
Run Code Online (Sandbox Code Playgroud)

我真的不知道定义FF_API_DESTRUCT_PACKET,,FF_DISABLE_DEPRECATION_WARNINGSFF_ENABLE_DEPRECATION_WARNINGS

某些原因导致泄漏av_free_packet破坏

根据源代码,av_init_packet被调用av_new_packetav_new_packet已经分配了AVBuffer,所以如果你想将数据设置为 new AVPacket

只需将内存复制到 的数据AVPacket,并av_free_packet在完成后调用。