Ffmpeg возможная утечка памяти в sws_scale - PullRequest
0 голосов
/ 28 февраля 2020

Я декодирую любой код камеры c, а затем всегда кодирую его в H264 и, более конкретно, qsv, если он поддерживается. В настоящее время есть 2 камеры для тестирования. Один кодируется H264, а другой - rawvideo. Проблема приходит с rawvideo. Пиксельный формат BGR24 и масштабирование до NV12

Я упросту код, потому что это как любой другой пример.

avcodec_send_packet()
// while
avcodec_receive_frame()

// if frame is not EAGAIN convert BGR24 to NV12
if (_pConvertContext == null)
{
    _pConvertContext = CreateContext(sourcePixFmt, targePixFmt);
}

if (_convertedFrameBufferPtr == IntPtr.Zero)
{
    int buffSize = ffmpeg.av_image_get_buffer_size(targePixFmt, sourceFrame->width, sourceFrame->height, 1);
    _convertedFrameBufferPtr = Marshal.AllocHGlobal(buffSize);
     ffmpeg.av_image_fill_arrays(ref _dstData, ref _dstLinesize, (byte*)_convertedFrameBufferPtr, targePixFmt, sourceFrame->width, sourceFrame->height, 1);
}

return ScaleImage(_pConvertContext, sourceFrame, targePixFmt, _dstData, _dstLinesize);

И ScaleImage Метод

ffmpeg.sws_scale(ctx, sourceFrame->data, sourceFrame->linesize, 0, sourceFrame->height, dstData, dstLinesize);

AVFrame* f = ffmpeg.av_frame_alloc();

var data = new byte_ptrArray8();
data.UpdateFrom(dstData);
var linesize = new int_array8();
linesize.UpdateFrom(dstLinesize);

f->data = data;
f->linesize = linesize;
f->width = sourceFrame->width;
f->height = sourceFrame->height;
f->format = (int)targePixelFormat;

return f;

После этого отправляем масштабированный кадр кодеру, принимаем его и записываем файл. После этого я вызываю av_frame_free(&frame) в кадре, возвращенном из метода. Но когда я устанавливаю точку останова, я вижу, что адрес кадра одинаков даже после вызова av_frame_alloc() и очистки каждый раз. И я думаю, что это причина утечки памяти. Если я сделаю глубокий клон из f, прежде чем вернуть его, все в порядке. Почему это происходит, когда тот же лог c отлично работает с другой камерой?

1 Ответ

0 голосов
/ 05 марта 2020

Что ж, после 3 потерянных дней попыток выяснить, почему это происходит только с определенными камерами, я сделал дамп памяти, используя DebugDiag 2 с трекером утечки памяти. Оказалось, что _aligned_offset_mallo c выделено огромное количество памяти, как вы можете видеть на рисунке ниже. Я использовал ffmpeg 4.2.2, понижение до 4.0.2 устранило проблему для меня. Нет утечки памяти сейчас. Я использую 32bit версию.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...