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