日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

v4l2 spec 中文 Ch01

 guitarhua 2013-11-06

 

 

Video for Linux Two API Specification

Revision 0.24

 

 

 

 

 

 

 

Michael H Schimek

mschimek@gmx.at

 

 

 

 

 

 

Bill Dirks

Hans Verkuil

Martin Rubli

 

 

 

 

 

V4L2 中文版            Made by:魚在飛(467350479)         個人翻譯,轉(zhuǎn)載申明

v4l2全五章下載地址

v4l2 中文pdf,Chapter all

Chapter 1. 通用API(Common API Elements)

編程以支持一個V4l2的設(shè)備包含以下步驟:

.打開設(shè)備

.改變設(shè)備的屬性,選擇音頻和視頻輸入,視頻的標(biāo)準(zhǔn)(編碼格式?),圖片的亮度等

.協(xié)商數(shù)據(jù)格式

.協(xié)商輸入/輸出的方法

.輸入/輸出循環(huán)

.關(guān)閉設(shè)備

1.1.  打開和關(guān)閉設(shè)備(Opening and Closing Devices)

1.1.1.  設(shè)備命名(Device Naming)

V4L2以模塊的方式在內(nèi)核中實現(xiàn),可以被管理員手動的加載或者是當(dāng)設(shè)備第一次打開時被加載。驅(qū)動模塊被掛在內(nèi)核模塊"videodev"下。在這份文檔中,提供了輔助函數(shù)和一個通用的應(yīng)用程序接口規(guī)范。

每個驅(qū)動加載時都會用主設(shè)備號81和次設(shè)備號0-255來注冊一個或多個設(shè)備節(jié)點。該如何分配次設(shè)備號給這些個V4L2設(shè)備,完全取決與系統(tǒng)管理員,這主要是為了解決設(shè)備間的沖突(為了區(qū)分不同的設(shè)備)1。當(dāng)選定次設(shè)備號后,模塊將會以"_nr"為前綴來命名特殊的設(shè)備文件名。舉個例子來說,像"video_nr"就是代表視頻采集設(shè)備的(在內(nèi)核中表示為)/dev/video。數(shù)字則是和設(shè)備類型相關(guān)并基于次設(shè)備號的一個偏移2

當(dāng)驅(qū)動支持同一型號的多個設(shè)備時,這時就可以賦予多個次設(shè)備號了,并以逗號隔開:

> insmod mydriver.o video_nr=0,1 radio_nr=0,1

 

在/etc/modules.conf 文件中,可能是顯示如下:

 alias char-major-81-0 mydriver

 alias char-major-81-1 mydriver

 alias char-major-81-64 mydriver                        ?

Options mydriver video_nr=0,1 radio_nr=0,1             ?

當(dāng)應(yīng)用程序試圖打開主設(shè)備號81,次設(shè)備號0,1,64,時會加載驅(qū)動"mydriver"

注冊前兩個視頻采集設(shè)備時是從主設(shè)備號0開始的,接著是1...一直到63,而音頻設(shè)備則是從次設(shè)備64開始的。

    如果未顯式給定次設(shè)備號,那么模塊將提供一個默認(rèn)值。第四章將闡述不同型號設(shè)備的起始次設(shè)備號。顯然次設(shè)備號必須是獨一無二的。假如所請求的設(shè)備號正在使用時,很明顯起沖突的設(shè)備將不會被注冊。

   安裝慣例,系統(tǒng)管理員會根據(jù)主、次設(shè)備號在/dev目錄下創(chuàng)建不同功用的特殊設(shè)備文件。文件名字則建議有別于列在第四章的V4L2設(shè)備名。

用命令mknod創(chuàng)建的字符設(shè)備,擁有特權(quán)操作并且這些設(shè)備是不能通過主、次設(shè)備號打開的。這就意味著應(yīng)用程序是不能可靠的掃描已加載或者是安裝的驅(qū)動的。用戶必須鍵入設(shè)備名,或者應(yīng)用程序會嘗試默認(rèn)的設(shè)備名。

在設(shè)備文件系統(tǒng)(devfs)下,次設(shè)備號是被忽略的(明顯的在其下我們只要知道設(shè)備的功能,主設(shè)備號就提供這樣的作用)。V4L2驅(qū)動會自動的在/dev/v4l目錄下,用默認(rèn)的設(shè)備名創(chuàng)建所請求的設(shè)備文件。

1.1.2.  相關(guān)設(shè)備(Related Devices)

驅(qū)動通常都能支持許多相關(guān)的功能。有個例子說,視頻采集,直接傳輸視頻,視頻垂直消隱信號采集 ,

都有著千絲萬縷的聯(lián)系,這是因為這些功能都共享著,起碼在他們之間,相同的視頻輸入(視頻采集頭,webcam)和高頻頭(可以看作是音視頻采集頭)。

 

注(V4L2所提供的接口):

1. 視頻采集接口(video capture interface):這種應(yīng)用的設(shè)備可以是高頻頭或者攝像頭.V4L2的最初設(shè)計就是應(yīng)用于這種功能的.         

2. 視頻輸出接口(video output interface):可以驅(qū)動計算機的外圍視頻圖像設(shè)備--像可以輸出電視信號格式的設(shè)備.         

3. 直接傳輸視頻接口(video overlay interface):它的主要工作是把從視頻采集設(shè)備采集過來的信號直接輸出到輸出設(shè)備之上,而不用經(jīng)過系統(tǒng)的CPU.         

4. 視頻間隔消隱信號接口(VBI interface):它可以使應(yīng)用可以訪問傳輸消隱期的視頻信號.           

5. 收音機接口(radio interface):可用來處理從AM或FM高頻頭設(shè)備接收來的音頻流.

V4L和早前的V4L2版本,視頻采集和overlay是使用相同的設(shè)備名,相同的次設(shè)備號,但是卻有別于VBI(Vertial Blanking Interval)。實踐表明,這種方法擁有眾多問題3,更糟糕的是V4L的videodev模型是禁止同時多次打開設(shè)備的。

作為補救措施,當(dāng)前的V4L2版本是通過特定的名字和次設(shè)備號放寬了設(shè)備類型的概念。為了保持和舊的應(yīng)用程序的兼容性,驅(qū)動必須依舊注冊不同的次設(shè)備號并制定一個默認(rèn)的對應(yīng)功能給這個設(shè)備(major代表一類設(shè)備,minor這是用來給內(nèi)核區(qū)分一類設(shè)備的不同實例或者功能。這樣,major代表一個班級,那么minor就是用來告訴校長這班級中的某個學(xué)生!)。但是,如果驅(qū)動支持相關(guān)功能,就必須在所注冊的次設(shè)備號下實現(xiàn)這個功能(就是說為了支持老版應(yīng)用像mjpg-server,你必須為這類設(shè)備提供一個minor以支持默認(rèn)的功能;但他有新的作用,你也必須給予支持)。在第四章提及的一些功能可以在打開的時候進行選擇。

想象一下,一個驅(qū)動支持視頻采集,直接視頻傳輸,視頻間隔消隱信號和FM收音機。他用0,64,224(這種編碼格式是為保兼容性從V4L API中繼承下來的)次設(shè)備號注冊了三個設(shè)備。不管/dev/video(81,0)或者/dev/vbi(81,224)是否處于打開狀態(tài),應(yīng)用程序都可以從這三種設(shè)備中選擇某項功能。不通過編程(就是說0直接用命令dd和cat)/dev/video就可采集視頻圖片,通過/dev/vbi來獲得原始的視頻間隔消隱信號。 /dev/radio(81,64)是一個不變的無線裝置,因而和視頻部分的功能并沒有聯(lián)系。但是,沒有相互的關(guān)聯(lián)并不意味著你可以同時使用它們。當(dāng)你用open()調(diào)用時很有可能返回設(shè)備忙--EBUSY的錯誤代碼。

除視頻的輸入輸出外,硬件可能也支持抽樣甚至是回放功能(VLC貌似就是這樣的)。如果真是這樣,那么這些功能會被實現(xiàn)為OSS(Open Sound System)或者ALSA (Advanced Linux Sound Architecture)PCM設(shè)備,最終可能是OSS或者ALSA的混合體。V4L2 API并未做任何假設(shè)來發(fā)現(xiàn)這些有相互關(guān)系的設(shè)備。

If you have an idea please write to the Video4Linux mailing list:

https://listman./mailman/listinfo/video4linux-list.

1.1.3.  并發(fā)打開(Multiple Opens)

    通常,V4l2設(shè)備可被多次打開的。當(dāng)這被驅(qū)動支持時,用戶可以,例子說嘛,你可以設(shè)計一個面板程序,比如有些按鈕可以調(diào)節(jié)亮暗或者音量啊,而與此同時另一個應(yīng)用程序卻正在采集音視頻。換句話說,面板程序就被比作了OSS或者ALSA混合應(yīng)用了。當(dāng)一個設(shè)備支持多項功能像采集啊且能同時直接接傳輸啊神馬的,Multiple Opens允許fork出進程或特定的應(yīng)用程序達(dá)到并發(fā)的使用設(shè)備。

Multiple Opens是可選的,驅(qū)動應(yīng)該至少允許在沒數(shù)據(jù)交換的情況下支持并發(fā)訪問,例子就是,上面的面板程序。這意味著當(dāng)設(shè)備正在使用中時open()可返回EBUSY錯誤代碼,ioctl()函數(shù)的初始化數(shù)據(jù)交換(也就是VIDIOC_S_FMT ioctl),read(),write()函數(shù)亦是如此。

只不過打開一個V4L2設(shè)備并不允許互斥存取4。然而初始化數(shù)據(jù)交換賦予讀和寫數(shù)據(jù)的請求類型的權(quán)利。

也可以改變相關(guān)屬性,文件描述符。應(yīng)用程序可以通過在1.3節(jié)描述的優(yōu)先級機制請求額外的訪問權(quán)限。                          

1.1.4.  共享數(shù)據(jù)流(Shared Data Streams)

V4L2驅(qū)動不應(yīng)該支持在一個設(shè)備上,通過拷貝緩沖對同一數(shù)據(jù)流進行多應(yīng)用程序的讀或?qū)?,或者是時分復(fù)用亦或是其他相似的方法。非要這么干,可以使用在用戶空間的代理程序。如果驅(qū)動支持流共享,那么其實現(xiàn)必須是透明的。V4L2 API 并沒有列出產(chǎn)生沖突時要如何來解決。

1.1.5.  函數(shù)(Functions)

應(yīng)用程序可以使用open()和close()函數(shù)來打開、關(guān)閉V4L2設(shè)備(都是雷同的)。下面幾小節(jié)將介紹設(shè)備編程所用到的ioctl()方法。

1.2.  功能查詢(Querying Capabilities)

因為啊,人都想做大嘛!這個V4l2 涉及了各式各樣的設(shè)備,但是呢,這個API接口卻并不能都適合這些個繁雜的設(shè)備。因此,相同類型的設(shè)備就可能擁有完全不一樣的能力,所以這份規(guī)范也允許忽略一些復(fù)雜且不那么重要的API接口。

ioctl的VIDIOC_QUERYCAP選項是用來檢查內(nèi)核設(shè)備是不是和這份規(guī)范相兼容滴,也可以順便看看這些設(shè)備所能夠支持的函數(shù)和I/O方法,一舉兩得。其他的特性嘛,也可以依葫蘆畫瓢,調(diào)用各自的ioctl方法,例子么,想知道設(shè)備上的視頻連接頭的名字啊,型號和數(shù)量神馬的,就可以調(diào)用ioctl的VIDIOC_ENUMINPUT方法.盡管API主要功用是--抽象(模糊)底層硬件,但是,ioctl方法是允許驅(qū)動特定的應(yīng)用程序來可靠的辨識相應(yīng)的驅(qū)動的。

但是,所有的V4l2驅(qū)動都必須支持VIDIOC_QUERYCAP這個方法(顯而易見的)。應(yīng)用程序都應(yīng)該在打開設(shè)備之后就調(diào)用這個方法。

1.3.  應(yīng)用程序的優(yōu)先級(Application Priority)

當(dāng)多個程序共享一個設(shè)備時,你可能就希望分配給他們不同的優(yōu)先級(想想為什么封建社會的把人分成三六九等,雖然不人道但有一方面:執(zhí)政者是希望管理起來方便)。不同于傳統(tǒng)"rm -rf /"(移除根目錄下的一切,系統(tǒng)需要內(nèi)核+文件系統(tǒng),這么做告訴你:不存在阻塞?)思想,視頻記錄程序可能阻止其他的應(yīng)用程序,使他們失去對視頻的控制,不能換電視臺(一個勁的放廣告,這擱誰他也受不鳥啊!)。

另一個目的就是,允許被用戶控制的應(yīng)用程序?qū)晒ぷ髟诤笈_的低優(yōu)先級的應(yīng)用進行搶占,然后(被搶占的)在稍后一點的時間重新獲得對設(shè)備的控制權(quán)。

鑒于這些個特性是不可能都在用戶空間中實現(xiàn)的,V4L2就定義了ioctl的VIDIOC_G_PRIORITY和VIDIOC_S_PRIORITY方法來請求和查詢訪問文件描述符的優(yōu)先級。因為有些個驅(qū)動并不支持這倆個方法,為保持和V4L2的早期版本的兼容性,會在打開設(shè)備時默認(rèn)的給他們個中間的優(yōu)先級。再通過VIDIOC_QUERYCAP后應(yīng)用程序通常會調(diào)用VIDIOC_S_PRIORITY請求一個其他的優(yōu)先級。

如果ioctls在其他程序擁有更高的優(yōu)先級時,用諸如VIDIOC_S_INPUT方法去改變驅(qū)動的屬性,會返回EBUSY的錯誤代碼。事件機制(如:U盤的熱插拔,他會在用戶空間中彈出個東東,告訴你US13來了)會通知應(yīng)用程序有人在別的地方想篡改屬性,但是還沒添加呢(您老給看看怎么辦唄)!

1.4.  視頻輸入/輸出(Video Inputs and Outputs)

視頻的輸入和輸出就是設(shè)備上的物理連接頭。例子是:RF紅外頭,復(fù)合視頻頭(不知是啥玩意),w-Video或者RGB連接頭。收音機就沒有視頻輸入、輸出了。

如果想去了解可用數(shù)量的輸入和輸出屬性,應(yīng)用程序可以分別使用ioctl的VIDIOC_ENUMINPUT和VIDIOC_ENUMOUTPUT方法來枚舉來查看。當(dāng)當(dāng)前的視頻輸入被查詢的時候,Ioctl的VIDIOC_ENUMINPUT方法會返回v4l2_input結(jié)構(gòu)體,它包含了可用的信號狀態(tài)信息。

Ioctl的VIDIOC_G_INPUT和VIDIOC_G_OUTPUT方法會返回當(dāng)前視頻的輸入、輸出索引。為選擇不同的輸入、輸出,應(yīng)用程序可以使用ioctl的VIDIOC_S_INPUT和VIDOC_S_OUTPUT方法。當(dāng)設(shè)備有一個或多個輸入時,驅(qū)動就必須實現(xiàn)所有的輸入類ioctl方法,對于輸出也是同樣的。

 

Example 1-1. Information about the current video input

struct v4l2_input input;

int index;

if(-1 == ioctl(fd, VIDIOC_G_INPUT, &index)){

    perror("VIDIOC_G_INPUT");

    exit(EXIT_FAILURE);

}

memset(&input, 0, sizeof(input));

input.index = index;

if(-1 == ioctl(fd, VIDIOC_ENUMINPUT, &input)){

    perror("VIDIOC_ENUMINPUT");

    exit(EXIT_FAILURE);

}

printf("Current input: %s\n", input.name);

 

Example 1-2. Switching to the first video input

int index;

index = 0;

if(-1 == ioctl(fd, VIDIOC_S_INPUT, &index)){

    perror("VIDIOC_S_INPUT");

    exit(EXIT_FAILURE);

}

1.5.  音頻輸入/輸出(Audio Inputs and Outputs)

音頻的輸入輸出也是一個設(shè)備的物理連接頭。 視頻采集設(shè)備有輸入(必須的),(若有輸出就有輸出?既是0個或多個的意思?)輸出設(shè)備有輸出(這...)。無線接收裝置是沒有音頻輸入或輸出的(就是個電磁信號)。他們必定擁有一個調(diào)頻頭,這也是他們的音頻信號來源!但是對于本API,調(diào)頻頭只是相對于視頻的輸入、輸出的,音頻設(shè)備是沒有這些個的。TV卡上的回環(huán)接頭,就是接收音頻信號并將它們發(fā)到聲卡上變成聲音,卻沒有被當(dāng)成音頻輸出。

音視頻的輸入輸出是有聯(lián)系的。想想也是,視頻源通常夾雜音頻信號。當(dāng)視頻和音頻源是個高頻頭(可參見百科)時,這就更加明顯了。假設(shè)存在有兩個混合視頻輸入,兩個音頻輸入,可以想見會有4種組合狀況。視頻和音頻接頭間的關(guān)系,分別定義在結(jié)構(gòu)體v4l2_input(源碼在Videodev2.h中)和v4l2_output的audioset域中,其每一位(從零開始)都代表著是輸入還是輸出的索引。

struct v4l2_input{

__u32    index;          Identifies the input, set by the                           application.

__u8     name[32];           Name of the video input, a                                     NUL-terminated ASCII string, for                               example: "Vin (Composite 2)".

                            This information is intended for the                           user, preferably the connector label on                           the device itself.   

__u32    type;           /*  Type of input */

   __u32    audioset;       /*  Associated audios (bitfield) */

                                Drivers can enumerate up to 32 video   and audio inputs. This field shows which          audio inputs were selectable as audio source if this was the currently                       selected video input. It is a bit mask.       The LSB corresponds to audio input 0,   the MSB to input 31. Any number of bits   can be set, or none.

                                When the driver does not enumerate     audio inputs no bits must be set.                    Applications shall not interpret this as lack of audio support. Some drivers                    automatically select audio sources and    do not enumerate them since there is no               choice anyway.

                            For details on audio inputs and how    to select the current input see Section           1.5.

   __u32    tuner;             /*  Associated tuner */

                                Capture devices can have zero or more tuners (RF demodulators). When the type    is set to V4L2_INPUT_TYPE_TUNER this is   an RF connector and this field                      identifies the tuner. It corresponds to   struct v4l2_tuner field index. For                details on tuners see Section 1.6.

    v4l2_std_id   std;          Every video input supports one or more different video standards. This                 field is a set of all supported standards.    For details on video standards and how         to switch see Section 1.7.

    __u32      status;         This   field provides status    information about the input. See Table                       3 for flags. Status is only valid when    this is the current input.

    __u32    reserved[4];       Reserved for future extensions.    Drivers must set the array to zero.

};

 

如果想去知道可用的輸入、輸出數(shù)量和屬性,應(yīng)用程序可以分別通過使用ioctl的VIDIOC_ENUMAUDIO和VIDIOC_ENUMAUDOUT方法來枚舉他們。當(dāng)正在使用中的設(shè)備被查詢時,由VIDIOC_ENUMAUDOUT方法返回的v4l2_audio結(jié)構(gòu)中包含了可用的信號狀態(tài)信息。

 

struct v4l2_audio{

   __u32   index;            Identifies the audio input, set by the                                 driver or Application.

 

   __u8  name[32];          Name of the audio input, a                                         NUL-terminated ASCII string, for                                   example: "Line In". This information is                              intended for the user, preferably the                              connector label on the device itself.

 

   __u32   capability;      Audio capability flags, see Table 2.

        __u32  mode;             Audio mode flags set by drivers and                                    applications (on VIDIOC_S_AUDIO ioctl),                               see Table 3.

 

   __u32   reserved[2];     Reserved for future extensions. Drivers   and applications must set the array to                zero.

};

 

Ioctl的VIDIOC_G_AUDIO和VIDIOC_G_AUDOUT方法會分別返回當(dāng)前音頻的輸入和輸出。和VIDIOC_G_INPUT,VIDIOC_G_OUTPUT不同,他們不僅僅返回個索引,而是類似VIDIOC_ENUMAUDIO和VIDIOC_ENUMDOUT返回的結(jié)構(gòu)體。

意欲選擇音頻的輸入或者是改變其屬性,應(yīng)用程序可以調(diào)用ioctl的VIDIOC_S_AUDIO方法。同樣的如果想選擇音頻輸出(要知道他們是沒有可變屬性的),則可以調(diào)用VIDIOC_S_AUDOUT方法。

當(dāng)設(shè)備具有一個或多個輸入、輸出時,驅(qū)動就必須實現(xiàn)所有相應(yīng)的ioctl方法!如果設(shè)備具有任何音頻輸入或者輸出,驅(qū)動就必須設(shè)置由VIDIOC_QUERYCAP方法返回的v4l2_capability結(jié)構(gòu)中V4L2_CAP_AUDIO標(biāo)志位。

 

struct v4l2_capability{

       __u8   driver[16];          Name of the driver, a unique                                   NUL-terminated ASCII string. For                                   example: "bttv". Driver specific                                  applications can use this information to                             verify the driver identity.

                                   It is also useful to work around                                   known bugs, or to identify drivers in                              errorr eports.

                                   The driver version is stored in the                                version field. Storing strings in fixed                               sized arrays is bad practice but                                  unavoidable here. Drivers and                                      applications should take precautions to                               never read or write beyond the end of the                                 array and to make sure the strings are                               properly NUL-terminated.

 

        __u8   card[32];            Name of the device, a NUL-terminated                               ASCII string. For example: "Yoyodyne                                  TV/FM". One driver may support different                                brands or models of video hardware. This                               information is intended for users, for                                example in a menu of available devices.

                                   Since multiple TV cards of the same                                brand may  be installed which are                                  supported by the same driver, this name                               should be combined with the character                             device file name (e. g. /dev/video2) or                               the bus_info string to avoid                                       ambiguities.

 

       __u8   bus_info[32];        Location of the device in the system,                              a NUL-terminated ASCII string. For                                    example: "PCI Slot 4". This information                               is intended for users, to distinguish                                 multiple identical devices. If no such                                 information is available the field may                                simply count the devices controlled by                               the driver, or contain the empty string                                 (bus_info[0] = 0).

 

       __u32   version;            Version number of the driver.                                  Together with the driver field this                                   identifies a particular driver.

                                    The version number is formatted                                     using the KERNEL_VERSION() macro:

    #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) __u32         version = KERNEL_VERSION

   __u32  capabilities;        Device capabilities, see Table 2.

 

       __u32  reserved[4];             Reserved for future extensions.                                    Drivers must set this array to zero.

};    

#define V4L2_CAP_AUDIO          0x00020000  /* has audio support */

 

Table 2. Device Capabilities Flags

V4L2_CAP_VIDEO_CAPTURE 0x00000001     The device supports the Video                                      Capture interface.

V4L2_CAP_VIDEO_OUTPUT   0x00000002     The device supports the Video                                      Output interface.

V4L2_CAP_VIDEO_OVERLAY 0x00000004     The device supports the Video                                      Overlay interface.

A video overlay device typically stores captured images directly in the video memory   of a graphics card,with hardware clipping and scaling.

V4L2_CAP_VBI_CAPTURE     0x00000010 The device supports the Raw                                            VBI Capture interface, providing                                      Teletext and Closed Caption                                          data.

V4L2_CAP_VBI_OUTPUT     0x00000020      The device supports the Raw                                            VBI Output interface.

V4L2_CAP_SLICED_VBI_CAPTURE  0x00000040 The device supports the Sliced VBI Capture interface.

V4L2_CAP_SLICED_VBI_OUTPUT   0x00000080 The device supports the Sliced VBI Output interface.

V4L2_CAP_RDS_CAPTURE    0x00000100          [to be defined]

 

Example 1-3. Information about the current audio input

struct v4l2_audio audio;

memset (&audio, 0, sizeof (audio));

if (-1 == ioctl (fd, VIDIOC_G_AUDIO, &audio)) {

    perror ("VIDIOC_G_AUDIO");

    exit (EXIT_FAILURE);

}

printf ("Current input: %s\n", audio.name);

 

Example 1-4. Switching to the first audio input

struct v4l2_audio audio;

memset (&audio, 0, sizeof (audio)); /* clear audio.mode, audio.reserved */

audio.index = 0;

if (-1 == ioctl (fd, VIDIOC_S_AUDIO, &audio)) {

    perror ("VIDIOC_S_AUDIO");

    exit (EXIT_FAILURE);

}

1.6.  高頻頭和調(diào)制器(Tuners and Modulators)

1.6.1.  高頻頭(Tuners)

視頻輸入設(shè)備可能有一個或多個高頻頭來解調(diào)RF(射頻)信號。VIDIOC_ENUMINPUT方法會返回type域被設(shè)置成V4L2_INPUT_TYPE_TUNER的v4l2_input結(jié)構(gòu)體,且其中的tuner域也包含著tuner的索引號碼。

無線發(fā)射設(shè)備通常只有索引號為0的這么一個tuner,同時沒有任何視頻輸入。

應(yīng)用程序可以分別通過使用VIDIOC_G_TUNER和VIDIOC_S_TUNER方法來查詢和改變tuner的屬性。當(dāng)正在使用中的設(shè)備被查詢時,由VIDIOC_G_TUNER方法返回的v4l2_tuner結(jié)構(gòu)中包含了可用的信號狀態(tài)信息。需要注意的是,當(dāng)擁有多個tuner時VIDIOC_S_TUNER并不會切換當(dāng)前的tuner。其實這個tuner是由當(dāng)前的視頻輸入唯一確定的。當(dāng)設(shè)備含有一個或多個tuner時,驅(qū)動就必須支持ioctl方法和提供設(shè)置由VIDIOC_QUERYCAP返回的v4l2_capability中V4L2_CAP_TUNER標(biāo)志。

...

#define VIDIOC_G_TUNER      _IOWR(‘V’, 29, struct v4l2_tuner)

#define VIDIOC_S_TUNER      _IOW(‘V’, 30,  struct v4l2_tuner)

...

1.6.2.  調(diào)制器(Modulators)

視頻輸出設(shè)備可以有一個或多個調(diào)制器,他可以將視頻信號調(diào)制成TV電線的解說信號,或者是視頻記錄器的。每個調(diào)制器是和一個或多個視頻輸出相關(guān)聯(lián)的,而關(guān)聯(lián)的數(shù)量取決于RF射頻連接頭的數(shù)量。

VIDIOC_ENUMOUTPUT方法返回的v4l2_output結(jié)構(gòu)中的type域會被設(shè)置成V4L2_OUTPUT_TYPE_MODULATOR,而他的modulator域包含了modulator的索引號。規(guī)范并沒有定義無線輸出設(shè)備。

   

struct v4l2_output {

    __u32        index;     /*  Which output */

    __u8         name[32];  /*  Label */

    __u32        type;          /*  Type of output */

    __u32        audioset;  /*  Associated audios (bitfield) */

    __u32        modulator;     /*  Associated modulator */

    v4l2_std_id  std;

    __u32        reserved[4];

};

應(yīng)用程序可以使用VIDIOC_G_MODULATOR和VIDIOC_S_MODULATOR方法來查詢和改變modulator的屬性。需要注意的是,當(dāng)擁有多個tuner時VIDIOC_S_MODULATOR并不會切換當(dāng)前的modulator。其實這個modulator是由當(dāng)前的視頻輸入唯一確定的.當(dāng)設(shè)備含有一個或多個modulator時,驅(qū)動就必須支持ioctl方法和提供設(shè)置由VIDIOC_QUERYCAP返回的v4l2_capability中V4L2_CAP_MODULATOR標(biāo)志。

1.6.3.  無線頻率(Radio Frequency)

struct v4l2_frequency {

__u32    tuner;             The tuner or modulator index number. This is the same value as in the struct v4l2_input tuner field and the struct v4l2_tuner index field, or the struct v4l2_output modulator field and the

                           struct v4l2_modulator index field.

 

enum v4l2_tuner_type  type;     The tuner type. This is the same value as in the struct v4l2_tuner type field. The field is not applicable to modulators, i.e.ignored by drivers.

 

__u32    frequency;         Tuning frequency in units of 62.5 kHz, or if the struct v4l2_tuner or struct v4l2_modulator capabilities flag V4L2_TUNER_CAP_LOW is set, in units of 62.5 Hz.

 

__u32    reserved[8];        Reserved for future extensions. Drivers and applications must set the array to zero.

};

 

應(yīng)用程序可以使用VIDIOC_G_FREQUENCY和VIDIOC_S_FREQUENCY方法來獲得和設(shè)置tuner或者modulator的無線頻率。這些個方法同樣適用于TV和無線設(shè)備。當(dāng)提供tuner和modulator的ioctl方法時,驅(qū)動就必須實現(xiàn)相關(guān)方法。

1.6.4.  衛(wèi)星接收器(Satellite Receivers)

    將要討論??梢詤⒁奝eter Schlaf的建議,位于郵件列表:video4linux-list@上,發(fā)表于2002年10月23號,主題是:"Re: [V4L] Re: v4l2 api"。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多