Share via


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용 이벤트 추적) 커널 수준 추적 기능을 사용하여 이러한 이벤트를 기록하는 것 외에는 아무런 조치도 취하지 않습니다. 그럼에도 불구하고 이 정보는 성능 문제를 측정하고 조사하는 데 중요합니다.

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

  • Miracast 사용자 모드 드라이버는 ReportStatistic 콜백 함수를 호출하여 MIRACAST_STATISTIC_TYPE_CHUNK_PROCESSING_COMPLETE 형식으로 세부 정보를 보고하거나 MIRACAST_STATISTIC_TYPE_CHUNK_SENT 사용하여 청크가 전송을 위해 네트워크 스택으로 전송될 예정임을 나타냅니다.
  • 디스플레이 미니포트 드라이버는 DXGK_INTERRUPT_MICACAST_CHUNK_PROCESSING_COMPLETE 인터럽트 형식의 청크 처리 세부 정보를 보고하지만 이 보고서는 인터럽트 시간에만 만들 수 있습니다. 청크 정보를 로깅하는 것 외에도 Miracast 사용자 모드 드라이버가 GetNextChunkData 콜백 함수를 호출하여 검색할 수 있도록 청크 패킷이 만들어지고 큐에 대기됩니다.
  • 디스플레이 미니포트 드라이버는 모든 IRQL 수준에서 DxgkCbReportChunkInfo 콜백 함수를 호출합니다. 이 함수는 청크 정보만 기록하며 청크 패킷을 큐에 대기하지 않습니다.

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

각 프레임의 마지막 조각에는 프레임 파트 번호가 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 구조체의 멤버에 대한 테이블 참조는 다음과 같습니다.

  • ChunkTypeMIRACAST_CHUNK_TYPE_XXX 값입니다.

  • FrameNumberPartNumberChunkId 공용 구조체의 멤버입니다.

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

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

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

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

처리 단계 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
네트워크 ReportStatistic에 다시 인코딩된 프레임에 대한 데이터를 보내기 위한 호출 직전에 해당 없음 101( ChunkSent.ChunkId.FrameNumber 값) 0( ChunkSent.ChunkId.PartNumber 값) 해당 없음 해당 없음

프로토콜 이벤트 보고

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

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

프로토콜 오류 보고

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

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