ความสามารถในการแสดงผล (เช่น โหมดการแสดงผลและประเภท HDR ที่รองรับ) อาจเปลี่ยนแปลง แบบไดนามิกในอุปกรณ์ที่มีจอแสดงผลที่เชื่อมต่อภายนอก (ด้วย HDMI หรือ DisplayPort) เช่น กล่องรับสัญญาณ (STB) ของ Android TV และอุปกรณ์การแพร่ภาพและเสียงผ่านโครงข่ายอินเทอร์เน็ต (Over The Top หรือ OTT) การเปลี่ยนแปลงนี้อาจเกิดขึ้นจากสัญญาณ Hotplug ของ HDMI เช่น เมื่อผู้ใช้เปลี่ยนจากจอแสดงผลหนึ่งไปยังอีกจอหนึ่ง หรือบูตอุปกรณ์โดยไม่มีจอแสดงผลที่เชื่อมต่อ Android 12 ขึ้นไปมีการเปลี่ยนแปลงในเฟรมเวิร์กเพื่อจัดการความสามารถในการเสียบร้อนและจอแสดงผลแบบไดนามิก
หน้านี้อธิบายการจัดการการเสียบจอแสดงผลขณะทำงานและการเปลี่ยนแปลงความสามารถของจอแสดงผลใน การติดตั้งใช้งาน HAL ของ Composer นอกจากนี้ ยังอธิบายวิธี จัดการเฟรมบัฟเฟอร์ที่เชื่อมโยงและป้องกันสภาวะการแข่งขันในสถานการณ์เหล่านี้ ด้วย
อัปเดตความสามารถในการแสดงผล
ส่วนนี้จะอธิบายวิธีที่เฟรมเวิร์ก 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
)
ใช้รหัสการกำหนดค่าตามลำดับเพื่อป้องกันสภาวะการแข่งขัน
เงื่อนไขการแข่งขันอาจเกิดขึ้นหาก 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 ต้องใช้ Composer 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
Composer HAL จะส่งเหตุการณ์
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
ดังที่แสดงในตัวอย่างก่อนหน้า กระบวนการที่ใช้การกำหนดรหัสตามลำดับ จะยืนยันว่าระบบป้องกันไม่ให้เกิด Race Condition และอัปเดตการเปลี่ยนแปลงการกำหนดค่าการแสดงผลที่ถูกต้อง