2009-08-20 84 views
0

我已成功構建了ezrgb24示例項目,該項目位於DirectShow SDK中。但是當我調試時遇到了一個困惑的問題。爲什麼輸出IMediaSample的緩衝區大小小於其中一個輸入?

以下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 

    ... 
} 

斷言陳述失敗。用graphedit,我檢查了過濾器的輸入介質類型是RGB24,輸出也是RGB24。我不明白爲什麼輸出的緩衝區大小會小於輸入的數據大小。誰能幫我?

謝謝。

---------------------------------------------- ----- 2009/8/20編輯

O,我發現實際輸入的媒體子類是RGB32,但輸出的子類型是RGB24。但爲什麼CEZrgb24 :: CheckInputType方法的類型可以是RGB32,CEZrgb24 :: CheckTransform只能爲RGB24返回OK。

---------------------------------------------- ---- 2009/8/21編輯

我自己碰到這個問題。我發佈答案。

+0

但我不知道爲什麼pSource-> GetActualDataLength()大於m_pInput-> CurrentMediaType()。GetSampleSize()。 – 2009-08-21 07:08:07

回答

0

我找到了自己的決議。我已經在問題中發佈了答案。根據StackOverflow的指導,我想我更喜歡在這裏粘貼它。

我遇到了問題。修改CEZrgb24 ::複製methold如下,

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 

    ... 
} 

現在斷言successed。

0

那麼這意味着你不確定輸出的CMediaType是否有效。

In :: CheckTransform它將返回E_FAIL,除非mtIn和mtOut相同,而CanPerformEZrgb24確認子類型是RGB_24。其中一個測試必須允許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; 

} 
+0

我沒有修改它們。我只是建立和調試項目。 – 2009-08-21 01:16:38

+0

我嘗試修改CEZrgb24 :: Copy作爲CopyMemory((PVOID)pDestBuffer,(PVOID)pSourceBuffer,min(lSourceSize,lDestSize))的語句CopyMemory((PVOID)pDestBuffer,(PVOID)pSourceBuffer,lSourceSize)。儘管有幾幀呈現爲紅色,但它仍然有效。 – 2009-08-21 01:28:50

相關問題