关于ffmpeg解码的几个基础性的问题
在使用ffmpeg解码文件时,先为AVFormatContext 变量分配内存。
AVFormatContext *pFileFormatCtx=av_alloc_format_context()
然后调用av_open_input_file打开文件
再调用av_find_stream_info获取流信息
再调用avcodec_find_decoder和avcodec_open等函数获取解码信息;
此时再定义一个AVFormatContext 变量,并分配内存;
AVFormatContext *pSecondormatCtx=av_alloc_format_context()
然后将第一个变量的内存拷贝给第二个变量
memcpy(pSecondormatCtx,pFileFormatCtx,sizeof(AVFormatContext));
按说此时第二个变量应该就有自己的内存及成员了,可我测试发现,如果此时我调用av_close_input_file(pFileFormatCtx)关闭文件,结果发现,第二个变量的解码相关的成员都变为无效值了,这是怎么回事?我明明已经为第二个变量分配了内存呀?
还有个问题就是在程序中自己调用avcodec_alloc_context或av_alloc_format_context()等函数分配的内存,在程序关闭时,用手动释放吗?我发现好像自己不释放也没有内存泄漏发生。如果需要释放,调用什么函数?
[解决办法]
because you do not provide the actual copy constructor
your problem is same as the following scenario:
void *ptr = malloc(100);
void *ptr2 = NULL;
if (ptr) {
memset(ptr,0,100);
ptr2 = ptr;
}
...
if (ptr)
free(ptr);
...
//still use ptr2
...
//crash, or wrong