การจัดการการเสียบร้อน

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

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

เฟรมเวิร์กจะจัดสรรเฟรมบัฟเฟอร์ใหม่ในเหตุการณ์ 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 และ iComposerClient API อื่นๆ (เช่น getHdrCapabilities)

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

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

ส่วนนี้จะอธิบายว่าเงื่อนไขการแข่งขันอาจเกิดขึ้นได้อย่างไร ตามด้วยรายละเอียดเกี่ยวกับวิธีติดตั้งใช้งาน Composer HAL เพื่อให้ใช้รหัสตามลําดับเพื่อป้องกันเงื่อนไขดังกล่าว

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

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

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

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

    • 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 ดังนี้เพื่อหลีกเลี่ยงเงื่อนไขการแข่งขัน

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

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

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

  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

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