Позвольте мне начать с фрагмента кода:
QByteArray ba;
ba.resize(500000);
int encsize = avcodec_encode_video(context, (uint8_t*)ba.data(), 500000, frame.unownedPointer());
То, что я делаю, - это кодирование данных из фрейма и помещение данных в буфер, указанный на QByteArray.Если я закомментирую строку avcodec_encode_video, утечка памяти исчезнет.unownedPointer () выглядит следующим образом:
if (this->frame != NULL) return this->frame;
this->frame = avcodec_alloc_frame();
uchar *data = this->img.bits();
frame->data[0] = (uint8_t *)data;
frame->data[1] = (uint8_t *)data + 1;
frame->data[2] = (uint8_t *)data + 2;
frame->linesize[0] = width * lineSize(this->fmt);
frame->linesize[1] = width * lineSize(this->fmt);
frame->linesize[2] = width * lineSize(this->fmt);
return this->frame;
Где this-> frame - это AVFrame *, а this-> img - QImage.
При скорости кодирования около 30 кадров в секунду я получаю утечку памяти около 50 МБ / с.Поэтому я не уверен, в чем проблема.Кажется, что avcodec_encode_video () копирует память и никогда не освобождает ее или что-то еще.Есть идеи?
Если avcodec_encode_video конвертирует мои данные RGB24 в YUV420P, будет ли это модифицировать данные, на которые указывает frame.unownedPointer ()?