다음을 통해 공유


선행 및 후행 에지 스트림 포인터

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

새 프레임이 큐에 도착했을 때, 선행 가장자리가 이미 프레임을 가리키고 있지 않은 경우 AVStream은 선행 가장자리가 이 새 프레임을 가리키도록 설정합니다.

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

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

상황 AVStream의 동작

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

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

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

AVStream은 최첨단을 선도합니다. 이제 전방 가장자리가 더 새로운 프레임을 가리킵니다.

스트림 포인터 소개에서 스트림 포인터를 진행하는 방법에 대한 자세한 내용을 참조하세요.

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

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

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

프레임 창 유지 관리

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

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

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

왼쪽 끝 큐는 미니드라이버가 후행 에지를 사용하여 작업 세트의 프레임을 생성하는 방법을 보여 줍니다. 선행 에지와 후행 에지 사이의 각 프레임은 이러한 프레임을 참조하는 스트림 포인터가 없다는 사실에도 불구하고 참조 수가 1입니다.

중간 큐는 스트림 포인터 복제하는예입니다. AVStream DMA Services핀 프로세스 단계에서 설명된 대로 드라이버는 반복적으로 복제한 후 선행 면을 앞으로 진행했습니다.

가장 오른쪽 대기열은 미니드라이버가 스트림 포인터의 복제본을 사용하여 후행 가장자리 이후의 프레임에 대한 참조 횟수를 어떻게 유지할 수 있는지 보여 줍니다.