336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
장치(Device)
Video4Linux는 다음의 장치(Device) 파일들을 제공한다. 이것들은 보통 /dev/bttv로서 알려져 있는 캐릭터형의 장치(Device)이며,
많은 사람들을 위해서 /dev/bttv는 /dev/video0 에의 기호 연결(Symlink)이 되어 있다.


장치(Device) 파일명 마이너 번호의 범위 기능
/dev/video 0-63 비디오 capture를 위한 인터페이스(Interface)
/dev/radio 64-127 AM/FM 라디오 장비
/dev/vtx 192-223 Teletext 인터페이스(Interface) 칩(Chips)
/dev/vbi 224-239 Raw VBI 데이터(Intercast/Teletext)

Video4Linux를 이용하는 프로그램은, 우선 장치(Device) (파일)을 열고 검색해서, 이용하길 원하는 기능을 찾아낸다. 기능의 검색으로 각 인터페이스(Interface)가 무엇을 지원하고 있는지를 알 수 있다. 이 API는 비디오 캡쳐 카드를 위해서만 정의되었다. 라디오 카드(Radio Card)의 경우에는 이 부분집합을 이용한다. Teletext의 인터페이스(Interface)에는 이미 정의되고 있는 VTX API를 이용한다.

기능의 검색의 Ioctl(Capability Query Ioctl)
비디오 장치(Device)가 지원하는 기능에 관한 정보를 얻으려면 VIDIOCGCAP ioctl()을 이용한다. ioctl에 struct video_capability를 건네주면 내용을 돌려준다. struct video_capability에는 이하에 주는 항목이 포함되어 있다.

name[32] 이 장치(Device)의 규범적인(Canonical) 이름
type 인터페이스(Interface)의 타입
channels radio/tv 의 입력 소스의 수(만약 사용 가능하면)
audios 오디오 장치(Device)의 수(만약 사용 가능하면)
maxwidth 최대의 capture폭(단위:픽셀)
maxheight 최대의 capture 높이(단위:픽셀)
minwidth 최소의 capture폭(단위:픽셀)
minheight 최소의 capture 높이(단위:픽셀)

type의 항목은 장치(Device)의 기능에 관한 정보가 플래그(Flag)로서 리스트(List)되어 있다. 이것에는 다음의 것이 있다.

이름 설명
VID_TYPE_CAPTURE 메모리상에 capture 하는 기능이 있다
VID_TYPE_TUNER 어떤 형식(Some Form)의 Tuner가 있다
VID_TYPE_TELETEXT teletext의 기능을 가지고 있다.
VID_TYPE_OVERLAY frame buffer상에 이미지를 오버레이 하는 기능이 있다
VID_TYPE_CHROMAKEY chroma-key로 오버레이 하는 기능이 있다
VID_TYPE_CLIPPING 오버레이의 클리핑을 하는 기능이 있다
VID_TYPE_FRAMERAM 오버레이는 frame buffer의 메모리를 덧쓰기하는 기능이 있다
VID_TYPE_SCALES 하드웨어가 이미지의 크기변환(Image Sacling)을 지원한다.
VID_TYPE_MONOCHROME 그레이 스케일(Grey Scale)만 Captuer한다.
VID_TYPE_SUBCAPTURE 이미지의 일부분만을 capture 할 수 있다

capture 장치(Device)가 돌려주는 최소와 최대의 사이즈는, 그 범위내에서 가능한 모든 높이와 폭의 비율이나 사이즈를 사용할 수 있는 것은 아니다. capture 사이즈를 설정하는 경우, 요구된 사이즈를 넘지 않는 범위에서 가능한 최대의 사이즈로 설정된다. 예를 들면 quickcam은 3개의 고정적인 설정 밖에 사용할 수 없다.

Frame buffer
capture 카드로부터 frame buffer에 직접 데이터를 쓰게 하기 위해서는, frame buffer의 베이스 주소(Base Address), 사이즈(Size), 구조(Organisation)를 장치(Device) 드라이버에 가르쳐 두지 않으면 안된다. 이것은 특권 모드(Proviliged)의 ioctl()이며, 사실은 X서버 자신이 설정해야 할 것이다.
VIDIOCSFBUF ioctl로 capture 장치(Device)를 위한 frame buffer의 파라미터를 설정한다. capture 카드가 frame buffer에의 직접적인 쓰기를 지원하고 있지 않는 경우, 이 ioctl()는 지원되지 않는다. VIDIOCGFBUF ioctl( ) 는 현재 설정되어 있는 파라미터를 돌려준다. 두 경우 모두 struct video_buffer를 사용해 파라미터를 얻어온다.

void *base 버퍼의 물리 베이스 주소(Base Physical Address)
int height frame buffer의 높이
int width frame buffer의 폭
int depth frame buffer의 깊이(Depth)
int bytesperline 인접한 다음의 같은 옆위치까지의 메모리상에서의 바이트(Byte) 수

이러한 값은 frame buffer의 물리적인 레이아웃을 반영한다. 실제로 표시되고(Visible) 있는 영역은 실제의 frame buffer보다 작을수도 있다. 사실, XFree86에서 이런 것은 보통이다. XFree86 의 DGA는 이 ioctl 로 설정하는 파라미터를 제공할 수 있다. 베이스 주소를 NULL로 설정해서, frame buffer에 액세스를 할 방법이 없다는 것을 나타낼 수 있다.

Capture Windows
capture하는 영역은 struct video_window를 사용해서 결정한다. 이 구조체는 capture 하는 영역과 필요하면 클리핑(Clipping)하는 영역을 설정한다. VIDIOCGWIN ioctl 로 현재의 설정된 값을 가져 올 수 있어서 VIDIOCSWIN 로 새로운 값을 설정할 수 있다.
VIDIOCSWIN 의 ioctl 에 성공했을 경우, 적당한(Suitable) 파라미터들이 선택되었다는 것이다. 이것은 요구된 파라미터 대로에 정확하게 설정했다고 하는 의미가 아니다. 유저 프로그램은, VIDIOCGWIN를 사용해서 실제로 설정된 파라미터가 정확한지 확인할 필요가 있다. struct video_window 에는 다음과 같은 항목이 있다.

x X윈도우에서의 X 좌표
y X윈도우에서의 Y 좌표
width capture 하는 이미지의 폭
height capture 하는 이미지의 높이
chromakey chroma-key의 값(호스트 순위(Host Order)에서의 RGB32의 값)
flags 추가 capture 플래그
clips 클리핑 하는 직사각형의 리스트(설정만)
clipcount 클리핑 직사각형의 수(설정만)

클리핑 직사각형은 배열로 넘겨준다. 클리핑 직사각형의 각 요소에는 다음의 항목이 있다.

x 스킵(Skip)하는 직사각형의 X좌표
y 스킵(Skip)하는 직사각형의 Y좌표
width 스킵(Skip)하는 직사각형의 폭
height 스킵(Skip)하는 직사각형의 높이

단지 capture 영역을 설정한 것 만으로는, capture하는 것은 유효하지 않는다. VIDIOCCAPTURE ioctl 로 1을 설정해서 건내주는 것으로써, 오버레이 capture 하는 것을 시작한다. 그리고 0을 설정하는 것으로써, 멈출 수가 있다.
몇몇의 capture-장치(Device)에 따라서는, 실제로 보이고 있는 영역의 일부를 capture 할 수 있는 것도 있다. 이 경우, VIDEO_TYPE_SUBCAPTURE가 설정되어 있다. video_capture 구조체는 시간과 Capture할 특별한 부분 영역을 지정한다.
video_capture 구조체에는 다음의 항목이 있다.

x 붙잡는(Grab) 영역의 X좌표
y 붙잡는(Grab) 영역의 Y좌표
width 붙잡는(Grab) 영역의 폭
height 붙잡는(Grab) 영역의 높이
decimation 적용될 스킵할 영역(decimation)
flags 붙잡을(Grab) 때의 플래그

가능한 플래그(flags)에는 다음의 것이 있다.

이름 설명
VIDEO_CAPTURE_ODD 홀수 프레임만을 capture 한다
VIDEO_CAPTURE_EVEN 짝수 프레임만을 capture 한다

비디오 소스(Video Source)
각각의 video4linux의 비디오나 오디오 드라이버는 한개 혹은 여러 소스 채널로부터 capture 한다. 각각의 채널은 VIDIOCGCHAN ioctl호출해서 정보를 얻을 수 있다. 이 함수(VIDIOCGCHAN ioctl)를 사용하기 전에, 호출하는 측은 반드시 channel의 항목에 정보를 얻고 싶은 채널의 번호를 설정해야 한다. 채널 자신에 대한 정보를 struct video_channel 에 저장하여 값을 돌려준다.
VIDIOCSCHAN ioctl 는 정수(integer) 형태의 인수를 취해서, capture하는 입력으로 변환한다. 색의 설정이나 튜닝에 관한 파라미터가 채널 변환을 건너서 유지되는 것은 정의되지 않는다. 호출측에서, 채널마다 이것들을 관리해 다시 설정해 줘야한다.(다른 비디오 입력마다 다른 설정을 보존하는 것이 합리적이다. (reasonable))
struct video_channel 은 다음과 같이 구성되어 있다.

channel
채널 번호(Channel Number) name 입력의 이름 - 카드의 입력 자신의 라벨(Label)이 반영되는 것이 바람직하다.
tuners 이 입력으로 연결되어 있는 튜너(Tuner)의 수
flags 튜너(Tuner)가 가지고 있는 설정(Properties)
type 입력의 타입(만약 알고 있는 경우만)
norm 이 채널의 표준(TV신호의 모드)

flags의 정의는

VIDEO_VC_TUNER 채널에 튜너(Tuner)가 있다.
VIDEO_VC_AUDIO 채널에 오디오가 있다.
VIDEO_VC_NORM 채널은 표준(TV신호의 모드)의 설정을 가지고 있다.

types의 정의는

VIDEO_TYPE_TV 입력은 TV 입력이다
VIDEO_TYPE_CAMERA 입력은 카메라이다

이미지 속성의 설정
화상(Picture)의 이미지 속성은 VIDIOCGPICT ioctl를 사용하면 struct video_picture에서 얻을 수 있다. VIDIOCSPICT ioctl 를 호출하여 이러한 값을 변경할 수 있다. palette의 형(Type)을 제외한 모든 값은 0~65535의 사이에서 조정된다.
struct video_picture 에는 다음의 항목이 있다.

brightness 화상의 밝음
hue 화상의 색조(hue)(칼라의 경우만)
colour 화상의 색(Color)(칼라의 경우만)
contrast 화상의 대조(Contrast)
whiteness 백색도(Whiteness) (그레이 스케일의 경우만)
depth 캡처하는 깊이(Capture Depth)(frame buffer의 깊이(depth)와 대조(match)할 필요가 있겠지요)
palette 이 이미지에서 사용될 팔레트를 알려준다.

팔레트의 값에는 다음의 것이 있다.

VIDEO_PALETTE_GREY 선형적으로 증가하는 gray scale(255가 가장 밝은 흰색)
VIDEO_PALETTE_HI240 BT848의 8 bit 칼라 큐브(cube)
VIDEO_PALETTE_RGB565 RGB565를 16 bit 워드(Word)에 채운다.(Packed)
VIDEO_PALETTE_RGB555 RGB555를 16 bit 워드(Word)에 채운다.(Packed), 맨 위의 비트는 미정의
VIDEO_PALETTE_RGB24 RGB888를 24 bit 워드(Word)에 채운다.(Packed)
VIDEO_PALETTE_RGB32 RGB888를 하위 3바이트에 넣은 32bit. 맨 위의 아르바이트는 미정의
VIDEO_PALETTE_YUV422 YUV422의 비디오의 형태(Style) - 4bits를 Y, 2bits를 U, 2bits를 V에 할당한 8bits
VIDEO_PALETTE_YUYV Describe me
VIDEO_PALETTE_UYVY Describe me
VIDEO_PALETTE_YUV420 YUV420 캡처(capture)
VIDEO_PALETTE_YUV411 YUV411 캡처(capture)
VIDEO_PALETTE_RAW RAW 캡처(capture) (BT848)
VIDEO_PALETTE_YUV422P YUV 4:2:2 Planar
VIDEO_PALETTE_YUV411P YUV 4:1:1 Planar

튜닝(Tuning)
각각의 비디오 입력 채널에는 그것과 관련된 하나 또는 다수 개의 튜너(Tuner)가 연결되어 있다. 많은 장치(Device)는 튜너(Tuner)를 가지고 있지 않는다. TV카드나, 라디오(Radio)카드에는 하나 또는 다수 개의 튜너(Tuner)가 붙어 있다.
튜너(Tuner)에 대한 정보는 VIDIOCGTUNER ioctl를 사용해서 struct video_tuner에서 얻을 수 있다. 튜너(Tuner)의 번호를 설정해 ioctl를 호출하면, 내용을 구조체로 보내준다. 튜너(Tuner)의 변환은 사용하고 싶은 튜너(Tuner)의 정수형의 번호(int)를 인수로 VIDIOCSTUNER를 이용한다.

struct video_tuner은 다음의 항목으로 구성된다.

tuner 튜너(Tuner)의 번호
name 튜너(Tuner)의 규범적인(Canonical) 이름 (예 FM/AM/TV)
rangelow 설정 가능한 최저 주파수
rangehigh 설정 가능한 최고 주파수
flags 튜너(Tuner)의 상태를 알려주는 플래그(Flags)
mode TV신호의 모드(관련하는 경우만)
signal 신호의 강도(아는 경우) - 0~65535의 사이

플래그(flags)에는 다음의 것이 있다.

VIDEO_TUNER_PAL PAL를 수신(tuning)을 지원한다.
VIDEO_TUNER_NTSC NTSC를 수신(tuning)을 지원한다.
VIDEO_TUNER_SECAM SECAM를 수신(tuning)을 지원한다.
VIDEO_TUNER_LOW 주파수가 저역대(Lower range)이다.
VIDEO_TUNER_NORM 튜너(Tuner)의 표준(TV신호의 모드)를 설정할 수 있다
VIDEO_TUNER_STEREO_ON 튜너(Tuner)의 오디오가 스테레오가 되어 있다
VIDEO_TUNER_RDS_ON 튜너(Tuner)는 RDS 데이터스트림(Datastream)을 보인다.
VIDEO_TUNER_MBS_ON 튜너(Tuner)는 MBS 데이터스트림(Datastream)을 보인다.

mode 에는 다음의 것이 있다.

VIDEO_MODE_PAL 튜너(Tuner)는 PAL 모드 이다.
VIDEO_MODE_NTSC 튜너(Tuner)는 NTSC 모드 이다.
VIDEO_MODE_SECAM 튜너(Tuner)는 SECAM 모드 이다.
VIDEO_MODE_AUTO
자동적으로 변환(switches)하는 모드 또는 모드를 설정할 수 없는 경우

튜너(Tuner)로 설정하는 주파수는 1/16 MHz 내에서의 unsigned 의 32bit 의 값이지만 VIDEO_TUNER_LOW 의 플래그가 설정되어 있는 경우에는 1/16 KHz의 값이다. 현재의 주파수는 VIDIOCGFREQ ioctl를 통해서 unsigned long 값으로 없을 수 있고 VIDIOCSFREQ ioctl 로 설정할 수 있다.

오디오(Audio)
TV와 라디오 장치(Device)는 선택할 수 있는 하나 또는 다수 개의 오디오 채널을 가지고 있다. 오디오의 설정은 struct video_audio을 VIDIOCGAUDIO ioctl에 건네주는 것으로 얻을 수 있다. 또 VIDIOCSAUDIO ioctl로 오디오의 특성(Properties)를 설정할 수 있다.
struct video_audio은 다음의 항목으로 구성된다.

audio 채널 번호
volume 볼륨 레벨(Level)
bass 중저음(bass) 레벨(Level)
treble 고음(treble) 레벨(Level)
flags 오디오 채널의 상태를 알려주는 플래그(Flags)
name[16] 오디오 입력을 위한 규범적인(Canonical) 이름
mode 오디오 입력의 모드
balance 좌/우의 밸런스
step 하드웨어로 설정 가능한 단계(Step)

플래그(flags)에는 다음과 같이 정의된다.

VIDEO_AUDIO_MUTE 오디오가 단음(mute)되고 있다
VIDEO_AUDIO_MUTABLE 단음(mute)를 지원한다.
VIDEO_AUDIO_VOLUME 음량(Volume)의 컨트롤을 할 수 있다
VIDEO_AUDIO_BASS 중저음(bass)의 컨트롤을 할 수 있다
VIDEO_AUDIO_TREBLE 고음(treble)의 컨트롤을 할 수 있다
VIDEO_AUDIO_BALANCE 좌우 밸런스의 컨트롤을 할 수 있다

디코딩(Decoding) 모드는 다음과 정의된다.

VIDEO_SOUND_MONO 모노(Mono) 신호
VIDEO_SOUND_STEREO 스테레오(Stereo)의 신호(NICAM for TV)
VIDEO_SOUND_LANG1 언어 1을 바꿀 수 있는 유럽 TV(European TV alternate language 1)
VIDEO_SOUND_LANG2 언어 2을 바꿀 수 있는 유럽 TV(European TV alternate language 2)

이미지 읽어오기(Reading Image)
read의 시스템 콜(System Call)에 대한 각각의 콜(Call)은 장치(Device)로부터 다음의 가능한 이미지를 가져온다. 포맷을 설정하고 함수에 대한 올바른 크기의 버퍼를 준비하는 것은 호출자의 책임이다. 모든 장치(Device)가 read 시스템 콜을 지원하지 않는다.
두번째 방법으로 장치(Device)가 mmap을 지원하면 mmap 인터페이스(interface)를 통해서 이미지 가져오는 것(Capture)을 조정할 수 있다. mmap 인터페이스를 사용하기 위해서 사용자는 우선 첫 번째로 원하는 이미지와 깊이(Depth)의 성질을 결정해야 한다.
그 다음 VIDIOCGMBUF ioctl를 호출한다. 이 ioctl 는, mmap 해야 할 버퍼(Buffer)의 크기와 각각의 프레임(Frame)에 대한 버퍼에서의 오프셋(offset)을 알려준다. 지원되는 프레임의 수는 장치(Device)에 의해서 결정되고 대체적으로 한 프레임이다.
video_mbuf structure은 다음의 항목으로 구성된다.

size 잡으려고(Map) 하는 바이트(Bytes) 수
frames 프레임(Frame)의 수
offsets 각각의 프레임 마다의 오프셋(offset)

mmap를 실시하면, VIDIOCMCAPTURE ioctl로 (최초의 설정과 같거나 작은) 사용하고 싶은 이미지의 사이즈를 설정한다. 설정이 끝나면 메모리 맵(Map)된 버퍼에 capture가 시작된다. 프로그램에 의해 버퍼가 사용(used) 될 때마다, VIDIOCSYNC ioctl를 호출해서 이 프레임을 해체(free)하고 계속(continue) 한다. 추가로 : VIDIOCSYNC는 해체(free)하고 싶은 프레임 번호를 인수로 가지고 있다.
버퍼가 unmapped 되거나, 모든 버퍼가 다 채워지면, capture는 멈춘다. 드라이버에 메모리와 화면의 양쪽 모두에 capture할 수 있게 설정했을 경우, 메모리에 캡처(Capture)하는 동안에 드라이버는 가능한 한 최선의 방법(Best Effort)으로 캡처한 것을 화면에 표시한다. 이것은 일반적으로 메모리 맵으로 Captuer할 수 없었던 모든 프레임(frame)이 화면에 표시될 수 있다.
마지막의 ioctl는, 만약 하나의 드라이버가 여러 개의 부속품(Components)으로 되어 있을 경우, 하나의 장치(Device)가 관련되어 있는 장치(Device)들을 얻게 해준다. (예를 들면, video0는 나쁜 문제를 만드는 intercast 표시 로그램의 원인이 될 수 있는 vbi0와 항상 관련이 있다고는 할 수 없다.)VIDIOCGUNIT ioctl은 관련되어 있는 장치(Device)가 있는 경우에 그 단위 번호들(unit Number)을 알려준다. video_unit 구조체에는 다음의 항목이 있다.


video 비디오 capture 장치(Device)
vbi VBI capture 장치(Device)
radio 라디오 장치(Device)
audio 오디오 믹서
teletext Teletext 장치(Device)

RDS 데이터스트림(Datastream)
RDS를 지원하는 라디오 장치(device)를 위해서, 장치에 read() 시스템 콜을 이용하여 Radio Data System(RDS) 정보를 받아오는 것은 가능하다. 이 데이터들은 다음과 같은 3개의 그룹으로 합쳐있다.

First Octet RDS 블록의 LSB(Least Significant Byte)
Second Octet RDS 블록의 MSB(Most Significant Byte)
Third Octet
Bit 7 : 에러 비트(Error bit). 이 블록을 받는 도중에 복구할 수 없는 에러가 발생했다는 것을 나타낸다.
Bit 6 : Corrected bit. 이 데이터 블록을 위해서 에러가 수정되었다는 것을 나타낸다.
Bit 5~3 : Received Offset. 싱크 시스템(Sync System)에 의해서 오프셋이 받아졌다는 것을 나타낸다.
Bit 2~0 : Offset Name. 이 데이터에 적용되는 오프셋을 나타낸다.

'Programming > Linux' 카테고리의 다른 글

yum을 이용한 rpm 다운로드 방법  (0) 2016.03.25
gcc 컴파일 옵션.  (0) 2008.08.22
Linux find grep 명령사용하기  (0) 2008.06.24
Fedora8사전에서 Microsoft를 검색하면...  (0) 2008.05.26
printf를 잘 쓰자  (0) 2008.05.21

+ Recent posts