คำแนะนำจาก OEM สำหรับการใช้ RoI

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

การใช้งาน

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

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

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

คีย์ในตัวแปลงรหัส 2

ใน 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 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