QueryAccept(다운스트림)
[DirectShow 이 페이지와 연결된 기능은 레거시 기능입니다. MediaPlayer, IMFMediaEngine, Media Foundation 오디오/비디오 캡처대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11에 최적화되었습니다. Microsoft는 가능하면 새로운 코드에서 MediaPlayer, IMFMediaEngine 및 Audio/Video Capture를 DirectShow대신 Media Foundation 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
이 메커니즘을 사용하면 출력 핀이 다운스트림 피어에 새 형식을 제안할 수 있습니다. 새 형식에는 더 큰 버퍼 크기가 필요하지 않아야 합니다. 출력 핀은 다음을 수행합니다.
IPin::QueryAccept또는 IPinConnection::D ynamicQueryAccept호출하여 다른 핀이 새 미디어 형식을 허용할 수 있는지 확인합니다(그림, A단계 참조).
1단계의 반환 값이 S_OK 경우 핀은 미디어 형식을 다음 샘플에 연결합니다. 이렇게 하려면 먼저 IMemAllocator::GetBuffer 호출하여 샘플(B)을 가져옵니다. 그런 다음 IMediaSample::SetMediaType 호출하여 미디어 형식을 해당 샘플(C)에 연결합니다. 샘플에 미디어 형식을 연결하면 필터는 해당 샘플부터 형식이 변경되었음을 나타냅니다.
핀은 샘플(D)을 제공합니다.
다운스트림 필터는 샘플을 받으면 IMediaSample::GetMediaType 호출하여 새 미디어 형식을 검색합니다.
queryaccept(다운스트림)
모든 핀은 QueryAccept
메서드를 지원합니다. 그러나 이 메서드는 약간 모호합니다. S_OK 반환 값이 그래프가 활성 상태일 때 항상 형식을 변경할 수 있다고 보장하지는 않기 때문입니다. 일부 필터는 S_OK 반환하지만 그래프가 활성 상태이면 변경 내용을 거부할 수 있습니다. 일부 입력 핀에서 지원되는 DynamicQueryAccept 메서드는 활성화된 상태에서 핀이 형식을 변경할 수 있도록 S_OK 명시적으로 정의합니다. 입력 핀이 IPinConnection 인터페이스를 지원하는 경우 QueryAccept
대신 DynamicQueryAccept 호출해야 합니다.
대부분의 경우 이 메커니즘은 비트 깊이 변경과 같이 형식을 크게 변경할 수 없습니다. 사용할 수 있는 한 가지 상황은 비디오 디코더가 색상표를 전환하는 경우입니다. 형식의 기본 세부 정보는 이미지 차원 및 비트 깊이와 같이 동일하게 유지되지만 새 미디어 형식에는 다른 색상표 항목 집합이 있습니다.
구현 참고
DirectShow 기본 클래스에서 CBasePin::QueryAccept 초기 핀 연결 중에 호출되는 CheckMediaType 메서드를 호출합니다. 변환 필터의 경우 입력 핀의 CheckMediaType 메서드는 출력 핀이 연결되어 있는지 여부와 연결된 경우 입력 미디어 형식이 출력 미디어 형식과 호환되는지 여부를 항상 확인해야 합니다. 따라서 이 구현은 QueryAccept
유효할 수 있습니다. 그렇지 않은 경우 필요한 추가 검사를 수행하려면 QueryAccept
재정의해야 합니다. 또한 CTransformFilter 클래스는 CheckInputType 및 CheckTransform 메서드 내에서 이 논리를 캡슐화합니다. 반면 CTransInPlaceFilter 클래스는 항상 다음 업스트림 또는 다운스트림 필터에서 QueryAccept
호출합니다.
CBaseInputPin::Receive 메서드는 들어오는 샘플에서 미디어 형식을 확인하고, 미디어 형식이 있는 경우 checkMediaType 호출합니다. 그러나 현재 미디어 형식을 보유하는 핀의 m_mt 멤버를 업데이트하지는 않습니다. 필터가 샘플을 처리할 때는 샘플에서 미디어 형식을 확인해야 합니다. 새 형식이 있는 경우 핀에서 SetMediaType 호출하거나 m_mt 값을 직접 설정하여 저장해야 할 수 있습니다. 반면에 비디오 변환 필터용으로 설계된 CVideoTransformFilter 클래스는 변경 시 미디어 형식을 저장합니다. 자세한 내용은 DirectShow 기본 클래스 라이브러리에서 CVideoTransformFilter::Receive 소스 코드를 참조하세요.
경우에 따라 단순히 QueryAccept
호출 다운스트림을 전달한 다음, 미디어 형식을 출력 샘플에 연결하고 다운스트림 필터에서 형식 변경을 처리하도록 할 수 있습니다.