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 ()?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top