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)
我刚刚阅读了 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_packet并av_new_packet已经分配了AVBuffer,所以如果你想将数据设置为 new AVPacket。
只需将内存复制到 的数据AVPacket,并av_free_packet在完成后调用。