我正在尝试编写一个处理 ffmpeg 的实用程序。一旦我需要将图像平面从一个指针复制到另一个指针。从 AVPicture 结构到我自己的。这里有一些来源。
我自己的框架结构。在构造函数中分配的内存,在析构函数中释放
template <class DataType>
struct Frame
{
DataType* data; //!< Pointer to image data
int f_type; //!< Type of color space (ex. RGB, HSV, YUV)
int timestamp; //!< Like ID of frame. Time of this frame in the video file
int height; //!< Height of frame
int width; //!< Width of frame
Frame(int _height, int _width, int _f_type=0):
height(_height),width(_width),f_type(_f_type)
{
data = new DataType[_width*_height*3];
}
~Frame()
{
delete[] data;
}
};
这是执行转换的主循环。如果注释了带有 memcpy 的行,则根本没有内存泄漏。但是如果我取消注释,就会出现内存泄漏。
for(int i = begin; i < end; i++)
{
AVPicture pict;
avpicture_alloc(&pict, PIX_FMT_BGR24, _width, _height);
std::shared_ptr<Frame<char>> frame(new Frame<char>(_height, _width, (int)PIX_FMT_BGR24));
sws_scale(ctx, frame_list[i]->data, frame_list[i]->linesize, 0, frame_list[i]->height, pict.data, pict.linesize);
memcpy(frame->data,pict.data[0],_width*_height*3);
//temp_to_add->push_back(std::shared_ptr<Frame<char>>(frame));
avpicture_free(&pict);
}
我一直在尝试很多事情,例如:通过 malloc 分配内存并通过 free 解除分配,手动将内存从 pict 复制到帧(在 for 循环中),使用 std::copy 和 avpicture_layout 这是 ffmpeg 辅助函数。没有什么帮助。所以问题是:我是否忘记了一些重要的事情?
我将不胜感激每一个答案。