Android Camera2 API - Apa kezdődik! [Dióhéjban]

írta: s3nsitivity, 9 éve

Igaz nem egy ropogós, friss dologról írok most de nem is igazán találtam semmit ahol legalább nagyjából körül írnák, hogy mi is ez. Miért is vannak az idei készülékek kamerájában manuális mód.
Nem, nem a Samsung csinálta az S6-hoz. ;]
Ez annál sokkal bonyolultabb..

Az egész a Google I/O 2014 - Keynote-on kezdődött. Bejelentésre került az Android 5.0, Lollipop mely megreformálja az Androidos készülékkel történő fényképezést, videózást.

Camera2 API

Hogy megértsük mi is ez először egy alapfogalmat kell tisztáznunk.

API: Az alkalmazásprogramozási felület vagy alkalmazásprogramozási interfész (angolul application programming interface, röviden API) egy program vagy rendszerprogram azon eljárásainak (szolgáltatásainak) és azok használatának dokumentációja, amelyet más programok felhasználhatnak. Egy nyilvános API segítségével lehetséges egy programrendszer szolgáltatásait használni anélkül, hogy annak belső működését ismerni kellene. - wiki
Összefoglalva, az API egy "gyűjtemény" mely az adott rendszerprogram szubrutinjait és eljárásait tartalmazza, megkönnyítve a használatát.

Camera API fejlődése

Az első Camera API réges rég,egy messzi, messzi galaxisban készült. Az android legelső, Alpha vagyis Astro kiadásához. Ez a " point-and-shoot camera " logikáját követi, Magyarországon jobban ismert a Kompakt fényképező elnevezés.

Természetesen az első API is fejlődött. A fokozatosan növekvő igények miatt bővíteni kellet a "tudástárat". Az egyik legjelentősebb fejlesztés egy új számítási módszer megérkezése volt mely segítségével több képet tudott rögzíteni elhanyagolható időkülönbséggel. Legelterjedtebb implementációja ennek a funkciónak az ún. HDR (High Dynamic Range), mely szinte egy időben készít különböző expozíciós képeket és ezekből az adott alkalmazás erre kifejlesztett metódusa egyetlen kibővített tónustartományú képet hoz létre. Ennek a megoldásnak köszönhető még az alábbi funkciók is: Super Resolution, Both Joined, Low-light mode, Eraser, Best face, melyek mind több képpel manipulálnak.
Ezen kívül a Google foglakozott az optikai zoom-mal felszerelt készülékekkel valamint a nagyobb méretű szenzorokkal érkező készülékekkel is melyek szintén az API bővítését igényelték.

KitKat-ig elég limitált számú funkció érhető el a Google saját megvalósításában. Így több gyártó is saját megvalósítást készített. Ezek a nagyközönség számára elérhetetlenek.

2014-ben a Google megreformálta a saját API-ját.

Az új API

Próbálta a felhasználói igényekhez igazítani az új API működését. Ennek eredménye az lett, hogy már nem bővítette a meglévőt hanem teljesen újra lett írva. From scratch.

Az új API logikája merőben eltér az előzőtől.
Az egész csővezeték rendszerű lett (pipeline). A beérkező kérelem (request) több bufferen keresztül halad mindegyik saját beállításán így a végeredmény egy merőben eltérő kép lesz.

Hogy ez mit is takar?

Néhány előnye az új API-nak:
- Minden frame külön, külön kontrollálható.
- Több szálú buffereknek köszönhetően egyszerre készülhet JPEG + RAW formátumú kép.
- Nincs szignifikáns különbség a videó és a fénykép között beállítások szempontjából.
- Teljes szenzormérettel elérhető 30 FPS-es feldolgozás. Multi Frame Capture

Az új API megjelenésével egy időben a Google száműzte az első API-t és minden fejlesztőt az új API használatára sarkall, ezzel jelezve, hogy az első API már elavult.

Mélyebbre úszva.

Három azaz 3, megvalósítása létezik a Camera2 API implementációjának.
Mivel az új API teljesen eltér az eddigiektől így a Google-nak kompromisszumot kellett kötnie és sok rugalmas implementációt készítenie, hogy a gyártók tudják frissíteni a saját készülékeiket az új rendszerre.
Ez ésszerű, ha a Google kötelezne mindenkit a teljes implementálásra a Lollipop működéséhez akkor ez a frissítés terjedne el a leglassabban. Ha bár eddig úgy tűnik e nélkül is sikerült elérni ezt hála a Lollipop egyéb hibáinak, de ez egy más téma.

A Reference Sheet-en is látszik, hogy 3 megvalósítás létezik:
- Full
- Limited
- Legacy

Hardver Rétegek

FULL: - Szinte minden

- Legalább 20 fps de inkább 30 fps szenzor méret tömörítés nélküli YUV kimenet.
- Per frame kontrol
- Manuális szenzor kontrol (ISO, exposure, stb)
- Manuális post-processing kontrol
- Manuális méret, koordináta állítás
- Legalább 3 feldolgozott, nem szétváló kimenet. pl: YUV 4:2:0 ,előnézetekhez.
- Lehetőség a beállítások listázására a kimenet szerint

+ A FULL sem követeli meg a RAW mentés lehetőségét.

LIMITED: - Részleges implementáció.

Ebben a megvalósításban nagy különbségek lehetnek két megvalósítás között is.
A LIMITED nem követeli meg a Camera2 API implementálását hanem egy új réteg kerül be amely pár funkciót tud biztosítani az új API nélkül is.

Minden kamera más adottságokkal rendelkezik így változhatnak a megvalósítás funkciói is.

LEGACY

Erről nincs sokat írni. Fent említettem, hogy ha kötelező lenne implementálni az API-t akkor lassú lenne a frissítés. Ez az implementáció azért jött létre, hogy ne kelljen implementálni az új API-t a frissítéshez. Néhány funkciót ezzel a módszerrel is életre lehet kelteni a köztes rétegen de elenyésző teljesítményt nyújt. Már ha éppen nyújt bármit is az adott implementáció.

Megkötések:

A legnagyobb hiány ami miatt a gyártók hanyagolják az új API használatát(mert hanyagolják. Erre később kitérek.) Az a HAL (Hardware Abstraction Layer) miatt van.
Ez a réteg közvetlenül a harvder fölött helyezkedik el és a gyártó készíti. (Qualcomm, Intel, MediaTek, stb)
Őket nem lehet kötelezni, hogy a Google megoldását kövessék így ha a HAL nem támogatja az adott API implementációját az egész bukott ügy mivel a gyártónak újra kell írnia a HAL és az ISP(Image Signal Processor) erre eső részét a saját szabadalmazott megoldásuk helyett.
Igazság szerint ezek csak kis problémák. A nagyobb az, hogy nem fordítanak rá időt.
Az új API bonyolult és összetett. Idő kell az implementálásához amit a gyártók nem adnak meg.

Készülékek:

Fentebb említettem, hogy hanyagolják az új API-t.
És most ezt be is mutatom.

MWC 2015 készülékei camera2 API implementációja:

FULL:

-

LIMITED.

- Samsung Galaxy S6 / S6 Edge

LEGACY:

- HTC One M9
- ASUS Zenfone 2
- Lenovo VIBE Shot
- Sony Xperia M4 Aqua
- GiONEE Elife S7

Készülékek melyek támogatják a camera2 API teljes implementációját:

Nexus 5
Nexus 6

Szomorú látni, hogy a gyártók a saját képükre formálják ezt is.
De ami még elszomorítóbb, hogy a 2015 előtt kiadott készülékekre nem sok esély van, hogy Legacy implementációs réteg fölött tudja majd használni az új API-t.

- s3nsitivity