Android 10, isteğe bağlı kamera HAL3 arabelleği yönetim API’leri farklı bellek kapasitesi ve yakalama işlemi için arabellek yönetimi mantığı gecikme dengesi sağlamak için kullanılır.
Kamera HAL'si için N istek gerekir (N, ardışık düzen derinliği) ancak genellikle N kümenin tamamını olmasını sağlayabilir.
Örneğin, HAL'de ardışık düzende sıraya alınmış sekiz istek olabilir. yalnızca son aşamadaki iki istek için çıktı tamponları kullanılmasını gerektirir ardışık düzendir. Android 9 ve önceki sürümleri çalıştıran cihazlarda kamera çerçevesi arabelleklerde bulunur. İstek HAL'de sıraya alındığında, tamponları oluşturur. Android 10'da kamera HAL3 arabellek yönetimi API'leri, çıktının ayrıştırılmasına olanak tanır. alt tür tamponları serbest bırakmak için kullanılır. Bu da ekipte yüzlerce megabayt cinsinden bellek tasarrufu sağlar ve düşük belleğe sahip cihazlardır.
Şekil 1'de, çalışan cihazlar için kamera HAL arayüzünün şeması gösterilmektedir Android 9 ve önceki sürümler. Şekil 2'de, Android'deki kamera HAL arayüzü gösterilmektedir 10 kamera HAL3 arabellek yönetimi API'lerinin uygulanması.
Şekil 1. Android 9 ve önceki sürümlerde kamera HAL arayüzü
Şekil 2. Android 10'da arabellek yönetimi API'lerinin kullanıldığı kamera HAL arayüzü
Arabellek yönetimi API'lerini uygulama
Arabellek yönetimi API'lerini uygulamak için kamera HAL'si:
- HIDL'yi uygulayın
ICameraDevice@3.5
. - Kamera özellikleri tuşunu ayarlayın
android.info.supportedBufferManagementVersion
Hedef:HIDL_DEVICE_3_5
.
Kamera HAL'si,
requestStreamBuffers
ve
returnStreamBuffers
yöntem:
ICameraDeviceCallback.hal
arabellekleri
istemek ve döndürmektir. HAL, ayrıca
signalStreamFlush
yöntemindeki
ICameraDeviceSession.hal
kamera HAL'sine arabellekleri döndürmesini bildirmek için kullanılır.
requestStreamBuffers
Şunu kullanın:
requestStreamBuffers
kamera çerçevesinden tampon isteme yöntemini kullanır. Kamera HAL3 kullanılırken
arabellek yönetimi API'leri, kamera çerçevesinden yakalama istekleri
çıkış arabellekleri içerir; yani, bufferId
alanı
StreamBuffer
oda: 0
. Bu nedenle, kamera HAL'sinin istekte bulunmak için requestStreamBuffers
kullanması gerekir
tamponları oluşturur.
requestStreamBuffers
yöntemi, çağrıyı yapanın birden fazla tampon istemesine olanak tanır.
tek bir aramada birden fazla çıkış akışından yararlanarak daha az HIDL IPC'si elde edebilirsiniz.
çağrısının en iyi yolu. Ancak
aynı zamana bağlıdır ve bu durum, toplam istek-sonuç gecikmesini olumsuz yönde etkileyebilir.
Ayrıca, requestStreamBuffers
için yapılan aramalar kamerada seri hale getirildiğinden
kamera donanım soyutlama katmanının özel bir yüksek öncelikli
iş parçacığı (Tampon) istemek için kullanır.
Arabellek isteği başarısız olursa kamera donanım soyutlama katmanının (HAL) düzgün bir şekilde işleyebilmesi gerekir. onarılabilir hatalar. Aşağıdaki listede, arabelleğin bir veya daha fazla kamera HAL'si tarafından nasıl ele alınacağını belirlemenize yardımcı olur.
- Uygulamanın çıkış akışıyla bağlantısı kesiliyor:
Bu önemli olmayan bir hatadır. Kamera HAL'si,
ERROR_REQUEST
(herhangi bir yakalama isteği için) bağlantısı kesilmiş bir akışı hedeflemek ve sonraki istekleri işlemeye hazır olmak gerekir. - Zaman aşımı: Bu durum, bir uygulama şu işlemleri yapmakla meşgulken ortaya çıkabilir:
ve yoğun işleme konabilir. Kamera HAL'si,
gönder
ERROR_REQUEST
nedeniyle yerine getirilemeyen yakalama isteklerine ve sonraki istekleri normal şekilde işlemeye hazır olun. - Kamera çerçevesi yeni bir akış yapılandırması hazırlıyor:
Kamera HAL'si bir sonraki
configureStreams
requestStreamBuffers
tekrar aranmadan önce arama tamamlandı. - Kamera donanım soyutlama katmanı,
arabellek sınırı
(
maxBuffers
alanı): Kamera HAL'si beklemelidir çağrı yapmadan önce akışın en az bir tamponu döndürene kadar tekrarrequestStreamBuffers
.
ReturnStreamBuffers
Şunu kullanın:
returnStreamBuffers
kamera çerçevesine ekstra tamponlar döndürmek için bir yöntem kullanır. Kamera HAL'si normal şekilde
kamera çerçevesine tamponları
processCaptureResult
yöntemini kullanır ancak yalnızca
kamera donanım soyutlama katmanı. requestStreamBuffers
yöntemiyle,
tarafından istenenden daha fazla arabellek tutmaya yönelik kamera HAL uygulaması
çerçeve oluşturmak. Bu durumda, returnStreamBuffers
yöntemi
kullanılır. HAL uygulaması hiçbir zaman istenenden daha fazla tampon tutmazsa
kamera HAL uygulamasının returnStreamBuffers
çağrısı yapmasına gerek yoktur
yöntemidir.
sinyal Akışı Flush
İlgili içeriği oluşturmak için kullanılan
signalStreamFlush
yöntem, kamera çerçevesi tarafından kamera donanım soyutlayıcısının (HAL) tüm öğeleri döndürmesini
elinizin altında bulundurun. Bu, normalde kamera çerçevesi en az
telefon etmek
configureStreams
ve kamera yakalama hattını boşaltmalıdır. returnStreamBuffers
ile benzer
kamera HAL uygulaması, 50 kareden daha fazla arabellek
istiyorsanız bu yöntemin boş bir şekilde uygulanması mümkündür.
Kamera çerçevesi
signalStreamFlush
bu çerçeve, tüm işlemler tamamlanana kadar kamera HAL'sine yeni yakalama istekleri göndermeyi
kamera çerçevesine geri döndürüldü. Tüm tamponlar
requestStreamBuffers
yöntemi çağrıları başarısız olur ve kamera
sağlam bir şekilde çalışmaya devam etmesini sağlayabilir. Ardından kamera çerçevesi
ya
configureStreams
veya
processCaptureRequest
yöntemidir. Kamera çerçevesi configureStreams
yöntemini çağırırsa kamera
HAL, configureStreams
çağrısı geri döndükten sonra tekrar arabellek istemeye başlayabilir
bahsettik. Kamera çerçevesi processCaptureRequest
yöntemini çağırırsa
kamera HAL'si, processCaptureRequest
sırasında arabellek istemeye başlayabilir.
çağrısına bir tıklama URL'si eklemeniz gerekir.
signalStreamFlush
yöntemi ile
flush
yöntemidir. flush
yöntemi çağrıldığında, HAL bekleyen yakalama işlemini iptal edebilir
şununla istek sayısı:
ERROR_REQUEST
mümkün olan en kısa sürede boşaltmak için. Zaman
signalStreamFlush
yöntemi çağrılır, HAL bekleyen tüm işlemleri tamamlamalıdır
yakalamanız ve tüm arabellekleri kamera çerçevesine döndürmeniz gerekir.
signalStreamFlush
yöntemi ile diğer yöntemler arasındaki bir diğer fark ise
signalStreamFlush
, tek yönlü bir HIDL yöntemidir. Yani kamera,
çerçeve, HAL aşağıdaki kodu almadan önce diğer engelleme API'lerini çağırabilir:
signalStreamFlush
arama. Bunun anlamı,
signalStreamFlush
yöntemi ve diğer yöntemler (özellikle
configureStreams
yöntemi) kameranın donanım soyutlama katmanına farklı bir sırada ulaşabilir
daha iyi anladıklarını söylüyor. Bu sorunu gidermek için
eşzamansız sorunu, streamConfigCounter
alanı
StreamConfiguration
ve signalStreamFlush
grubuna bağımsız değişken olarak eklendi
yöntemidir. Kamera HAL uygulaması, streamConfigCounter
bir signalStreamFlush
çağrısının, kendisinden daha sonra gelip gelmediğini belirlemek için
ilgili configureStreams
çağrısı. Örnek için bkz. Şekil 3.
Şekil 3. Kamera HAL'sinin geç gelen sinyalStreamFlush çağrılarını algılama ve işleme şekli
Tampon yönetimi API'leri uygulanırken davranış değişiklikleri
Arabellek yönetim mantığını uygulamak için arabellek yönetimi API'lerini kullanırken kamerada aşağıdaki olası davranış değişikliklerini göz önünde bulundurun ve kamera HAL uygulaması:
Çekme istekleri kamera donanım soyutlama katmanına (HAL) daha hızlı ve daha hızlı ulaşır sıklıkla: Arabellek yönetimi API'leri olmadan kamera çerçevesi göndermeden önce her yakalama isteği için çıkış arabellekleri kamera donanım soyutlama katmanı. Arabellek yönetimi API'leri kullanılırken kamera çerçevesi artık arabellekleri beklemek zorunda değildir ve bu nedenle yakalama istekleri gönderebilir önce kamera HAL'ye gönderebilirsiniz.
Ayrıca, arabellek yönetimi API'leri olmadan kamera çerçevesi durur Yakalamanın çıkış akışlarından biri için yakalama isteği gönderme istek, HAL’nin şurada tutabileceği maksimum tampon sayısına ulaşmıştır: bir kez kullanın (bu değer, kamera HAL'si tarafından
configureStreams
işlevinin döndürülen değerindekiHalStream::maxBuffers
alanı çağrısı) gerekir. Arabellek yönetimi API'leriyle bu kısıtlama davranışı artık kamera HAL uygulaması, HAL'nin çok fazla yakalama isteği olduğundaprocessCaptureRequest
çağrısı sıraya alındı.requestStreamBuffers
arama gecikmesi önemli ölçüde değişiklik gösteriyor: birrequestStreamBuffers
aramasının ortalaması. Örnek:- Yeni oluşturulan bir akışın ilk birkaç arabelleği için Cihazın bellek ayırması gerekeceğinden daha uzun sürebilir.
- Beklenen gecikme, toplamda beklenen gecikmenin her aramada istenen tamponlar.
- Uygulama arabellek tutuyor ve işleme devam ediyor. Bu nedeniyle tampon isteklerinin yavaşlamasına veya zaman aşımına uğramasına veya yoğun CPU kullanımı vardır.
Tampon yönetimi stratejileri
Arabellek yönetimi API'leri farklı türlerde tampon yönetimine olanak tanır etkili bir kanal görevi görebilir. Bu parçalardan bazıları:
- Geriye dönük uyumlu: HAL, yakalama isteği için arabellek ister
processCaptureRequest
araması sırasında. Bu strateji, tasarruf sağlar ancak arabelleğin ilk uygulaması olarak da kullanılabilir yönetim API'leri; mevcut kamera donanım soyutlama katmanında çok az kod değişikliği gerektirir. - Maksimum bellek tasarrufu: Kamera HAL'si yalnızca çıkış arabellekleri ister. veya doldurulması gerekenden hemen önce girilmelidir. Bu strateji sayesinde maksimum bellek tasarrufu. Dezavantajı ise daha fazla kamera hattıdır. arabellek isteklerinin tamamlanması normalden uzun sürdüğünde stabil bir gecikme yaşayabilirsiniz.
- Önbelleğe alındı: Kamera HAL'si, mümkün olduğunca az sayıda arabelleği önbelleğe alır. zaman zaman gerçekleşen yavaş bir arabellek isteğinden etkilenebilir.
Kamera donanım soyutlama katmanı (HAL), belirli kullanım alanları için, Örneğin, çok fazla bellek kullanan kullanım alanları için diğer kullanım alanları için geriye dönük uyumlu stratejiden yararlanabilirsiniz.
Harici kamera HAL'sindeki örnek uygulama
Harici kamera HAL'si, Android 9'da kullanıma sunulmuştur ve şurada bulunabilir:
konumundaki kaynak ağacı
hardware/interfaces/camera/device/3.5/
.
Android 10'da,
ExternalCameraDeviceSession.cpp
arabellek yönetimi API'sinin uygulanmasıdır. Bu harici kamera donanım soyutlama katmanı
Tampon yönetimi bölümünde bahsedilen maksimum bellek tasarrufu stratejisini uygular
stratejik düşünmeyi
C++ kodu.