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