สตรีมเอาต์พุต
ระบบย่อยของกล้องจะทำงานบนไปป์ไลน์แบบ ANativeWindow เท่านั้นสำหรับความละเอียดและรูปแบบเอาต์พุตทั้งหมด คุณกำหนดค่าสตรีมหลายรายการพร้อมกันเพื่อส่งเฟรมเดียวไปยังเป้าหมายหลายรายการได้ เช่น GPU, ตัวแปลงรหัสวิดีโอ, RenderScript หรือบัฟเฟอร์ที่แสดงในแอป (บัฟเฟอร์ Bayer รูปแบบ RAW, บัฟเฟอร์ YUV ที่ประมวลผลแล้ว หรือบัฟเฟอร์ที่โค้ดด้วย JPEG)
สำหรับการเพิ่มประสิทธิภาพ สตรีมเอาต์พุตเหล่านี้ต้องได้รับการกำหนดค่าล่วงหน้า และจะมีได้เพียงจำนวนจำกัดเท่านั้น การดำเนินการนี้ช่วยให้มีการจัดสรรบัฟเฟอร์หน่วยความจำล่วงหน้าและการกำหนดค่าฮาร์ดแวร์กล้องได้ ดังนั้นเมื่อมีการส่งคำขอที่มีไปป์ไลน์เอาต์พุตหลายรายการหรือแตกต่างกันที่ระบุไว้ จึงจะไม่เกิดความล่าช้าหรือเวลาในการตอบสนองตามคำขอ
ดูข้อมูลเพิ่มเติมเกี่ยวกับชุดค่าผสมเอาต์พุตสตรีมที่รับประกันซึ่งขึ้นอยู่กับระดับฮาร์ดแวร์ที่รองรับได้ที่ createCaptureSession()
การครอตัด
การครอบตัดอาร์เรย์พิกเซลแบบเต็ม (สำหรับการซูมดิจิทัลและกรณีการใช้งานอื่นๆ ที่ต้องการ FOV ขนาดเล็ก) ผ่านการตั้งค่า ANDROID_SCALER_CROP_REGION การตั้งค่านี้เป็นการตั้งค่าต่อคำขอและสามารถเปลี่ยนแปลงตามคำขอ ซึ่งสำคัญต่อการใช้การซูมดิจิตอลอย่างราบรื่น
ภูมิภาคจะกำหนดเป็นสี่เหลี่ยมผืนผ้า (x, y, กว้าง, สูง) โดย (x, y) จะอธิบายมุมบนซ้ายของสี่เหลี่ยมผืนผ้า รูปสี่เหลี่ยมผืนผ้าจะถูกกำหนดไว้ในระบบพิกัดของอาร์เรย์พิกเซลแอ็กทีฟของเซ็นเซอร์ โดยที่ (0,0) เป็นพิกเซลด้านบนซ้ายของอาร์เรย์พิกเซลที่แอ็กทีฟ ดังนั้น ความกว้างและความสูงต้องไม่มากกว่ามิติข้อมูลที่รายงานในช่องข้อมูลแบบคงที่ของ ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY HAL จะรายงานความกว้างและความสูงขั้นต่ำที่อนุญาตผ่านช่องข้อมูลแบบคงที่ ANDROID_SCALER_MAX_DIGITAL_ZOOM ซึ่งอธิบายปัจจัยการซูมที่รองรับสูงสุด ดังนั้น ความกว้างและความสูงขั้นต่ำของพื้นที่ครอบตัดจึงเท่ากับ
{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) }
หากพื้นที่ที่ครอบตัดต้องเป็นไปตามข้อกำหนดเฉพาะ (เช่น ต้องเริ่มต้นจากพิกัดที่สม่ำเสมอ และความกว้าง/ความสูงต้องเท่าๆ กัน) HAL จะต้องปัดเศษองค์ประกอบที่จำเป็นและเขียนพื้นที่ที่ครอบตัดสุดท้ายที่ใช้ในข้อมูลเมตาของผลลัพธ์เอาต์พุต ในทำนองเดียวกัน หาก HAL ใช้ระบบกันภาพสั่น จะต้องปรับพื้นที่ครอบตัดผลลัพธ์เพื่ออธิบายพื้นที่ที่รวมอยู่ในเอาต์พุตจริงหลังจากใช้ระบบกันภาพสั่น โดยทั่วไปแล้ว แอปที่ใช้กล้องต้องสามารถระบุขอบเขตการมองเห็นที่ได้รับโดยอิงตามพื้นที่ครอบตัด ขนาดของเซ็นเซอร์รูปภาพ และความยาวโฟกัสของเลนส์
เนื่องจากพื้นที่ที่ครอบตัดจะใช้กับสตรีมทั้งหมด ซึ่งอาจมีสัดส่วนภาพต่างจากพื้นที่ที่ครอบตัด พื้นที่เซ็นเซอร์ที่แน่นอนที่ใช้สำหรับแต่ละสตรีมจึงอาจเล็กกว่าพื้นที่ที่ครอบตัด กล่าวโดยละเอียดคือ สตรีมแต่ละรายการควรรักษาพิกเซลสี่เหลี่ยมจัตุรัสและอัตราส่วนภาพไว้โดยครอบตัดพื้นที่ครอบตัดที่กําหนดไว้ให้น้อยที่สุด หากสัดส่วนภาพของสตรีมกว้างกว่าพื้นที่ครอบตัด ก็ควรครอบตัดสตรีมเพิ่มเติมในแนวตั้ง และหากสัดส่วนภาพของสตรีมแคบกว่าพื้นที่ครอบตัด ก็ควรครอบตัดสตรีมเพิ่มเติมในแนวนอน
ในทุกกรณี การสตรีมแบบครอบตัดต้องอยู่ตรงกลางของพื้นที่ครอบตัดทั้งหมด และแต่ละสตรีมจะครอบตัดในแนวนอนหรือแนวตั้งเท่านั้นเมื่อเทียบกับพื้นที่ครอบตัดทั้งหมด โดยต้องไม่ครอบตัดทั้ง 2 แบบ
ตัวอย่างเช่น หากกำหนดสตรีม 2 รายการ ได้แก่ สตรีม 640x480 (สัดส่วน 4:3) และสตรีม 1280x720 (สัดส่วน 16:9) ด้านล่างจะแสดงพื้นที่เอาต์พุตที่คาดไว้สำหรับแต่ละสตรีมสำหรับตัวอย่างพื้นที่ครอบตัด 2-3 รายการบนเซ็นเซอร์ 3 ล้านพิกเซล (อาร์เรย์ 2,000 x 1,500 พิกเซล) สมมติ
พื้นที่ครอบตัด: (500, 375, 1000, 750) (สัดส่วนภาพ 4:3)
การครอบตัดสตรีมขนาด 640x480: (500, 375, 1000, 750) (เท่ากับพื้นที่ครอบตัด)
การครอบตัดสตรีมขนาด 1280x720: (500, 469, 1000, 562)
พื้นที่ครอบตัด: (500, 375, 1333, 750) (สัดส่วนภาพ 16:9)
การครอบตัดสตรีมขนาด 640x480: (666, 375, 1000, 750)
การครอบตัดสตรีมขนาด 1280x720: (500, 375, 7503 เป็นภูมิภาค) (การครอบตัด equal เป็น 1333)
พื้นที่ครอบตัด: (500, 375, 750, 750) (สัดส่วนภาพ 1:1)
การครอบตัดสตรีมขนาด 640x480: (500, 469, 750, 562)
การครอบตัดสตรีมขนาด 1280x720: (500, 543, 750, 414)
และตัวอย่างสุดท้ายคือสตรีมที่มีสัดส่วนภาพสี่เหลี่ยมจัตุรัส 1024x1024 แทนสตรีม 480p
ดังนี้
พื้นที่ครอบตัด: (500, 375, 1000, 750) (สัดส่วนภาพ 4:3)
ครอบตัดสตรีม 1024x1024: (625, 375, 750, 750)
ครอบตัดสตรีม 1280x720: (500, 469, 1000, 562)
กำลังประมวลผล
การรองรับเพิ่มเติมสำหรับไฟล์รูปภาพ RAW มาจากการสนับสนุนการประมวลผลข้อมูล Bayer รูปแบบ RAW อีกครั้ง การรองรับนี้ทำให้ไปป์ไลน์ของกล้องสามารถประมวลผลบัฟเฟอร์ RAW และข้อมูลเมตาที่บันทึกไว้ก่อนหน้านี้ (ทั้งเฟรมที่บันทึกไว้ก่อนหน้านี้) เพื่อสร้างเอาต์พุต YUV หรือ JPEG ใหม่
Zoom
สำหรับอุปกรณ์ที่ใช้ Android 11 ขึ้นไป แอปจะใช้การซูมของกล้อง (ดิจิทัลและออปติคัล) ผ่านการตั้งค่า ANDROID_CONTROL_ZOOM_RATIO
ได้
อัตราส่วนการซูมจะกำหนดเป็นปัจจัยจุดลอยตัว แทนที่จะใช้ ANDROID_SCALER_CROP_REGION
สำหรับการครอบตัดและซูม แอปจะใช้ ANDROID_CONTROL_ZOOM_RATIO
ในการควบคุมระดับการซูม และใช้ ANDROID_SCALER_CROP_REGION
สำหรับการครอบตัดแนวนอนและแนวตั้งเพื่อให้ได้สัดส่วนภาพที่ต่างจากเซ็นเซอร์กล้องแบบเดิม
ระบบกล้องหลายตัวอาจมีเลนส์มากกว่า 1 ตัวที่มีความยาวโฟกัสต่างกัน และผู้ใช้สามารถใช้การซูมแบบออปติคัลได้โดยการสลับระหว่างเลนส์
การใช้ ANDROID_CONTROL_ZOOM_RATIO
มีข้อดีในสถานการณ์ต่อไปนี้
- การซูมจากเลนส์มุมกว้างไปยังเลนส์เทเลโฟโต้: อัตราส่วนจุดลอยตัวให้ความแม่นยำสูงกว่าค่าจำนวนเต็มของ
ANDROID_SCALER_CROP_REGION
- การซูมออกจากเลนส์มุมกว้างไปยังเลนส์มุมกว้างพิเศษ:
ANDROID_CONTROL_ZOOM_RATIO
รองรับการซูมออก (<1.0f) แต่ANDROID_SCALER_CROP_REGION
ไม่รองรับ
อัตราส่วนการซูม: 2.0; 1/4 ของมุมมองเดิม
พื้นที่ครอบตัด: (0, 0, 2000, 1500) (สัดส่วนภาพ 4:3)
การครอบตัดสตรีม 640x480: (0, 0, 2000, 1500) (เท่ากับพื้นที่ครอบตัด)
การครอบตัดสตรีม 1280x720: (0, 187, 2000, 1125)
อัตราส่วนการซูม: 2.0; 1/4 ของมุมมองเดิม
พื้นที่ครอบตัด: (0, 187, 2000, 1125) (สัดส่วนภาพ 16:9)
การครอบตัดสตรีม 640x480: (250, 187, 1500, 1125) (แบบเสา)
การครอบตัดสตรีม 1280x720: (0, 187, 2000, 1125) (เท่ากับพื้นที่ครอบตัด)
อัตราส่วนการซูม: 0.5; มุมมองเดิม 4 เท่า (เปลี่ยนจากเลนส์มุมกว้างเป็นเลนส์มุมกว้างพิเศษ)
พื้นที่ครอบตัด: (250, 0, 1500, 1500) (สัดส่วนภาพ 1:1)
การครอบตัดสตรีม 640x480: (250, 187, 1500, 1125) (แถบดำด้านบน-ล่างของภาพ)
การครอบตัดสตรีม 1280x720: (250, 328, 1500, 844) (แถบดำด้านบน-ล่างของภาพ)
จากกราฟด้านบน ระบบพิกัดของพื้นที่ครอบตัดจะเปลี่ยนเป็นมุมมองที่มีประสิทธิภาพหลังจากการซูม และแสดงด้วยสี่เหลี่ยมผืนผ้าที่มีมิติข้อมูลดังนี้ (0
, 0
, activeArrayWith
, activeArrayHeight
) เช่นเดียวกันกับพื้นที่ AE/AWB/AF และใบหน้า การเปลี่ยนแปลงระบบพิกัดนี้จะไม่มีผลกับการจับภาพ RAW และข้อมูลเมตาที่เกี่ยวข้อง เช่น intrinsicCalibration
และ lensShadingMap
โดยใช้ตัวอย่างสมมติเดียวกันด้านบน และสมมติว่าสตรีมเอาต์พุต #1 (640x480) เป็นสตรีมช่องมองภาพ การซูม 2.0 เท่าทำได้ 2 วิธีดังนี้
zoomRatio = 2.0
,scaler.cropRegion = (0, 0, 2000, 1500)
zoomRatio = 1.0
(ค่าเริ่มต้น),scaler.cropRegion = (500, 375, 1000, 750)
หากต้องการให้แอปตั้งค่า android.control.aeRegions
เป็นมุมซ้ายบน
ของช่องมองภาพในช่องมองภาพ ให้ตั้งค่า android.control.aeRegions
เป็น (0, 0, 1000, 750)
โดยตั้งค่า android.control.zoomRatio
เป็น 2.0
หรือจะตั้งค่า android.control.aeRegions
เป็นภูมิภาคที่เทียบเท่าของ (500, 375, 1000, 750)
สำหรับ android.control.zoomRatio
ของ 1.0
ก็ได้