Portál AbcLinuxu, 4. května 2025 23:56

Jaderné noviny - Video4Linux2 - 4: vstupy a výstupy

16. 1. 2007 | Robert Krátký
Články - Jaderné noviny - Video4Linux2 - 4: vstupy a výstupy  

Čtvrtý článek z nepravidelné série o psaní video ovladačů pro Linux. Tato část popisuje, jak může aplikace zjistit, jaké vstupy a výstupy daný adaptér poskytuje, a jak si z nich vybrat.

Pokud jste ještě nečetli první díl, možná by stálo zato začít tam.

V mnoha případech videoadaptér příliš možností vstupu a výstupu nenabízí. Například řadič kamery může nabízat samotnou kameru a nic moc dalšího. V jiných případech je však situace komplikovanější. TV karta může mít několik vstupů odpovídajících různým konektorům na desce; může mít dokonce i více tunerů schopných nezávislého fungování. Tyto vstupy někdy mívají odlišné charakteristiky; některé mohou být schopny naladit širší rozsah video standardů než ostatní. Totéž platí pro výstupy.

Je zřejmé, že aby mohla aplikace videoadaptér plně využívat, musí mít možnost se dozvědět o dostupných vstupech a výstupech a zároveň ji musí být umožněno si zvolit ten, se kterým si přeje pracovat. Pro tento účel nabízí Video4Linux2 API tři různá ioctl() volání pro vstupy a tři pro výstupy. Ovladače by měly implementovat všechny tři (pro každou z podporovaných funkcí). U jednoduchého hardwaru jde většinou o jednoduchý kód. Kromě toho by ovladače měly poskytovat rozumné výchozí hodnoty nastavené po zapnutí. Co by však ovladače dělat neměly, to je reset informací o vstupu a výstupu po ukončení aplikace; podobně jako u dalších video parametrů by tato nastavení měla zůstat zachována.

Video standardy

Než se však dostaneme k podrobnostem o vstupech a výstupech, musíme se podívat na video standardy. Tyto standardy popisují, jak je videosignál formátován pro přenos - rozlišení, počet snímků za vteřinu atd. Většinou jsou standardy určovány příslušnými úřady v každé zemi. Na světě se používají tři hlavní typy video standardů: NTSC (používán převážně v Severní Americe), PAL (většina Evropy, Afrika a Asie) a SECAM (Francie, Rusko, části Afriky). V různých zemích se však standardy mírně liší a některá zařízení jsou v tomto ohledu přizpůsobivější než jiná.

Vrstva V4L2 reprezentuje video standardy pomocí typu v4l2_std_id, což je 64bitová maska. Každá varianta je pak jeden bit masky. Takže "standard" NTSC je V4L2_STD_NTSC_M s hodnotou 0x1000, ale japonská varianta je V4L2_STD_NTSC_M_JP (0x2000). Pokud si zařízení poradí se všemi variantami NTSC, může nastavit typ standardu V4L2_STD_NTSC, který má nastaveny všechny relevantní bity. Podobné sady bitů jsou k dispozici pro varianty PAL a SECAM. Vizte kompletní seznam.

Pro uživatelský prostor poskytuje V4L2 ioctl() příkaz (VIDIOC_ENUMSTD), který aplikaci umožňuje zjistit, které standardy zařízení implementuje. Ovladač nemusí na takovou otázku odpovídat přímo - místo toho prostě naplní pole tvnorm struktury video_device všemi standardy, které podporuje. Vrstva V4L2 pak pro aplikaci vyčlení podporované standardy. Příkaz VIDIOC_G_STD, používaný pro zjišťování toho, který standard je právě aktivní, je v rámci vrstvy V4L2 také obsluhován vracením příslušné hodnoty v poli current_norm struktury video_device. Při spuštění by měl ovladač inicializovat current_norm, aby odpovídalo skutečnosti; některé aplikace jsou zmateny, pokud není nějaký standard nastaven - ačkoliv samy žádný nenastavovaly.

Pokud si chce aplikace vyžádat určitý standard, použije volání VIDIOC_S_STD, které je ovladači předáno prostřednictvím:

    int (*vidioc_s_std) (struct file *file, void *private_data,
                         v4l2_std_id std);

Ovladač by měl hardware naprogramovat tak, aby použil daný standard a vrátil nulu (nebo záporný chybový kód). Vrstva V4L2 se postará o nastavení current_norm na novou hodnotu.

Aplikace by mohla chtít vědět, jaký signál vlastně hardware na svém vstupu vidí. Odpověď lze nalézt pomocí VIDIOC_QUERYSTD, který k ovladači přistupuje takto:

    int (*vidioc_querystd) (struct file *file, void *private_data,
                            v4l2_std_id *std);

Ovladač by měl toto pole vyplnit co nejpodrobněji. Pokud hardware neposkytuje moc informací, pole std by mělo ukazovat některý ze standardů, které by to mohly být.

Za zmínku ještě stojí jedna věc: všechna video zařízení musí podporovat (nebo alespoň tvrdit, že podporují) přinejmenším jeden standard. Video standardy sice nedávají smysl u kamer, které nejsou vázány na nějaké konkrétní předpisy, ale neexistuje žádný standard, který by říkal "Jsem kamera a umím skoro všechno, co si můžeš přát". Takže vrstva V4L2 má několik ovladačů, které tvrdí, že vracejí buď PAL nebo NTSC data.

Vstupy

Aplikace pro získávání videa začne očíslováním dostupných video vstupů pomocí příkazu VIDIOC_ENUMINPUT. V rámci vrstvy V4L2 bude tento příkaz převeden na volání odpovídajícího zpětného volání ovladače:

    int (*vidioc_enum_input)(struct file *file, void *private_data,
			     struct v4l2_input *input);

V tomto volání je file to otevřené video zařízení a private_data je soukromé pole nastavené ovladačem. Skutečné informace jsou předávány struktuře input; má několik polí, která nás zajímají:

Za normálních okolností nastaví ovladač všechna uvedená pole a vrátí nulu. Je-li index mimo rozsah podporovaných vstupů, bude vrácena -EINVAL; nic moc dalšího už se u tohoto volání pokazit nemůže.

Když chce aplikace aktuální vstup změnit, obdrží ovladač volání svého zpětného volání vidioc_s_input():

    int (*vidioc_s_input) (struct file *file, void *private_data, 
                           unsigned int index);

Hodnota index má stejný význam jako předtím - určuje vstup, o který má aplikace zájem. Ovladač by měl hardware naprogramovat tak, aby tento vstup použil a vrátil nulu. Další možné hodnoty jsou -EINVAL (v případě nesmyslného indexového čísla) nebo -EIO (pro potíže s hardwarem). Toto zpětné volání by ovladače měly implementovat i v případě, že podporují jen jediný vstup.

K dispozici je také zpětné volání pro zjištění toho, který vstup je právě aktivní:

    int (*vidioc_g_input) (struct file *file, void *private_data, 
                           unsigned int *index);

V tomto případě ovladač nastaví *index na indexové číslo právě aktivního vstupu.

Výstupy

Proces číslování a vybírání výstupů je velmi podobný jako u vstupů, takže popis bude stručnější. Zpětné volání pro očíslování výstupů vypadá takto:

    int (*vidioc_enumoutput) (struct file *file, void *private_data
    			      struct v4l2_output *output);

Pole struktury v4l2_output jsou:

K dispozici jsou rovněž zpětná volání pro nastavování a zjišťování aktuálního nastavení výstupů; odpovídají zpětným voláním u vstupů:

    int (*vidioc_g_output) (struct file *file, void *private_data, 
                            unsigned int *index);
    int (*vidioc_s_output) (struct file *file, void *private_data, 
                            unsigned int index);

Všechna zařízení, která podporují výstup videa, by měla mít každé z těchto tří zpětných volání definována - i když je možný jen jediný výstup.

Jsou-li tyto metody po ruce, může V4L2 aplikace zjistit, které vstupy a výstupy jsou na daném zařízení dostupné, a vybrat si z nich. Trochu komplikovanější je pak určování, jaký druh video dat těmito vstupy a výstupy teče. Další díl tohoto seriálu se zaměří na video formáty a to, jak se na video formátu dohodnout s uživatelským prostředím.

Seriál Video4Linux2 (dílů: 9)

První díl: Jaderné noviny - Video4Linux2 API: úvod, poslední díl: Jaderné noviny - Video4Linux2 - 7 (ovládání).
Předchozí díl: Jaderné noviny - Video4Linux2 - 3: základní práce s ioctl()
Následující díl: Jaderné noviny - Video4Linux2 - 5a (barvy a formáty)

Související články

Jaderné noviny - 13. 12. 2006
Jaderné noviny - 6. 12. 2006
Jaderné noviny - 29. 11. 2006
Jaderné noviny - 21. 11. 2006

Odkazy a zdroje

Video4Linux2 part 4: inputs and outputs

Další články z této rubriky

Jaderné noviny – přehled za březen 2025
Jaderné noviny – přehled za únor 2025
Jaderné noviny – přehled za leden 2025
Jaderné noviny – přehled za prosinec 2024
Jaderné noviny – přehled za listopad 2024

Diskuse k tomuto článku

17.1.2007 08:56 myles | skóre: 8 | blog: Zápisníček
Rozbalit Rozbalit vše Re: Jaderné noviny - Video4Linux2 - 4: vstupy a výstupy
Odpovědět | Sbalit | Link | Blokovat | Admin
Pouzivam kartu Leadtek DTV2000H. Je to hybrid. Nevedel by nekdo jak prepinat tuto kartu mezi analog a digital? Karta se po restartu systemu jakoby vyrestartuje a prepne se pravdepodobne do digitalu, ktery tu zatim u nas neni. Jeste vcera jsem fungoval v analogu, stanice nalazene. Ted obraz sumi a nic. :-(
17.1.2007 09:10 myles | skóre: 8 | blog: Zápisníček
Rozbalit Rozbalit vše Re: Jaderné noviny - Video4Linux2 - 4: vstupy a výstupy
Tak se omlouvam. Spatne jsem koukal. Vyse popsany problem uz je tu http://www.abclinuxu.cz/forum/show/154938 vyresen.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.