คำแนะนำของ OEM สำหรับการติดตั้งใช้งาน ROI

Android 15 มีกระบวนการที่ได้มาตรฐานสำหรับการผสานรวมการกำหนดค่าของผู้ใช้ในพื้นที่ที่สนใจ (RoI) เข้ากับเฟรมเวิร์กการเข้ารหัสวิดีโอของ Android ฟีเจอร์นี้ช่วยให้ ROI มีคุณภาพการบีบอัดที่ดีขึ้นโดย การเสนอ API สาธารณะเพื่อผสานรวมและวิเคราะห์การกำหนดค่าของผู้ใช้ในตัวเข้ารหัสวิดีโอ

การใช้งาน

ผู้ให้บริการ SoC และ OEM สามารถควบคุมการรองรับ RoI สำหรับการเข้ารหัสวิดีโอได้ด้วย FEATURE_Roi แฟล็ก หากไม่ได้เปิดใช้ FEATURE_Roi จะไม่มีการเปลี่ยนแปลงลักษณะการทำงานของตัวเข้ารหัสวิดีโอ

การเปลี่ยนแปลงในเฟรมเวิร์กวิดีโอ

ส่วนนี้จะอธิบายรายละเอียดการเปลี่ยนแปลงในเฟรมเวิร์กวิดีโอที่จำเป็นต่อการใช้งานฟีเจอร์นี้

คีย์ใน Codec2

ใน Android 15 ระบบจะกำหนดแผนที่พารามิเตอร์การหาปริมาณ (QP_map) และการกำหนดค่าสี่เหลี่ยมผืนผ้า (rect) เป็นประเภทการกำหนดค่า RoI นอกจากนี้ เรายังได้เปิดตัวคีย์ 2 รายการใน Codec2 (C2) เพื่อ รองรับประเภทใหม่เหล่านี้ การใช้งานคีย์ทั้ง 2 รายการจะเหมือนกับ API สาธารณะ ภายในลูปเฟรมของโปรแกรมเปลี่ยนไฟล์ ระบบจะปรับการกำหนดค่าแบบไดนามิก ในระหว่างขั้นตอนการทำงาน ก่อนที่จะจัดคิวบัฟเฟอร์อินพุต ซึ่งอธิบายได้ดังนี้

  • ในสถานการณ์เหนียวหนึบ หากไม่มีการกำหนดค่า ROI สำหรับเฟรมปัจจุบัน ตัวเข้ารหัสจะใช้การกำหนดค่าเดียวกับเฟรมก่อนหน้า

  • ในสถานการณ์แบบไดนามิก ประเภทการกำหนดค่า ROI จะเปลี่ยนแปลงแบบไดนามิกได้

คีย์ใหม่ใน C2 มีคำอธิบายในส่วนต่อไปนี้

kParamIndexQpOffsetMapBuffer

kParamIndexQpOffsetMapBuffer คีย์จะส่งสัญญาณqp-offsetแผนที่สำหรับเฟรม โดยค่าจะกำหนดโดยใช้พารามิเตอร์อินพุต PARAMETER_KEY_QP_OFFSET_MAP จาก setParameters

kParamIndexQpOffsetMapBuffer คืออาร์เรย์ไบต์ใน C2InfoBuffer ที่มีแอตทริบิวต์ต่อไปนี้

  • ความยาว: จำนวนบล็อกขนาด 16x16 ในเฟรมเดียว

  • ค่า: ค่าแต่ละค่าของอาร์เรย์คือออฟเซ็ต QP ของบล็อก 16x16 ในรีเจียน -51~51 QP ของหน่วยการเข้ารหัสที่ใหญ่ที่สุด (LCU) เป้าหมายจะคำนวณโดย การควบคุมอัตราของตัวเข้ารหัสบวกออฟเซ็ต หากผลลัพธ์ที่คำนวณเกินช่วง 0~51 ระบบจะตัดค่าให้เหลือ 0~51

    • หากเป็น 0: ไม่มีการชดเชย QP ระบบจะกำหนด QP โดยการควบคุมอัตราเดิม
    • หากไม่ใช่ 0: QP คือการควบคุมอัตราเดิมบวกออฟเซ็ต
    • หากเป็นลบ: ระบบจะเพิ่มคุณภาพวิดีโอใน LCU เป้าหมาย
    • หากเป็นบวก คุณภาพวิดีโอจะลดลงใน LCU เป้าหมาย
  • การใช้งาน: ผู้ใช้ต้องกำหนดค่าคีย์นี้เป็นบล็อกขนาด 16x16 โปรแกรมเปลี่ยนไฟล์จะปรับ การกำหนดค่าให้เป็นขนาด LCU จริงโดยหาค่าเฉลี่ยของค่าบล็อกขนาด 16x16 ใน LCU

C2_PARAMKEY_QP_OFFSET_RECTS

คีย์ C2_PARAMKEY_QP_OFFSET_RECTS (ตั้งค่าเป็น coding.qp-offset-rects จะตั้งค่า ROI เป็น QpOffset-Rects โดยกำหนดค่าโดยใช้พารามิเตอร์อินพุต PARAMETER_KEY_QP_OFFSET_RECTS จาก setParameters

เราจึงได้เพิ่มโครงสร้างต่อไปนี้C2QpOffsetRectStruct เพื่อรองรับคีย์นี้

struct C2QpOffsetRectStruct : C2Rect {
  int32_t qpOffset;

  DEFINE_AND_DESCRIBE_C2STRUCT(QpOffsetRect)
  C2FIELD(width, "width")
  C2FIELD(height, "height")
  C2FIELD(left, "left")
  C2FIELD(top, "top")
  C2FIELD(qpOffset, "qp-offset")
}

สถานที่:

  • top และ left: พิกัดของ ROI ในรูปสี่เหลี่ยมผืนผ้า RoI จะ ขยายออกเพื่อให้สอดคล้องกับขอบเขต LCU ค่านี้แสดงถึงมุมซ้ายบนของแต่ละพิกเซล โดย ((0,0), (16, 16)) จะกำหนดบล็อกขนาด 16x16 เต็ม

  • qpOffset: ค่าแต่ละค่าของอาร์เรย์แสดงถึงออฟเซ็ต QP ของเป้าหมาย rect คำจำกัดความและการใช้งานจะเหมือนกับค่า kParamIndexQpOffsetMapBuffer

อัลกอริทึมการแมป

ตารางต่อไปนี้แสดงการเชื่อมโยงจากคีย์สาธารณะไปยังเฟรมเวิร์กวิดีโอ

คีย์สาธารณะหรือ API การแมปในเฟรมเวิร์กวิดีโอ
PARAMETER_KEY_QP_OFFSET_MAP ค่าจะส่งไปยัง kParamIndexQpOffsetMapBuffer เป็นอินสแตนซ์ C2InfoBuffer
PARAMETER_KEY_QP_OFFSET_RECTS ระบบจะแปลงค่าจาก String เป็น Struct C2QpOffsetRectStruct และส่งไปยัง C2_PARAMKEY_QP_OFFSET_RECTS

การจัดการข้อผิดพลาด

การติดตั้งใช้งาน OEM ต้องจัดการกรณีข้อผิดพลาดต่อไปนี้

กรณีข้อผิดพลาด ตัวอย่าง การใช้งาน
ทั้งคีย์ของผู้ให้บริการและคีย์มาตรฐานใช้เพื่อเปิด ROI ผู้ใช้โทรหาทั้ง setFeatureEnabled(FEATURE_ROI) และ คีย์ของผู้ให้บริการเพื่อเปิด ROI ต้องเปิด RoI
QP offset อยู่ในช่วงที่รองรับ แต่ผู้ให้บริการ SoC ไม่รองรับ ผู้ใช้ตั้งค่าออฟเซ็ต QP เป็น 12 แต่ SoC รองรับออฟเซ็ต QP ได้สูงสุดเพียง 10 ช่วงออฟเซ็ต QP ที่รองรับจะยังคงเป็นไปตามความพยายามอย่างเต็มที่ ค่าจะ ถูกจำกัด ให้อยู่ในช่วงที่ SoC รองรับ
ระบบจะตั้งค่า RoI หลายรายการ (ไม่ว่าจะเป็นคีย์มาตรฐานหรือคีย์เฉพาะของผู้ให้บริการ) เป็นเฟรมเดียว ผู้ใช้ใช้ทั้งคีย์มาตรฐานและคีย์ของผู้ให้บริการสำหรับเฟรม 1 หากมี เฟรมเวิร์กจะเก็บการกำหนดค่า rect ที่ได้มาตรฐานแรก การกำหนดค่า QP_map ที่ได้มาตรฐานแรก หรือทั้ง 2 อย่าง ในแต่ละหมวดหมู่ เฟรมเวิร์กจะส่งการกำหนดค่ามาตรฐานเพียงรายการเดียวไปยัง SoC และหากมีการกำหนดค่ามาตรฐาน การติดตั้งใช้งาน SoC ต้องไม่สนใจการกำหนดค่าของผู้ให้บริการ หากมีการส่งการกำหนดค่าหลายรายการไปยัง SoC ผู้ให้บริการ SoC ต้องเก็บ การกำหนดค่า RoI เพียงรายการเดียวและไม่สนใจการกำหนดค่าที่เหลือ

ระบบจะเก็บการกำหนดค่าตามลำดับความสำคัญต่อไปนี้

  1. rect ที่ได้มาตรฐาน
  2. QP_map ที่ได้มาตรฐาน
  3. ผู้ให้บริการ rect
  4. ผู้ให้บริการ QP_map