天天看點

v4l2 spec 中文 Ch01【轉】 Chapter 1. 通用APICommon API Elements

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t0">Chapter 1 通用APICommon API Elements</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t1">1  打開和關閉裝置Opening and Closing Devices</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t2">11  裝置命名Device Naming</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t3">12  相關裝置Related Devices</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t4">13  并發打開Multiple Opens</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t5">14  共享資料流Shared Data Streams</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t6">15  函數Functions</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t7">2  功能查詢Querying Capabilities</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t8">3  應用程式的優先級Application Priority</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t9">4  視訊輸入輸出Video Inputs and Outputs</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t10">5  音頻輸入輸出Audio Inputs and Outputs</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t11">6  高頻頭和調制器Tuners and Modulators</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t12">61  高頻頭Tuners</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t13">62  調制器Modulators</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t14">63  無線頻率Radio Frequency</a>

<a href="http://blog.csdn.net/wuhzossibility/article/details/6638245#t15">64  衛星接收器Satellite Receivers</a>

Revision 0.24

Michael H Schimek

<a href="mailto:[email protected]" target="_blank">[email protected]</a>

Bill Dirks

Hans Verkuil

Martin Rubli

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

v4l2全五章下載下傳位址

<a href="http://download.csdn.net/detail/wuhzossibility/5154824" target="_blank">v4l2 中文pdfChapter all</a>

程式設計以支援一個V4l2的裝置包含以下步驟

.打開裝置

.改變裝置的屬性選擇音頻和視訊輸入視訊的标準編碼格式圖檔的亮度等

.協商資料格式

.協商輸入/輸出的方法

.輸入/輸出循環

.關閉裝置

V4L2以子產品的方式在核心中實作可以被管理者手動的加載或者是當裝置第一次打開時被加載。驅動子產品被挂在核心子產品"videodev"下。在這份文檔中提供了輔助函數和一個通用的應用程式接口規範。

每個驅動加載時都會用主裝置号81和次裝置号0-255來注冊一個或多個裝置節點。該如何配置設定次裝置号給這些個V4L2裝置完全取決與系統管理者這主要是為了解決裝置間的沖突為了區分不同的裝置1。當選定次裝置号後子產品将會以"_nr"為字首來命名特殊的裝置檔案名。舉個例子來說,像"video_nr"就是代表視訊采集裝置的在核心中表示為/dev/video。數字則是和裝置類型相關并基于次裝置号的一個偏移2。

當驅動支援同一型号的多個裝置時這時就可以賦予多個次裝置号了并以逗号隔開

&gt; 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             ‚

當應用程式試圖打開主裝置号81次裝置号0,1,64時會加載驅動"mydriver"

‚注冊前兩個視訊采集裝置時是從主裝置号0開始的接着是1...一直到63而音頻裝置則是從次裝置64開始的。

    如果未顯式給定次裝置号那麼子產品将提供一個預設值。第四章将闡述不同型号裝置的起始次裝置号。顯然次裝置号必須是獨一無二的。假如所請求的裝置号正在使用時很明顯起沖突的裝置将不會被注冊。

   安裝慣例系統管理者會根據主、次裝置号在/dev目錄下建立不同功用的特殊裝置檔案。檔案名字則建議有别于列在第四章的V4L2裝置名。

用指令mknod建立的字元裝置擁有特權操作并且這些裝置是不能通過主、次裝置号打開的。這就意味着應用程式是不能可靠的掃描已加載或者是安裝的驅動的。使用者必須鍵入裝置名或者應用程式會嘗試預設的裝置名。

在裝置檔案系統devfs下次裝置号是被忽略的明顯的在其下我們隻要知道裝置的功能主裝置号就提供這樣的作用。V4L2驅動會自動的在/dev/v4l目錄下用預設的裝置名建立所請求的裝置檔案。

驅動通常都能支援許多相關的功能。有個例子說視訊采集直接傳輸視訊視訊垂直消隐信号采集

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

注V4L2所提供的接口

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

2. 視訊輸出接口(video output interface):可以驅動計算機的外圍視訊圖像裝置--像可以輸出電視信号格式的裝置.         

3. 直接傳輸視訊接口(video overlay interface):它的主要工作是把從視訊采集裝置采集過來的信号直接輸出到輸出裝置之上,而不用經過系統的CPU.         

4. 視訊間隔消隐信号接口(VBI interface):它可以使應用可以通路傳輸消隐期的視訊信号.           

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

V4L和早前的V4L2版本視訊采集和overlay是使用相同的裝置名相同的次裝置号但是卻有别于VBIVertial Blanking Interval。實踐表明這種方法擁有衆多問題3更糟糕的是V4L的videodev模型是禁止同時多次打開裝置的。

作為補救措施目前的V4L2版本是通過特定的名字和次裝置号放寬了裝置類型的概念。為了保持和舊的應用程式的相容性驅動必須依舊注冊不同的次裝置号并制定一個預設的對應功能給這個裝置major代表一類裝置minor這是用來給核心區分一類裝置的不同執行個體或者功能。這樣major代表一個班級那麼minor就是用來告訴校長這班級中的某個學生。但是如果驅動支援相關功能就必須在所注冊的次裝置号下實作這個功能就是說為了支援老版應用像mjpg-server你必須為這類裝置提供一個minor以支援預設的功能但他有新的作用你也必須給予支援。在第四章提及的一些功能可以在打開的時候進行選擇。

想象一下一個驅動支援視訊采集直接視訊傳輸視訊間隔消隐信号和FM收音機。他用0,64,224這種編碼格式是為保相容性從V4L API中繼承下來的次裝置号注冊了三個裝置。不管/dev/video(81,0)或者/dev/vbi(81,224)是否處于打開狀态應用程式都可以從這三種裝置中選擇某項功能。不通過程式設計就是說0直接用指令dd和cat/dev/video就可采集視訊圖檔通過/dev/vbi來獲得原始的視訊間隔消隐信号。 /dev/radio81,64是一個不變的無線裝置因而和視訊部分的功能并沒有聯系。但是沒有互相的關聯并不意味着你可以同時使用它們。當你用open()調用時很有可能傳回裝置忙--EBUSY的錯誤代碼。

除視訊的輸入輸出外硬體可能也支援抽樣甚至是回放功能VLC貌似就是這樣的。如果真是這樣那麼這些功能會被實作為OSSOpen Sound System或者ALSA Advanced Linux Sound ArchitecturePCM裝置最終可能是OSS或者的混合體。V4L2 API并未做任何假設來發現這些有互相關系的裝置。

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

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

    通常V4l2裝置可被多次打開的。當這被驅動支援時使用者可以例子說嘛你可以設計一個面闆程式比如有些按鈕可以調節亮暗或者音量啊而與此同時另一個應用程式卻正在采集音視訊。換句話說面闆程式就被比作了OSS或者ALSA混合應用了。當一個裝置支援多項功能像采集啊且能同時直接接傳輸啊神馬的Multiple Opens允許fork出程序或特定的應用程式達到并發的使用裝置。

Multiple Opens是可選的驅動應該至少允許在沒資料交換的情況下支援并發通路例子就是上面的面闆程式。這意味着當裝置正在使用中時open()可傳回EBUSY錯誤代碼ioctl()函數的初始化資料交換也就是VIDIOC_S_FMT ioctl,read(),write()函數亦是如此。

隻不過打開一個V4L2裝置并不允許互斥存取4。然而初始化資料交換賦予讀和寫資料的請求類型的權利。

也可以改變相關屬性檔案描述符。應用程式可以通過在1.3節描述的優先級機制請求額外的通路權限。                          

V4L2驅動不應該支援在一個裝置上通過拷貝緩沖對同一資料流進行多應用程式的讀或寫或者是時分複用亦或是其他相似的方法。非要這麼幹可以使用在使用者空間的代理程式。如果驅動支援流共享那麼其實作必須是透明的。V4L2 API 并沒有列出産生沖突時要如何來解決。

應用程式可以使用open()和close()函數來打開、關閉V4L2裝置都是雷同的。下面幾小節将介紹裝置程式設計所用到的ioctl()方法。

因為啊人都想做大嘛這個V4l2 涉及了各式各樣的裝置但是呢這個API接口卻并不能都适合這些個繁雜的裝置。是以相同類型的裝置就可能擁有完全不一樣的能力是以這份規範也允許忽略一些複雜且不那麼重要的API接口。

ioctl的VIDIOC_QUERYCAP選項是用來檢查核心裝置是不是和這份規範相相容滴也可以順便看看這些裝置所能夠支援的函數和I/O方法一舉兩得。其他的特性嘛也可以依葫蘆畫瓢調用各自的ioctl方法例子麼想知道裝置上的視訊連接配接頭的名字啊型号和數量神馬的就可以調用ioctl的VIDIOC_ENUMINPUT方法.盡管API主要功用是--抽象模糊底層硬體但是ioctl方法是允許驅動特定的應用程式來可靠的辨識相應的驅動的。

但是所有的V4l2驅動都必須支援VIDIOC_QUERYCAP這個方法顯而易見的。應用程式都應該在打開裝置之後就調用這個方法。

當多個程式共享一個裝置時你可能就希望配置設定給他們不同的優先級想想為什麼封建社會的把人分成三六九等雖然不人道但有一方面執政者是希望管理起來友善。不同于傳統"rm -rf /"(移除根目錄下的一切系統需要核心+檔案系統這麼做告訴你不存在阻塞)思想視訊記錄程式可能阻止其他的應用程式使他們失去對視訊的控制,不能換電視台(一個勁的放廣告這擱誰他也受不鳥啊)。

另一個目的就是允許被使用者控制的應用程式對可工作在背景的低優先級的應用進行搶占然後被搶占的在稍後一點的時間重新獲得對裝置的控制權。

鑒于這些個特性是不可能都在使用者空間中實作的V4L2就定義了ioctl的VIDIOC_G_PRIORITY和VIDIOC_S_PRIORITY方法來請求和查詢通路檔案描述符的優先級。因為有些個驅動并不支援這倆個方法為保持和V4L2的早期版本的相容性會在打開裝置時預設的給他們個中間的優先級。再通過VIDIOC_QUERYCAP後應用程式通常會調用VIDIOC_S_PRIORITY請求一個其他的優先級。

如果ioctls在其他程式擁有更高的優先級時用諸如VIDIOC_S_INPUT方法去改變驅動的屬性會傳回的錯誤代碼。事件機制如盤的熱插拔他會在使用者空間中彈出個東東告訴你US13來了會通知應用程式有人在别的地方想篡改屬性但是還沒添加呢(您老給看看怎麼辦呗)

視訊的輸入和輸出就是裝置上的實體連接配接頭。例子是RF紅外頭複合視訊頭不知是啥玩意w-Video或者RGB連接配接頭。收音機就沒有視訊輸入、輸出了。

如果想去了解可用數量的輸入和輸出屬性應用程式可以分别使用ioctl的VIDIOC_ENUMINPUT和VIDIOC_ENUMOUTPUT方法來枚舉來檢視。當目前的視訊輸入被查詢的時候Ioctl的VIDIOC_ENUMINPUT方法會傳回v4l2_input結構體它包含了可用的信号狀态資訊。

Ioctl的VIDIOC_G_INPUT和VIDIOC_G_OUTPUT方法會傳回目前視訊的輸入、輸出索引。為選擇不同的輸入、輸出應用程式可以使用ioctl的VIDIOC_S_INPUT和VIDOC_S_OUTPUT方法。當裝置有一個或多個輸入時驅動就必須實作所有的輸入類ioctl方法對于輸出也是同樣的。

Example 1-1. Information about the current video input

struct v4l2_input input;

int index;

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

    perror("VIDIOC_G_INPUT");

    exit(EXIT_FAILURE);

}

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

input.index = index;

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

    perror("VIDIOC_ENUMINPUT");

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

Example 1-2. Switching to the first video input

index = 0;

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

    perror("VIDIOC_S_INPUT");

音頻的輸入輸出也是一個裝置的實體連接配接頭。 視訊采集裝置有輸入必須的若有輸出就有輸出既是0個或多個的意思輸出裝置有輸出這...。無線接收裝置是沒有音頻輸入或輸出的就是個電磁信号。他們必定擁有一個調頻頭這也是他們的音頻信号來源但是對于本API調頻頭隻是相對于視訊的輸入、輸出的音頻裝置是沒有這些個的。TV卡上的回環接頭就是接收音頻信号并将它們發到聲霸卡上變成聲音卻沒有被當成音頻輸出。

音視訊的輸入輸出是有聯系的。想想也是視訊源通常夾雜音頻信号。當視訊和音頻源是個高頻頭可參見百科時這就更加明顯了。假設存在有兩個混合視訊輸入兩個音頻輸入可以想見會有4種組合狀況。視訊和音頻接頭間的關系分别定義在結構體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.

};

如果想去知道可用的輸入、輸出數量和屬性應用程式可以分别通過使用ioctl的VIDIOC_ENUMAUDIO和VIDIOC_ENUMAUDOUT方法來枚舉他們。當正在使用中的裝置被查詢時由VIDIOC_ENUMAUDOUT方法傳回的v4l2_audio結構中包含了可用的信号狀态資訊。

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方法會分别傳回目前音頻的輸入和輸出。和VIDIOC_G_INPUT,VIDIOC_G_OUTPUT不同他們不僅僅傳回個索引而是類似VIDIOC_ENUMAUDIO和VIDIOC_ENUMDOUT傳回的結構體。

意欲選擇音頻的輸入或者是改變其屬性應用程式可以調用ioctl的VIDIOC_S_AUDIO方法。同樣的如果想選擇音頻輸出要知道他們是沒有可變屬性的則可以調用VIDIOC_S_AUDOUT方法。

當裝置具有一個或多個輸入、輸出時驅動就必須實作所有相應的ioctl方法如果裝置具有任何音頻輸入或者輸出驅動就必須設定由VIDIOC_QUERYCAP方法傳回的v4l2_capability結構中V4L2_CAP_AUDIO标志位。

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) &lt;&lt; 16) + ((b) &lt;&lt; 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 (&amp;audio, 0, sizeof (audio));

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

    perror ("VIDIOC_G_AUDIO");

    exit (EXIT_FAILURE);

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

Example 1-4. Switching to the first audio input

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

audio.index = 0;

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

    perror ("VIDIOC_S_AUDIO");

視訊輸入裝置可能有一個或多個高頻頭來解調RF射頻信号。VIDIOC_ENUMINPUT方法會傳回type域被設定成V4L2_INPUT_TYPE_TUNER的v4l2_input結構體且其中的tuner域也包含着tuner的索引号碼。

無線發射裝置通常隻有索引号為0的這麼一個tuner同時沒有任何視訊輸入。

應用程式可以分别通過使用VIDIOC_G_TUNER和VIDIOC_S_TUNER方法來查詢和改變tuner的屬性。當正在使用中的裝置被查詢時由VIDIOC_G_TUNER方法傳回的v4l2_tuner結構中包含了可用的信号狀态資訊。需要注意的是當擁有多個tuner時VIDIOC_S_TUNER并不會切換目前的tuner。其實這個tuner是由目前的視訊輸入唯一确定的。當裝置含有一個或多個tuner時驅動就必須支援ioctl方法和提供設定由VIDIOC_QUERYCAP傳回的v4l2_capability中V4L2_CAP_TUNER标志。

...

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

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

視訊輸出裝置可以有一個或多個調制器他可以将視訊信号調制成TV電線的解說信号或者是視訊記錄器的。每個調制器是和一個或多個視訊輸出相關聯的而關聯的數量取決于RF射頻連接配接頭的數量。

VIDIOC_ENUMOUTPUT方法傳回的v4l2_output結構中的type域會被設定成V4L2_OUTPUT_TYPE_MODULATOR,而他的modulator域包含了modulator的索引号。規範并沒有定義無線輸出裝置。

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];

應用程式可以使用VIDIOC_G_MODULATOR和VIDIOC_S_MODULATOR方法來查詢和改變modulator的屬性。需要注意的是當擁有多個tuner時VIDIOC_S_MODULATOR并不會切換目前的modulator。其實這個modulator是由目前的視訊輸入唯一确定的.當裝置含有一個或多個modulator時驅動就必須支援ioctl方法和提供設定由VIDIOC_QUERYCAP傳回的v4l2_capability中V4L2_CAP_MODULATOR标志。

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.

應用程式可以使用VIDIOC_G_FREQUENCY和VIDIOC_S_FREQUENCY方法來獲得和設定tuner或者modulator的無線頻率。這些個方法同樣适用于TV和無線裝置。當提供tuner和modulator的ioctl方法時驅動就必須實作相關方法。

    将要讨論。可以參見Peter Schlaf的建議位于郵件清單[email protected]上發表于2002年10月23号主題是"Re: [V4L] Re: v4l2 api"。

本文轉自張昺華-sky部落格園部落格原文連結http://www.cnblogs.com/sky-heaven/p/6903325.html如需轉載請自行聯系原作者

繼續閱讀