청크 및 통계 인코딩 Miracast 보고

참고

Windows 10 현재 OS에는 Miracast 무선 디스플레이의 네이티브 구현이 포함되어 있습니다. 드라이버는 더 이상 사용자 지정 Miracast 표시 구성 요소를 구현하지 않아야 합니다. 사용자 지정 Miracast 구현에 대한 지원은 향후 버전의 Windows 제거될 수 있습니다.

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

청크 처리 보고

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

Miracast 사용자 모드 드라이버 또는 디스플레이 미니포트 드라이버는 하드웨어가 프레임에 대한 처리 단계를 완료할 때마다 그리고 프레임의 각 부분이 네트워크로 전송되기 직전에 운영 체제에 알려야 합니다. 특정 보고 처리 단계의 시간은 이벤트가 운영 체제에 보고된 시간으로 간주되므로 가능한 한 신속하게 단계를 보고하는 것이 중요합니다.

운영 체제는 ETW(event Tracing for 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 멤버의 값: ChunkTypeChunkId입니다. ChunkId. 처리 단계 MIRACAST_ CHUNK_TYPE_ 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 해당(N/A)

* MIRACAST_STATISTIC_TYPE_CHUNK_SENT 사용하여 호출됩니다.

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

MIRACAST_CHUNK_INFO 멤버의 값: ChunkTypeChunkId. ChunkId. 처리 단계 MIRACAST_ CHUNK_TYPE_ FrameNumber PartNumber ProcessingTime EncodeRate 시작 처리 프레임 FRAME_START 101 0 0 0 색 변환이 완료 되었습니다COLOR_CONVERT_COMPLETE 101 0 950 0 조각 1 인코딩이 완료 된 ENCODE_COMP 조각 101 1 1042 15000 조각 2 인코딩이 완료 되었습니다ENCODE_COMPLETE 101 0 400 15000 네트워크 ReportStatistic 호출에 조각 1 데이터를 보내기 위해 호출하기 직전에* 101, ChunkSent의 값입니다. ChunkId. FrameNumber 1, ChunkSent의 값입니다. ChunkId. PartNumber N/A N/A 네트워크 ReportStatistic 호출* 101, ChunkSent 값으로 조각 2 데이터를 보내기 위해 호출하기 직전에. ChunkId. FrameNumber 0, ChunkSent 값입니다. ChunkId. PartNumber (위 참고 참조) 해당(N/A)

* MIRACAST_STATISTIC_TYPE_CHUNK_SENT 사용하여 호출됩니다.

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

MIRACAST_CHUNK_INFO 멤버의 값: ChunkTypeChunkId. ChunkId. 처리 단계 MIRACAST_ CHUNK_TYPE_ FrameNumber PartNumber ProcessingTime EncodeRate 시작 프레임 FRAME_START 101 0 0 0 색 변환이 완료 되었습니다COLOR_CONVERT_COMPLETE 101 0 950 0 인코딩이 완료 된 ENCODE_COMPLETE 101 0 1042 15000을 호출하기 직전에 원래 프레임의 데이터를 Network ReportStatistic call* 101, ChunkSent 값으로 보냅니다. ChunkId. FrameNumber 0, ChunkSent 값입니다. ChunkId. PartNumber N/A N/A 다시 인코딩이 완료된 ENCODE_COMPLETE 101 0 500 15000을 호출하기 직전에 다시 인코딩된 프레임에 대한 데이터를 네트워크 ReportStatistic call* 101, ChunkSent 값으로 보냅니다. ChunkId. FrameNumber 0, ChunkSent 값입니다. ChunkId. PartNumber 해당(N/A)

* MIRACAST_STATISTIC_TYPE_CHUNK_SENT 사용하여 호출됩니다.

프로토콜 이벤트 보고

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

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

프로토콜 오류 보고

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

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