我现在正在使用FFmpeg项目,我必须存储来自av_read_frame的AVPacket数据,并将数据填充到新的AVPacket以进行后续解码。
这是我的问题,当我尝试新的&释放AVPacket,内存泄漏 总是发生。
我只是做了一个简单的测试:
for(;;)
{
AVPacket pkt;
av_new_packet(&pkt, 1000);
av_init_packet(&pkt);
av_free_packet(&pkt);
}
这里有什么问题吗?
答案 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 。