abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 15:00 | Nová verze

    Všem vše nejlepší do nového roku 2026.

    Ladislav Hagara | Komentářů: 6
    dnes 13:33 | Zajímavý software

    Crown je multiplatformní open source herní engine. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT a GPLv3+. Byla vydána nová verze 0.60. Vyzkoušet lze online demo.

    Ladislav Hagara | Komentářů: 0
    dnes 12:11 | Zajímavý článek

    Daniel Stenberg na svém blogu informuje, že po strncpy() byla ze zdrojových kódů curlu odstraněna také všechna volání funkce strcpy(). Funkci strcpy() nahradili vlastní funkcí curlx_strcopy().

    Ladislav Hagara | Komentářů: 1
    dnes 03:00 | Nová verze

    Byla vydána nová verze 25.12.30 svobodného multiplatformního video editoru Shotcut (Wikipedie) postaveného nad multimediálním frameworkem MLT. Shotcut je vedle zdrojových kódů k dispozici také ve formátech AppImage, Flatpak a Snap.

    Ladislav Hagara | Komentářů: 0
    včera 18:55 | IT novinky

    Společnost Valve publikovala přehled To nej roku 2025 ve službě Steam aneb ohlédnutí za nejprodávanějšími, nejhranějšími a dalšími nej hrami roku 2025.

    Ladislav Hagara | Komentářů: 0
    včera 16:11 | Komunita

    Byly publikovány výsledky průzkumu mezi uživateli Blenderu uskutečněného v říjnu a listopadu 2025. Zúčastnilo se více než 5000 uživatelů.

    Ladislav Hagara | Komentářů: 0
    včera 03:33 | Bezpečnostní upozornění

    V dokumentově orientované databázi MongoDB byla nalezena a v upstreamu již opravena kritická bezpečností chyba CVE-2025-14847 aneb MongoBleed.

    Ladislav Hagara | Komentářů: 0
    29.12. 23:11 | IT novinky

    Při úklidu na Utažské univerzitě se ve skladovacích prostorách náhodou podařilo nalézt magnetickou pásku s kopií Unixu V4. Páska byla zaslána do počítačového muzea, kde se z pásky úspěšně podařilo extrahovat data a Unix spustit. Je to patrně jediný známý dochovaný exemplář tohoto 52 let starého Unixu, prvního vůbec programovaného v jazyce C.

    NUKE GAZA! 🎆 | Komentářů: 14
    29.12. 15:55 | Komunita

    FFmpeg nechal kvůli porušení autorských práv odstranit z GitHubu jeden z repozitářů patřících čínské technologické firmě Rockchip. Důvodem bylo porušení LGPL ze strany Rockchipu. Rockchip byl FFmpegem na porušování LGPL upozorněn již téměř před dvěma roky.

    NUKE GAZA! 🎆 | Komentářů: 7
    29.12. 15:44 | Zajímavý software

    K dispozici je nový CLI nástroj witr sloužící k analýze běžících procesů. Název je zkratkou slov why-is-this-running, 'proč tohle běží'. Klade si za cíl v 'jediném, lidsky čitelném, výstupu vysvětlit odkud daný spuštěný proces pochází, jak byl spuštěn a jaký řetězec systémů je zodpovědný za to, že tento proces právě teď běží'. Witr je napsán v jazyce Go.

    NUKE GAZA! 🎆 | Komentářů: 1
    Kdo vám letos nadělí dárek?
     (30%)
     (1%)
     (25%)
     (1%)
     (1%)
     (1%)
     (11%)
     (10%)
     (19%)
    Celkem 214 hlasů
     Komentářů: 22, poslední dnes 15:34
    Rozcestník

    Jaderné noviny - Video4Linux2 - 6a (základní I/O snímků)

    1. 8. 2007 | Robert Krátký | Jaderné noviny | 3337×

    Ačkoliv tento seriál o video ovladačích běží už nějaký čas, ještě jsme nepřenesli ani jediný snímek video dat. V tuto chvíli už však máme probráno dost podrobností o vybírání formátu, takže se můžeme pustit do toho, jak se mezi aplikací a zařízením pohybují video snímky.

    Obsah

    Video4Linux2 API definuje tři různé způsoby přenosu video snímků, z nichž dva už jsou v současné implementaci k dispozici:

    • Systémová volání read() a write() mohou být použita běžným způsobem. V závislosti na hardwaru a implementaci ovladače může být tato technika poměrně pomalá - ale není to jediný způsob.

    • Snímky mohou být streamovány přímo z a do bufferů, ke kterým má aplikace přístup. Streamování je obyčejně nejúčinnější způsob přenosu video dat; toto rozhraní také umožňuje přenášet spolu se snímky užitečná metadata. Existují dvě varianty streamovací techniky - rozlišují se podle toho, jestli jsou buffery umístěny v jaderném nebo uživatelském prostoru.

    • Specifikace Video4Linux2 API obsahuje i asynchronní I/O mechanismus pro přenos snímků. Tento režim však zatím nebyl implementován, a nemůže být používán.

    V tomto díle se podíváme na jednoduché rozhraní read() a write(); streamované přenosy budou tématem dalšího dílu.

    read() a write()

    link

    Implementace read() a write() není specifikací Video4Linux2 vyžadována. Ale mnohé jednodušší aplikace očekávají, že budou tato systémová volání k dispozici, takže by autor ovladače měl zařídit, aby fungovala. Pokud ovladač tato volání podporuje, neměl by zapomenout reagovat na volání VIDIOC_QUERYCAP (vizte část 3) nastavením bitu V4L2_CAP_READWRITE. Většina aplikací se však neobtěžuje kontrolovat, jestli jsou volání dostupná, než se je pokusí použít.

    Ovladačové metody read() a write() musejí být uloženy v poli fops příslušné struktury video_device. Nezapomeňte, že specifikace Video4Linux2 vyžaduje, aby ovladače, které implementují tyto metody, poskytovaly i operaci poll().

    Naivní implementace read() na zařízení pro zachytávání snímků je jednoduchá: ovladač řekne hardwaru, ať začne zachytávat snímky, jeden doručí do bufferu v uživatelském prostoru, zastaví hardware a znovu. Je-li to možné, tak by měl ovladač zařídit, aby DMA operace přenášela data přímo do cílového bufferu, ale to jde pouze v případě, že řadič umí scatter/gather I/O. Jinak bude muset ovladač snímek bufferovat přes jádro. Stejně tak zápisové operace by měly jít, pokud možno, přímo na zařízení - jinak budou bufferovány přes jádro.

    Implementace však nemusí být tak jednoduchá. Například ovladač "Cafe" od Jonathana Corbeta ponechává řadič kamery běžet po operaci read() ve spekulativním režimu. Po další zlomek vteřiny budou následující snímky z kamery bufferovány v jádře; pokud aplikace provede další volání read(), bude jí vyhověno mnohem rychleji, bez nutnosti znovu startovat hardware. Po několika nevyžádaných snímcích je řadič vrácen do klidového stavu. Podobně by mohla i operace write() pozdržet o pár desítek milisekund první snímek, aby se aplikaci pomohlo snímky streamovat rychlostí, kterou hardware očekává.

    Parametry streamování

    link

    ioctl() volání VIDIOC_G_PARM a VIDIOC_S_PARM upravují některé parametry, které jsou specifické pro implementace read() a write() - a také některé obecnější. Vypadá to, že jde o volání, kam byly uklizeny různé volby, které nebylo kam jinam dát. Popíšeme ho teď, i když se některé parametry týkají i streamovaného I/O.

    Ovladače Video4Linux2, které toto volání podporují, poskytují následující dvě metody:

        int (*vidioc_g_parm) (struct file *file, void *private_data,
        			  struct v4l2_streamparm *parms);
        int (*vidioc_s_parm) (struct file *file, void *private_data,
    			  struct v4l2_streamparm *parms);
    

    Struktura v4l2_streamparm obsahuje jeden z těch union prvků, které by už pravidelní čtenáři tohoto seriálu měli znát:

        struct v4l2_streamparm
        {
    	enum v4l2_buf_type type;
    	union
    	{
    		struct v4l2_captureparm	capture;
    		struct v4l2_outputparm	output;
    		__u8 raw_data[200];
    	} parm;
        };
    

    Pole type popisuje typ operace, o kterou půjde; bude to V4L2_BUF_TYPE_VIDEO_CAPTURE pro zachytávací zařízení a V4L2_BUF_TYPE_VIDEO_OUTPUT pro výstupní zařízení. Může to však být i V4L2_BUF_TYPE_PRIVATE a pak je pole raw_data využito pro předání nějakých soukromých, nepřenosných, pravděpodobně nedoporučovaných dat ovladači.

    U zachytávacích zařízení nás bude zajímat pole parm.capture. Struktura vypadá takto:

        struct v4l2_captureparm
        {
    	__u32		   capability;
    	__u32		   capturemode;
    	struct v4l2_fract  timeperframe;
    	__u32		   extendedmode;
    	__u32              readbuffers;
    	__u32		   reserved[4];
        };
    

    capability je sada příznaků určujících schopnosti; zatím je definován jen jeden: V4L2_CAP_TIMEPERFRAME, který říká, že zařízení umí měnit snímkovou frekvenci [frame rate]. capturemode je další příznakové pole, ve kterém je definován jediný příznak: V4L2_MODE_HIGHQUALITY. Ten má za úkol přepnout hardware do režimu vysoké kvality, který je vhodný pro zachytávání jednotlivých snímků. Tento režim si může dělat, cokoliv ho napadne (z hlediska podporovaných datových formátů, expozičních časů atd.), jen aby dosáhl nejkvalitnějšího obrazu, jakého je zařízení schopno.

    Pole timeperframe se používá pro specifikaci požadované snímkové frekvence. Je to opět struktura:

        struct v4l2_fract {
    	__u32   numerator;
    	__u32   denominator;
        };
    

    Kvocient popisovaný v numerator a denominator udává čas mezi po sobě jdoucími snímky na zařízení. Další pole specifické pro daný ovladač je extendedmode, které v API nemá žádný definovaný význam. Pole readbuffers ukazuje počet bufferů, které by mělo jádro využít pro příchozí snímky, když je použita metoda read().

    Pro výstupní video zařízení vypadá struktura takto:

        struct v4l2_outputparm
        {
    	__u32		   capability;
    	__u32		   outputmode;
    	struct v4l2_fract  timeperframe;
    	__u32		   extendedmode;
    	__u32              writebuffers;
    	__u32		   reserved[4];
        };
    

    Pole capability, timeperframe a extendedmode jsou úplně stejná jako u zachytávacích zařízení. outputmode a writebuffers fungují stejně jako capturemode a readbuffers.

    Když si aplikace přeje získat aktuální parametry, provede volání VIDIOC_G_PARM, což způsobí zavolání metody ovladače vidioc_g_parm(). Ovladač by měl poskytnout aktuální nastavení, přičemž by neměl zapomenout nastavit pole extendedmode na nulu, pokud není používáno, a reserved vždy na nulu.

    Pokus o nastavení parametrů způsobí volání vidioc_s_parm(). V takovém případě by měl ovladač parametry nastavit tak, aby co nejvíce odpovídaly požadavkům aplikace, a upravit strukturu v4l2_streamparm, aby odrážela hodnoty, které byly nakonec použity. Aplikace může například požadovat vyšší snímkovou frekvenci, než dokáže hardware nabídnout; pak by měla být naprogramována nejvyšší možná snímková frekvence a pole timeperframe nastaveno na skutečnou frekvenci.

    Je-li timeperframe aplikací nastaveno na nulu, měl by ovladač zvolit nominální snímkovou frekvenci přiřazenou k aktuální video normě. Pokud jsou nuly v readbuffers nebo writebuffers, měl by ovladač vrátit aktuální nastavení - ne se aktuálních bufferů zbavit.

    V tuto chvíli už jsme toho probrali dost, abychom mohli napsat jednoduchý ovladač, který by podporoval přenos snímků pomocí read() nebo write(). Většina aplikací, které to myslí vážně, však bude chtít používat streamovaný I/O: streamovaný režim usnadňuje dosahování vyššího výkonu a umožňuje přibalovat ke snímkům relevantní metadata (např. sekvenční čísla). Další díl seriálu bude tedy popisovat implementaci streamovacího API.

           

    Hodnocení: 100 %

            špatnédobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.