3B단계. GetMediaType 메서드 구현
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 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 을 호출하여 입력 핀에서 입력 형식을 가져옵니다. 그런 다음, 다음과 같이 압축 형식을 나타내기 위해 일부 필드를 변경합니다.
- FOURCCMap 클래스를 사용하여 FOURCC 코드 'MRLE'에서 생성되는 새 하위 형식 GUID를 할당합니다.
- bFixedSizeSamples 플래그를 FALSE로 설정하고 lSampleSize 멤버를 0으로 설정하여 변수 크기의 샘플을 나타내는 CMediaType::SetVariableSize 메서드를 호출합니다.
- CMediaType::SetTemporalCompression 메서드를 FALSE 값으로 호출하여 모든 프레임이 키 프레임임을 나타냅니다. (이 필드는 정보 전용이므로 안전하게 무시할 수 있습니다.)
- biCompression 필드를 BI_RLE8 설정합니다.
- biSizeImage 필드를 이미지 크기로 설정합니다.
다음: 3C단계. CheckTransform 메서드를 구현합니다.
관련 항목