Почему размер буфера вывода IMediaSample меньше, чем один из входных? - PullRequest
0 голосов
/ 20 августа 2009

Я успешно создал пример проекта ezrgb24, который находится в DirectShow SDK. Но я столкнулся с запутанной проблемой при отладке.

Следующий метод 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 отредактировано

О, я обнаружил, что на самом деле подтип медиа является RGB32, но подтип вывода RGB24. Но почему типом может быть RGB32 как для метода CEZrgb24 :: CheckInputType, так и для CEZrgb24 :: CheckTransform только возвращают OK для RGB24.

----------------------------------------------- --- 2009/8/21 отредактировано

Я сам столкнулся с проблемой. Выкладываю как ответ.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

Я сам нашел разрешение. Я разместил ответ в вопросе. Согласно руководству StackOverflow , я думаю, что я предпочитаю вставить его сюда.

Я столкнулся с проблемой. Измените CEZrgb24 :: Скопировать метод в следующем порядке,

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

    ...
}

Теперь утверждение успешно завершено.

0 голосов
/ 20 августа 2009

Ну, это может означать, что вы не уверены, что CMediaType для вывода действителен.

In :: CheckTransform возвращает E_FAIL, если mtIn и mtOut не совпадают, в то время как CanPerformEZrgb24 подтверждает, что SubType имеет значение 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;

}
...