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 ไว้เพียงรายการเดียวและละเว้นการกําหนดค่าที่เหลือการกำหนดค่าจะยังคงอยู่ตามลำดับความสำคัญดังนี้
|