ความสามารถในการแสดงผล (เช่น โหมดการแสดงผลและประเภท HDR ที่รองรับ) อาจเปลี่ยนแปลง แบบไดนามิกในอุปกรณ์ที่มีจอแสดงผลที่เชื่อมต่อภายนอก (ด้วย HDMI หรือ DisplayPort) เช่น กล่องรับสัญญาณ (STB) ของ Android TV และอุปกรณ์การแพร่ภาพและเสียงผ่านโครงข่ายอินเทอร์เน็ต (Over The Top หรือ OTT) การเปลี่ยนแปลงนี้อาจเกิดขึ้นจากสัญญาณ Hotplug ของ HDMI เช่น เมื่อผู้ใช้เปลี่ยนจากจอแสดงผลหนึ่งไปยังอีกจอหนึ่ง หรือบูตอุปกรณ์โดยไม่มีจอแสดงผลที่เชื่อมต่อ Android 12 ขึ้นไปมีการเปลี่ยนแปลงในเฟรมเวิร์กเพื่อจัดการความสามารถในการเสียบร้อนและจอแสดงผลแบบไดนามิก
หน้านี้อธิบายการจัดการการเสียบจอแสดงผลขณะทำงานและการเปลี่ยนแปลงความสามารถของจอแสดงผลใน Composer HAL นอกจากนี้ ยังอธิบายวิธี จัดการเฟรมบัฟเฟอร์ที่เชื่อมโยงและป้องกันการแข่งขันในสถานการณ์เหล่านี้ด้วย
อัปเดตความสามารถในการแสดงผล
ส่วนนี้จะอธิบายวิธีที่เฟรมเวิร์ก Android จัดการการเปลี่ยนแปลงความสามารถของจอแสดงผล ที่เริ่มต้นโดย Composer HAL
ก่อนที่ Android จะจัดการการเปลี่ยนแปลงความสามารถในการแสดงผลได้อย่างถูกต้อง OEM ต้อง
ใช้ Composer HAL เพื่อให้ใช้
onHotplug(display, connection=CONNECTED) เพื่อแจ้งให้เฟรมเวิร์กทราบถึง
การเปลี่ยนแปลงความสามารถในการแสดงผล หลังจากที่ใช้การเปลี่ยนแปลงนี้แล้ว Android จะจัดการ
การเปลี่ยนแปลงความสามารถของจอแสดงผลดังนี้
- เมื่อตรวจพบการเปลี่ยนแปลงความสามารถในการแสดงผล เฟรมเวิร์กจะได้รับการแจ้งเตือน
onHotplug(display, connection=CONNECTED) - เมื่อได้รับการแจ้งเตือน เฟรมเวิร์กจะทิ้งสถานะการแสดงผลและสร้างสถานะใหม่ด้วยความสามารถใหม่จาก HAL โดยใช้วิธีการ
getActiveConfig,getDisplayConfigs,getDisplayAttribute,getColorModes,getHdrCapabilitiesและgetDisplayCapabilities - หลังจากที่เฟรมเวิร์กสร้างสถานะการแสดงผลใหม่แล้ว เฟรมเวิร์กจะส่ง Callback
onDisplayChangedไปยังแอปที่รอรับฟังเหตุการณ์ดังกล่าว
เฟรมเวิร์กจะจัดสรรเฟรมบัฟเฟอร์ใหม่ในเหตุการณ์
onHotplug(display, connection=CONNECTED)ที่ตามมา ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดการหน่วยความจำของ Framebuffer อย่างถูกต้องเพื่อหลีกเลี่ยงความล้มเหลวระหว่างการจัดสรร Framebuffer ใหม่ได้ที่
การจัดการ Framebuffer ของไคลเอ็นต์
จัดการสถานการณ์การเชื่อมต่อที่พบบ่อย
ส่วนนี้จะอธิบายวิธีจัดการสถานการณ์การเชื่อมต่อต่างๆ อย่างเหมาะสมในการติดตั้งใช้งานเมื่อจอแสดงผลหลักเชื่อมต่อและยกเลิกการเชื่อมต่อ
เนื่องจากสร้างขึ้นสำหรับอุปกรณ์เคลื่อนที่ เฟรมเวิร์ก Android จึงไม่มี การรองรับในตัวสำหรับจอแสดงผลหลักที่ไม่ได้เชื่อมต่อ แต่ HAL ต้อง แทนที่จอแสดงผลหลักด้วยจอแสดงผลตัวยึดตำแหน่งในการโต้ตอบกับ เฟรมเวิร์กในกรณีที่จอแสดงผลหลักถูกตัดการเชื่อมต่อทางกายภาพ
สถานการณ์ต่อไปนี้อาจเกิดขึ้นใน STB และดองเกิลทีวีที่มี จอแสดงผลที่เชื่อมต่อภายนอกซึ่งสามารถยกเลิกการเชื่อมต่อได้ หากต้องการใช้ การรองรับสถานการณ์เหล่านี้ ให้ใช้ข้อมูลในตารางต่อไปนี้
| สถานการณ์ | การใช้งาน |
|---|---|
| ไม่มีจอแสดงผลที่เชื่อมต่ออยู่ตอนบูต |
|
| เชื่อมต่อจอแสดงผลหลักทางกายภาพ |
|
| จอแสดงผลหลักถูกตัดการเชื่อมต่อทางกายภาพ |
|
ข้อควรพิจารณาเกี่ยวกับการเชื่อมต่อที่ไม่ใช่ HDMI
Android TV รองรับความละเอียดต่อไปนี้เท่านั้น
- 720x1280
- 1080x1920
- 2160x3840
- 4320x7680
เมื่อ STB หรือดองเกิลทีวีพยายามแสดงความละเอียดที่ไม่รองรับ เช่น 480i ผ่านการเชื่อมต่อ CVBS ระบบจะแสดงข้อความแสดงข้อผิดพลาดต่อผู้ใช้
หาก STB หรือดองเกิลทีวีมีการเชื่อมต่อทั้ง HDMI และที่ไม่ใช่ HDMI การเชื่อมต่อ HDMI
จะเป็นจอแสดงผลหลัก และการเชื่อมต่อที่ไม่ใช่ HDMI จะ
ไม่ทำงาน ด้วยเหตุนี้ หากการเชื่อมต่อ HDMI ถูกยกเลิกในขณะที่การเชื่อมต่อที่ไม่ใช่ HDMI ยังคงเชื่อมต่ออยู่ ระบบจะส่งเหตุการณ์ไปยัง SurfaceFlinger และต้องแสดงความสามารถของจอแสดงผลที่ไม่ใช่ HDMI ผ่าน getDisplayAttribute และ API อื่นๆ ของ IComposerClient (เช่น getHdrCapabilities)
ใช้รหัสการกำหนดค่าตามลำดับเพื่อป้องกันสภาวะการแข่งขัน
เงื่อนไขการแข่งขันอาจเกิดขึ้นหาก HAL ของ Composer อัปเดตการกำหนดค่าจอแสดงผลที่รองรับพร้อมกันกับเฟรมเวิร์กที่เรียก setActiveConfig หรือ setActiveConfigWithConstraints วิธีแก้คือการติดตั้งใช้งาน Composer
HAL เพื่อใช้รหัสตามลำดับและป้องกันปัญหานี้
ส่วนนี้จะอธิบายวิธีที่สภาวะการแข่งขันอาจเกิดขึ้น ตามด้วยรายละเอียด เกี่ยวกับวิธีติดตั้งใช้งาน Composer HAL เพื่อให้ใช้รหัสตามลําดับเพื่อป้องกันสภาวะดังกล่าว
พิจลําดับเหตุการณ์ต่อไปนี้เมื่อไม่ได้กําหนดรหัสใหม่ตามลําดับ ให้กับการกําหนดค่าการแสดงผลใหม่ ซึ่งทําให้เกิดสภาวะการแข่งขัน
รหัสการกำหนดค่าการแสดงผลที่รองรับมีดังนี้
- id=1, 1080x1920 60 Hz
- id=2, 1080x1920 50 Hz
เฟรมเวิร์กจะเรียกใช้
setActiveConfig(display, config=1)ในขณะเดียวกัน Composer HAL จะประมวลผลการเปลี่ยนแปลงการกำหนดค่าจอแสดงผลและ อัปเดตสถานะภายในเป็นการกำหนดค่าจอแสดงผลชุดใหม่ ดังนี้
- id=1, 2160x3840 60 Hz
- id=2, 2160x3840 50 Hz
- id=3, 1080x1920 60 Hz
- id=4, 1080x1920 50 Hz
Composer HAL จะส่งเหตุการณ์
onHotplugไปยังเฟรมเวิร์กเพื่อแจ้งให้ทราบว่าชุดโหมดที่รองรับมีการเปลี่ยนแปลงComposer HAL จะได้รับ
setActiveConfig(display, config=1)(จาก ขั้นตอนที่ 2)HAL ตีความว่าเฟรมเวิร์กได้ขอเปลี่ยนการกำหนดค่าเป็น 2160x3840 60 Hz แม้ว่าในความเป็นจริงจะเลือก 1080x1920 60 Hz
กระบวนการใช้การกำหนดรหัสแบบไม่ต่อเนื่องจะสิ้นสุดที่นี่พร้อมกับการ ตีความการเปลี่ยนแปลงการกำหนดค่าที่เลือกผิด
กำหนดค่า HAL ของ Composer ให้ใช้รหัสตามลำดับ
หากต้องการหลีกเลี่ยงภาวะแข่งขันดังกล่าว OEM ต้องใช้ HAL ของ Composer ดังนี้
- เมื่อ Composer HAL อัปเดตการกำหนดค่าการแสดงผลที่รองรับ ระบบจะกำหนดรหัสใหม่ที่ต่อเนื่อง ให้กับการกำหนดค่าการแสดงผลใหม่
- เมื่อเฟรมเวิร์กเรียก
setActiveConfigหรือsetActiveConfigWithConstraintsด้วยรหัสการกำหนดค่าที่ไม่ถูกต้อง Composer HAL จะไม่สนใจการเรียก
ขั้นตอนเหล่านี้มีไว้เพื่อป้องกันสภาวะแข่งขันตามที่แสดงในการสนทนาต่อไปนี้
พิจารณาลำดับเหตุการณ์ต่อไปนี้เมื่อมีการกำหนดรหัสใหม่ตามลำดับ ให้กับการกำหนดค่าการแสดงผลใหม่
รหัสการกำหนดค่าการแสดงผลที่รองรับมีดังนี้
- id=1, 1080x1920 60 Hz
- id=2, 1080x1920 50 Hz
เฟรมเวิร์กจะเรียกใช้
setActiveConfig(display, config=1)เมื่อประมวลผลการเปลี่ยนแปลงการกำหนดค่าการแสดงผล ระบบจะกำหนดชุดรหัสการกำหนดค่าชุดถัดไป โดยเริ่มจากจำนวนเต็มที่ไม่ได้ใช้ถัดไป ดังนี้
id=3, 2160x3840 60 Hz
id=4, 2160x3840 50 Hz
id=5, 1080x1920 60 Hz
id=6, 1080x1920 50 Hz
Composer HAL จะส่งเหตุการณ์
onHotplugไปยังเฟรมเวิร์กเพื่อแจ้งให้ทราบว่าชุดโหมดที่รองรับมีการเปลี่ยนแปลงComposer HAL จะได้รับ
setActiveConfig(display, config=1)(จาก ขั้นตอนที่ 2)HAL ของ Composer จะไม่สนใจการเรียกเนื่องจากรหัสไม่ถูกต้องอีกต่อไป
เฟรมเวิร์กจะรับและประมวลผลเหตุการณ์
onHotplugจากขั้นตอนที่ 4 โดยจะเรียกใช้ HAL ของ Composer โดยใช้ฟังก์ชันgetDisplayConfigsและgetDisplayAttributeฟังก์ชันเหล่านี้ช่วยให้เฟรมเวิร์กระบุ รหัสใหม่ (5) สำหรับความละเอียดและอัตรารีเฟรชที่เลือกเป็น 1080x1920 และ 60 Hzเฟรมเวิร์กจะส่งเหตุการณ์
setActiveConfigอีกรายการพร้อมรหัสที่อัปเดตแล้ว เป็น 5HAL ของ Composer จะได้รับ
setActiveConfig(display, config=5)จาก ขั้นตอนที่ 5HAL ตีความอย่างถูกต้องว่าเฟรมเวิร์กได้ขอเปลี่ยนการกำหนดค่าเป็น 1080x1920 60 Hz
ดังที่แสดงในตัวอย่างก่อนหน้า กระบวนการที่ใช้การกำหนดรหัสตามลำดับ จะยืนยันว่ามีการป้องกันภาวะแข่งขันและมีการอัปเดตการเปลี่ยนแปลงการกำหนดค่าการแสดงผลที่ถูกต้อง