I am filling a Frame
with a BGR image for encoding, and I am getting a memory leak. I think I got to the source of the problem but it appears to be a library issue instead. Since FFmpeg is such a mature library, I think I am misusing it and I would like to be instructed on how to do it correctly.
I am allocating a Frame
using:
AVFrame *bgrFrame = av_frame_alloc();
And later I allocate the image in the Frame
using:
av_image_alloc(bgrFrame->data, bgrFrame->linesize, bgrFrame->width, bgrFrame->height, AV_PIX_FMT_BGR24, 32);
Then I fill the image allocated using:
av_image_fill_pointers(bgrFrame->data, AV_PIX_FMT_BGR24, bgrFrame->height, originalBGRImage.data, bgrFrame->linesize);
Where originalBGRImage
is an OpenCV Mat
.
And this has a memory leak, apparently, av_image_alloc()
allocates memory, and av_image_fill_pointers()
also allocates memory, on the same pointers (I can see bgrFrame->data[0]
changing between calls).
If I call
av_freep(&bgrFrame->data[0]);
After av_image_alloc()
, it's fine, but if I call it after av_image_fill_pointers()
, the program crashes, even though bgrFrame->data[0]
is not NULL
, which I find very curious.
Looking FFmpeg's av_image_alloc()
source code, I see it calls av_image_fill_pointers()
twice inside it, once allocating a buffer buff
....and later in av_image_fill_pointers()
source code, data[0]
is substituted by the image pointer, which is (I think) the source of the memory leak, since data[0]
was holding buf
from the previous av_image_alloc()
call.
So this brings the final question: What's the correct way of filling a frame with an image?.