QueryAccept(다운스트림)

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

이 메커니즘을 사용하면 출력 핀이 다운스트림 피어에 새 형식을 제안할 수 있습니다. 새 형식에는 더 큰 버퍼 크기가 필요하지 않아야 합니다. 출력 핀은 다음을 수행합니다.

  1. 다운스트림 핀에서 IPin::QueryAccept 또는 IPinConnection::D ynamicQueryAccept 를 호출하여 다른 핀이 새 미디어 형식을 수락할 수 있는지 확인합니다(그림, A단계 참조).

  2. 1단계의 반환 값이 S_OK 경우 핀은 미디어 형식을 다음 샘플에 연결합니다. 이렇게 하려면 먼저 IMemAllocator::GetBuffer 를 호출하여 샘플(B)을 가져옵니다. 그런 다음 IMediaSample::SetMediaType 을 호출하여 미디어 형식을 해당 샘플(C)에 연결합니다. 미디어 형식을 샘플에 연결하면 필터는 해당 샘플부터 형식이 변경되었음을 나타냅니다.

  3. 핀은 샘플(D)을 제공합니다.

  4. 다운스트림 필터가 샘플을 받으면 IMediaSample::GetMediaType 을 호출하여 새 미디어 형식을 검색합니다.

    queryaccept(다운스트림)

모든 핀은 메서드를 지원합니다 QueryAccept . 그러나 이 메서드는 약간 모호합니다. S_OK 반환 값이 그래프가 활성화된 동안 형식을 변경할 수 있다고 항상 보장하지는 않기 때문입니다. 일부 필터는 S_OK 반환할 수 있지만 그래프가 활성화된 경우 변경 내용을 거부할 수 있습니다. 일부 입력 핀에서 지원되는 DynamicQueryAccept 메서드는 활성화된 상태에서 핀이 형식을 변경할 수 있다는 것을 의미하는 S_OK 명시적으로 정의합니다. 입력 핀이 IPinConnection 인터페이스를 지원하는 경우 가 아닌 QueryAcceptDynamicQueryAccept를 호출해야 합니다.

대부분의 경우 이 메커니즘은 비트 깊이 변경과 같은 형식의 급격한 변경을 허용하지 않습니다. 사용할 수 있는 한 가지 상황은 비디오 디코더가 팔레트를 전환하는 경우입니다. 형식의 기본 세부 정보는 이미지 차원 및 비트 깊이와 같이 동일하게 유지되지만 새 미디어 형식에는 다른 색상표 항목 집합이 있습니다.

구현 참고 사항

DirectShow 기본 클래스에서 CBasePin::QueryAccept 는 초기 핀 연결 중에 호출되는 CheckMediaType 메서드를 호출합니다. 변환 필터의 경우 입력 핀의 CheckMediaType 메서드는 출력 핀이 연결되어 있는지 여부와 입력 미디어 형식이 출력 미디어 형식과 호환되는지 여부를 항상 검사 합니다. 따라서 이 구현은 에 QueryAccept유효할 수 있습니다. 그렇지 않은 경우 필요한 추가 검사를 수행하려면 재정 QueryAccept 의해야 합니다. 또한 CTransformFilter 클래스는 CheckInputTypeCheckTransform 메서드 내에서 이 논리를 캡슐화합니다. 반면에 CTransInPlaceFilter 클래스는 항상 다음 업스트림 또는 다운스트림 필터를 호출 QueryAccept 합니다.

CBaseInputPin::Receive 메서드는 들어오는 샘플에서 미디어 형식을 확인하고, 미디어 형식이 있는 경우 CheckMediaType을 호출합니다. 그러나 현재 미디어 형식을 보유하는 핀의 m_mt 멤버는 업데이트하지 않습니다. 필터가 샘플을 처리할 때 미디어 형식에 대한 샘플을 검사 합니다. 새 형식이 있는 경우 핀에서 SetMediaType 을 호출하거나 m_mt 값을 직접 설정하여 저장해야 할 수 있습니다. 반면, 비디오 변환 필터용 으로 설계된 CVideoTransformFilter 클래스는 미디어 형식이 변경되면 저장합니다. 자세한 내용은 DirectShow 기본 클래스 라이브러리에서 CVideoTransformFilter::Receive 의 소스 코드를 참조하세요.

경우에 따라 단순히 호출 다운스트림을 전달한 QueryAccept 다음, 미디어 형식을 출력 샘플에 연결하고 다운스트림 필터가 형식 변경을 처리하도록 할 수 있습니다.