การจัดการปลั๊กไฟ

ความสามารถของจอแสดงผล (เช่น โหมดการแสดงผลและประเภท 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 จะจัดการการเปลี่ยนแปลงความสามารถของจอแสดงผลดังนี้

  1. เมื่อตรวจพบการเปลี่ยนแปลงในความสามารถของการแสดงผล เฟรมเวิร์กจะได้รับการแจ้งเตือนonHotplug(display, connection=CONNECTED)
  2. เมื่อได้รับการแจ้งเตือน เฟรมเวิร์กจะยกเลิกสถานะการแสดงผลและสร้างขึ้นใหม่ด้วยความสามารถใหม่จาก HAL โดยใช้เมธอด getActiveConfig, getDisplayConfigs, getDisplayAttribute, getColorModes, getHdrCapabilities และ getDisplayCapabilities
  3. หลังจากที่เฟรมเวิร์กสร้างสถานะการแสดงผลใหม่ขึ้นแล้ว ระบบจะส่งการเรียกกลับ onDisplayChanged ไปยังแอปที่กําลังรอฟังเหตุการณ์ดังกล่าวอยู่

เฟรมเวิร์กนี้จะจัดสรร Framebuffer อีกครั้งในเหตุการณ์ onHotplug(display, connection=CONNECTED) ที่ตามมา ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดการหน่วยความจำ Framebuffer อย่างเหมาะสมเพื่อหลีกเลี่ยงความล้มเหลวระหว่างการจัดสรร Framebuffer ใหม่ได้ที่การจัดการ Framebuffer ของไคลเอ็นต์

จัดการกับสถานการณ์การเชื่อมต่อทั่วไป

ส่วนนี้จะอธิบายวิธีจัดการสถานการณ์การเชื่อมต่อต่างๆ ในการใช้งานอย่างเหมาะสมเมื่อจอแสดงผลหลักเชื่อมต่อและยกเลิกการเชื่อมต่อ

เฟรมเวิร์ก Android สร้างขึ้นสำหรับอุปกรณ์เคลื่อนที่ จึงไม่มีการสนับสนุนในตัวสำหรับจอแสดงผลหลักที่ยกเลิกการเชื่อมต่อ โดย HAL จะต้องแทนที่จอแสดงผลหลักด้วยการแสดงตัวยึดตำแหน่งเมื่อโต้ตอบกับเฟรมเวิร์ก ในกรณีที่จอแสดงผลหลักขาดการเชื่อมต่อจริง

สถานการณ์ต่อไปนี้อาจเกิดขึ้นใน STB และดองเกิลทีวีที่มีจอแสดงผลที่เชื่อมต่อภายนอกซึ่งถอดออกได้ หากต้องการใช้การรองรับสถานการณ์เหล่านี้ ให้ใช้ข้อมูลในตารางด้านล่าง

สถานการณ์ การใช้งาน
ไม่มีจอแสดงผลที่เชื่อมต่อเมื่อเปิดเครื่อง
  • ส่งสัญญาณ onHotplug(display, connection=CONNECTED) จาก HAL ของ Composer ไปยังเฟรมเวิร์ก
  • แทนที่สถานะการแสดงผลจริงภายใน Composer HAL ด้วยสถานะการแสดงผลตัวยึดตําแหน่ง
จอแสดงผลหลักเชื่อมต่ออยู่
  • ส่งเหตุการณ์ onHotplug(display, connection=CONNECTED) อื่นจาก HAL ของ Composer ไปยังเฟรมเวิร์ก

    ซึ่งจะทำให้เฟรมเวิร์กโหลดความสามารถการแสดงผลทั้งหมดซ้ำ

จอแสดงผลหลักถูกถอดออก
  • ส่งonHotplug(display, connection=CONNECTED) เหตุการณ์อีกรายการจาก HAL ของ Composer ไปยังเฟรมเวิร์ก
  • แทนที่สถานะการแสดงผลจริงภายใน Composer HAL ด้วยสถานะการแสดงผลตัวยึดตําแหน่ง การแสดงตัวยึดตําแหน่งต้องมีโหมดการแสดงผลเดียวเพื่อให้เฟรมเวิร์กส่งการเรียกกลับ onDisplayChanged ไปยังแอป (เนื่องจากชุดโหมดที่รองรับมีการเปลี่ยนแปลง) โหมดการแสดงผลเดียวนี้ต้องตรงกับโหมดที่ใช้งานอยู่ล่าสุดของจอแสดงผลจริงก่อนการยกเลิกการเชื่อมต่อ เพื่อไม่ให้แอปได้รับเหตุการณ์การเปลี่ยนแปลงการกำหนดค่า

ข้อควรพิจารณาเกี่ยวกับการเชื่อมต่อที่ไม่ใช่ 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 ของคอมโพสเซอร์ เพื่อให้ใช้รหัสตามลำดับเพื่อป้องกันเงื่อนไขดังกล่าว

พิจารณาลำดับเหตุการณ์ต่อไปนี้ เมื่อ "ไม่ได้" กำหนดรหัสตามลำดับใหม่ให้กับการกำหนดค่าการแสดงผลใหม่ ซึ่งจะทำให้เกิดเงื่อนไขการแข่งขัน

  1. รหัสการกำหนดค่าการแสดงผลที่รองรับมีดังนี้

    • id=1, 1080x1920 60 Hz
    • id=2, 1080x1920 50 Hz
  2. เฟรมเวิร์กเรียก setActiveConfig(display, config=1)

  3. ในขณะเดียวกัน HAL ของ Composer จะประมวลผลการเปลี่ยนแปลงการกำหนดค่าการแสดงผลและอัปเดตสถานะภายในเป็นการกำหนดค่าการแสดงผลชุดใหม่ดังต่อไปนี้

    • id=1, 2160x3840 60 Hz
    • id=2, 2160x3840 50 Hz
    • id=3, 1080x1920 60 Hz
    • id=4, 1080x1920 50 Hz
  4. Composer HAL จะส่งเหตุการณ์ onHotplug ไปยังเฟรมเวิร์กเพื่อแจ้งว่าชุดโหมดที่รองรับมีการเปลี่ยนแปลง

  5. HAL ของ Composer ได้รับ setActiveConfig(display, config=1) (จากขั้นตอนที่ 2)

  6. HAL จะตีความว่าเฟรมเวิร์กได้ส่งคำขอเปลี่ยนการกำหนดค่าเป็น 2160x3840 60 Hz แม้ว่าในความเป็นจริงจะต้องการ 1080x1920 60 Hz ก็ตาม

กระบวนการที่ใช้การมอบหมายรหัสแบบไม่ตามลำดับจะสิ้นสุดที่นี่ด้วยการตีความการเปลี่ยนแปลงการกำหนดค่าที่ต้องการอย่างไม่ถูกต้อง

กำหนดค่า HAL ของ Composer ให้ใช้รหัสตามลำดับ

โดย OEM จะต้องใช้ HAL ของคอมโพสเซอร์ดังนี้เพื่อหลีกเลี่ยงเงื่อนไขการแข่งขันนี้

  • เมื่อ Composer HAL อัปเดตการกำหนดค่าการแสดงผลที่รองรับ ระบบจะกำหนดรหัสใหม่ตามลำดับให้กับการกำหนดค่าการแสดงผลใหม่
  • เมื่อเฟรมเวิร์กเรียกใช้ setActiveConfig หรือ setActiveConfigWithConstraints ที่มีรหัสการกำหนดค่าไม่ถูกต้อง Composer HAL จะไม่สนใจการเรียกใช้

ขั้นตอนเหล่านี้มีไว้เพื่อป้องกันเงื่อนไขการแข่งขันตามที่แสดงในบทสนทนาต่อไปนี้

พิจารณาลําดับเหตุการณ์ต่อไปนี้เมื่อมีการกําหนดรหัสใหม่ตามลําดับให้กับการกำหนดค่าการแสดงผลใหม่

  1. รหัสการกำหนดค่าการแสดงผลที่รองรับมีดังนี้

    • id=1, 1080x1920 60 Hz
    • id=2, 1080x1920 50 Hz
  2. เฟรมเวิร์กนี้เรียกใช้ setActiveConfig(display, config=1)

  3. เมื่อระบบประมวลผลการเปลี่ยนแปลงการกําหนดค่าการแสดงผล ระบบจะกําหนดรหัสการกําหนดค่าชุดถัดไปโดยเริ่มจากจํานวนเต็มที่ไม่ได้ใช้รายการถัดไป ดังที่แสดงต่อไปนี้

    • id=3, 2160x3840 60 Hz

    • id=4, 2160x3840 50 Hz

    • id=5, 1080x1920 60 Hz

    • id=6, 1080x1920 50 Hz

  4. HAL ของ Composer จะส่งเหตุการณ์ onHotplug ไปยังเฟรมเวิร์กเพื่อแจ้งว่าชุดโหมดที่รองรับมีการเปลี่ยนแปลง

  5. HAL ของ Composer ได้รับ setActiveConfig(display, config=1) (จากขั้นตอนที่ 2)

  6. HAL ของ Composer จะละเว้นการเรียกใช้เนื่องจากรหัสไม่ถูกต้องแล้ว

  7. เฟรมเวิร์กจะรับและประมวลผลเหตุการณ์ onHotplug จากขั้นตอนที่ 4 โดยจะเรียกใช้ HAL ของ Composer โดยใช้ฟังก์ชัน getDisplayConfigs และ getDisplayAttribute เมื่อใช้ฟังก์ชันเหล่านี้ เฟรมเวิร์กจะระบุรหัสใหม่ (5) สำหรับความละเอียดและอัตราการรีเฟรชที่ต้องการที่ 1080x1920 และ 60 Hz

  8. เฟรมเวิร์กจะส่งเหตุการณ์ setActiveConfig อื่นที่มีรหัสที่อัปเดตเป็น 5

  9. HAL ของ Composer ได้รับ setActiveConfig(display, config=5)จากขั้นตอนที่ 5

  10. HAL ตีความได้อย่างถูกต้องว่าเฟรมเวิร์กได้ส่งคำขอเปลี่ยนการกำหนดค่าเป็น 1080x1920 60 Hz

ดังที่แสดงในตัวอย่างข้างต้น กระบวนการที่ใช้การกำหนดรหัสตามลำดับจะป้องกันเงื่อนไขการแข่งขันและอัปเดตการเปลี่ยนแปลงการกำหนดค่าการแสดงผลที่ถูกต้อง