FFMPEG avec QT fuite de mémoire
-
25-09-2019 - |
Question
Permettez-moi de commencer par un clip de code:
QByteArray ba;
ba.resize(500000);
int encsize = avcodec_encode_video(context, (uint8_t*)ba.data(), 500000, frame.unownedPointer());
Ce que je fais est coder les données du cadre et de mettre les données dans le tampon pointé à QByteArray. Si je commente la ligne avcodec_encode_video ma fuite de mémoire disparaît. unownedPointer () ressemble à ceci:
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;
Où this-> est un cadre AVFrame * et this-> img est un QImage.
A un taux d'encodage d'environ 30fps, je reçois une fuite de mémoire d'environ 50 Mo / s. Je ne suis pas sûr de ce que la question pourrait être. Il semble que avcodec_encode_video () est la copie mémoire et ne jamais libérer ou quelque chose. Toutes les idées?
Si avcodec_encode_video convertit mes données RGB24 à YUV420P serait-il modifier les données pointées par frame.unownedPointer ()?
La solution
Jetez un oeil au code QtFFmpegwrapper il utilise un contexte enregistré pour ce faire efficently ou vous pouvez simplement utiliser directement le QtFFMpegwrapper