Шаг 3B. Реализация метода GetMediaType

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

Это шаг 3B руководства Написание фильтров преобразования.

Примечание

Этот шаг не требуется для фильтров, производных от CTransInPlaceFilter.

 

Метод CTransformFilter::GetMediaType возвращает один из предпочтительных выходных типов фильтра, на который ссылается номер индекса. Этот метод никогда не вызывается, если входной контакт фильтра уже не подключен. Поэтому для определения предпочтительных типов выходных данных можно использовать тип носителя из вышестоящий подключения.

Кодировщик обычно предлагает один предпочтительный тип, представляющий целевой формат. Декодеры обычно поддерживают ряд форматов выходных данных и предлагают их в порядке убывания качества или эффективности. Например, в этом порядке список может быть UYVY, Y211, RGB-24, RGB-565, RGB-555 и RGB-8. Для фильтров эффектов может потребоваться точное совпадение между форматом вывода и форматом входных данных.

В следующем примере возвращается один тип выходных данных, который создается путем изменения входного типа для указания сжатия RLE8:

HRESULT CRleFilter::GetMediaType(int iPosition, CMediaType *pMediaType)
{
    ASSERT(m_pInput->IsConnected());
    if (iPosition < 0)
    {
        return E_INVALIDARG;
    }
    if (iPosition == 0)
    {
        HRESULT hr = m_pInput->ConnectionMediaType(pMediaType);
        if (FAILED(hr))
        {
            return hr;
        }
        FOURCCMap fccMap = FCC('MRLE'); 
        pMediaType->subtype = static_cast<GUID>(fccMap);
        pMediaType->SetVariableSize();
        pMediaType->SetTemporalCompression(FALSE);

        ASSERT(pMediaType->formattype == FORMAT_VideoInfo);
        VIDEOINFOHEADER *pVih =
            reinterpret_cast<VIDEOINFOHEADER*>(pMediaType->pbFormat);
        pVih->bmiHeader.biCompression = BI_RLE8;
        pVih->bmiHeader.biSizeImage = DIBSIZE(pVih->bmiHeader); 
        return S_OK;
    }
    // else
    return VFW_S_NO_MORE_ITEMS;
}

В этом примере метод вызывает IPin::ConnectionMediaType , чтобы получить тип входных данных из пин-кода ввода. Затем он изменяет некоторые поля, чтобы указать формат сжатия, как показано ниже.

  • Он назначает новый GUID подтипа, который создается из кода FOURCC MRLE с помощью класса FOURCCMap .
  • Он вызывает метод CMediaType::SetVariableSize , который задает для флага bFixedSizeSamplesзначение FALSE , а для элемента lSampleSize — нулевое значение, указывающее выборки переменной величины.
  • Он вызывает метод CMediaType::SetTemporalCompression со значением FALSE, указывая, что каждый кадр является ключевым кадром. (Это поле является только информационным, поэтому его можно спокойно игнорировать.)
  • Он задает для поля biCompression значение BI_RLE8.
  • Он задает для поля biSizeImage размер изображения.

Далее: Шаг 3C. Реализация метода CheckTransform.

Написание фильтров DirectShow