다음을 통해 공유


스트림 열기 및 닫기

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 클래스 인터페이스로 반환해야 합니다.