다음을 통해 공유


스트림 열기 및 닫기

Stream 클래스 인터페이스는 stream 클래스 미니드라이버에 SRB_OPEN_STREAM 요청을 보내 선택한 비디오 형식으로 스트림을 엽니다. SRB_OPEN_STREAM 전달되는 정보에는 열려는 스트림의 인덱스 및 KS_VIDEOINFOHEADER 구조체에 대한 포인터가 포함됩니다. 스트림 인덱스는 이전 SRB_GET_STREAM_INFO 요청에 대한 응답으로 미니 드라이버가 반환한 KS_DATARANGE_VIDEO 구조 배열의 스트림 덱스에 해당합니다. SRB_GET_STREAM_INFO 처리에 대한 자세한 내용은 스트림 범주를 참조하세요.

다음 예제 코드는 스트림 인덱스, 커널 스트리밍 데이터 형식 및 커널 스트리밍 비디오 정보 헤더를 가져옵니다.

int StreamNumber = pSrb->StreamObject->StreamNumber;
PKS_DATAFORMAT_VIDEOINFOHEADER  pKSDataFormat = 
    (PKS_DATAFORMAT_VIDEOINFOHEADER) pSrb->CommandData.OpenFormat;
PKS_VIDEOINFOHEADER pVideoInfoHdrRequested = 
    &pKSDataFormat->VideoInfoHeader;

미니 드라이버는 요청된 스트림 형식을 지원할 수 있는지 확인해야 합니다. 특히 rcSourcercTarget 멤버가 지정한 자르기 및 크기 조정 정보와 함께 KS_BITMAPINFOHEADER 구조체의 내용을 확인해야 합니다.

디바이스 하드웨어가 KS_VIDEOINFOHEADER AvgTimePerFrame 멤버에서 요청한 캡처 프레임 속도를 지원할 수 없는 경우 항상 사용 가능한 다음 낮은 프레임 속도를 선택해야 합니다. 예를 들어 카메라가 초당 7프레임(fps) 및 15fps의 캡처 프레임 속도를 지원할 수 있고 클라이언트 애플리케이션이 10fps의 캡처 프레임 속도로 스트림을 열려고 시도하는 경우 카메라는 7fps 물리적 스트림을 만들어야 합니다.

사용 가능한 실제 프레임 70개를 모두 캡처하는 10초 캡처의 경우 미니 드라이버는 캡처된 100프레임, 그 중 30프레임은 KSPROPERTY_DROPPEDFRAMES_CURRENT 속성에 의해 삭제되었다고 보고해야 합니다.

출력 버퍼가 DirectDraw 표면인 경우 특수 규칙이 적용됩니다. 이 경우 KS_BITMAPINFOHEADER 구조체의 biWidth 멤버는 일반적으로 비디오 이미지 너비보다 큰 대상 DirectDraw 표면의 보폭을 나타냅니다. 표면의 보폭은 일반적으로 바이트 깊이를 곱한 표면의 너비입니다. 예를 들어 너비가 640픽셀이고 색상 깊이가 픽셀당 32비트인 표면의 경우 보폭은 2560바이트입니다.

요청된 이미지 너비를 확인하려면 다음 코드 예제를 사용합니다.

if (IsRectEmpty(&pVideoInfoHdrRequested->rcTarget) {
    Width =  pVideoInfoHdrRequested->bmiHeader.biWidth;
    Height = pVideoInfoHdrRequested->bmiHeader.biHeight;
} 
else {
    Width = pVideoInfoHdrRequested->rcTarget.right − 
            pVideoInfoHdrRequested->rcTarget.left;
    Height = pVideoInfoHdrRequested->rcTarget.bottom − 
             pVideoInfoHdrRequested->rcTarget.top;
}

Stream 클래스 인터페이스는 스트림을 닫기 위해 미니드라이버에 SRB_CLOSE_STREAM 요청을 보냅니다. 그러면 미니드라이버가 모든 미해결 스트림 SRB를 Stream 클래스 인터페이스로 반환해야 합니다.