2012-03-29 21 views
0

私はlibavcodecの助けを借りてビデオをコード変換しようとしています。 大きなビデオファイルを(1時間以上)トランスコードすると、avcodec_encode_videoで大きなメモリリークが発生します。私はそれをデバッグしようとしましたが、さまざまなビデオファイルで異なる関数がリークを生成する、私はそれについて少し混乱して:)。ここでFFMPEG with QT memory leakは私と同じ問題ですが、私はどのようにその人がそれを解決したのか分かりません。 QtFFmpegwrapperは同じことをしているようです(または何かが恋しくなりません)。ffmpeg(libavcodec)。 avcodec_encode_videoのメモリリーク

私の方法は低いです。私は、av_freeとav_free_packetを使って、aFrameとaPacketの外側を気にしました。

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; 
} 

答えて

0

最初の手順は、可能であれば、LinuxのValgrindで問題を再現することです。

ffmpegエンコーダとデコーダは通常、動的にメモリを割り当てません。コール間でバッファを再利用します。漏れは、通常、どこかのフレームに存在します。

パケットにデストラクタ機能がある場合にのみ、av_free_packetは動的に割り当てられたバッファを解放することに注意してください。関数がlibavcodec/avpacket.cで定義されている方法で

ルック:

void av_free_packet(AVPacket *pkt) 
{ 
    if (pkt) { 
     if (pkt->destruct) pkt->destruct(pkt); 
     pkt->data = NULL; pkt->size = 0; 
     pkt->side_data  = NULL; 
     pkt->side_data_elems = 0; 
    } 
} 

pkt->destruct機能がない場合は、ノークリーンアップが行われます!

関連する問題