선행 및 후행 Edge 스트림 포인터

기본적으로 각 AVStream 큐에는 선행 에지 스트림 포인터가 포함됩니다. 선행 에지는 큐에 도착할 때 새 프레임을 가리킵니다. 특히 선행 가장자리는 처음에 큐에 도착하는 첫 번째 프레임을 가리키며 미니드라이버가 이동할 때까지 이동하지 않습니다. AVStream은 선행 에지를 만든 다음 큐의 수명 동안 존재합니다. 미니 드라이버는 Microsoft에서 제공하는 함수를 사용하여 선행 가장자리를 조작할 수 있습니다.

새 프레임이 큐에 도착하면 AVStream은 선행 가장자리가 프레임을 가리키지 않는 경우 이 프레임을 가리키도록 선행 가장자리를 설정합니다.

선행 에지 스트림 포인터에 대한 포인터를 가져오기 위해 미니 드라이버는 KsPinGetLeadingEdgeStreamPointer를 호출합니다.

미니 드라이버는 다음 표에 요약된 두 가지 상황을 제외한 모든 상황에서 선행 우위를 발전시키는 역할을 담당합니다.

상황 AVStream의 동작

프레임이 이전에 비어 있는 큐에 도착합니다.

AVStream은 이 프레임을 가리키도록 선행 가장자리를 설정합니다.

선행 가장자리는 프레임을 가리킵니다. 이 프레임에 해당하는 IRP가 취소됩니다.

AVStream은 선행 가장자리를 발전합니다. 이제 선행 가장자리가 최신 프레임을 가리킵니다.

스트림 포인터 진행에 대한 자세한 내용은 스트림 포인터 소개를 참조하세요.

후행 에지 스트림 포인터 지정

미니드라이버에서는 큐에 후행 에지 스트림 포인터가 있음을 지정할 수 있습니다. 후행 가장자리는 일반적으로 미니 드라이버에 가장 오래된 관심 프레임을 나타냅니다. 후행 가장자리를 지정하려면 관련 KSPIN_DESCRIPTOR_EX 구조체의 Flags 멤버에서 KSPIN_FLAG_DISTINCT_TRAILING_EDGE 플래그를 설정합니다. 그런 다음 KsPinGetTrailingEdgeStreamPointer 를 호출하여 후행 에지 스트림 포인터에 대한 포인터를 가져옵니다.

후행 가장자리가 진행되면 이전에 가리켰던 프레임에 대한 참조 수가 0으로 떨어지고 프레임이 완료됩니다. 프레임이 IRP에 포함된 마지막 프레임인 경우 싱크 핀은 호출자에게 IRP를 완료합니다. 원본 핀은 IRP를 연결된 핀으로 보냅니다.

프레임 창 유지 관리

스트림 포인터 소개에 설명된 프레임 참조 개수 규칙의 결과로, 스트림 포인터에서 프레임을 참조하지 않더라도 선행 가장자리와 후행 가장자리 사이의 프레임이 취소될 때까지 큐에 남아 있습니다. 따라서 미니 드라이버는 선행 및 후행 에지 포인터를 사용하여 여러 연속 프레임의 작업 창을 유지할 수 있습니다. 예를 들어 창의 프레임이 처리 또는 채우기를 기다리고 있을 수 있습니다.

다음 다이어그램에서 가장 오래된 프레임은 맨 아래에 있습니다. 새 프레임이 맨 위에 도착합니다. 각 프레임의 숫자는 해당 프레임에 대한 참조 수입니다. 스트림 포인터가 진행되면 이 다이어그램에서 위로 이동합니다.

핀 큐를 참조하는 avstream 스트림 포인터를 보여 주는 다이어그램

맨 왼쪽 큐는 미니드라이버가 후행 에지를 사용하여 작업 프레임 집합을 만드는 방법을 보여 줍니다. 선행 가장자리와 후행 에지 사이의 각 프레임에는 이러한 프레임을 참조하는 스트림 포인터가 없음에도 불구하고 하나의 참조 수가 있습니다.

중간 큐는 스트림 포인터 복제의 예입니다. 드라이버는 AVStream DMA Services의 핀 프로세스 단계에서 설명한 대로 선행 가장자리를 반복적으로 복제한 다음 고급화했습니다.

맨 오른쪽 큐는 스트림 포인터 클론을 사용하여 미니드라이버가 후행 에지 뒤의 프레임에 대한 참조 횟수를 유지하는 방법을 보여 줍니다.