คำแนะนำของ 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 ใน 1 เฟรม

  • ค่า: ค่าแต่ละค่าของอาร์เรย์คือการชดเชย 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 อยู่ในขอบเขตแต่ผู้จำหน่าย 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 ของผู้จำหน่าย