2010-11-17 30 views
0

Permettez-moi de commencer par un clip de code:FFMPEG avec mémoire QT fuite

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.

À un taux de codage d'environ 30fps, j'obtiens une fuite de mémoire d'environ 50MB/sec. Donc, je ne suis pas sûr de ce que le problème pourrait être. Il semble que avcodec_encode_video() copie la mémoire et ne la libère jamais. Des idées?

Si avcodec_encode_video convertit mes données RGB24 en YUV420P, modifierait-il les données pointées par frame.unownedPointer()?

Répondre

0

Jetez un oeil au code pour QtFFmpegwrapper il utilise un contexte enregistré pour ce faire efficently, ou vous pouvez simplement utiliser le QtFFMpegwrapper directement

+0

complètement inutilisable dans ma situation. Il ne supporte que la lecture/écriture dans un fichier, et cela ne répond pas à ce qui cause la fuite de mémoire. –

+0

Après l'avoir regardé de nouveau, il semble que cela pourrait fonctionner ... Je devrais cependant éditer un peu de code pour que cela se produise. –

+0

Désolé - ne peut pas voir ce qui ne va pas avec votre code, cela dépend de la façon dont ffmpeg gère la mémoire. Juste pensé que je voudrais souligner une alternative - vous pouvez utiliser l'exampel dans leur sur comment appeler swscale pour faire RVB-> conversion YUV, il y a aussi un échantillon de la fonction directe RGB-> YUV –