3A단계. CheckInputType 메서드 구현
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
변환 필터 작성 자습서의 3A단계입니다.
CTransformFilter::CheckInputType 메서드는 업스트림 필터가 변환 필터에 미디어 형식을 제안할 때 호출됩니다. 이 메서드는 AM_MEDIA_TYPE 구조체에 대한 씬 래퍼인 CMediaType 개체에 대한 포인터를 사용합니다. 이 메서드에서는 형식 블록의 필드를 포함하여 AM_MEDIA_TYPE 구조체의 모든 관련 필드를 검사해야 합니다. CMediaType에 정의된 접근자 메서드를 사용하거나 구조체 멤버를 직접 참조할 수 있습니다. 필드가 유효하지 않으면 VFW_E_TYPE_NOT_ACCEPTED 반환합니다. 전체 미디어 형식이 유효한 경우 S_OK 반환합니다.
예를 들어 RLE 인코더 필터에서 입력 형식은 8비트 또는 4비트 압축되지 않은 RGB 비디오여야 합니다. 16비트 또는 24비트 RGB와 같은 다른 입력 형식을 지원할 이유가 없습니다. 필터는 더 낮은 비트 깊이로 변환해야 하고 DirectShow는 이미 해당 용도로 색 공간 변환기 필터를 제공하므로 지원합니다. 다음 예제에서는 인코더가 8비트 비디오를 지원하지만 4비트 비디오는 지원하지 않는다고 가정합니다.
HRESULT CRleFilter::CheckInputType(const CMediaType *mtIn)
{
if ((mtIn->majortype != MEDIATYPE_Video) ||
(mtIn->subtype != MEDIASUBTYPE_RGB8) ||
(mtIn->formattype != FORMAT_VideoInfo) ||
(mtIn->cbFormat < sizeof(VIDEOINFOHEADER)))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
VIDEOINFOHEADER *pVih =
reinterpret_cast<VIDEOINFOHEADER*>(mtIn->pbFormat);
if ((pVih->bmiHeader.biBitCount != 8) ||
(pVih->bmiHeader.biCompression != BI_RGB))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
// Check the palette table.
if (pVih->bmiHeader.biClrUsed > PALETTE_ENTRIES(pVih))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
DWORD cbPalette = pVih->bmiHeader.biClrUsed * sizeof(RGBQUAD);
if (mtIn->cbFormat < sizeof(VIDEOINFOHEADER) + cbPalette)
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
// Everything is good.
return S_OK;
}
이 예제에서 메서드는 먼저 주 형식 및 하위 형식을 확인합니다. 그런 다음 형식 형식을 확인하여 서식 블록이 VIDEOINFOHEADER 구조체인지 확인합니다. 필터는 VIDEOINFOHEADER2도 지원할 수 있지만 이 경우 실제 혜택은 없습니다. VIDEOINFOHEADER2 구조체는 8비트 비디오에서 관련이 없는 인터레이싱 및 제곱이 아닌 픽셀에 대한 지원을 추가합니다.
형식 형식이 올바른 경우 이 예제에서는 VIDEOINFOHEADER 구조체의 biBitCount 및 biCompression 멤버를 확인하여 형식이 8비트 압축되지 않은 RGB인지 확인합니다. 이 예제에서 볼 수 있듯이 를 강제 변환해야 합니다.
pbFormat
형식 형식에 따라 올바른 구조체에 대한 포인터입니다. 포인터를 캐스팅하기 전에 항상 형식 형식 GUID(formattype) 및 형식 블록의 크기(cbFormat)를 검사.
또한 이 예제에서는 색상표 항목 수가 비트 깊이와 호환되고 서식 블록이 색상표 항목을 저장할 수 있을 만큼 큰지 확인합니다. 이 모든 정보가 올바른 경우 메서드는 S_OK 반환합니다.
다음: 3B단계. GetMediaType 메서드를 구현합니다.
관련 항목