[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>
'Hello CE,Mobile' 카테고리의 다른 글
Windows Mobile은 왜 버그가 많은가요? (0) | 2010.11.01 |
---|---|
너무 좋은 스마트폰 한글 입력기 열혈남아su님의 로즈키 (0) | 2010.11.01 |
[Windows Mobile] Programming Camera Driver #5 (0) | 2010.10.28 |
[Windows Mobile] Programming Camera Driver #4 (0) | 2010.10.28 |
[Windows Mobile] Programming Camera Driver #3 (0) | 2010.10.28 |