본문 바로가기

Hello CE,Mobile

[Windows Mobile] Programming Camera Driver #4

[Windows Mobile] Programming Camera Driver #4

Video Format Negotiation

   

DirectShow middleware 같은 camera client CSPROPERTY_PIN_DATARANGES (see CSPROPERTY_PIN) property 이용하여, 주어진 pin 지원하는 모든 video formats 알아보기 위해, camera driver query 있다. Camera driver pin 지원하는 모든 video formats 나타내는 structure 배열을 return함으로써, query 대해 응답해야만 한다.

아래의 list video formats 나타낼 , 사용되는 structure 보여준다.

CS_DATARANGE_VIDEO

CS_DATARANGE_VIDEO2

   

Client CSPROPERTY_PIN_DATAINTERSECTION (see CSPROPERTY_PIN) 이용하여 stream type 협의하며, CSPROPERTY_CONNECTION_DATAFORMAT 이용하여, 상호 협의된 format 하나를 선택한다.

   

   

   

Buffer Management by the Camera Driver

   

Buffers camera driver 또는 client 의해 할당될 있다. Client buffer 할당에 대한 역할이 자신에게 있는지 driver 있는지를 detect 있다. client에서 사용되는 buffer 전체 수는 hardware capabilities 또는 DMA channel 수에 의해 제한된다.

   

Allocation and Initialization

driver상의 나타난 Buffer 수는 고정적이다. Client CSPROPSETID_Connection property set (see IOCTL_CS_PROPERTY) CSPROPERTY_CONNECTION_ALLOCATORFRAMING property (see CSPROPERTY_CONNECTION) 이용한 query , 그에 대한 응답을 통해, buffer allocation 대한 응답을 통해, hardware capabilities 결정할 있다.

   

이것을 통해, 할당된 buffer 수를 return 하고, software 또는 hardware상의 allocation type 대해서 나타낸다. Client driver driver 초기 작업으로 buffer list 협의한다.

   

Buffers buffer header structure CSSTREAM_HEADER 통해, client driver사이에서 전달된다. Header CS_FRAME_INFO structure 이용하여 설정되며, data packet 상의 특정 data type 추가적인 정보를 위해 header 보완하게 된다.

   

Video capture streams 위한 최소한의 buffer 수는 보장할 없다. Architecture 성능에 따른 문제로, driver 하나 이상의 buffer 사용해야 하며, driver 개발자는 그러한 지원을 제공해야 한다는 것을 기초로 고안된다.

   

YUV 422 format 위해, 3개의 buffer 있다면, 모든 buffer single image 위해 사용되며, 하나는 driver로부터 할당된 것이어야 한다.

   

Buffers allocated by the driver

Hardware memory 할당된 buffer 경우, driver 자신의 memory 할당자 (allocator) 가지고 있어야 하며, client driver로부터 할당된 buffer list 받아야만 한다.

   

Driver CSPROPERTY_BUFFER_DRIVER property (see CSPROPERTY_BUFFER_MODE) 통해, buffer allocation model 대한 driver 지원을 나타내야 한다.

Client CSPROPSETID_Connection property set (see IOCTL_CS_PROPERTY) CSPROPERTY_CONNECTION_ALLOCATORFRAMING property (see CSPROPERTY_CONNECTION) 이용하여 query함으로써, driver 어떤 framing model 지원하는지 결정한다.

   

Client IOCTL_CS_BUFFERS 열거된 CS_ALLOCATE (see BUFFER_COMMANDS) 포함하는 DeviceIoControl 함수를 호출함으로써, buffer list 얻을 있다.

   

Buffers allocated by the client

Buffer system memory상의 할당되어있을 경우, client pin stop mode 상태에서 driver에게 buffer list 전달해야 한다. Stop mode 상태로 pin 놓여지는 것은 driver buffer 전달하기 위한 direct memory access (DMA) operation 준비할 있도록 해준다. Client driver DMA operation 준비하기 전에, buffers 초기화 해야 한다. Client buffer 통한 작업을 완료하면, buffer 위한 memory free시켜야 한다. Client client DMA capabilities 기반으로 buffer 할당에 대한 가지 다른 접근 방법 하나를 취한다.

   

만약 driver DMA 준비 시간이 느리다면, driver client로부터 모든 버퍼에 대해 먼저 알아야 한다. Driver CSPROPERTY_BUFFER_CLIENT_LIMITED property 통해, buffer allocation model 대한 이러한 지원을 나타내고 있다.

   

만약 driver DMA 준비 시간이 빠르다면, client buffer 필요할 때마다, buffer allocation, initiation, release 있다. Driver CSPROPERTY_BUFFER_CLIENT_UNLIMITED property 통해, buffer allocation model 대한 이러한 지원을 나타내고 있다.

   

Client CSPROPERTY_CONNECTION_ALLOCATORFRAMING property 통해 query함으로써, driver 지원하는 framing model 어떤 것인지를 결정한다.

   

Client IOCTL_CS_PROPERTY CSPROPERTY_BUFFER_COUNT property 이용한 DeviceIoControl 함수를 호출함으로써 buffer 수를 협상할 있다.

   

Client IOCTL_CS_BUFFERS CS_ENQUEUE 이용하여, driver에게 buffer 전달한다. Client IOCTL_CS_BUFFERS CS_DEALLOCATE 이용하여, 사용된 buffer release한다.

   

Buffer rotation

Idle buffers 위한 queue ready buffers 위한 queue, 가지의 buffer queue 존재한다. Client idle buffers 위한 queue 관리하며, driver ready buffers 위한 queue 관리한다.

   

Driver 초기화 이후, 모든 capture buffer client idle queue 놓여진다. 이때, driver 해당 buffers 대해 알고 있지만 그것들을 제어하지는 않는다. Driver buffer 제어할 있도록 하기 위해서, client idle queue에서 ready queue 해당 buffer 전달해야만 한다. Client CS_ENQUEUE property (see BUFFER_COMMANDS) 셋팅하여, IOCTL_CS_PROPERTY 호출한다.

   

IOCTL CS_STREAM_DESCRIPTOR structure pointer 취하며, 하나의 상태를 return 한다. CS_STREAM_DESCRIPTOR structure 모든 멤버는 채워져야 한다. CS_STREAM_DESCRIPTOR structure application 의해 할당되어야 하며, driver application에게 buffer return 때까지, 유효한 상태로 남아있어야 한다.

   

Driver IOCTL 호출을 받았을 , driver pointer 확인하기 위해 handle 사용하며, descriptor shadow copy 받는다. Driver descriptor 대한 shadow copy 연결하고, buffer ready queue 추가한다.

   

Hardware buffer 채운다면, driver message queue 사용하여 application에게 buffer return 해야 한다. 그렇게 하기 위해, driver message queue 이용하여, Read function 통해, 전달된 stream descriptor 대한 pointer 돌려준다.

   

   

   

Asynchronous Data Flow and Buffer Management in Camera Drivers

   

Windows Embedded CE Camera Device Driver Interface message queue 이용하여, asynchronous operation 지원한다. Client CreateMsgQueue function 이용하여 massage queue 생성하며, driver에게 해당 queue object 대한 핸들을 전달한다. Driver 해당 queue 이용하여, 완성된 video frames client에게 전달한다. Client 일반적으로 WaitForSingleObject 또는 ReadMsgQueue 함수를 통해 제어되는 worker thread 사용한다. Worker thread 사용 가능한 video frame 처리하며, IOCTL_CS_BUFFERS 통한 재사용을 위해, buffer 되돌려주는 역할을 담당한다.

   

아래의 code message queue 대한 external interface 나타내고 있다.

CSPROPERTY_CONNECTION_STATE/CSSTATE_PAUSE

   

HANDLE WINAPI CreateMsgQueue(LPCWSTR lpszName,

LPMSGQUEUEOPTIONS lpOptions);

BOOL WINAPI ReadMsgQueue(HANDLE hMsgQ, LPVOID lpBuffer,

DWORD cbBufferSize,

LPDWORD lpNumberOfBytesRead,

DWORD dwTimeout, DWORD *pdwFlags);

BOOL WINAPI WriteMsgQueue(HANDLE hMsgQ, LPVOID lpBuffer,

DWORD cbDataSize, DWORD dwTimeout,

DWORD dwFlags);

   

   

October 9, 2007

from Hoya^^

   

원본 위치 <http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=60&MAEULNO=23&no=267&page=2>