2

ffmpeg を扱うユーティリティを作成しようとしています。あるポインターから別のポインターにイメージ プレーンをコピーする必要がある場合。AVPicture構造から自分のものへ。ここにいくつかの情報源があります。

私自身のフレーム構造。コンストラクターで割り当てられたメモリ、デストラクタで解放されたメモリ

template <class DataType>
struct Frame
{
    DataType* data; //!< Pointer to image data
    int f_type; //!< Type of color space (ex. RGB, HSV, YUV)
    int timestamp; //!< Like ID of frame. Time of this frame in the video file
    int height; //!< Height of frame
    int width; //!< Width of frame

    Frame(int _height, int _width, int _f_type=0):
        height(_height),width(_width),f_type(_f_type)
    {
        data = new DataType[_width*_height*3];
    }

    ~Frame()
    {
        delete[] data;
    }
};

これが変換を実行するメインループです。memcpy の行がコメント化されている場合、メモリ リークはまったくありません。しかし、コメントを外すと、メモリリークが発生します。

for(int i = begin; i < end; i++)
{
    AVPicture pict;
    avpicture_alloc(&pict, PIX_FMT_BGR24, _width, _height);
    std::shared_ptr<Frame<char>> frame(new Frame<char>(_height, _width, (int)PIX_FMT_BGR24));

    sws_scale(ctx, frame_list[i]->data, frame_list[i]->linesize, 0, frame_list[i]->height, pict.data, pict.linesize);

    memcpy(frame->data,pict.data[0],_width*_height*3);

    //temp_to_add->push_back(std::shared_ptr<Frame<char>>(frame));

    avpicture_free(&pict);
}

malloc によるメモリの割り当てと free による割り当て解除、pict からフレームへのメモリのコピー (for ループ)、std::copy と ffmpeg ヘルパー関数である avpicture_layout の使用など、多くのことを試してきました。何も役に立ちません。質問: 私は何か重要なことを忘れていますか?

私はすべての答えに感謝します。

4

2 に答える 2

0

クラスは、コピーの作成または代入で簡単にメモリ リークを起こす可能性があります。明示的なコピー コンストラクターと代入演算子を提供する必要があります (少なくとも非公開として禁止されています)。

private:
    Frame(const Frame<T>& rhs);
    Frame<T>& operator=(const Frame<T>& rhs);
于 2013-10-27T08:19:15.250 に答える