如何新的&删除AVPacket?

时间:2014-08-22 02:50:39

标签: 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);
}

这里有什么问题吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我刚刚阅读了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_new_packet 时,它已经 av_init_packet 并且 av_new_packet 已经分配了AVBuffer, 所以如果你想把数据设置为新的AVPAcket,

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