Kamera HAL3 Arabellek Yönetimi API'leri

Android 10 tanıttı opsiyonel kamera HAL3 kamera HAL uygulamalarında farklı bellek ve yakalama gecikme tradeoffs ulaşmak için tampon yönetim mantığını uygulamak için izin tampon yönetim API'leri.

(N eşit olduğu kamera HAL N istekleri gerektirir boru hattı derinliği onun boru hattı sıraya), ancak genellikle aynı anda çıkış tamponların tüm N setleri gerektirmez.

Örneğin, HAL'nin ardışık düzende sıraya alınmış sekiz isteği olabilir, ancak yalnızca boru hattının son aşamalarındaki iki istek için çıktı arabellekleri gerektirir. Android 9 ve önceki sürümleri çalıştıran cihazlarda, istek HAL'de sıraya alındığında kamera çerçevesi arabellekler ayırır, böylece HAL'de kullanılmayan altı arabellek grubu olabilir. Android 10'da, kamera HAL3 arabellek yönetimi API'leri, altı arabellek kümesini boşaltmak için çıkış arabelleklerinin ayrıştırılmasına izin verir. Bu, ileri teknoloji cihazlarda yüzlerce megabayt bellek tasarrufuna yol açabilir ve düşük bellekli cihazlar için de faydalı olabilir.

Şekil 1, Android 9 ve önceki sürümleri çalıştıran cihazlar için kamera HAL arayüzünün bir diyagramını göstermektedir. Şekil 2, uygulanan kamera HAL3 arabellek yönetimi API'leri ile Android 10'daki kamera HAL arabirimini gösterir.

9 veya daha düşük sürümlerde tampon yönetimi

Android 9 ve alt Şekil 1. Kamera HAL arayüzü

Android 10'da arabellek yönetimi

Tampon yönetim API'leri kullanılarak Android 10 Şekil 2. Kamera HAL arayüzü

Tampon yönetimi API'lerini uygulama

Arabellek yönetimi API'lerini uygulamak için kamera HAL'ı şunları yapmalıdır:

Kamera HAL kullanır requestStreamBuffers ve returnStreamBuffers yöntemleri ICameraDeviceCallback.hal istek ve dönüş tamponları için. HAL da uygulamalıdır signalStreamFlush yöntemi ICameraDeviceSession.hal dönüş tampon kamera HAL sinyal.

requestStreamBuffers

Kullanım requestStreamBuffers kamera çerçevesinden tamponlarını isteme yöntemini. Kamera HAL3 tampon yönetim API'leri kullanırken, kamera çerçevesi yakalama istekleri çıkış tamponlarını içermez olduğunu, bufferId alan StreamBuffer olduğunu 0 . Bu nedenle, kamera HAL kullanmalıdır requestStreamBuffers kamera çerçevesinden tamponlarını istemek için.

requestStreamBuffers yöntem daha az HIDL IPC aramalar için izin veren tek bir çağrıda birden fazla çıkış akışları birden fazla tampon talep arayan sağlar. Ancak, aynı anda daha fazla arabellek istendiğinde çağrılar daha uzun sürer ve bu, istekten sonuca toplam gecikme süresini olumsuz etkileyebilir. İçine aramaları çünkü Ayrıca, requestStreamBuffers kamera hizmetinde dizi haline getirilir, kameranın isteği tamponları için özel bir yüksek öncelikli iş parçacığı kullanmak Hal önerilir.

Bir arabellek isteği başarısız olursa, kamera HAL'ının önemli olmayan hataları düzgün bir şekilde işleyebilmesi gerekir. Aşağıdaki liste, arabellek isteklerinin başarısız olmasının yaygın nedenlerini ve bunların kamera HAL tarafından nasıl ele alınması gerektiğini açıklar.

  • Uygulama çıkış akımından kesintileri: Bu olmayan bir hatadır. Kamera HAL göndermesi gerektiğini ERROR_REQUEST bir bağlantısız akışı hedefleyen herhangi bir yakalama isteği için ve normalde daha sonraki istekleri işlemeye hazır olun.
  • Zaman Aşımı: Bir uygulama bir tampon üzerine tutarken yoğun işlem yaparak meşgul olduğu durumda meydana gelebilir. Kamera HAL göndermesi gerektiğini ERROR_REQUEST bir zaman aşımı hatası nedeniyle yerine ve normalde daha sonraki istekleri işlemeye hazır olamaz yakalama istekleri için.
  • Kamera çerçeve yeni bir akım yapılandırmasını hazırlanıyor: Bir sonraki kadar kamera HAL beklemesi gerektiğini configureStreams çağrı çağırmadan önce tamamlanır requestStreamBuffers tekrar.
  • Kamera HAL onun ulaşmıştır tampon sınırı ( maxBuffers aramadan önce akışın en az bir tampon dönünceye kadar kamera HAL beklemelidir: alanı) requestStreamBuffers tekrar.

dönüşAkışTamponları

Kullanım returnStreamBuffers kamera çerçevesine fazladan tamponlarını dönmek için yöntem. Kamera HAL normalde aracılığıyla kamera çerçevesine tampon döndüren processCaptureResult yöntemiyle, ancak kamera HAL gönderilmiş yakalama istekleri için sadece açıklama getirebilir. İle requestStreamBuffers yöntemle, bu kamera HAL uygulama kamera çerçevesi tarafından talep edilmiş olandan daha fazla tampon korumak için mümkündür. Bu olduğunda, returnStreamBuffers yöntem kullanılmalıdır. HAL uygulanması talep ettiğinden daha fazla tampon tutan asla, kamera HAL uygulama aramaya gerek yoktur returnStreamBuffers yöntemi.

sinyalAkışFlush

signalStreamFlush yöntemi eldeki tüm tamponlarını dönmek için kamera HAL bildirmek için kamera çerçeve tarafından çağrılır. Kamera çerçeve çağrı üzereyken Bu normalde denir configureStreams ve kamera yakalama boru hattını tahliye gerekir. Benzer returnStreamBuffers bir kamera HAL uygulanması talep ettiğinden daha fazla tampon kabul etmezse yöntemi, bu yöntemin boş uygulanmasını olması mümkündür.

Kamera çerçeve çağırır sonra signalStreamFlush , çerçeve bütün tamponlar kamera çerçevesi iade edilene kadar kamera HAL yeni yakalama istekleri göndermeyi durdurur. Tüm tamponlar iade edildiğinde, requestStreamBuffers yöntem çağrıları başarısız ve kamera çerçeve temiz bir durumda çalışmalarını devam edebilir. Kamera çerçeve sonra da çağırır configureStreams veya processCaptureRequest yöntemi. Kamera çerçeve ararsa configureStreams yöntemini sonra, kamera HAL tekrar tampon talebinde başlayabilirsiniz configureStreams başarıyla döner diyoruz. Kamera çerçeve ararsa processCaptureRequest yöntemi, kamera HAL sırasında tampon talebinde başlayabilirsiniz processCaptureRequest çağrısı.

Semantik farklıdır signalStreamFlush yöntemi ve flush yöntemi. Ne zaman flush yöntemi denir, HAL ile yakalama istekleri bekleniyor iptal edebilir ERROR_REQUEST en kısa sürede boru hattını tahliye etmek. Ne zaman signalStreamFlush yöntemi denir, HAL beklemedeki tüm yakalama isteklerini normalde bitirmek ve kamera çerçevesine tüm tamponları dönmelidir.

Arasındaki bir diğer fark signalStreamFlush yöntemi ve diğer yöntemler olduğunu signalStreamFlush olan HAL almadan önce Kamera çerçeve diğer engelleme API'leri edilmesine neden olabilecek bu araç, bir tek yönlü HIDL yöntem olup signalStreamFlush çağrı. Bu araçlar signalStreamFlush yöntemi ve diğer yöntemler (özellikle configureStreams yöntemi) de kamera çerçevesinde adlandırılan için farklı bir üzere kamera HAL gelmesi olabilir. Bu asenkroni sorunu çözmek için, streamConfigCounter alan eklendi StreamConfiguration ve bir argüman olarak eklenen signalStreamFlush yöntemiyle. Kamera HAL uygulaması kullanmalıdır streamConfigCounter bir olup olmadığını belirlemek için bir argüman signalStreamFlush çağrısı karşılık gelen daha geç ulaşır configureStreams diyoruz. Örnek için Şekil 3'e bakın.

Geç gelen aramaları yönetme

Geç gelmesi Şekil kamera HAL algılamalıdır Nasıl 3. ve sap signalStreamFlush aramalar

Arabellek yönetimi API'lerini uygularken davranış değişiklikleri

Arabellek yönetimi mantığını uygulamak için arabellek yönetimi API'lerini kullanırken, kamera ve kamera HAL uygulamasında aşağıdaki olası davranış değişikliklerini göz önünde bulundurun:

  • Yakalama istekleri daha hızlı ve daha sık kamera HAL varmak: Tampon yönetim API'leri olmadan, her yakalama isteği için kamera çerçeve istekleri çıkış tamponlarını kamera HAL'den yakalama isteğini göndermeden önce. Arabellek yönetimi API'lerini kullanırken, kamera çerçevesinin artık arabellekleri beklemesi gerekmez ve bu nedenle kamera HAL'ına daha önce yakalama istekleri gönderebilir.

    Ayrıca, arabellek yönetimi API'leri olmadan, yakalama isteğinin çıkış akışlarından biri HAL'ın bir seferde tutabileceği maksimum arabellek sayısına ulaştığında kamera çerçevesi yakalama istekleri göndermeyi durdurur (bu değer, HalStream::maxBuffers bir dönüş değeri alan configureStreams çağrı). Tampon yönetim API'leri ile bu azaltma davranışı artık yok ve kamera HAL uygulanması kabul etmemelidir processCaptureRequest HAL sıraya çok fazla yakalama istekleri olduğunda aramaları.

  • requestStreamBuffers gecikme anlamlı farklılık çağırır: Bir çok sebebi vardır requestStreamBuffers ortalamadan daha uzun zaman alabilir diyoruz. Örneğin:

    • Yeni oluşturulan bir akışın ilk birkaç arabelleği için, cihazın bellek ayırması gerektiğinden aramalar daha uzun sürebilir.
    • Beklenen gecikme, her çağrıda istenen arabellek sayısıyla orantılı olarak artar.
    • Uygulama arabellek tutuyor ve işleniyor. Bu, arabellek isteklerinin yavaşlamasına veya arabellek eksikliği veya yoğun bir CPU nedeniyle zaman aşımına uğramasına neden olabilir.

Tampon yönetim stratejileri

Tampon yönetimi API'leri, farklı türde arabellek yönetimi stratejilerinin uygulanmasına izin verir. Bazı örnekler:

  • Geriye uyumlu: HAL sırasında bir yakalama isteği için tampon istekleri processCaptureRequest çağrısı. Bu strateji herhangi bir bellek tasarrufu sağlamaz, ancak mevcut kamera HAL'inde çok az kod değişikliği gerektiren arabellek yönetimi API'lerinin ilk uygulaması olarak hizmet edebilir.
  • Maximized bellek tasarrufu: Kamera HAL tek doldurulması gereklidir hemen önce çıkış tamponlarını ister. Bu strateji, maksimum bellek tasarrufu sağlar. Potansiyel dezavantajı, arabellek isteklerinin tamamlanması alışılmadık derecede uzun sürdüğünde daha fazla kamera ardışık düzeni çöplüğüdür.
  • Önbellek: daha az olasılıkla bir arada yavaş tampon isteği etkilenecek var ki kamera HAL birkaç tamponlarını önbelleğe alır.

Kamera HAL'ı, örneğin çok fazla bellek kullanan kullanım durumları için maksimum bellek tasarrufu stratejisini kullanmak ve diğer kullanım durumları için geriye dönük uyumlu stratejiyi kullanmak gibi belirli kullanım durumları için farklı stratejiler benimseyebilir.

Harici kamera HAL'de örnek uygulama

Harici kamera HAL Android 9'da tanıtıldı ve en kaynak ağacında bulunabilir hardware/interfaces/camera/device/3.5/ . Android 10, içerecek şekilde güncellenmiştir ExternalCameraDeviceSession.cpp , tampon yönetim API bir uygulama. Bu dış kamera HAL uygular belirtilen maksimize bellek tasarruf stratejisi Tampon yönetim stratejilerinin C ++ kodunun birkaç yüz hatlarında.