ffmpeg: «утечка» памяти (av_read_packet) 6

Posted by Андрей on Июль 10, 2008

Может, это кому-то поможет сохранить пару часов отладки. Когда читаем видеопоток из файла, делаем что-то наподобие следующего:

AVPacket *m_pPacket = (AVPacket *)malloc(sizeof(AVPacket))
while(1)
{
     int ret = av_read_frame(formatCtx, m_pPacket);

     if (ret < 0)
         // error

     if (m_pPacket.stream_index == videoStreamIndex)
     {
         .... avcodec_decode_video ...
     }
 }
 av_free_packet(m_pPacket);
 free(m_pPacket);

Так вот, это неправильно, нужно вызывать av_free_packet после каждого av_read_packet:

AVPacket *m_pPacket = (AVPacket *)malloc(sizeof(AVPacket))
while(1)
{
     int ret = av_read_frame(formatCtx, m_pPacket);

     if (ret < 0)
         // error

     if (m_pPacket.stream_index == videoStreamIndex)
     {
         .... avcodec_decode_video ...
     }
     av_free_packet(m_pPacket);
 }
 free(m_pPacket);

P.S. Может, из текста не совсем понятно, это не бага в самом ffmpeg, это моя программа, используя libavcodec, libavformat (библиотеки ffmpeg), как я написал в начале поста, «текла».

Trackbacks

Use this link to trackback from your own site.

Comments

Leave a response

  1. Stepan Чт, 10 Июл 2008 22:20:18 UTC

    А вы в рассылу ffmpeg написали?

  2. Андрей Пт, 11 Июл 2008 06:50:36 UTC

    Нет, не писал, это не бага у них.

    Вообще у ffmpeg фактически нет документации. Лучшее, что я нашел – это http://www.dranger.com/ffmpeg/tutorial01.html, где как раз и приводится «ошибочный» код.

    Это скорее бага в том tutorial.

    Кстати, а кому-то интересен модуль на python, который использует библиотеки ffmpeg, чтобы собирать информацию о видео и вырезать из него кадры? Если это интересно, я могу подготовить его для open-source.

  3. Максим Крентовский Вт, 15 Июл 2008 19:40:14 UTC

    Меня бы заинтересовало, но я на Питоне не разрабатываю. А за пост – спасибо.

  4. Rauan Пн, 20 Окт 2008 12:33:29 UTC

    Здравствуйте Андрей. С удовольствием бы посмотрел такой модуль. :)

  5. Артем Ср, 22 Апр 2009 18:02:03 UTC

    Андрей, тоже заинтересован. Хотя лучше конечно же на Си. Очень интересно посмотреть такие исходники с использованием библиотек ffmpeg.

  6. Дмитрий костромин Вт, 03 Авг 2010 12:33:26 UTC

    Извините меня за откровенность – но помоему это и ежу понятно что – если data в AVPacket не равна 0 и меняется с каждым пакетом – то значит её кто-то выделяет – и очевидно предположить, что её выделяет ffmpeg а соответственно – её надо удалять

Comments