Правильная очистка AVFrame

Я создаю объект AVFrame с помощью функции av_frame_alloc() и очищаю его с помощью av_frame_free(&frame), который внутренне вызывает av_frame_unref(), но он не очищает память должным образом. Размер кучи моего приложения растет экспоненциально во время выполнения.

Не работает:

AVFrame* frame = av_frame_alloc();
av_frame_free(&frame);

Работающий:

AVFrame* frame = av_frame_alloc();
av_free(frame->data[0]);

Насколько я знаю, av_frame_free() вызывает av_freep(), который вызывает av_free() для освобождения динамической памяти. Память очищается, если я использую av_free(frame->data[0]) напрямую вместо av_frame_free(&frame)


person Vencat    schedule 01.04.2019    source источник
comment
Возможно, кадр где-то подсчитывается, так как кода я не вижу, только догадываюсь. Попробуйте av_frame_unref(frame), а затем av_frame_free(&frame).   -  person the kamilz    schedule 02.04.2019
comment
av_frame_free() внутренне вызывает av_frame_unref(), если на него есть ссылка. Пожалуйста, найдите исходный код для справки [github.com/pockethook/ игрок/блоб/мастер/игрок.cpp#L104]   -  person Vencat    schedule 02.04.2019
comment
Что-то все портит, я не знаю, виноват ли av_frame_copy_props в следующей строке или ваш format_converter_. Вам лучше переключиться на простой C и проверить пошагово (вручную освобождая). Затем вернитесь к умным указателям (C++).   -  person the kamilz    schedule 02.04.2019
comment
@thekamilz спасибо. Я проверю и уточню причину проблемы в ближайшее время.   -  person Vencat    schedule 02.04.2019
comment
@thekamilz использует av_image_alloc() для копирования одного кадра в другой. Согласно этому документу [ffmpeg.org/doxygen/2.0/ выделенный буфер изображения должен быть освобожден с помощью av_freep(&frame-›data[0]) вместо av_frame_free(&frame). Я думал, что av_frame_free() внутренне вызывает av_freep(&frame-›data[0]).   -  person Vencat    schedule 03.04.2019


Ответы (1)


Я разработал личный проект о приложении для совместного использования видео с использованием libav с H.264, чтобы кодировать видео со скоростью 60 кадров в секунду.

Чтобы исправить проблемы с утечкой памяти, я выделяю frame с помощью av_frame_alloc, делаю его доступным для записи каждый цикл с помощью av_frame_make_writable и освобождаю их память с помощью av_free или av_freep.

Итак, используйте один из них:

av_free(frame);
av_freep(frame);
person Fabio Crispino    schedule 06.06.2020