ความสามารถของจอแสดงผล (เช่น โหมดการแสดงผลและประเภท HDR ที่รองรับ) อาจเปลี่ยนแปลงได้แบบไดนามิกในอุปกรณ์ที่มีจอแสดงผลที่เชื่อมต่อภายนอก (ด้วย HDMI หรือ DisplayPort) เช่น กล่องรับสัญญาณ (STB) ของ Android TV และอุปกรณ์ Over The Top (OTT) การเปลี่ยนแปลงนี้อาจเกิดจากสัญญาณการเสียบ/ถอดออกของ HDMI เช่น เมื่อผู้ใช้เปลี่ยนจากจอแสดงผลหนึ่งไปยังอีกจอหนึ่งหรือบูตอุปกรณ์โดยไม่มีจอแสดงผลที่เชื่อมต่ออยู่ Android 12 ขึ้นไปจะมีการเปลี่ยนแปลงเฟรมเวิร์กเพื่อจัดการความสามารถในการเสียบร้อนและการแสดงผลแบบไดนามิก
หน้านี้อธิบายการจัดการการเสียบปลั๊กจอแสดงผลและการเปลี่ยนแปลงความสามารถของจอแสดงผลในการใช้งาน 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
ไปยังแอปที่คอยฟังเหตุการณ์ดังกล่าว
เฟรมเวิร์กจะจัดสรรเฟรมบัฟเฟอร์ใหม่ในเหตุการณ์ 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
และ iComposerClient
API อื่นๆ (เช่น getHdrCapabilities
)
ใช้รหัสการกําหนดค่าตามลําดับเพื่อป้องกันเงื่อนไขการแข่งขัน
เงื่อนไขการแข่งขันอาจเกิดขึ้นหาก Composer HAL อัปเดตการกำหนดค่าจอแสดงผลที่รองรับพร้อมกันกับเฟรมเวิร์กที่เรียกใช้ 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
ไปยังเฟรมเวิร์กเพื่อแจ้งว่าชุดโหมดที่รองรับมีการเปลี่ยนแปลงHAL ของ Composer ได้รับ
setActiveConfig(display, config=1)
(จากขั้นตอนที่ 2)HAL จะตีความว่าเฟรมเวิร์กได้ส่งคำขอเปลี่ยนการกำหนดค่าเป็น 2160x3840 60 Hz แม้ว่าในความเป็นจริงจะต้องการ 1080x1920 60 Hz ก็ตาม
กระบวนการที่ใช้การกำหนดรหัสแบบไม่เรียงลำดับจะสิ้นสุดลงที่นี่ด้วยความเข้าใจผิดเกี่ยวกับการเปลี่ยนแปลงการกำหนดค่าที่ต้องการ
กำหนดค่า HAL ของ Composer ให้ใช้รหัสตามลำดับ
OEM ต้องใช้ HAL ของ Composer ดังนี้เพื่อหลีกเลี่ยงเงื่อนไขการแข่งขัน
- เมื่อ Composer HAL อัปเดตการกำหนดค่าการแสดงผลที่รองรับ ระบบจะกำหนดรหัสใหม่ตามลำดับให้กับการกำหนดค่าการแสดงผลใหม่
- เมื่อเฟรมเวิร์กเรียกใช้
setActiveConfig
หรือsetActiveConfigWithConstraints
ด้วยรหัสการกําหนดค่าที่ไม่ถูกต้อง HAL ของ Composer จะละเว้นการเรียกใช้
ขั้นตอนเหล่านี้มีไว้เพื่อป้องกันเงื่อนไขการแข่งขันตามที่แสดงในบทสนทนาต่อไปนี้
พิจารณาลําดับเหตุการณ์ต่อไปนี้เมื่อมีการกําหนดรหัสใหม่ตามลําดับให้กับการกำหนดค่าการแสดงผลใหม่
รหัสการกำหนดค่าการแสดงผลที่รองรับมีดังนี้
- 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
ดังที่แสดงในตัวอย่างข้างต้น กระบวนการที่ใช้การกำหนดรหัสตามลำดับจะป้องกันเงื่อนไขการแข่งขันและอัปเดตการเปลี่ยนแปลงการกำหนดค่าการแสดงผลที่ถูกต้อง