2

この質問では、QImage オブジェクトに関連付けられた外部バッファー オブジェクトの寿命を維持するためのベスト プラクティスを知りたいと思います。

バックグラウンド

QTで非圧縮画像ファイルビューアを開発しています。ファイルから YV12 データを読み取り、RGB フレーム バッファーに変換し、QImage オブジェクトを構築し、レンダリングのために UI レイヤーに渡します。

YV12ファイルリーダーはこんな感じ。

class YV12Frame
{
public:
    YV12Frame(std::string const& fileName)
    {
        // Initialize m_frameBuffer
        // ... (Omitted for brevity)
    }

    QImage GetQImage()
    {
        // Build QImage object
        return QImage(m_frameBuffer, WIDTH, HEIGHT, QImage::Format_RGB32); 
    }

private:
    unsigned char m_frameBuffer[WIDTH * HEIGHT * 4];
};

QT のドキュメントにあるように、QImage オブジェクトの存続期間中、YV12Frame オブジェクトを有効に維持する必要があります。

UI レイヤーは、浅いコピーまたは深いコピーを介して QImage オブジェクトをコピーできます。つまり、一度にフレーム バッファを参照する QImage オブジェクトの数が不明な場合があります。

質問

YV12Frame オブジェクトを安全に削除するタイミングを知るにはどうすればよいですか?

予想される答え

「ねえ、私はフレーム バッファを参照する最後の QImage オブジェクトであり、削除されようとしています。今すぐフレーム バッファを安全に削除できます。」という通知 (コールバックなど) があります。

しかし、そのような通知は見つかりませんでした。

4

1 に答える 1

0

次の回避策がニーズに合う場合があります。

配列の代わりに、実際のQImageオブジェクトをYV12Frameのプライベートメンバーとして保存します(正しい幅と高さで初期化されます)。これは、関数から返す必要のあるオブジェクトですGetQtImage()。QImageの暗黙的な共有のおかげで、他のQImageインスタンスはそれが発生したときに独自のピクセルデータを切り離すため、いつでも安全にYV12Frameを削除できます。

フレームデコードでは、通常のsetPixel()関数を使用してQImageのコンテンツを変更します。

速度が重要な場合は、setPixelを使用できないため、ピクセルデータを直接操作する必要があります。ここでの秘訣は、QImageがピクセルデータを切り離さないようにすることです。したがって、 constBits()またはconstScanLine( )のいずれかを使用し、それを非constポインターにキャストしてから、直接アクセスする必要があります(醜い、私は知っています)。

于 2013-01-08T06:07:15.143 に答える