ความสามารถของจอแสดงผล (เช่น โหมดการแสดงผลและประเภท HDR ที่รองรับ) อาจเปลี่ยนแปลงได้แบบไดนามิกในอุปกรณ์ที่มีจอแสดงผลที่เชื่อมต่อภายนอก (ด้วย HDMI หรือ DisplayPort) เช่น กล่องรับสัญญาณ (STB) ของ Android TV และอุปกรณ์ Over-the-top (OTT) การเปลี่ยนแปลงนี้อาจเกิดจากสัญญาณการเสียบ/ถอดออกของ HDMI เช่น เมื่อผู้ใช้เปลี่ยนจากจอแสดงผลหนึ่งไปยังอีกจอหนึ่งหรือบูตอุปกรณ์โดยไม่มีจอแสดงผลที่เชื่อมต่ออยู่ Android 12 ขึ้นไปจะมีการเปลี่ยนแปลงเฟรมเวิร์กเพื่อจัดการความสามารถในการเสียบร้อนและการแสดงผลแบบไดนามิก
หน้านี้อธิบายการจัดการ HotPlug ของ Display และการเปลี่ยนแปลงความสามารถในการแสดงผลในการใช้งาน Composer HAL นอกจากนี้ ยังอธิบายวิธีจัดการ Framebuffer ที่เชื่อมโยงและป้องกันเงื่อนไขการแข่งขันในสถานการณ์เหล่านี้
อัปเดตความสามารถของจอแสดงผล
ส่วนนี้จะอธิบายวิธีที่เฟรมเวิร์ก Android จัดการการเปลี่ยนแปลงความสามารถในการแสดงผลที่ Composer HAL เริ่มต้น
OEM ต้องใช้ Composer HAL เพื่อให้ใช้ onHotplug(display, connection=CONNECTED)
เพื่อแจ้งเฟรมเวิร์กเกี่ยวกับการเปลี่ยนแปลงความสามารถของการแสดงผลอย่างถูกต้องก่อนที่ Android จะจัดการการเปลี่ยนแปลงความสามารถของการแสดงผลได้อย่างเหมาะสม หลังจากติดตั้งใช้งานแล้ว Android จะจัดการการเปลี่ยนแปลงความสามารถของจอแสดงผลดังนี้
- เมื่อตรวจพบการเปลี่ยนแปลงในความสามารถของการแสดงผล เฟรมเวิร์กจะได้รับการแจ้งเตือน
onHotplug(display, connection=CONNECTED)
- เมื่อได้รับการแจ้งเตือน เฟรมเวิร์กจะยกเลิกสถานะการแสดงผลและสร้างขึ้นใหม่ด้วยความสามารถใหม่จาก HAL โดยใช้เมธอด
getActiveConfig
,getDisplayConfigs
,getDisplayAttribute
,getColorModes
,getHdrCapabilities
และgetDisplayCapabilities
- หลังจากที่เฟรมเวิร์กสร้างสถานะการแสดงผลใหม่ขึ้นแล้ว ระบบจะส่งการเรียกกลับ
onDisplayChanged
ไปยังแอปที่กําลังรอฟังเหตุการณ์ดังกล่าวอยู่
เฟรมเวิร์กนี้จะจัดสรร Framebuffer อีกครั้งในเหตุการณ์ 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
)
ใช้รหัสการกำหนดค่าตามลำดับเพื่อป้องกันเงื่อนไขการแข่งขัน
เงื่อนไขการแข่งขันอาจเกิดขึ้นหาก Composer HAL อัปเดตการกำหนดค่าจอแสดงผลที่รองรับพร้อมกันกับเฟรมเวิร์กที่เรียกใช้ setActiveConfig
หรือ setActiveConfigWithConstraints
วิธีแก้ไขคือใช้ HAL ของคอมโพสเซอร์เพื่อใช้รหัสตามลำดับและป้องกันปัญหานี้
ส่วนนี้อธิบายวิธีการของเงื่อนไขการแข่งขัน ตามด้วยรายละเอียดเกี่ยวกับวิธีติดตั้งใช้งาน HAL ของคอมโพสเซอร์ เพื่อให้ใช้รหัสตามลำดับเพื่อป้องกันเงื่อนไขดังกล่าว
พิจารณาลำดับเหตุการณ์ต่อไปนี้ เมื่อ "ไม่ได้" กำหนดรหัสตามลำดับใหม่ให้กับการกำหนดค่าการแสดงผลใหม่ ซึ่งจะทำให้เกิดเงื่อนไขการแข่งขัน
รหัสการกำหนดค่าการแสดงผลที่รองรับมีดังนี้
- id=1, 1080x1920 60 Hz
- id=2, 1080x1920 50 Hz
เฟรมเวิร์กเรียก
setActiveConfig(display, config=1)
ในขณะเดียวกัน HAL ของ Composer จะประมวลผลการเปลี่ยนแปลงการกำหนดค่าการแสดงผลและอัปเดตสถานะภายในเป็นการกำหนดค่าการแสดงผลชุดใหม่ดังต่อไปนี้
- id=1, 2160x3840 60 Hz
- id=2, 2160x3840 50 Hz
- id=3, 1080x1920 60 Hz
- id=4, 1080x1920 50 Hz
Composer HAL จะส่งเหตุการณ์
onHotplug
ไปยังเฟรมเวิร์กเพื่อแจ้งว่าชุดโหมดที่รองรับมีการเปลี่ยนแปลงHAL ของ Composer ได้รับ
setActiveConfig(display, config=1)
(จากขั้นตอนที่ 2)HAL จะตีความว่าเฟรมเวิร์กได้ส่งคำขอเปลี่ยนการกำหนดค่าเป็น 2160x3840 60 Hz แม้ว่าในความเป็นจริงจะต้องการ 1080x1920 60 Hz ก็ตาม
กระบวนการที่ใช้การมอบหมายรหัสแบบไม่ตามลำดับจะสิ้นสุดที่นี่ด้วยการตีความการเปลี่ยนแปลงการกำหนดค่าที่ต้องการอย่างไม่ถูกต้อง
กำหนดค่า HAL ของ Composer ให้ใช้รหัสตามลำดับ
โดย OEM จะต้องใช้ HAL ของคอมโพสเซอร์ดังนี้เพื่อหลีกเลี่ยงเงื่อนไขการแข่งขันนี้
- เมื่อ 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
HAL ของ Composer จะส่งเหตุการณ์
onHotplug
ไปยังเฟรมเวิร์กเพื่อแจ้งว่าชุดโหมดที่รองรับมีการเปลี่ยนแปลงHAL ของ Composer ได้รับ
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
ดังที่แสดงในตัวอย่างข้างต้น กระบวนการที่ใช้การกำหนดรหัสตามลำดับจะป้องกันเงื่อนไขการแข่งขันและอัปเดตการเปลี่ยนแปลงการกำหนดค่าการแสดงผลที่ถูกต้อง