Не могу придумать, что делать с этой проблемой. При транскодировании большого видео(от часа) в оперативу натекает просто кошмарно, а что делать - не знаю. Дебажил, но с разными видео память выделяется разными функциями и я уже запутался, где - что. Конечно, ещё пару дней красноглазого выискивания и, возможно, всё найду, но как-то не хочется идти этим путём. Вот тут схожая проблема, но решение заключается в обёртке QtFFmpegwrapper, которая, по сути, ничем не отличается от моего кода(или я что-то пропустил).
текст моего метода ниже. То, что выделено маллоком, освобождается вне метода. Пакет тоже освобождается, всё проверено. Есть у кого какие идеи? :)
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;
}