Kamera HAL3 arabellek yönetimi API'leri

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ı.

9 veya daha kısa sürümlerde arabellek yönetimi

Şekil 1. Android 9 ve önceki sürümlerde kamera HAL arayüzü

Android 10'da arabellek yönetimi

Ş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:

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 tekrar requestStreamBuffers.

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.

Geç gelen aramaları yönetme

Ş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ğerindeki HalStream::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ğunda processCaptureRequest çağrısı sıraya alındı.

  • requestStreamBuffers arama gecikmesi önemli ölçüde değişiklik gösteriyor: bir requestStreamBuffers 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.