camera3_device_ops Yapı Referansı
#include <
camera3.h
>
Veri Alanları |
|
int(* | initialize )(const struct camera3_device *, const camera3_callback_ops_t *callback_ops) |
int(* | configure_streams )(const struct camera3_device *, camera3_stream_configuration_t *stream_list) |
int(* | register_stream_buffers )(const struct camera3_device *, const camera3_stream_buffer_set_t *buffer_set) |
const camera_metadata_t *(* | construct_default_request_settings )(const struct camera3_device *, int type) |
int(* | process_capture_request )(const struct camera3_device *, camera3_capture_request_t *request) |
void(* | get_metadata_vendor_tag_ops )(const struct camera3_device *, vendor_tag_query_ops_t *ops) |
void(* | dump )(const struct camera3_device *, int fd) |
int(* | flush )(const struct camera3_device *) |
void * | reserved [8] |
Ayrıntılı Açıklama
Alan Belgeleri
int(* configure_streams)(const struct camera3_device *, camera3_stream_configuration_t *stream_list) |
configure_streams:
Yalnızca CAMERA_DEVICE_API_VERSION_3_0:
HAL kamera cihazı işleme ardışık düzenini sıfırlayın ve yeni giriş ve çıkış akışları oluşturun. Bu çağrı, mevcut yayın yapılandırmalarını stream_list içinde tanımlanan yayınlarla değiştirir. Bu yöntem, initialize() sırasından sonra process_capture_request() kullanılarak bir istek gönderilmeden önce en az bir kez çağrılır.
stream_list en az bir çıkışa sahip akış içermelidir ve birden fazla girişe sahip akış içeremez.
stream_list, şu anda etkin olan akış grubunda da bulunan akışları (önceki configure_stream() çağrısından) içerebilir. Bu akışlar, kullanım, max_buffers ve özel işaretçi için geçerli değerlere sahip olacaktır.
Bu tür bir akış için arabellekleri daha önce kaydedilmişse register_stream_buffers() işlevi akış için tekrar çağrılmaz ve akıştaki arabellekler giriş isteklerine hemen dahil edilebilir.
HAL'ın yeni yapılandırma nedeniyle mevcut bir akış için akış yapılandırmasını değiştirmesi gerekirse yapılandırma çağrısı sırasında usage ve/veya max_buffers değerlerini yeniden yazabilir.
Çerçeve bu tür bir değişikliği algılar, ardından akış arabelleklerini yeniden ayarlar ve istekte bu akıştaki arabellekleri kullanmadan önce register_stream_buffers() işlevini tekrar çağırır.
Halihazırda etkin olan bir akış stream_list'e dahil edilmezse HAL, bu akışa yapılan tüm referansları güvenli bir şekilde kaldırabilir. Daha sonraki bir configure() çağrısında çerçeve tarafından yeniden kullanılmaz ve configure_streams() çağrısı döndükten sonra bununla ilgili tüm gralloc arabellekleri serbest bırakılır.
stream_list yapısının sahibi çerçevedir ve bu çağrı tamamlandıktan sonra erişilemez. Tek bir camera3_stream_t yapısının adresi, stream_list bağımsız değişkeninde artık bu camera3_stream_t'yi içermeyen ilk configure_stream() çağrısının sonuna kadar HAL tarafından erişim için geçerli kalır. HAL, configure_streams() doğrudan çağrısı sırasındaki usage ve max_buffers üyeleri dışında, özel işaretçi dışındaki akış yapısındaki değerleri değiştiremez.
Yayın yeniyse yayın yapısının usage, max_buffer ve private pointer alanlarının tümü 0 olarak ayarlanır. HAL cihazı, configure_streams() çağrısı döndürülmeden önce bu alanları ayarlamalıdır. Bu alanlar daha sonra çerçeve ve platform gralloc modülü tarafından her akış için gralloc arabelleklerini ayırmak üzere kullanılır.
Bu tür yeni bir akıştaki arabelleklerin yakalama isteğine dahil edilebilmesi için çerçeve, bu akışla birlikte register_stream_buffers() işlevini çağırır. Ancak çerçevenin, istek göndermeden önce tüm akışlar için arabellek kaydetmesi gerekmez. Bu sayede, örneğin bir önizleme yayınını hızlıca başlatabilir ve diğer yayınları daha sonra veya aynı anda yayınlayabilirsiniz.
Yalnızca CAMERA_DEVICE_API_VERSION_3_1:
HAL kamera cihazı işleme ardışık düzenini sıfırlayın ve yeni giriş ve çıkış akışları oluşturun. Bu çağrı, mevcut yayın yapılandırmalarını stream_list içinde tanımlanan yayınlarla değiştirir. Bu yöntem, initialize() sırasından sonra process_capture_request() kullanılarak bir istek gönderilmeden önce en az bir kez çağrılır.
stream_list en az bir çıkışa sahip akış içermelidir ve birden fazla girişe sahip akış içeremez.
stream_list, şu anda etkin olan akış grubunda da bulunan akışları (önceki configure_stream() çağrısından) içerebilir. Bu akışlar, kullanım, max_buffers ve özel işaretçi için geçerli değerlere sahip olacaktır.
Bu tür bir akış için arabellekleri daha önce kaydedilmişse register_stream_buffers() işlevi akış için tekrar çağrılmaz ve akıştaki arabellekler giriş isteklerine hemen dahil edilebilir.
HAL'ın yeni yapılandırma nedeniyle mevcut bir akış için akış yapılandırmasını değiştirmesi gerekirse yapılandırma çağrısı sırasında usage ve/veya max_buffers değerlerini yeniden yazabilir.
Çerçeve bu tür bir değişikliği algılar, ardından akış arabelleklerini yeniden ayarlar ve istekte bu akıştaki arabellekleri kullanmadan önce register_stream_buffers() işlevini tekrar çağırır.
Halihazırda etkin olan bir akış stream_list'e dahil edilmezse HAL, bu akışa yapılan tüm referansları güvenli bir şekilde kaldırabilir. Daha sonraki bir configure() çağrısında çerçeve tarafından yeniden kullanılmaz ve configure_streams() çağrısı döndükten sonra bununla ilgili tüm gralloc arabellekleri serbest bırakılır.
stream_list yapısının sahibi çerçevedir ve bu çağrı tamamlandıktan sonra erişilemez. Tek bir camera3_stream_t yapısının adresi, stream_list bağımsız değişkeninde artık bu camera3_stream_t'yi içermeyen ilk configure_stream() çağrısının sonuna kadar HAL tarafından erişim için geçerli kalır. HAL, configure_streams() doğrudan çağrısı sırasındaki usage ve max_buffers üyeleri dışında, özel işaretçi dışındaki akış yapısındaki değerleri değiştiremez.
Yayın yeniyse yayın yapısının max_buffer ve özel işaretçi alanlarının tümü 0 olarak ayarlanır. Kullanım, tüketici kullanım işaretlerine ayarlanır. HAL cihazı, configure_streams() çağrısı döndürülmeden önce bu alanları ayarlamalıdır. Bu alanlar daha sonra çerçeve ve platform gralloc modülü tarafından her akış için gralloc arabelleklerini ayırmak üzere kullanılır.
Bu tür yeni bir akıştaki arabelleklerin yakalama isteğine dahil edilebilmesi için çerçeve, bu akışla birlikte register_stream_buffers() işlevini çağırır. Ancak çerçevenin, istek göndermeden önce tüm akışlar için arabellek kaydetmesi gerekmez. Bu sayede, örneğin bir önizleme yayınını hızlıca başlatabilir ve diğer yayınları daha sonra veya aynı anda yayınlayabilirsiniz.
>= CAMERA_DEVICE_API_VERSION_3_2:
HAL kamera cihazı işleme ardışık düzenini sıfırlayın ve yeni giriş ve çıkış akışları oluşturun. Bu çağrı, mevcut yayın yapılandırmalarını stream_list içinde tanımlanan yayınlarla değiştirir. Bu yöntem, initialize() sırasından sonra process_capture_request() kullanılarak bir istek gönderilmeden önce en az bir kez çağrılır.
stream_list en az bir çıkışa sahip akış içermelidir ve birden fazla girişe sahip akış içeremez.
stream_list, şu anda etkin olan akış grubunda da bulunan akışları (önceki configure_stream() çağrısından) içerebilir. Bu akışlar, kullanım, max_buffers ve özel işaretçi için geçerli değerlere sahip olacaktır.
HAL'ın yeni yapılandırma nedeniyle mevcut bir akış için akış yapılandırmasını değiştirmesi gerekirse yapılandırma çağrısı sırasında usage ve/veya max_buffers değerlerini yeniden yazabilir.
Çerçeve bu tür bir değişikliği algılar ve ardından bir istekte bu akıştaki arabellekleri kullanmadan önce akış arabelleğini yeniden dağıtabilir.
Halihazırda etkin olan bir akış stream_list'e dahil edilmezse HAL, bu akışa yapılan tüm referansları güvenli bir şekilde kaldırabilir. Daha sonraki bir configure() çağrısında çerçeve tarafından yeniden kullanılmaz ve configure_streams() çağrısı döndükten sonra bununla ilgili tüm gralloc arabellekleri serbest bırakılır.
stream_list yapısının sahibi çerçevedir ve bu çağrı tamamlandıktan sonra erişilemez. Tek bir camera3_stream_t yapısının adresi, stream_list bağımsız değişkeninde artık bu camera3_stream_t'yi içermeyen ilk configure_stream() çağrısının sonuna kadar HAL tarafından erişim için geçerli kalır. HAL, configure_streams() doğrudan çağrısı sırasındaki usage ve max_buffers üyeleri dışında, özel işaretçi dışındaki akış yapısındaki değerleri değiştiremez.
Yayın yeniyse yayın yapısının max_buffer ve özel işaretçi alanlarının tümü 0 olarak ayarlanır. Kullanım, tüketici kullanım işaretlerine ayarlanır. HAL cihazı, configure_streams() çağrısı döndürülmeden önce bu alanları ayarlamalıdır. Bu alanlar daha sonra çerçeve ve platform gralloc modülü tarafından her akış için gralloc arabelleklerini ayırmak üzere kullanılır.
Yeni ayrılan arabellekler, çerçeve tarafından dilediğiniz zaman yakalama isteğine dahil edilebilir. Bir gralloc arabelleği, process_capture_result ile çerçeveye döndürüldükten sonra (ve ilgili release_fence sinyali gönderildikten sonra) çerçeve bu arabelleği dilediğinde serbest bırakabilir veya yeniden kullanabilir.
Ön koşullar:
Çerçeve bu yöntemi yalnızca hiçbir yakalama işlenmediği zaman çağırır. Yani tüm sonuçlar çerçeveye döndürülmüş, tüm uçuştaki giriş ve çıkış arabellekleri döndürülmüş ve bunların serbest bırakma senkronizasyon çitleri HAL tarafından sinyallenmiştir. configure_streams() çağrısı devam ederken çerçeve, yakalama için yeni istek göndermez.
Sonraki koşullar:
HAL cihazı, kamera cihazının statik meta verilerinde belirtildiği gibi çıkış akışlarının boyutları ve biçimleri göz önüne alınarak mümkün olan maksimum çıkış kare hızını sağlayacak şekilde yapılandırılmalıdır.
Performans koşulları:
Görüntü sensörünün ve kamera işleme ardışık düzeninin sıfırlanması ve yeniden yapılandırılması gerekebileceğinden bu çağrının ağır olması ve tamamlanmasının birkaç yüz milisaniye sürmesi beklenir. Yine de HAL cihazı, uygulama çalışma modu değişiklikleri sırasında kullanıcı tarafından görülebilen duraklamaları en aza indirmek için yeniden yapılandırma gecikmesini en aza indirmeye çalışmalıdır (ör. fotoğraf çekmeden video kaydına geçme).
HAL bu çağrıdan 500 ms içinde, ardından 1.000 ms içinde dönmelidir.
Döndürülen değerler:
0: Akış yapılandırması başarılı olduğunda
-EINVAL: İstenen akış yapılandırması geçersizse. Geçersiz yayın yapılandırmalarına örnek olarak şunlar verilebilir:
- 1'den fazla girişe sahip akış ekleme (INPUT veya BIDIRECTIONAL)
- Çıkış yapabilen akışlar (OUTPUT veya BIDIRECTIONAL) dahil değildir.
- Desteklenmeyen biçimlere veya bu biçim için desteklenmeyen boyutlara sahip akışlar dahildir.
- Belirli bir biçimde çok fazla çıkış akışı ekleme
- Desteklenmeyen döndürme yapılandırması (yalnızca sürümü >= CAMERA_DEVICE_API_VERSION_3_3 olan cihazlar için geçerlidir)
- Akış boyutları/biçimlerinin NORMAL olmayan mod için camera3_stream_configuration_t->operation_mode koşulları karşılanmıyor veya istenen operation_mode, HAL tarafından desteklenmiyor. (yalnızca CAMERA_DEVICE_API_VERSION_3_3 ve sonraki sürümlere sahip cihazlar için geçerlidir)
Akış yapılandırmaları yapılandırılmadan önce kontrol edildiğinden, çerçevenin geçersiz bir akış yapılandırması göndermesinin normal bir işlem olmadığını unutmayın. Geçersiz yapılandırma, çerçeve kodunda bir hata olduğu veya HAL'ın statik meta verileri ile akışlardaki koşullar arasında bir uyuşmazlık olduğu anlamına gelir.
-ENODEV: Önemli bir hata oluştuysa ve cihaz artık çalışmıyorsa. Bu hata döndürüldükten sonra yalnızca close() işlevi çerçeve tarafından başarıyla çağrılabilir.
const camera_metadata_t *(* construct_default_request_settings)(const struct camera3_device *, int type) |
construct_default_request_settings:
Standart kamera kullanım alanları için çekim ayarları oluşturun.
Cihaz, istenen kullanım alanını karşılayacak şekilde yapılandırılmış bir ayarlar arabelleği döndürmelidir. Bu arabellek, CAMERA3_TEMPLATE_* enum'larından biri olmalıdır. Tüm istek denetimi alanları eklenmelidir.
HAL bu yapının sahipliğini korur ancak yapının işaretçisi, cihaz kapatılana kadar geçerli olmalıdır. Çerçeve ve HAL, bu çağrı tarafından döndürüldükten sonra arabelleği değiştiremez. Aynı şablon veya diğer şablonlar için sonraki çağrılarda aynı arabellek döndürülebilir.
Performans koşulları:
Bu, engellenmeyen bir çağrı olmalıdır. HAL bu çağrıdan 1 ms içinde, 5 ms içinde dönmelidir.
Döndürülen değerler:
Geçerli meta veriler: Varsayılan ayarlar arabelleğinin başarıyla oluşturulması.
NULL: Kritik bir hata durumunda. Bu döndürüldükten sonra çerçeve yalnızca close() yöntemini başarıyla çağırabilir.
void(* dump)(const struct camera3_device *, int fd) |
dökümü:
Kamera cihazının hata ayıklama durumunu yazdırın. Bu yöntem, kamera hizmetinden hata ayıklama dökümü istendiğinde çerçeve tarafından çağrılır. Bu durum, dumpsys aracı kullanıldığında veya bir hata raporu yakalandığında gerçekleşir.
İletilen dosya tanımlayıcısı, dprintf() veya write() kullanılarak hata ayıklama metni yazmak için kullanılabilir. Metin yalnızca ASCII kodlamasında olmalıdır.
Performans koşulları:
Bu, engellenmeyen bir çağrı olmalıdır. HAL bu çağrıdan 1 ms içinde, bu çağrıdan 10 ms içinde dönmelidir. Bu çağrı, kamera çalışırken herhangi bir noktada çağrılabileceği için kilitlenmelere yol açmamalıdır. Kullanılan tüm senkronizasyon temel öğeleri (ör. mutex kilitleri veya semaforlar) zaman aşımı ile edinilmelidir.
Tanımı, camera3.h dosyasının 2971. satırı içindedir.
int(* flush)(const struct camera3_device *) |
flush:
Belirtilen cihazda, işleme alınmış tüm yakalamaları ve ardışık düzendeki tüm arabellekleri temizleyin. Çerçeve, configure_streams() çağrısına hazırlanmak için tüm durumu mümkün olduğunca hızlı bir şekilde dökmek amacıyla bunu kullanır.
Başarılı bir şekilde döndürülmesi gereken hiçbir arabellek yoktur. Bu nedenle, flush() sırasında tutulan her arabellek (başarılı bir şekilde doldurulmuş olsun veya olmasın) CAMERA3_BUFFER_STATUS_ERROR ile döndürülebilir. Bu çağrı sırasında HAL'in, başarıyla doldurulmaları koşuluyla geçerli (CAMERA3_BUFFER_STATUS_OK) arabellekleri döndürmesine yine de izin verildiğini unutmayın.
Şu anda HAL'de bulunan tüm isteklerin en kısa sürede iade edilmesi beklenmektedir. İşleme alınmayan istekler hemen hata döndürmelidir. Kesilebilir donanım blokları durdurulmalı, kesintisiz bloklar ise beklenmelidir.
flush() process_capture_request() ile eşzamanlı olarak çağrılabilir. Bu durumda, process_capture_request işlevinin hızlı bir şekilde dönmesi ve bu process_capture_request çağrısında gönderilen isteğin diğer tüm uçuştaki istekler gibi ele alınması beklenir. Eşzamanlılık sorunları nedeniyle, HAL'ın bakış açısından, temizleme çağrısı yapıldıktan ancak henüz döndürülmedikten sonra process_capture_request() çağrısının başlatılması mümkündür. Böyle bir çağrı, flush() dönmeden önce gerçekleşirse HAL, yeni yakalama isteğini diğer bekleyen isteklerle aynı şekilde ele almalıdır (aşağıdaki 4. maddeye bakın).
Daha ayrıntılı olarak belirtmek gerekirse HAL, çeşitli durumlarda aşağıdaki şartlara uymalıdır:
- HAL'ın iptal edemeyeceği/durduramayacak kadar geç olan ve HAL tarafından normal şekilde tamamlanacak çekimler için; yani HAL, shutter/notify ve process_capture_result ile arabellekleri normal şekilde gönderebilir.
- İşleme yapılmamış bekleyen istekler için HAL, CAMERA3_MSG_ERROR_REQUEST bildirimini çağırmalı ve tüm çıkış arabelleklerini process_capture_result ile hata durumunda (CAMERA3_BUFFER_STATUS_ERROR) döndürmelidir. HAL, serbest bırakma çitini hata durumuna koymamalıdır. Bunun yerine, serbest bırakma çitleri çerçeve tarafından iletilen edinme çitlerine veya HAL tarafından zaten beklenmişse -1 değerine ayarlanmalıdır. Bu, HAL'ın CAMERA3_MSG_SHUTTER ile notify() işlevini zaten çağırdığı ancak meta veri/geçerli arabellek oluşturmayacağı tüm yakalamalarda da izlenecek yoldur. CAMERA3_MSG_ERROR_REQUEST'ten sonra, belirli bir kare için yalnızca CAMERA3_BUFFER_STATUS_ERROR'da arabellekler içeren process_capture_results çağrılarına izin verilir. Boş olmayan meta veriler içeren başka notify veya process_capture_result çağrılarına izin verilmez.
-
Tüm çıkış arabelleklerine sahip olmayan veya meta verileri eksik olan, kısmen tamamlanmış bekleyen istekler için HAL aşağıdakileri yapmalıdır:
3.1. Beklenen sonuç meta verilerinden bazıları (ör. bir veya daha fazla kısmi meta veri) çekim için kullanılamayacaksa CAMERA3_MSG_ERROR_RESULT ile notify çağrısı yapın.
3.2. Kayıt için üretilmeyecek her arabellek için CAMERA3_MSG_ERROR_BUFFER ile notify çağrısı yapın.
3.3 process_capture_result ile herhangi bir arabellek/meta veri döndürülmeden önce CAMERA3_MSG_SHUTTER ile notify çağrısı yapın.
3.4 Bazı sonuçlar verecek çekimler için HAL, CAMERA3_MSG_ERROR_REQUEST çağrısı yapmamalıdır. Bu çağrı, tamamen başarısız olduğunu gösterir.
3.5. Geçerli tamponlar/meta veriler çerçeveye normal şekilde iletilmelidir.
3.6. Başarısız olan arabellekler, 2. durum için açıklandığı şekilde çerçeveye döndürülmelidir. Ancak başarısız arabelleklerin, geçerli arabelleklerin katı sıralamasını izlemesi gerekmez ve geçerli arabelleklere göre sıra dışı olabilir. Örneğin, A, B, C, D, E tamponları gönderilir ve D ile E başarısız olursa A, E, B, D, C kabul edilebilir bir geri gönderme sırasıdır.
3.7. Tamamen eksik meta veriler için CAMERA3_MSG_ERROR_RESULT çağrısı yeterlidir. process_capture_result işlevini NULL meta verileriyle veya eşdeğeriyle çağırmanız gerekmez.
- process_capture_request() çağrısı etkinken flush() çağrısı yapılırsa bu işlem çağrısı en kısa sürede döndürülmelidir. Ayrıca, process_capture_request() çağrısı, flush() çağrıldıktan sonra ancak flush() döndürülmeden önce yapılırsa geç process_capture_request çağrısı tarafından sağlanan yakalama isteği, yukarıdaki 2. durumdaki bekleyen istek gibi ele alınmalıdır.
flush() yalnızca HAL'de bekleyen arabellekler veya istekler kalmadığında döndürülmelidir. Çerçeve, HAL durumu artık sessiz olduğu için configure_streams'i çağırabilir veya yeni istekler gönderebilir.
Yalnızca tamamen başarılı ve tamamen başarısız sonuç durumlarını desteklemenin yeterli olduğunu unutmayın. Ancak, genel temizleme çağrısı performansını iyileştirmeye yardımcı olabileceğinden, kısmi başarısızlık durumlarının da desteklenmesi son derece arzu edilir.
Performans koşulları:
HAL, bu çağrıdan 100 ms içinde ve bu çağrıdan 1.000 ms içinde dönmelidir. Ayrıca bu çağrı, ardışık düzen gecikmesinden daha uzun süre engellenmemelidir (tanım için S7'ye bakın).
Sürüm bilgileri:
Yalnızca cihaz sürümü >= CAMERA_DEVICE_API_VERSION_3_1 ise kullanılabilir.
Döndürülen değerler:
0: Kamera HAL'inin başarılı bir şekilde temizlenmesi.
-EINVAL: Giriş hatalıysa (cihaz geçerli değilse).
-ENODEV: Kamera cihazı ciddi bir hatayla karşılaştıysa. Bu hata döndürüldükten sonra çerçeve yalnızca close() yöntemini başarıyla çağırabilir.
Tanımı, şu dosyanın 3077 satırında bulabilirsiniz: camera3.h .
void(* get_metadata_vendor_tag_ops)(const struct camera3_device *, vendor_tag_query_ops_t *ops) |
get_metadata_vendor_tag_ops:
Tedarikçi firma uzantısı meta veri etiketi bilgilerini sorgulamak için yöntemler alın. HAL, tüm tedarikçi etiketi işlem yöntemlerini doldurmalı veya tedarikçi etiketi tanımlanmamışsa işlemleri değiştirmeden bırakmalıdır.
vendor_tag_query_ops_t tanımını system/media/camera/include/system/camera_metadata.h dosyasında bulabilirsiniz.
>= CAMERA_DEVICE_API_VERSION_3_2: KULLANIMDAN KALDIRILDI. Bu işlevin desteği sonlandırılmıştır ve HAL tarafından NULL olarak ayarlanmalıdır. Lütfen bunun yerine camera_common.h dosyasında get_vendor_tag_ops işlevini uygulayın.
int(* initialize)(const struct camera3_device *, const camera3_callback_ops_t *callback_ops) |
initialize:
Çerçeve geri çağırma işlevi işaretçilerini HAL'e iletmek için tek seferlik başlatma. Başarılı bir open() çağrısından sonra, camera3_device_ops yapısında başka işlevler çağrılmadan önce bir kez çağrılır.
Performans koşulları:
Bu, engellenmeyen bir çağrı olmalıdır. HAL bu çağrıdan 5 ms içinde, 10 ms içinde dönmelidir.
Döndürülen değerler:
0: Başarılı başlatma
-ENODEV: Başlatma başarısız olursa. Bundan sonra yalnızca close() işlevi çerçeve tarafından başarıyla çağrılabilir.
int(* process_capture_request)(const struct camera3_device *, camera3_capture_request_t *request) |
process_capture_request:
HAL'e yeni bir yakalama isteği gönderin. HAL, işlenecek bir sonraki isteği kabul etmeye hazır olana kadar bu çağrıdan dönmemelidir. Çerçeve tarafından aynı anda yalnızca bir process_capture_request() çağrısı yapılır ve tüm çağrılar aynı iş parçacığında olur. Yeni bir istek ve ilişkili arabellekler kullanıma sunulduğunda process_capture_request() işlevine bir sonraki çağrı yapılır. Normal bir önizleme senaryosundaki bu durum, işlevin çerçeve tarafından neredeyse anında tekrar çağrılacağı anlamına gelir.
Gerçek istek işleme işlemi eşzamansızdır ve yakalama sonuçları, HAL tarafından process_capture_result() çağrısı aracılığıyla döndürülür. Bu çağrı için sonuç meta verilerinin mevcut olması gerekir ancak çıkış arabellekleri, beklemek için senkronizasyon çitleri sağlayabilir. Tam çıkış kare hızını korumak için aynı anda birden fazla istek gönderilmesi gerekir.
İstek yapısının sahipliği çerçevede kalır. Bu kimliğin yalnızca bu arama sırasında geçerli olacağı garanti edilir. HAL cihazı, yakalama işlemi için saklaması gereken bilgilerin kopyalarını oluşturmalıdır. Arabelleklerin çitlerini bekleyip kapatmaktan ve arabellek tutamaçlarını çerçeveye döndürmekten HAL sorumludur.
HAL, giriş arabelleğinin NULL olmaması durumunda giriş arabelleğinin serbest bırakma senkronizasyon çitinin dosya tanımlayıcısını input_buffer->release_fence içine yazmalıdır. HAL, giriş arabelleğinin senkronizasyon çiti için -1 döndürürse çerçeve, giriş arabelleğini hemen yeniden kullanabilir. Aksi takdirde çerçeve, giriş arabelleğini doldurup yeniden kullanmadan önce senkronizasyon çitinde bekler.
>= CAMERA_DEVICE_API_VERSION_3_2:
Her istekte çerçeve tarafından sağlanan giriş/çıkış arabellekleri yepyeni olabilir (HAL tarafından daha önce hiç görülmemiş).
Performansla ilgili dikkat edilmesi gereken noktalar:
Yeni bir arabellek kullanımı son derece hafif olmalı ve kare hızında düşüş veya kare titremesi olmamalıdır.
Bu çağrı, özellikle yayın durumları için (son işleme kalite ayarları HIZLI olarak ayarlanmışsa) istenen kare hızının korunmasını sağlayacak kadar hızlı bir şekilde döndürülmelidir. HAL bu çağrıyı 1 kare aralığında döndürmeli ve bu çağrıdan 4 kare aralığında dönmelidir.
Döndürülen değerler:
0: Kayıt isteğinin işlenmeye başarıyla başlaması
-EINVAL: Giriş hatalı biçimlendirilmişse (izin verilmediğinde ayarlar NULL ise, 0 çıkış arabelleği varsa vb.) ve yakalama işlemi başlatılamıyorsa. İstek işlenirken ortaya çıkan hatalar, camera3_callback_ops_t.notify() çağrısı yapılarak ele alınmalıdır. Bu hata durumunda çerçeve, akış arabelleklerinin çitleri ve arabellek tutamaçlarıyla ilgili sorumluluğu üstlenir. HAL, çitleri kapatmamalı veya bu arabellekleri process_capture_result ile döndürmemelidir.
-ENODEV: Kamera cihazı ciddi bir hatayla karşılaştıysa. Bu hata döndürüldükten sonra çerçeve yalnızca close() yöntemini başarıyla çağırabilir.
int(* register_stream_buffers)(const struct camera3_device *, const camera3_stream_buffer_set_t *buffer_set) |
register_stream_buffers:
>= CAMERA_DEVICE_API_VERSION_3_2:
KULLANIMDAN KALDIRILDI. Bu işlev çağrılmaz ve NULL olarak ayarlanmalıdır.
<= CAMERA_DEVICE_API_VERSION_3_1:
Belirli bir akış için arabellekleri HAL cihazına kaydedin. Bu yöntem, configure_streams tarafından yeni bir akış tanımlandıktan sonra ve bu akıştaki arabellekler bir yakalama isteğine dahil edilmeden önce çerçeve tarafından çağrılır. Aynı akış, sonraki bir configure_streams() çağrısında listelenirse register_stream_buffers, söz konusu akış için tekrar çağrılmaz.
Çerçevenin, ilk yakalama isteğini göndermeden önce tüm yapılandırılan akışlar için arabellek kaydetmesi gerekmez. Bu sayede, diğer akışlar hâlâ ayrılırken önizleme (veya benzer kullanım alanları) için hızlı başlatma yapılabilir.
Bu yöntem, HAL cihazının arabellekleri daha sonra kullanmak üzere eşlemesine veya başka bir şekilde hazırlamasına olanak tanır. İletilen arabellekler kullanım için kilitlenmiş olmalıdır. Görüşmenin sonunda tüm arabellekler akışa geri döndürülmeye hazır olmalıdır. buffer_set bağımsız değişkeni yalnızca bu çağrının süresi boyunca geçerlidir.
Akış biçimi HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED olarak ayarlandıysa kamera HAL'i, platforma özel piksel biçimi bilgilerini belirlemek için burada iletilen arabellekleri incelemelidir.
Performans koşulları:
Bu, engellenmeyen bir çağrı olmalıdır. HAL bu çağrıdan 1 ms içinde, 5 ms içinde dönmelidir.
Döndürülen değerler:
0: Yeni akış arabelleklerinin başarıyla kaydedilmesi
-EINVAL: stream_buffer_set geçerli bir etkin akışı referans almıyorsa veya buffers dizisi geçersizse.
-ENOMEM: Arabelleklerin kaydedilmesinde hata varsa. Çerçeve, tüm akış arabelleklerinin kayıtsız olduğunu dikkate almalı ve daha sonra tekrar kaydetmeyi deneyebilir.
-ENODEV: Önemli bir hata varsa ve cihaz artık çalışmıyorsa. Bu hata döndürüldükten sonra yalnızca close() işlevi çerçeve tarafından başarıyla çağrılabilir.
Bu yapının dokümanları aşağıdaki dosyadan oluşturulmuştur:
- hardware/libhardware/include/hardware/ camera3.h