LINUX.ORG.RU

Some buffers are still owned by the caller on close

 


0

1

Вот такое странное сообщение выдает мне ffmpeg после попытки "подчистить хвосты".

[tl;dr]
Я начал пилить новую версию "астровидеогида" (сбор и обработка в реальном времени видео с видеокамеры подсмотра, выдача команд исполнительным приводам для коррекции поля — чтобы объект никуда не "убегал" при мелких колебаниях телескопа, а также коррекция телескопом при ошибках сопровождения), т.к. мне надоело для каждой новой камеры/платы видеозахвата допиливать модуль. Я решил использовать ffmpeg: пусть он жирный, зато проблем сразу меньше. Один демон будет просто хапать видео и в shm складывать в циклический буфер 4 последних кадра (раньше так и работало), а еще в shm будет складывать вычисленные координаты смещения опорного объекта (раньше сразу отправлялись команды на исполнительные приводы). Это позволит разделить демон захвата и исполнительный демон → проще будет разрабатывать новые устройства.
[/tl;dr]

Вот ссылка на мои начинания. Кода пока немножко. Проблема в файле capture.c: функция free_videodev() вызывает матюки:

[video4linux2,v4l2 @ 0x62e560] Some buffers are still owned by the caller on close.

Вопрос: мне наплевать на эти матюки, или же попытаться найти ту неведомую штуку, которая продолжает занимать память? Вроде бы, высвобождаются все ресурсы. В коде ffmpeg черт ногу сломит: очень уж много всего.

☆☆☆☆☆

Последнее исправление: Eddy_Em (всего исправлений: 1)

Ответ на: комментарий от Krieger_Od

Эта:

if(pFormatCtx) avformat_close_input(&pFormatCtx);

Eddy_Em ☆☆☆☆☆
() автор топика

Ну я и рукожоп! Сделал make clean и удалил ru.po! Хорошо, в репах уже хранилось, вернул. Починил cmakelists.

Eddy_Em ☆☆☆☆☆
() автор топика

Выходишь из цикла не освобождая последний пакет.

	while(av_read_frame(pFormatCtx, &packet) >= 0) {
...
				if(++istart >= ilast) break;
			}
		}
		// Free the packet that was allocated by av_read_frame
		av_free_packet(&packet);
	}

fopen ★★
()

Сам ты жирный. У тебя встроенное приложение, так собери только нужные тебе части: configure --disable-all --enable-indev=v4l2 и т.д.

fopen ★★
()
Ответ на: комментарий от fopen

Нет, не оно:

int i;
...
while((i = av_read_frame(pFormatCtx, &packet)) >= 0){
...
}
if(i < 0) av_free_packet(&packet); // free error packet

аналогичную ошибку выдает.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от fopen

Ты предлагаешь тащить еще и кастомную сборку ffmpeg? Да ну нафиг!

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Нет, не оно:

if(i < 0) av_free_packet(&packet); // free error packet

:) Я сказал «выходишь из цикла», а выходил из цикла ты по условию (istart >= ilast). Да, любой человек на слова «выходишь из цикла» посмотрит на условие в while. И ты туда посмотрел и наступил на известные грабли, брошенные тобой же. Короче, циклы делают так:

пока (есть работа) {
    делать работу;
    если (непредвиденная фигня) {
        прервать работу;
    }
}
А в твоем случае это вообще простой цикл for с маленькой особенностью - условным увеличением счетчика. Но ты все важное спрятал. Ты не программист, я помню. Но простые привычки уберегут тебя от утечек и не только.

fopen ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.