Утечка памяти кадров H.264 с некоторыми декодерами

Я получаю поток H.264с цифрового видеорегистратора, используя его SDK. Были утечки памяти, и я думал, что все утечки вызваны SDK. Но когда я записал поток и воспроизвел кадры один за другим, читая с диска (без участия сторонних dll), я заметил, что проблема не в dll, а в самом потоке.

Как ни странно, Декодер DivX H264— единственный кодек, который не вызывает утечки памяти, но при длительном проигрывании потока иногда падает и декодер DivX. Я бы предпочел использовать Microsoft DTV-DVD Video Decoder, но это приводит к огромным утечкам памяти и потере большого количества кадров. Многие другие декодеры H.264, которые я пробовал, ведут себя точно так же.

Я изучил кадры h.264, используя некоторые парсеры h.264, сравнив их с некоторыми другими безпроблемными потоками, но не заметил в логах ничего очевидного.

Поскольку моя проблема связана со структурой кадров h.264, я подготовил исходный фильтр с именем FramesFromFileSourceFilter, который вы можете скачать ниже.

http://www.akaydin.com/directshow/FramesFromFileSourceFilter.zip

Это проект Visual Studio 2008, и все зависимости включены в zip-файл в относительно расположенных папках (включая h 0,264 кадра). Итак, все, что вам нужно сделать, это скомпилировать проект, зарегистрировать вывод с помощью regsvr32.exeи запустить фильтр с любым декодером h.264 из GraphEdit или GraphStudio. Примеры графиков ниже.

FramesFromFileSourceFilter with DivX

FramesFromFileSourceFilter with Microsoft DTV-DVD Video Decoder

Также кадры h264 доступны в виде одного необработанного файла h264 по приведенной ниже ссылке, который можно воспроизвести с помощью VLC (с неправильным FPS, поскольку в оригинале было 12 FPS).

http://www.akaydin.com/directshow/stream.zip

Вопрос:

Что может быть причиной проблем с утечкой памяти во многих известных декодерах H264, кроме декодера DivX. Что не так с этим потоком?

Обновление 1

Поток чтения данных удален, а функции перемещены в FillBuffer без использования каких-либо буферов и флагов. Проблема остается той же.

http://www.akaydin.com/directshow/FramesFromFileSourceFilterUpdate1.zip

Обновление 2

Обновление 1 использовало Sleep()в FillBuffer(), которая вызывал некоторые проблемы. Теперь я удалил Sleep()и использовал SetTime(), чтобы получить ~12 FPS. Это также решило Microsoft DTV-DVD Video Decoderпроблемы с пропуском кадров, но не решило проблемы с памятью.

http://www.akaydin.com/directshow/FramesFromFileSourceFilterUpdate2.zip

Увеличение памяти происходит только для рабочего набора. Virtual Bytesи Private Bytesкажутся стабильными. Что может быть причиной непрерывного увеличения памяти рабочего набора, которое происходит только с видеодекодером Microsoft DTV-DVD?

8
задан Emir Akaydın 29 June 2012 в 09:52
поделиться