AVStream 코덱에서 데이터 형식 협상 처리

디바이스가 초기화되면 시스템에서 제공하는 디바이스 프록시(Devproxy) 모듈은 드라이버에서 제공하는 필터 설명자를 구문 분석합니다. 또한 Devproxy는 해당 MFT(Media Foundation Transform)의 입력 및 출력 핀에 드라이버 지원 데이터 범위를 노출합니다.

스트리밍이 시작되면 MF 파이프라인 및 사용자 모드 애플리케이션은 이러한 범위를 사용하여 드라이버와 데이터 형식 협상을 수행합니다.

데이터 형식 협상 중에 다음과 같은 상호 작용이 발생합니다.

  1. Devproxy는 하드웨어 코덱 필터의 각 핀 설명자에서 미니드라이버에서 제공하는 데이터 범위를 검색합니다.

  2. Devproxy는 드라이버에 데이터 교차 요청을 발급합니다.

  3. Devproxy는 완전히 구성된 형식을 MF에 노출합니다.

  4. MF 토폴로지 작성기(DirectShow 그래프 작성기의 MF)는 스트리밍 토폴로지를 생성합니다.

  5. MF 토폴로지 작성기가 Devproxy 입력/출력 핀에 대한 데이터 형식을 완료한 후 미니드라이버의 AVStrMiniPinSetDataFormat 콜백 함수를 호출하여 핀의 데이터 형식을 설정합니다. KS 핀이 없으면 Devproxy는 KsCreatePin을 호출합니다.

성공적인 데이터 형식 협상을 사용하도록 설정하려면 미니드라이버가 다음 단계를 수행해야 합니다.

  1. 하드웨어 코덱 필터에 포함된 노출된 각 핀에 대해 KSPIN_DESCRIPTORDataRanges 멤버에서 지원되는 데이터 범위 목록을 제공합니다. 예:

    const PKSDATARANGE VideoDecoderInputPinDataRanges[8] = {
        (PKSDATARANGE)&H264DataFormat,
        (PKSDATARANGE)&VC_1DataFormat,
        (PKSDATARANGE)&VC_1DataFormatVIH2,
        (PKSDATARANGE)&WMV9DataFormat,
        (PKSDATARANGE)&WMV9DataFormatVIH2,
        (PKSDATARANGE)&DX50DataFormat,
        (PKSDATARANGE)&DX50DataFormatVIH2,
        (PKSDATARANGE)&MPEG2DataFormat
    };
    

    이 경우 지정된 범위는 KS_DATARANGE_MPEG2_VIDEO, KS_DATARANGE_VIDEOKS_DATARANGE_VIDEO2 같은 래퍼 형식입니다. 이전에 나열된 코드 예제에서 각 범위는 KSDATARANGE에 대한 typecast입니다.

    래퍼 구조체의 마지막 멤버를 형식 블록 구조체(예: KS_DATARANGE_MPEG2_VIDEO)라고 합니다. VideoInfoHeader.

    연속 데이터 범위를 지원하는 드라이버는 형식 블록 구조의 최대값을 지정해야 합니다. 불연속 데이터 범위를 지원하는 드라이버는 형식 블록 구조에 불연속 값이 포함된 배열을 지정해야 합니다.

    지정된 형식을 지원한다고 주장하는 드라이버가 나중에 해당 형식으로 설정된 형식 요청에 실패하면 성능이 저하될 수 있습니다. 지원을 보장하는 목록 형식만 지정합니다.

  2. 드라이버는 KSSTATE_STOP/KSSTATE_RUN 동안 핀에 미디어 유형을 설정할 수 있도록 허용해야 합니다. 드라이버에서 이를 허용하지 않도록 하는 것 외에는 아무 작업도 필요하지 않습니다.

  3. 드라이버는 KSPIN_DESCRIPTOR_EX 교차 처리기를 제공해야 합니다. 각 핀에 대한 IntersectHandler 입니다.

  4. 미니 드라이버는 KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT 속성에 대한 처리기를 제공해야 합니다.

  5. 출력 미디어 형식이 설정된 경우 인코더는 지정된 출력 미디어 형식에 따라 가능한 입력 형식(핀 설명자를 사용하여)을 보고해야 합니다. 출력 미디어 형식이 설정되지 않은 경우 인코더는 입력 미디어 형식을 보고해서는 안 됩니다.

  6. 입력 미디어 형식이 설정된 경우 디코더는 지정된 입력 미디어 형식에 따라 가능한 출력 형식을 보고해야 합니다.

  7. 입력 미디어 형식이 설정된 경우 비디오 프로세서는 지정된 입력 미디어 형식에 따라 출력 형식을 보고해야 합니다.

  8. 드라이버는 ICodecAPI 인터페이스를 지원해야 합니다. 그런 다음 사용자 모드 구성 요소는 이 사용자 모드 인터페이스를 사용하여 코덱 구성 정보를 가져올 수 있습니다.

  9. 인코더를 설정하는 동안 먼저 ICodecAPI 속성이 설정되고 출력 미디어 형식이 뒤따릅니다. 이에 따라 인코더는 현재 구성에서 지원할 수 있는 입력 형식만 제공해야 합니다.

  10. ICodecAPI 속성 및 코덱 API 미디어 형식 속성은 프로필 및 수준과 같은 일부 영역에서 겹칩니다. 이러한 경우 미디어 유형과 관련된 코덱 API 속성은 ICodecAPI 속성을 재정의합니다. 미디어 유형이 설정되면 미니드라이버에서 이러한 겹치는 속성을 수정할 수 없습니다.

  11. 디코더를 설정하는 동안 입력 형식이 먼저 설정됩니다. 그런 다음 디코더는 현재 입력 형식으로 지원할 수 있는 출력 형식만 제공해야 합니다.

  12. 인코더에 대한 예상 입력은 4:2:0이고 NV12 인터레이스/프로그레시브 이상이어야 합니다. 예상 출력은 MPEG2 PS/TS 또는 H.264 부록 B 형식의 압축된 기본 스트림입니다.

  13. 디코더에 대한 예상 입력은 기본 스트림입니다. 예상 출력은 압축되지 않은 NV12로 소스 스트림의 크기가 조정되지 않은 버전입니다.

  14. AVStream 드라이버의 핀에는 서로 독립적인 상태가 있어야 합니다. 즉, 출력 핀이 KSSTATE_STOP상태로 유지되는 동안 입력 핀이 KSSTATE_STOP KSSTATE_RUN 전환할 수 있습니다.

  15. 미니드라이버가 가변 데이터 버퍼 크기의 속성 GET 요청을 받으면 미니드라이버가 NULL 버퍼를 필요한 버퍼 크기에 대한 쿼리로 해석해야 합니다. 이 경우 드라이버는 Irp-IoStatus.Information> 필드에 필요한 길이를 지정하고 STATUS_BUFFER_OVERFLOW 반환해야 합니다. 또한 미니드라이버에서는 반환 코드를 오류가 아닌 경고로 설정해야 합니다. 예를 들어 데이터 교차 처리기를 사용하여 이 지침을 따릅니다.