0

DirectShow SDK にある ezrgb24 サンプル プロジェクトを正常にビルドしました。しかし、デバッグ中に混乱した問題が発生しました。

次の Copy メソッドは、Transform メソッドによって呼び出されました。

HRESULT CEZrgb24::Copy(IMediaSample *pSource, IMediaSample *pDest) const
{
    ...
    // Copy the sample data
    BYTE *pSourceBuffer, *pDestBuffer;
    long lSourceSize = pSource->GetActualDataLength();

#ifdef DEBUG
    long lDestSize = pDest->GetSize();
    ASSERT(lDestSize >= lSourceSize);
#endif

    ...
}

assert ステートメントが失敗しました。Grapheditで、フィルターの入力メディアタイプがRGB24で、出力もRGB24であることを確認しました。出力のバッファ サイズが入力の実際のデータ サイズよりも小さくなる理由がわかりません。誰が私を助けることができます?

ありがとう。

-------------------------------------------------- 2009/8/20 編集

おお、実際の入力メディア サブタイプは RGB32 ですが、出力のサブタイプは RGB24 であることがわかりました。しかし、CEZrgb24::CheckInputType メソッドと CEZrgb24::CheckTransform の両方でタイプを RGB32 にできる理由は、RGB24 に対してのみ OK を返すことです。

-------------------------------------------------- 2009/8/21 編集

私は自分で問題にぶつかりました。回答として投稿します。

4

2 に答える 2

0

私は自分で解決策を見つけました。質問に答えを投稿しました。StackOverflowのガイドによると、ここに貼り付けたほうがいいと思います。

問題にぶち当たりました。CEZrgb24::Copy メソッドを次のように変更します。

HRESULT CEZrgb24::Copy(IMediaSample *pSource, IMediaSample *pDest) const
{
    ...
    // Copy the sample data
    BYTE *pSourceBuffer, *pDestBuffer;
    long lSourceSize = m_pInput->CurrentMediaType().GetSampleSize();

#ifdef DEBUG
    long lDestSize = m_pOutput->CurrentMediaType().GetSampleSize();
    ASSERT(lDestSize >= lSourceSize);
#endif

    ...
}

これで、アサートが成功しました。

于 2012-02-07T01:25:54.657 に答える
0

それは、出力の CMediaType が有効であることを確認していないことを意味します。

::CheckTransform では、mtIn と mtOut が同じでない限り E_FAIL を返しますが、CanPerformEZrgb24 は SubType が RGB_24 であることを確認します。これらのテストの 1 つは、RGB32 が通過できるようにする必要があります。これは、コードをわずかに変更したことを意味します。

次の関数が次のようになっていることを確認します。

HRESULT CEZrgb24::CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut)
{
    CheckPointer(mtIn,E_POINTER);
    CheckPointer(mtOut,E_POINTER);

    if (CanPerformEZrgb24(mtIn)) 
    {
        if (*mtIn == *mtOut) 
        {
            return NOERROR;
        }
    }
    return E_FAIL;
}

BOOL CEZrgb24::CanPerformEZrgb24(const CMediaType *pMediaType) const
{
    CheckPointer(pMediaType,FALSE);

    if (IsEqualGUID(*pMediaType->Type(), MEDIATYPE_Video)) 
    {
        if (IsEqualGUID(*pMediaType->Subtype(), MEDIASUBTYPE_RGB24)) 
        {
            VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pMediaType->Format();
            return (pvi->bmiHeader.biBitCount == 24);
        }
    }

    return FALSE;

}
于 2009-08-20T12:58:50.937 に答える