본문 바로가기

Hello CE,Mobile

[Windows Mobile] Programming Camera Driver #6

[Windows Mobile] Programming Camera Driver #6 (The End)

Stream-to-Pin Connections and Capture

   

DirectShow middleware camera driver 하나가 frame buffers 할당하기 위해 협상을 한다.

   

Client CSPROPERTY_CONNECTION_ALLOCATORFRAMING property (see CSPROPERTY_CONNECTION) 통해, framing 요청을 set하거나 get 있다. 이것은 driver frame buffers 위해 할당해야 하는 memory 양에 대한 정보를 제공한다.

   

Client CSPROPERTY_CONNECTION_STATE property CSSTATE_PAUSE (see CSSTATE) 상태를 전달하여, pause state stream set한다.

   

만약, client buffer 할당한다면, IOCTL_CS_BUFFERS 사용하여, driver에서 모든 buffer 전달한다. Driver 해당 buffer headers 초기화한다.

   

만약, driver 할당자라 하고, client IOCTL_CS_BUFFERS 호출하였다면, CSSTREAM_ALLOCATOR structure 전달한다. 결과, driver 할당자 framing 정보를 이용하여 buffer 할당하고, buffer headers 초기화한다.

   

Client CSPROPERTY_CONNECTION_STATE property (see CSPROPERTY_CONNECTION) CSSTATE_RUN state (see CSSTATE) 전달하여, run state set 있다. data 받은 , driver capturing 준비를 한다.

   

Client CSPROPERTY_CONNECTION_STATE property 이용하여, driver 서로 다른 상태를 변경하며, 적절한 상태를 열거한다.

   

Streaming stop하기 위해, client 반드시 CSSTATE_STOP set 해야 한다.

   

   

   

Stream States in the Camera Driver

   

Driver에서 제공되는 stream stopped, paused, 그리고 running 같은 세가지 상태 하나로 존재한다. 이러한 상태는 CSSTATE 열거자의 구성요소를 통해 나타난다. 초기화 , stream stopped state 정의된다. Stream 오직 CSSTATE_RUN state에서만 data 읽는다.

   

순차적인 resource 할당을 위해, 가능한 state transition subset 허용되어야 한다. 아래의 table driver 전형적으로 수행하는 작업에 따라 허용되는 transition 나타내고 있다.

   

Transition

Description

Stop to Pause

Resources 할당한다. 읽기 (Reads) pause 상태로 변경된 , queue 들어간다.

Pause to Run

Streaming 시작한다.

Run to Pause

Streaming stop한다. 읽기 (Reads) queue상태로 남아있다.

Pause to Stop

Resources 해제하고, 모든 읽기(Reads) 작업은 완료된다. 이미지로 채워지지 않은 읽기는 zero 길이로 완료된다.

   

Stream stopped state 변경되면, 그것은 즉시 모든 data 읽기를 완료해야 한다.

   

Property set stream state query 또는 변경하는데 사용되는 property CSPROPSETID_Connection (see IOCTL_CS_PROPERTY) CSPROPERTY_CONNECTION_STATE (see CSPROPERTY_CONNECTION)이다.

   

   

   

Still Image Support in Camera Drivers

   

Camera drivers still image 하나의 stream type으로 다룬다. Stream capture preview 같이 동작한다. Still image capture 위해, client still images capture 허용하기 위해, 다른 하나의 pin 사용해야 한다.

   

Still image captured 되어야 , client run 상태에서 STILL stream 넣어야 한다. Client 아래와 같은 동작을 수행해야 한다:

   

CAPTURE/PREVIEW streams pause한다. Stream pause , frames 버려지는 것을 고려하지 않으며, frame dropped counter 증가하지 않는다.

Run state에서 still image stream 넣는다.

사진을 촬영하고, 그것을 일치하는 message queue 넣는다.

Pause state 넣는다 (변경한다).

Capture/Preview stream state 이전 상태로 변경한다.

   

queue상의 buffers preview 또는 capture 아닌 still image buffers임을 나타내기 위해, 분리된 하나의 message queue 존재한다.

   

   

   

Camera Driver Details

   

General Implementation

Camera 나타내기 위한 class 디자인 하고, 해당 class pins 나타내며, interface layer 맞추어 camera driver interface functions 구현함으로써, camera driver 생성할 있다.

CAM_Open function 호출함으로써 camera device global object 생성한다. object hardware adapter 나타내며, driver 동시에 오직 하나의 instance 존재함을 확인해야 한다.

   

Dropped Frames

Client PROPSETID_DROPPEDFRAME property set CSPROPERTY_DROPPEDFRAMES_CURRENT (see CSPROPERTY_VIDCAP_DROPPEDFRAMES) 사용하여, driver에게 버려진 frames query 있다. Driver CSPROPERTY_DROPPEDFRAMES_CURRENT_S structure 이용하여, captured frames 수와 버려진 frames 수를 return한다.

   

Hardware encoding

Hardware encoding 지원하는 camera 대해, driver encoding settings 나태내기 위해, PROPSETID_VIDCAP_VIDEOCOMPRESSION property set 사용한다. CSPROPERTY_VIDCAP_VIDEOCOMPRESSION properties 열거하였다.

   

Custom properties

Camera driver model 확장 가능하도록 디자인되어야 하며, driver 개발자는 특별한 hardware 위한 몇몇 특징을 나타내기 위해, 자신의 customized properties 정의 IOCTL codes 정의해야 한다.

   

Null Driver

Null camera driver hardware 맞는 camera driver 개발 과정을 시작 , 도움이 있는 자료를 제공한다. Null driver source code 특정 hardware에서 즉시 동작하지는 않는다. 일반적으로, camera driver 일반적인 부분 외에 매우 중요한 customization 작업에 시간을 투자해야 한다. Memory alignment 요구 사항 pin buffers , 특정 hardware-specific parameters 포함하는 driver 만드는 것인 어려운 과제이다.

   

Memory alignment and working set optimization

CSALLOCATOR_FRAMING 이용하여, 최대한 값을 튜닝을 함으로써, driver 크기 최소화를 통해 Driver performance 유지할 있도록 한다. CSALLOCATOR_FRAMING.Frames 대한 최적화된 값을 셋팅하는 것은 driver working set 줄일 있다.

   

Using DirectDraw Overlays

Driver DirectShow overlay surfaces 위해 정확한 capability bits 설정해야 한다. 아래의 topics 공통의 capability bits settings 나타낸다.

Capability Bits for Non-flippable RGB Overlays

Capability Bits for Non-flippable YV12 Overlays

Capability Bits for Flippable YV12 Overlays

Software적인 overlays 사용하는 driver 있을 있다. driver power-saving mode 전환 , overlay 반드시 꺼야 한다. Driver power-saving mode로부터 나타났다면, 이전 hardware state 아닌 software state 기반으로 overlay 재저장해야 것이다. 이러한 steps application, video renderer, device power-saving mode 들어가는 hardware 사이의 일련의 문제점을 회피할 있다.

   

   

Capture with YUV Formats

모든 YUV formatted media types 위해, CS_BITMAPINFOHEADER상의 height value negative 되어야 한다. 따라서 계산시, biHight 값에 의존해서는 안된다. biSizeImage, biBitCount 또는 frame rate 관련된 값들을 계산시, biHeight 값의 절대값을 사용해야만 한다.

   

pin 하나 또는 이상의 formats 제공한다. Driver 이러한 format 다루기 위해, CS_DATARANGE_VIDEO 사용한다. 아래의 code 15fps 지원하는 176 x 144 YV12 contents CS_DATARANGE_VIDEO structure 보여주고 있다.

   

#define BITRATE (DX * abs(DY) * DBITCOUNT * FRAMERATE)

#define SAMPLESIZE (DX * abs(DY) * DBITCOUNT / 8)

#define FOURCC_YV12 mmioFOURCC('Y', 'V', '1', '2')

   

#define DX 176

#define DY -144 // **** YUV is always negative ****

#define DBITCOUNT 12 // **** YV12 is 12 bits format ****

#define FRAMERATE 15

   

CS_DATARANGE_VIDEO DCAM_StreamMode = {

// CSDATARANGE

{

sizeof (CS_DATARANGE_VIDEO), // Flags

0,

SAMPLESIZE, // SampleSize

0, // Reserved

STATIC_CSDATAFORMAT_TYPE_VIDEO,

FOURCC_YV12,

0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71,

STATIC_CSDATAFORMAT_SPECIFIER_VIDEOINFO

},

   

TRUE, // BOOL, bFixedSizeSamples

TRUE, // BOOL, bTemporalCompression

CS_VIDEOSTREAM_CAPTURE, // StreamDescriptionFlags (CS_VIDEO_DESC_*)

0, // MemoryAllocationFlags (CS_VIDEO_ALLOC_*)

   

// _CS_VIDEO_STREAM_CONFIG_CAPS

{

STATIC_CSDATAFORMAT_SPECIFIER_VIDEOINFO,

CS_AnalogVideo_None, // AnalogVideoStandard

DX,DY, // InputSize, (the inherent size of the incoming signal

// with every digitized pixel unique)

DX,DY, // MinCroppingSize, smallest rcSrc cropping rect allowed

DX,DY, // MaxCroppingSize, largest rcSrc cropping rect allowed

1, // CropGranularityX, granularity of cropping size

1, // CropGranularityY

1, // CropAlignX, alignment of cropping rect

1, // CropAlignY;

DX, DY, // MinOutputSize, smallest bitmap stream can produce

DX, DY, // MaxOutputSize, largest bitmap stream can produce

DX, // OutputGranularityX, granularity of output bitmap size

DY, // OutputGranularityY;

0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)

0, // StretchTapsY

0, // ShrinkTapsX

0, // ShrinkTapsY

// Allow 1% difference

FRAMEINTERVAL_15FPS, // MinFrameInterval (10,000,000 / 30.00FPS),

// 100nS units

FRAMEINTERVAL_3_75FPS, // MaxFrameInterval (10,000,000 / 3.75FPS),

// 100nS units

BITRATE / 8, // (DX * DY * DBITCOUNT) * DFPS_MIN,

// MinBitsPerSecond (3.75 FPS);

BITRATE, // (DX * DY * DBITCOUNT) * DFPS_MAX

// MaxBitsPerSecond (30.0 FPS);

},

// CS_VIDEOINFOHEADER (default format)

{

0,0,DX,DY, // RECT rcSource;

0,0,DX,DY,// RECT rcTarget;

BITRATE, // DWORD dwBitRate;

0L, // DWORD dwBitErrorRate;

REFTIME_15FPS, // REFERENCE_TIME AvgTimePerFrame;

sizeof (CS_BITMAPINFOHEADER), // DWORD biSize;

DX, // LONG biWidth;

DY, // LONG biHeight;

3, // WORD biPlanes;

DBITCOUNT, // WORD biBitCount;

FOURCC_YV12|BI_SRCPREROTATE, // DWORD biCompression;

SAMPLESIZE, // DWORD biSizeImage;

0, // LONG biXPelsPerMeter;

0, // LONG biYPelsPerMeter;

0, // DWORD biClrUsed;

0, // DWORD biClrImportant;

0, 0, 0 // DWORD dwBitMasks[3]

}

};

---------------------------------------------------------------------------- The End

   

   

Camera Driver 개발 관련 자료에 대한 내용을 이것으로 모두 올렸습니다.

전반적으로 Camera Driver 개발함에 있어, 필요 또는 논의 되는 내용을 한번 정도 보셨다는 기분정도만 가지셔도 좋을 같습니다.

Camera Application 개발에 대한 내용은 DirectShow라는 방대한 내용이 들어가야 합니다.

따라서 Application 관련 글을 게시판에 올리는 시점은 해당 글이 마무리 가능한 시점이 되면 올리도록 하겠습니다.

미흡하지만 끝까지 글을 읽어주신 분들께 감사의 마음을 전합니다.

   

October 11, 2007

from Hoya^^

   

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