날마다 새롭게 또 날마다 새롭게

펌 - video4linux kit 레퍼런스 본문

프로그래밍/영상처리

펌 - video4linux kit 레퍼런스

아무유 2013. 1. 31. 09:46

본 문서는 Video4Linux Kit의 레퍼런스 이다. 본 문서에서는 Video4Linux

Kit의 각종 함수와 정의된 상수에 대한 설명을 담고 있으며, 이를 이용하여

화면을 캡쳐하는 방법을 담고 있다.

_______________________________________________________________________


Contents

---------


1. Video4Linux Kit

2. Structure

3. Open/Close Video4Linux Device

4. Set Channel Properties

5. Set Picture Properties

6. Simple Capture

7. Double Buffering

  7.1 Initialize

  7.2 Wait

  7.3 Capture Next Frame

8. Getter

  8.1 Capabilities

  8.2 Channel Properties

  8.3 Image Properties

  8.4 Etc.

9. Simple Image Grabber

10. Hidden Interface

11. License

12. Revision History


_______________________________________________________________________



1. Video4Linux Kit

-------------------


Video4Linux Kit(이하 V4L Kit)은 Video4Linux를 사용하여 비디오 장치로

부터 이미지를 캡쳐하기 위한 라이브러리 킷을 말한다. V4L Kit은

기본적으로 Video4Linux의 호출들을 사용하여 작업을 처리하며, 그 동작을

추상화 시키고 관련된 모든 데이타를 묶어놓은 자료구조 이다.



2. Structure

-------------


V4L Kit는 Video4Linux의 자료형을 갖는 구조체로 관리된다. 따라서, 특정

장치 당 하나의 Video4Linux 포인터를 필요로 한다. 선언은 다음과 같다:


-----------------------------------------------------------------------

Video4Linux *v4l; /* pointer to Video4Linux type */

-----------------------------------------------------------------------


V4L-Kit의 사용에 있어서 Video4Linux 구조체의 모든 멤버를 알아야 할

필요는 없다. 우리가 사용해야 하는 대부분의 멤버는 사용을 위한 함수가

마련되어 있고, 사용 할 필요가 없는 멤버의 경우에는 V4L Kit 내부에서

관리된다. 하지만, 보다 고급적인 사용이 필요하고 Video4Linux에 대한

이해가 완벽하다면 10장 'Hidden Interface'를 보기 바란다.



3. Open/Close Video4Linux Device

---------------------------------


Video4Linux 타입의 포인터가 선언되어 있다면, Video4Linux 디바이스를

이용하기 위해서 디바이스를 오픈하여야 한다. 이 때, V4L Kit는

Video4Linux 디바이스의 관리에 필요한 메모리 공간을 모두 할당하고,

Video4Linux 구조체를 이용하여 관리하기 위한 준비를 모두 하게 된다.

앞서 Video4Linux 타입의 포인터 'v4l'을 선언하였다면, 다음의 함수를

사용하여 이용하고자 하는 디바이스를 오픈할 수 있다.


-----------------------------------------------------------------------

V4L_Open(&v4l, "/dev/video0"); /* open the device '/dev/video0' */

-----------------------------------------------------------------------


또한, 디바이스의 모든 사용이 끝나면 자원을 받납하고 디바이스를 닫기

위해 다음의 함수를 반드시 사용하여야 한다.


-----------------------------------------------------------------------

V4L_Close(v4l);

-----------------------------------------------------------------------


만일 디바이스를 열거나 닫기 위한 작업이 실패 할 경우에는 V4L_Open과

V4L_Close 함수는 모두 true를 반환하게 된다. 또한 V4L_DEBUG 상수가

설정되어 있을 경우 해당 디버그 정보를 표준 에러 스트림으로 출력한다.


* 유의하여야 할 점은 V4L Kit의 모든 함수는 'V4L_'로 시작한다는 점과

  V4L_Open 함수에서만 오직 Video4Linux 구조체 포인터의 주소가 인수로

  사용된다는 점이다.



4. Set Channel Properties

--------------------------


앞의 과정을 진행하여 Video4Linux 디바이스가 오픈된 상태라면,

Video4Linux 구조체는 해당 디바이스의 모든 정보를 갖고 있다. 또한

디바이스의 채널 속성도 설정이 가능하다. 기본적으로 설정이 가능한 채널

속성은 비디오의 타입과 모드 이다. 채널 속성을 설정하기 위한 함수의

원형은 다음과 같다:


-----------------------------------------------------------------------

bool V4L_SetChannel(Video4Linux *self,

                     int channel_no,

                     int video_type,

                     int video_mode);

-----------------------------------------------------------------------


첫번째 인수는 오픈된 Video4Linux 구조체의 포인터, 두번째는 설정하고자

하는 채널의 번호, 세번째는 비디오 타입, 그리고 마지막 네번째는 비디오

모드가 각각 넘겨진다. 이때 첫번째 인수를 제외한 다른 모든 인수는

V4L_NOSET이 될 수 있다. 만약 특정 인수가 V4L_NOSET이라면 해당하는

인수는 이전에 설정되어 있던 값을 따르게 된다.


비디오 타입은 다음의 다음의 두가지 상수 중 한가지가 될 수 있다.


상수명             의미

-----------------------------------------------------------------------

VIDEO_TYPE_TV      TV 입력

VIDEO_TYPE_CAMERA  Camera 입력


또한 비디오 모드는 다음 중 한가지가 될 수 있다.


상수명            의미

-----------------------------------------------------------------------

VIDEO_MODE_PAL    PAL 모드

VIDEO_MODE_NTSC   NTSC 모드

VIDEO_MODE_SECAM  SECAM 모드

VIDEO_MODE_AUTO   모드를 설정할 수 없거나, 자동 변환 함


만약 모든 설정이 실패하면 함수를 true를 리턴한다.



5. Set Image Properties

------------------------


채널과 함께 캡쳐하고자 하는 이미지의 속성을 설정하는 것 또한

가능하다. 이를 위한 함수 역시 채널 속성을 위한 함수와 비슷한 형식을

따르는데, 원형은 다음과 같다:


-----------------------------------------------------------------------

bool V4L_SetPicture(Video4Linux *self,

                     int brightness,

                     int hue,

                     int colour,

                     int contrast,

                     int whiteness,

                     int depth,

                     int palette);

-----------------------------------------------------------------------


이미지의 속성은 비교적 항목이 많은 편이지만 어려운 점은 없다. 첫번째

인수는 채널의 경우와 동일한 Video4Linux 타입의 포인터가 되며, 두번째는

밝기, 세번째는 색조(hue), 네번째는 색(color), 다섯번째는

대조(contrast), 여섯번째는 백색도(whiteness), 일곱번째는 캡쳐의

깊이(capture depth), 그리고 마지막은 이미지에서 사용될 팔레트를 고르게

된다. 기본적으로 첫번째의 포인터와 마지막의 팔레트를 제외한 모든

항목은 V4L_NOSET 또는 0~65535 사이의 값을 갖을 수 있으며, 팔레트는

다음의 상수 중 한가지 또는 V4L_NOSET을 값으로 갖게 된다.


상수명                   의미

-----------------------------------------------------------------------

VIDEO_PALETTE_GREY       0~255로 표현되는 선형적인 그레이 스케일

VIDEO_PALETTE_HI240      BT848에서 사용하는 8Bit 칼라 큐브(Cube)

VIDEO_PALETTE_RGB565     RGB565를 16비트 워드(Word)에 채움(Packed)

VIDEO_PALETTE_RGB555     RGB555를 16비트 워드(Word)에 채움(Packed)

VIDEO_PALETTE_RGB24      RGB888을 24비트 워드(Word)에 채움(Packed)

VIDEO_PALETTE_RGB32      RGB888을 하위 3바이트에 넣은 32bit

VIDEO_PALETTE_YUV422     YUV422의 비디오 형태 4:2:2의 8비트

VIDEO_PALETTE_YUYV       

VIDEO_PALETTE_UYYY       표준으로 적합

VIDEO_PALETTE_YUV420     YUV420 캡쳐

VIDEO_PALETTE_YUV411     YUV411 캡쳐

VIDEO_PALETTE_RAW        RAW 캡쳐 (BT848)

VIDEO_PALETTE_YUV422P    YUV 4:2:2 Planar

VIDEO_PALETTE_YUV411P    YUV 4:1:1 Planar

VIDEO_PALETTE_YUV420P    YUV 4:2:0 Planar

VIDEO_PALETTE_YUV410P    YUV 4:1:0 Planar

VIDEO_PALETTE_PLANAR     Planar 항목의 시작

VIDEO_PALETTE_COMPONENT  Component 항목의 시작


만약 특정 인수가 V4L_NOSET의 값을 갖을 경우에는 채널 속성의 설정과

동일하게 동작한다.



6. Simple Capture

------------------


Video4Linux 디바이스를 올바르게 오픈하였다면, 기본값을 이용하여 간단히

화면을 캡쳐할 수 있다. 또한, 알맞은 설정으로 보다 유연한 캡쳐가

가능하다. 단순히 선택한 프레임에서 원하는 크기로 캡쳐하기 위해서는

다음의 함수를 사용하여야 한다.


-----------------------------------------------------------------------

bool V4L_SimpleCapture(Video4Linux *self,

                        int frame,

                        int width,

                        int height);

-----------------------------------------------------------------------


위의 함수 중 첫번째 인수를 제외한 모든 값은 V4L_NOSET으로 설정이

가능하며, 두번째 인수는 캡쳐할 프레임 번호를 세번째와 네번째 인수는

캡쳐할 이미지의 크기를 결정한다.


만일 캡쳐가 성공적이라면 해당 함수는 false를 리턴하고 실패하였다면

true를 리턴한다. 성공적인 경우에는 다음의 함수를 이용하여 캡쳐한

프레임의 포인터를 얻을 수 있다.


-----------------------------------------------------------------------

unsigned char *V4L_GetFrame(Video4Linux *self);

-----------------------------------------------------------------------


위의 함수 V4L_GetFrame은 바로 직전의 캡쳐된 프레임에 대해서만 포인터를

반환할 수 있다.


Simple Capture는 말 그대로 단순히 한장의 프레임만을 캡쳐할 수 있으며,

보다 진보된 캡쳐는 다음 장의 Double Buffering에서 다루게 된다.



7. Double Buffering

--------------------


앞에서 살펴본 Simple Capture는 한번에 하나의 프레임만을

캡쳐한다. 하지만 Video4Linux 디바이스는 캡쳐하기 위해서 많은 시간을

할애해야 하며, 계속하여 프레임을 캡쳐할 필요가 있는 동영상 캡쳐에는

앞의 방법이 적합하지 않다. 따라서, 두개의 프레임을 동시에 사용하여

캡쳐하는 더블 버퍼링이란 기법이 사용되게 된다.

V4L Kit에서도 역시 더블 버퍼링을 지원한다. 이제 V4L Kit에서 제공하는

더블 버퍼링 함수에 대해 알아보자.


7.1 Initialize


더블 버퍼링을 위해서는 기본적으로 초기화 작업이 필요하다. 더블

버퍼링은 0번과 1번 프레임을 기본으로 사용한다. 따라서, 프레임 번호를

제외한 크기만을 설정하여 초기화 하면 된다. 초기화를 위해 제공되는

함수는 다음과 같다:


-----------------------------------------------------------------------

bool V4L_DoubleBufferingInit(Video4Linux *self,

                              int width,

                              int height);

-----------------------------------------------------------------------


7.2 Wait


더블 버퍼링은 초기화가 끝난 이후부터 버퍼링을 시도한다. 따라서 첫번째

프레임의 캡쳐가 끝날 때 까지 기다린 후 캡쳐된 프레임을 사용하여야

한다. 이를 위해 사용되는 함수는 다음과 같다:


-----------------------------------------------------------------------

bool V4L_DoubleBufferingWait(Video4Linux *self);

-----------------------------------------------------------------------


만약 위의 함수가 성공적으로 실행되었다면(false 리턴 하였다면), 위에서

설명한 GetFrame 함수를 이용하여 캡쳐된 프레임을 가져올 수 있다.


7.3 Capture Next Frame


Wait 작업을 통해 하나의 프레임을 캡쳐 하였다면 다음 프레임을 캡쳐하기

위한 동작이 필요하다. 이를 위한 함수는 다음을 이용한다:


-----------------------------------------------------------------------

bool V4L_DoubleBufferingNext(Video4Linux *self);

-----------------------------------------------------------------------


위의 함수는 이미 캡쳐가 완료된 프레임을 버리고 새로운 프레임을

캡쳐하기 위한 작업을 한다. 기본적으로 더블 버퍼링을 이용한 캡쳐는 위의

네가지 함수로 이루어 지며, 한번의 초기화 작업을 하고 Wait, Get, Next가

반복되며 캡쳐가 이루어진다.



8. Getter

----------


이제 필요한 주요 함수는 모두 설명이 되었고 화면의 캡쳐에도 충분히

사용이 가능하다. 하지만 Video4Linux 디바이스는 보다 많은 정보를 갖고

있고 이를 가져오기 위한 Getter들을 소개한다.


8.1 Capabilities


Video4Linux 디바이스의 기능에 관련된 함수는 총 8가지가

존재한다. 각각은 다음과 같다:


- 디바이스 이름 가져오기

-----------------------------------------------------------------------

char *V4L_GetName(Video4Linux *self);

-----------------------------------------------------------------------


- 타입 확인하기

-----------------------------------------------------------------------

bool V4L_IsType(Video4Linux *self, unsigned int type);

-----------------------------------------------------------------------

위의 함수는 주어진 디바이스와 타입을 비교하여 지원여부를 true/false로

리턴한다.


- 채널의 수 가져오기

-----------------------------------------------------------------------

int V4L_GetNumOfChannels(Video4Linux *self);

-----------------------------------------------------------------------


- 오디오의 수 가져오기

-----------------------------------------------------------------------

int V4L_GetNumOfAudios(Video4Linux *self);

-----------------------------------------------------------------------


- 최대 폭 가져오기

-----------------------------------------------------------------------

int V4L_GetMaxWidth(Video4Linux *self);

-----------------------------------------------------------------------


- 최대 높이 가져오기

-----------------------------------------------------------------------

int V4L_GetMaxHeight(Video4Linux *self);

-----------------------------------------------------------------------


- 최소 폭 가져오기

-----------------------------------------------------------------------

int V4L_GetMinWidth(Video4Linux *self);

-----------------------------------------------------------------------


- 최소 높이 가져오기

-----------------------------------------------------------------------

int V4L_GetMinHeight(Video4Linux *self);

-----------------------------------------------------------------------


8.2 Channel Properties


앞서 설명한 채널 설정 이외에 디바이스가 현재 사용하고 있는 채널에 관한

정보를 얻기 위한 함수는 다음과 같다:


- 채널 번호 가져오기

-----------------------------------------------------------------------

int V4L_GetChannelNum(Video4Linux *self);

-----------------------------------------------------------------------


- 채널 이름 가져오기

-----------------------------------------------------------------------

char *V4L_GetChannelName(Video4Linux *self);

-----------------------------------------------------------------------


- 튜너의 수 가져오기

-----------------------------------------------------------------------

int V4L_GetNumOfTuners(Video4Linux *self);

-----------------------------------------------------------------------

* 튜너는 각 채널별로 존재할 수 있다.


- 채널의 기능 알아보기

-----------------------------------------------------------------------

bool V4L_ChannelHave(Video4Linux *self, unsigned int flag);

-----------------------------------------------------------------------

각 플래그에 해당하는 기능을 채널이 갖고 있는지의 여부를 true/false로

리턴한다. 플래그가 될 수 있는 상수는 다음과 같다.


상수명          의미

-----------------------------------------------------------------------

VIDEO_VC_TUNER  채널이 튜너를 갖고 있음

VIDEO_VC_AUDIO  채널에 오디오가 있음


- 채널의 타입 확인하기

-----------------------------------------------------------------------

bool V4L_IsChannelType(Video4Linux *self, unsigned int type);

-----------------------------------------------------------------------

입력된 타입과 비교하여 true/false로 리턴한다.


- 채널의 모드 확인하기

-----------------------------------------------------------------------

bool V4L_IsChannelMode(Video4Linux *self, unsigned int mode);

-----------------------------------------------------------------------

입력된 모드와 비교하여 true/false로 리턴한다.


8.3 Image Properties


캡쳐할 혹은 캡쳐된 이미지의 속성은 다음 함수로 가져올 수 있다.


- 밝기 가져오기

-----------------------------------------------------------------------

unsigned int V4L_GetBrightness(Video4Linux *self);

-----------------------------------------------------------------------


- 색조 가져오기

-----------------------------------------------------------------------

unsigned int V4L_GetHue(Video4Linus *self);

-----------------------------------------------------------------------


- 색 가져오기

-----------------------------------------------------------------------

unsigned int V4L_GetColour(Video4Linux *self);

-----------------------------------------------------------------------


- 대조 가져오기

-----------------------------------------------------------------------

unsigned int V4L_GetContrast(Video4Linux *self);

-----------------------------------------------------------------------


- 백색도 가져오기

-----------------------------------------------------------------------

unsigned int V4L_GetWhiteness(Video4Linux *self);

-----------------------------------------------------------------------


- 캡쳐의 깊이 가져오기

-----------------------------------------------------------------------

unsigned int V4L_GetDepth(Video4Linux *self);

-----------------------------------------------------------------------


- 팔레트 확인 하기

-----------------------------------------------------------------------

bool V4L_IsPalette(Video4Linux *self, unsigned int palette);

-----------------------------------------------------------------------

입력된 팔레트와 디바이스를 비교하여 true/false를 리턴한다.


8.4 Etc.


그 외에 직전에 캡쳐한 이미지의 폭과 높이를 알기 위한 함수, 디바이스

경로를 알아내기 위한 함수, 현재 프레임의 번호를 가져오기 위한 함수가

다음에 있다:


- 디바이스 경로 가져오기

-----------------------------------------------------------------------

char *V4L_GetDeviceName(Video4Linux *self);

-----------------------------------------------------------------------


- 프레임 번호 가져오기

-----------------------------------------------------------------------

int V4L_GetFrameNum(Video4Linux *self);

-----------------------------------------------------------------------


- 현재 폭 가져오기

-----------------------------------------------------------------------

int V4L_GetWidth(Video4Linux *self);

-----------------------------------------------------------------------


- 현재 높이 가져오기

-----------------------------------------------------------------------

int V4L_GetHeight(Video4Linux *self);

-----------------------------------------------------------------------



9. Simple Image Grabber

------------------------


본 문서와 함께 포함된 V4L Kit 소스 외에 'SIG'라는 프로그램이 포함되어

있다. 'SIG'는 Ankur Mahajan이 제작한 단순한 정지 화상 캡쳐

프로그램으로 V4L Kit의 실제 사용을 보여주기 위하여 수정하여

포함되었다. 소스에 대한 자세한 설명은 하지 않지만, 소스를 보고 V4L

Kit의 이용에 대하여 살펴보기 바란다.


* 'SIG'에서는 디버그 정보의 출력을 위해 V4L Kit의 Hidden Interface를

사용하였다. 하지만, 실제로 프로그래밍시에는 Getter만으로 충분할

것으로 생각된다.



10. Hidden Interface

---------------------


V4L Kit에는 제공되는 함수 외에 구조체 내부에 많은 멤버가

존재한다. 또한 C언어의 특성상 이 모든 멤버는 접근이 가능하다. 따라서

보다 고급적인 조작을 원할 경우에는 위험하지만 멤버를 직접 변경할 수

있다.

V4L Kit에서는 Video4Linux의 몇가지 구조체를 재정의 하여 사용하고

있으며, 각 구조체에 해당하는 변수를 Video4Linux 구조체 내에 멤버로

갖고 있다.

Hidden Interface는 권장하지 않기 때문에 자세히 설명하지 않는다. 모든

멤버는 video4linux.h 파일을 통해 간단한 주석과 함께 살펴볼 수

있으므로, 사용을 원한다면 헤더 파일을 직접 참조하기 바란다.


* '__'로 시작하는 함수 또는 변수들은 조작하지 않길 바란다. 보다 하위

  레벨에 위치하고 있는 인터페이스이다.



11. License

------------


Copyright (c) 2004 James G. Kim. Permission to distribute and modify

this document is granted under the GNU Free Documentation License. An

on-line copy is available at http://www.gnu.org/licenses/fdl.html

[출처] video4linux 레퍼런스|작성자 실이


Comments