FFmpeg (кодек). утечки памяти в avcodec_encode_video - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь перекодировать видео с помощью libavcodec. При перекодировании больших видеофайлов (час или больше) я получаю огромные утечки памяти в avcodec_encode_video. Я попытался отладить его, но с разными видеофайлами разные функции приводят к утечкам, я немного запутался по этому поводу :). Здесь FFMPEG с утечкой памяти QT - это та же проблема, что и у меня, но я понятия не имею, как этот человек решил ее. QtFFmpegwrapper, кажется, делает то же самое, что и я (или я что-то пропустил).

мой метод ниже. Я позаботился об aFrame и aPacket снаружи с помощью av_free и av_free_packet.

int
Videocut::encode(
AVStream *anOutputStream,
AVFrame *aFrame,
AVPacket *aPacket
)
{
AVCodecContext *outputCodec = anOutputStream->codec;

if (!anOutputStream ||
    !aFrame ||
    !aPacket)
{
    return 1;
    /* NOTREACHED */
}

uint8_t * buffer = (uint8_t *)malloc(
    sizeof(uint8_t) * _DefaultEncodeBufferSize
    );

    if (NULL == buffer) {
        return 2;
        /* NOTREACHED */
}

int packetSize = avcodec_encode_video(
    outputCodec,
        buffer,
        _DefaultEncodeBufferSize,
        aFrame
    );

if (packetSize < 0) {
    free(buffer);
    return 1;
    /* NOTREACHED */
}

aPacket->data = buffer;
aPacket->size = packetSize;

return 0;
}

1 Ответ

1 голос
/ 31 марта 2012

Первым шагом будет попытка воспроизвести вашу проблему в Valgrind на компьютере с Linux, если вы можете.

Кодеры и декодеры ffmpeg обычно не выделяют память динамически;они повторно используют буферы между вызовами.Утечки обычно будут где-то в кадрах.

Обратите внимание, что av_free_packet освободит ваш динамически распределенный буфер, только если пакет имеет функцию деструктора!в libavcodec/avpacket.c:

void av_free_packet(AVPacket *pkt)
{
    if (pkt) {
        if (pkt->destruct) pkt->destruct(pkt);
        pkt->data = NULL; pkt->size = 0;
        pkt->side_data       = NULL;
        pkt->side_data_elems = 0;
    }
}

Если функция pkt->destruct отсутствует, очистка не производится!

...