Windows 8.1에서 Miracast 인코딩 청크 및 통계 보고

참고 항목

Windows 10(WDDM 2.0)부터 운영 체제는 모든 GPU에서 작동할 수 있는 기본 제공 Miracast 스택과 함께 제공됩니다. Microsoft Miracast 스택 및 Windows 10부터 Miracast 디스플레이를 지원하기 위한 드라이버 및 하드웨어 요구 사항에 대한 자세한 내용은 다음 설명서를 참조하세요.

드라이버 개발자는 더 이상 사용자 지정 Miracast 스택을 구현하지 않아야 합니다. Microsoft는 이후 버전의 Windows에서 사용자 지정 Miracast 스택에 대한 지원을 제거할 수 있습니다.

Windows 8.1에서 디스플레이 하드웨어는 프레임을 여러 부분으로 분할하거나 청크를 인코딩하여 Miracast 무선 디스플레이 링크를 통해 전송된 각 비디오 프레임을 처리할 수 있습니다. 각 청크에는 프레임 번호와 프레임 부분(또는 조각) 번호에서 생성되는 고유한 청크 ID가 있습니다. 동일한 데스크톱 프레임 업데이트와 관련된 각 청크에는 동일한 프레임 번호가 할당되어야 합니다.

청크 처리 보고

드라이버는 여러 처리 단계(예: 인코딩에서 색 변환 분리) 또는 단일 단계에서 Miracast 무선 링크를 통해 전송할 프레임을 인코딩할 수 있습니다. 각 처리 단계에는 프레임 내에 고유한 프레임 파트 번호가 할당되어야 합니다.

Miracast 사용자 모드 드라이버 또는 디스플레이 미니포트 드라이버는 운영 체제에 다음을 알려야 합니다.

  • 하드웨어가 프레임에 대한 처리 단계를 완료했습니다.
  • 프레임의 각 부분이 네트워크로 전송되기 바로 전에.

보고된 특정 처리 단계의 시간은 이벤트가 운영 체제에 보고된 시간으로 간주되므로 가능한 한 빨리 단계를 보고하는 것이 중요합니다.

운영 체제는 ETW(Windows용 이벤트 추적) 커널 수준 추적 기능을 사용하여 이러한 이벤트를 기록하는 것 외에 다른 작업을 수행하지 않습니다. 그럼에도 불구하고 이 정보는 성능 문제를 측정하고 조사하는 데 중요합니다.

드라이버는 다음과 같은 가능한 방법 중 하나를 사용하여 알림을 제공할 수 있습니다.

데스크톱 이미지가 업데이트되지 않았지만 드라이버가 품질을 개선하기 위해 데스크톱 이미지를 다시 인코딩해야 하는 경우 동일한 프레임 번호와 부품 번호를 사용해야 합니다. 성능 도구는 동일한 프레임 및 부품 번호에 대한 두 번째 인코딩 완료 이벤트를 트리거하여 동일한 프레임의 두 번째 인코딩이 수행되었음을 나타냅니다.

각 프레임의 마지막 조각에는 성능 도구에 대한 프레임의 마지막 조각을 나타내는 프레임 파트 번호가 0이어야 합니다.

기본 표면의 올바른 동기화를 보장하기 위해 픽셀 파이프라인이 인코딩을 수행하는 경우 인코딩이 기본 화면에 액세스하기 전에 VSync 간격으로 요청된 모든 대칭 이동 작업을 보고해서는 안 됩니다. 이 동작은 인코딩 엔진에서 읽는 동안 발표자가 기본 화면으로 렌더링되지 않도록 합니다.

Miracast 사용자 모드 드라이버는 프레임을 처리하는 여러 단계마다 운영 체제에 알려야 합니다.

  • 시작 프레임, 청크 유형 MIRACAST_CHUNK_TYPE_FRAME_START

    운영 체제가 드라이버에 새 데스크톱 프레임을 표시하도록 요청하는 지점을 나타냅니다. 기술적으로 Miracast 사용자 모드 드라이버는 이 단계를 보고할 수 있지만 새 프레임 처리 시작에는 항상 디스플레이 미니포트 드라이버가 포함되므로 해당 드라이버에서 보고해야 합니다.

  • 색 변환 완료, 청크 유형 MIRACAST_CHUNK_TYPE_COLOR_CONVERT_COMPLETE

    일부 솔루션에는 별도의 색 변환 및 인코딩 단계가 있습니다. 이러한 솔루션에서 색 변환 전체 처리 이벤트는 가능한 한 빨리 보고되어야 하며 드라이버는 DXGK_MIRACAST_CHUNK_INFO 사용해야 합니다.ProcessingTime 멤버는 하드웨어가 작업을 수행하는 데 걸린 시간을 보고합니다. 전체 프레임이 조각이 아닌 한 번에 모두 변환되는 경우 파트 번호는 0이어야 합니다.

  • 전체 인코딩, 청크 유형 MIRACAST_CHUNK_TYPE_ENCODE_COMPLETE

    H.264 인코딩이 완료되었음을 나타냅니다. DXGK_MIRACAST_CHUNK_INFO 구조체의 ProcessingTimeEncodeRate 멤버를 완료해야 합니다.

  • 프레임 보내기, MIRACAST_STATISTIC_TYPE_CHUNK_SENT 사용하여 ReportStatistic 호출

    Miracast 사용자 모드 드라이버가 이 프레임/파트 번호의 데이터 패킷을 전송을 위해 네트워킹 API로 보내려고 했음을 나타냅니다. 이 프레임/파트에 대한 데이터가 네트워킹 API에 대한 여러 호출을 사용하여 전송되는 경우 첫 번째 패킷을 보내기 직전에만 기록해야 합니다. 네트워크 API를 호출하기 직전에 호출해야 합니다. 네트워크 API가 호출을 차단하는 경우 그래픽 스택의 프레임 처리에 대해 차단된 시간을 계산하지 않기 때문에 이 타이밍이 중요합니다.

  • 삭제된 프레임, 청크 유형 MIRACAST_CHUNK_TYPE_FRAME_DROPPED

    언제든지 드라이버가 프레임/파트의 처리를 완료하고 싱크로 전송하지 않기로 결정한 경우 삭제된 프레임을 보고해야 합니다. 이 컨텍스트에서 프레임은 드라이버가 실제로 MIRACAST_CHUNK_TYPE_FRAME_START 로깅하여 처리를 시작한 경우에만 삭제된 것으로 간주됩니다. 드라이버가 처리 없이 이 프레임을 건너뛸 것이라고 계산하는 경우 MIRACAST_CHUNK_TYPE_FRAME_START 로깅하지 않고 MIRACAST_CHUNK_TYPE_FRAME_DROPPED 기록할 수 있습니다.

  • 드라이버 정의 청크 유형 MIRACAST_CHUNK_TYPE_ENCODE_DRIVER_DEFINED_1 또는 _2

    이러한 청크 유형은 시나리오의 성능을 이해하는 데 도움이 됩니다. 일부 사례:

    • 드라이버는 이러한 형식을 사용하여 이 프레임에 대해 I-Frame이 생성되었음을 나타냅니다.
    • 드라이버는 인코딩된 프레임의 총 크기를 포함하는 네트워크 API로 프레임의 마지막 조각이 전송된 후 다른 패킷을 기록합니다.

프레임 색 변환의 예

다음 예제에서는 프레임 색이 변환되는 방법과 디스플레이 미니포트 드라이버에서 색 변환 완료를 보고하는 방법을 보여 줍니다.

MIRACAST_CHUNK_INFO 구조체의 멤버에 대한 테이블 참조는 다음과 같습니다.

  • ChunkType은 MIRACAST_CHUNK_TYPE_XXX 값입니다.

  • FrameNumberPartNumber는 ChunkId 공용 구조체의 구성원입니다.

  • ProcessingTime 은 마이크로초의 시간입니다.

  • EncodeRate 는 초당 킬로비트 단위입니다.

MIRACAST_STATISTIC_TYPE_CHUNK_SENT ReportStatistic 호출과 관련된 처리 단계에서 사용됩니다.

조각을 사용하지 않고 단일 프레임 보고

처리 단계 ChunkType FrameNumber PartNumber ProcessingTime EncodeRate
프레임 처리 시작 FRAME_START 101 0 0 0
색 변환이 완료되었습니다. COLOR_CONVERT_COMPLETE 101 0 950 0
인코딩이 완료되었습니다. ENCODE_COMPLETE 101 0 1042 15000
네트워크 ReportStatistic 호출에 데이터를 보내기 위한 호출 직전 해당 없음 101(ChunkSent.ChunkId.FrameNumber) 0(ChunkSent.ChunkId.PartNumber) 해당 없음 해당 없음

조각을 사용하여 처리된 단일 프레임 보고

처리 단계 ChunkType FrameNumber PartNumber ProcessingTime EncodeRate
프레임 처리 시작 FRAME_START 101 0 0 0
색 변환이 완료되었습니다. COLOR_CONVERT_COMPLETE 101 0 950 0
조각 1 인코딩이 완료되었습니다. ENCODE_COMPLETE 101 1 1042 15000
조각 2 인코딩이 완료되었습니다. ENCODE_COMPLETE 101 0 400 15000
네트워크 ReportStatistic 호출에 조각 1 데이터를 보내기 위한 호출 직전 해당 없음 101(조각 1의 ChunkSent.ChunkId.FrameNumber 값) 1(조각 1의 ChunkSent.ChunkId.PartNumber 값) 해당 없음 해당 없음
네트워크 ReportStatistic 호출에 조각 2 데이터를 보내기 위한 호출 직전 해당 없음 101(조각 2의 ChunkSent.ChunkId.FrameNumber 값) 0(조각 2의 ChunkSent.ChunkId.FrameNumber 값) 해당 없음 해당 없음

조각을 사용하지 않고 처리된 후 다시 인코딩된 원래 프레임 보고

처리 단계 ChunkType FrameNumber PartNumber ProcessingTime EncodeRate
프레임 처리 시작 FRAME_START 101 0 0 0
색 변환이 완료되었습니다. COLOR_CONVERT_COMPLETE 101 0 950 0
인코딩이 완료되었습니다. ENCODE_COMPLETE 101 0 1042 15000
원래 프레임의 데이터를 네트워크 ReportStatistic 호출로 보내기 위한 호출 직전 해당 없음 101(ChunkSent.ChunkId.FrameNumber) 0(ChunkSent.ChunkId.PartNumber) 해당 없음 해당 없음
다시 인코딩이 완료되었습니다. ENCODE_COMPLETE 101 0 500 15000
다시 인코딩된 프레임에 대한 데이터를 Network ReportStatistic으로 보내기 위한 호출 직전 해당 없음 101(ChunkSent.ChunkId.FrameNumber) 0(ChunkSent.ChunkId.PartNumber) 해당 없음 해당 없음

프로토콜 이벤트 보고

Miracast 사용자 모드 드라이버가 MIRACAST_STATISTIC_DATA 사용하여 ReportStatistic 함수호출하여 프로토콜 이벤트를 보고하는 경우 MIRACAST_STATISTIC_TYPE_EVENT 설정된 StatisticType은 운영 체제에서 이벤트를 기록하지만 다른 작업은 수행하지 않습니다. 그럼에도 불구하고 이러한 이벤트는 진단 및 성능 조사에 유용합니다.

MIRACAST_PROTOCOL_EVENT 열거형에는 보고할 수 있는 가능한 프로토콜 이벤트 유형이 포함됩니다.

프로토콜 오류 보고

Miracast 연결된 세션이 진행 중인 동안 Miracast 사용자 모드 드라이버가 오류를 발견하면 MiracastStatus 매개 변수에서 적절한 MIRACAST_STATUS 오류 상태 정보를 사용하여 ReportSessionStatus 콜백 함수를 호출해야 합니다. 운영 세션은 오류가 보고되면 항상 세션을 삭제합니다.

운영 체제는 단지 진단에 대한 ReportSessionStatus 상태 매개 변수를 기록하고 해당 값에 따라 아무 작업도 수행하지 않지만 드라이버는 이 매개 변수를 사용하여 오류의 여러 원인을 구분해야 합니다.