Çıkış akışları
Kamera alt sistemi, tüm çözünürlükler ve çıkış biçimleri için yalnızca ANativeWindow tabanlı ardışık düzende çalışır. GPU, video kodlayıcı, RenderScript veya uygulama tarafından görülebilen arabellekler (RAW Bayer, işlenmiş YUV arabellekleri veya JPEG kodlu arabellekler) gibi birçok hedefe tek bir kare göndermek için tek seferde birden çok akış yapılandırılabilir.
Optimizasyon amacıyla bu çıkış akışları önceden yapılandırılmalıdır ve aynı anda yalnızca sınırlı sayıda akış bulunabilir. Bu sayede, isteklerin birden fazla veya değişen çıkış ardışık düzenleriyle birlikte gönderildiğinde isteklerin yerine getirilmesinde gecikme veya gecikmeli yanıt yaşanmaması için bellek arabelleklerinin önceden ayrılmasına ve kamera donanımının yapılandırılmasına olanak tanınmaktadır.
Desteklenen donanım düzeyine bağlı olarak garanti edilen yayın çıkışı kombinasyonları hakkında daha fazla bilgi için createCaptureSession()
bölümüne bakın.
Kesme
Tam piksel dizisinin kırpılması (dijital yakınlaştırma ve daha küçük bir FOV'nin istenen diğer kullanım alanları için) ANDROID_SCALER_CROP_REGION ayarı aracılığıyla iletilir. Bu, istek başına bir ayardır ve istek başına değişebilir. Bu, sorunsuz dijital yakınlaştırma için kritik öneme sahiptir.
Bölge, (x, y, width, height) şeklinde bir dikdörtgen olarak tanımlanır. Bu dikdörtgenin sol üst köşesi (x, y) ile açıklanır. Dikdörtgen, sensör etkin piksel dizisinin koordinat sisteminde tanımlanır. Bu sistemde (0,0), etkin piksel dizisinin sol üst pikseli olur. Bu nedenle, genişlik ve yükseklik, ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY statik bilgi alanında raporlanan boyutlardan daha büyük olamaz. İzin verilen minimum genişlik ve yükseklik, HAL tarafından ANDROID_SCALER_MAX_DIGITAL_ZOOM statik bilgi alanı aracılığıyla bildirilir. Bu alan, desteklenen maksimum yakınlaştırma faktörünü tanımlar. Bu nedenle, minimum kırpma bölgesi genişliği ve yüksekliği şu şekildedir:
{width, height} = { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] / ANDROID_SCALER_MAX_DIGITAL_ZOOM), floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] / ANDROID_SCALER_MAX_DIGITAL_ZOOM) }
Kırpma bölgesinin belirli koşulları karşılaması gerekiyorsa (ör. çift koordinatlarda başlaması ve genişliğinin/yüksekliğinin çift olması gerekir) HAL gerekli yuvarlamayı yapmalı ve çıkış sonucu meta verilerinde kullanılan nihai kırpma bölgesini yazmalıdır. Benzer şekilde, HAL video sabitleme uygularsa sonuç kırpma bölgesini, video sabitleme uygulandıktan sonra çıktıya dahil edilen bölgeyi tanımlayacak şekilde ayarlamalıdır. Genel olarak, kamera kullanan bir uygulama, kırpma bölgesine, görüntü sensörünün boyutlarına ve lens odak uzunluğuna göre aldığı görüş alanını belirleyebilmelidir.
Kırpma bölgesi, kırpma bölgesinden farklı en boy oranlarına sahip olabilecek tüm yayınlar için geçerli olduğundan, her yayın için kullanılan tam sensör bölgesi kırpma bölgesinden daha küçük olabilir. Daha açık belirtmek gerekirse her yayın, tanımlanan kırpma bölgesini minimum düzeyde daha da kırparak kare pikselleri ve en boy oranını korumalıdır. Yayın en boy oranı kırpma bölgesinden daha genişse yayın daha da dikey olarak kırpılmalıdır. Yayın en boy oranı kırpma bölgesinden daha darsa yayın daha da yatay olarak kırpılmalıdır.
Her durumda, yayın kırpması tam kırpma bölgesinin ortasına yerleştirilmelidir ve her yayın, tam kırpma bölgesine göre yalnızca yatay veya dikey olarak kırpılır, hiçbir zaman ikisi birden kırpılmaz.
Örneğin, iki akış tanımlanırsa (640x480 akış (4:3 en boy oranı) ve 1280x720 akış (16:9 en boy oranı)) aşağıda, varsayımsal bir 3 MP (2000 x 1500 piksel dizisi) sensörde birkaç örnek kırpma bölgesi için her akışta beklenen çıkış bölgeleri gösterilmektedir.
Kırpma bölgesi: (500, 375, 1000, 750) (4:3 en boy oranı)
640x480 yayın kırpması: (500, 375, 1000, 750) (kırpma bölgesine eşit)
1280x720 yayın kırpması: (500, 469, 1000, 562)
Kırpma bölgesi: (500, 375, 1333, 750) (16:9 en boy oranı)
640x480 yayın kırpması: (666, 375, 1000, 750)
1280x720 yayın kırpması: (500, 375, 1333, 750) (kırpma bölgesine eşit)
Kırpma bölgesi: (500, 375, 750, 750) (1:1 en boy oranı)
640x480 yayın kırpması: (500, 469, 750, 562)
1280x720 yayın kırpması: (500, 543, 750, 414)
Son örnek olarak, 480p yayın yerine 1024x1024 kare en boy oranına sahip bir yayın:
Kırpma bölgesi: (500, 375, 1000, 750) (4:3 en boy oranı)
1024x1024 yayın kırpması: (625, 375, 750, 750)
1280x720 yayın kırpması: (500, 469, 1000, 562)
Yeniden işleniyor
RAW Bayer verileri için yeniden işleme desteği, ham görüntü dosyaları için ek destek sağlar. Bu destek, kamera ardışık düzeninin yeni oluşturulmuş bir YUV veya JPEG çıkışı oluşturmak için önceden yakalanmış RAW arabelleğini ve meta verilerini (daha önce kaydedilen tüm kare) işleyebilmesini sağlar.
Yakınlaştırma
Android 11 veya sonraki sürümleri çalıştıran cihazlarda uygulamalar, ANDROID_CONTROL_ZOOM_RATIO
ayarını kullanarak kameranın yakınlaştırma özelliğini (dijital ve optik) kullanabilir.
Yakınlaştırma oranı, kayan nokta faktörü olarak tanımlanır. Bir uygulama, kırpma ve yakınlaştırma için ANDROID_SCALER_CROP_REGION
yerine yakınlaştırma düzeyini kontrol etmek için ANDROID_CONTROL_ZOOM_RATIO
'ü, doğal kamera sensöründen farklı en boy oranları elde etmek için yatay ve dikey kırpma için ANDROID_SCALER_CROP_REGION
'ü kullanabilir.
Çok kameralı sistemler, farklı odak uzunluklarına sahip birden fazla lens içerebilir. Kullanıcı, lensler arasında geçiş yaparak optik yakınlaştırmayı kullanabilir.
ANDROID_CONTROL_ZOOM_RATIO
kullanmanın aşağıdaki senaryolarda avantajları vardır:
- Geniş bir lensten telefoto lense yakınlaştırma: Kayan nokta oranı,
ANDROID_SCALER_CROP_REGION
tam sayı değerlerine kıyasla daha iyi hassasiyet sağlar. - Geniş lensten ultra geniş lense yakınlaştırma:
ANDROID_CONTROL_ZOOM_RATIO
, uzaklaştırmayı (<1,0f) destekler,ANDROID_SCALER_CROP_REGION
ise desteklemez.
Yakınlaştırma oranı: 2,0; orijinal görüş alanının 1/4'ü
Kırpma bölgesi: (0, 0, 2000, 1500) (4:3 en boy oranı)
640x480 yayın kırpması: (0, 0, 2000, 1500) (kırpma bölgesine eşit)
1280x720 yayın kırpması: (0, 187, 2000, 1125)
Yakınlaştırma oranı: 2,0; orijinal görüş alanının 1/4'ü (1/4) (Orijinal görüş alanının 1/4'ü)
Kırpma bölgesi: (0, 187, 2000, 1125) (16:9 en boy oranı)
640x480 akış kırpma: (250, 187, 1500, 1125) (pillarbox2080, dikey kırpılmış bölge)
Kırpma bölgesi10, 187, 2000, 1125
Yakınlaştırma oranı: 0, 5; orijinal görüş alanının 4x'i (geniş lensten ultra geniş lense geçildi)
24x1000, 1125) Kırpma bölgesi: (250, 0, 1500, 1500) (1:1 en boy oranı)
640x480 akış kırpma: (250, 187, 1500, harfli kutu24, 1125)
Yukarıdaki grafiklerde görüldüğü gibi, kırpma bölgesinin koordinat sistemi, yakınlaştırma sonrası etkili görüş alanına dönüşür ve aşağıdaki boyutlara sahip dikdörtgenle temsil edilir: (0
, 0
, activeArrayWith
, activeArrayHeight
). Aynı durum AE/AWB/AF bölgeleri ve yüzler için de geçerlidir. Bu koordinat sistemi değişikliği, RAW çekimi ve intrinsicCalibration
ile lensShadingMap
gibi ilgili meta veriler için geçerli değildir.
Yukarıdaki varsayıma dayalı aynı örneği kullanarak ve 1.çıkış akışının (640x480) vizör akışı olduğu varsayıldığında, 2, 0x yakınlaştırma iki yöntemden biriyle elde edilebilir:
zoomRatio = 2.0
,scaler.cropRegion = (0, 0, 2000, 1500)
zoomRatio = 1.0
(varsayılan),scaler.cropRegion = (500, 375, 1000, 750)
Bir uygulamanın android.control.aeRegions
değerini vizör görüş alanının sol üst çeyreği olarak ayarlaması için android.control.aeRegions
değerini (0, 0, 1000, 750)
, android.control.zoomRatio
değerini ise 2.0
olarak ayarlayın. Alternatif olarak uygulama, 1.0
'daki android.control.zoomRatio
için android.control.aeRegions
'ü (500, 375, 1000, 750)
'un eşdeğer bölgesine ayarlayabilir.