Android 15 में, दिलचस्पी वाले इलाके (RoI) से जुड़ी उपयोगकर्ता की सेटिंग को Android वीडियो एनकोडिंग फ़्रेमवर्क में इंटिग्रेट करने के लिए, एक स्टैंडर्ड प्रोसेस शुरू की गई है. इस सुविधा की मदद से, RoI के लिए बेहतर कंप्रेशन क्वालिटी मिलती है. इसके लिए, सार्वजनिक एपीआई उपलब्ध कराए जाते हैं. इनकी मदद से, वीडियो एनकोडर में उपयोगकर्ता की सेटिंग को इंटिग्रेट और उनका विश्लेषण किया जा सकता है.
लागू करना
SoC वेंडर और ओईएम,
FEATURE_Roi
फ़्लैग की मदद से, वीडियो एनकोडिंग के लिए RoI की सुविधा को कंट्रोल कर सकते हैं. अगर FEATURE_Roi की सुविधा चालू नहीं है, तो वीडियो एनकोडर के व्यवहार में कोई बदलाव नहीं होता.
वीडियो फ़्रेमवर्क में बदलाव
इस सेक्शन में, इस सुविधा को लागू करने के लिए वीडियो फ़्रेमवर्क में किए जाने वाले बदलावों के बारे में बताया गया है.
Codec2 में कुंजियां
Android 15 में, क्वॉन्टाइज़ेशन पैरामीटर मैप (QP_map) और आयताकार कॉन्फ़िगरेशन (rect) को RoI कॉन्फ़िगरेशन टाइप के तौर पर तय किया गया है. इसके अलावा, इन नए टाइप के लिए सहायता उपलब्ध कराने के लिए, Codec2 (C2) में दो कुंजियां जोड़ी गई हैं. दोनों कुंजियों का इस्तेमाल, सार्वजनिक एपीआई की तरह ही किया जाता है.
एनकोडर के फ़्रेम लूप में, इनपुट बफ़र को क्यू में जोड़ने से पहले, रनिंग स्टेज के दौरान कॉन्फ़िगरेशन को डाइनैमिक तरीके से अडजस्ट किया जाता है. इसके बारे में यहां बताया गया है:
स्टिक वाले मामले में, अगर मौजूदा फ़्रेम के लिए RoI कॉन्फ़िगरेशन उपलब्ध नहीं कराया जाता है, तो एनकोडर पिछले फ़्रेम के जैसा ही कॉन्फ़िगरेशन इस्तेमाल करता है.
डाइनैमिक वाले मामले में, RoI कॉन्फ़िगरेशन टाइप को डाइनैमिक तरीके से बदला जा सकता है.
C2 में मौजूद नई कुंजियों के बारे में, यहां दिए गए सेक्शन में बताया गया है.
kParamIndexQpOffsetMapBuffer
The kParamIndexQpOffsetMapBuffer
कुंजी, किसी फ़्रेम के लिए qp-offset मैप का सिग्नल देती है. इसकी वैल्यू, setParameters से इनपुट
पैरामीटर PARAMETER_KEY_QP_OFFSET_MAP
का इस्तेमाल करके सेट की जाती है.
kParamIndexQpOffsetMapBuffer एक बाइट कलेक्शन होता है
C2InfoBuffer,
इसमें ये एट्रिब्यूट होते हैं:
लंबाई: एक फ़्रेम में 16x16 ब्लॉक की संख्या.
वैल्यू: कलेक्शन की हर वैल्यू, -51~51 के बीच के इलाके में, 16x16 ब्लॉक का QP ऑफ़सेट होती है. एनकोडर रेट कंट्रोल के साथ-साथ ऑफ़सेट की मदद से, टारगेट किए गए सबसे बड़े कोडिंग यूनिट (एलसीयू) का QP कैलकुलेट किया जाता है. अगर कैलकुलेट किया गया नतीजा, 0~51 के बीच के इलाके से बाहर जाता है, तो वैल्यू को 0~51 के बीच में काट दिया जाता है.
- अगर 0 है, तो कोई QP ऑफ़सेट नहीं होता. QP, ओरिजनल रेट कंट्रोल से तय होता है.
- अगर शून्य नहीं है, तो QP, ओरिजनल रेट कंट्रोल के साथ-साथ ऑफ़सेट भी होता है.
- अगर नेगेटिव है, तो टारगेट किए गए एलसीयू में वीडियो की क्वालिटी बेहतर होती है.
- अगर पॉज़िटिव है, तो टारगेट किए गए एलसीयू में वीडियो की क्वालिटी कम हो जाती है.
इस्तेमाल: उपयोगकर्ता को इस कुंजी को 16x16 ब्लॉक के तौर पर कॉन्फ़िगर करना होगा. एनकोडर, एलसीयू में मौजूद 16x16 ब्लॉक की वैल्यू का औसत निकालकर, कॉन्फ़िगरेशन को असली एलसीयू साइज़ के हिसाब से अडजस्ट करता है.
C2_PARAMKEY_QP_OFFSET_RECTS
The 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 को एलसीयू की सीमाओं के साथ अलाइन करने के लिए, स्ट्रेच किया जाता है. वैल्यू, हर पिक्सल के टॉप-लेफ़्ट कॉर्नर को दिखाती है. जैसे, ((0,0), (16, 16)) से 16x16 का पूरा ब्लॉक तय होता है.qpOffset: कलेक्शन की हर वैल्यू, टारगेट किए गएrectइलाके के QP ऑफ़सेट को दिखाती है. इसकी परिभाषा और इस्तेमाल,kParamIndexQpOffsetMapBufferवैल्यू के जैसे ही होते हैं.
मैपिंग एल्गोरिद्म
यहां दी गई टेबल में, सार्वजनिक कुंजियों से वीडियो फ़्रेमवर्क में मैपिंग के बारे में बताया गया है:
| सार्वजनिक कुंजियां या एपीआई | वीडियो फ़्रेमवर्क में मैपिंग |
|---|---|
PARAMETER_KEY_QP_OFFSET_MAP |
वैल्यू को
C2InfoBuffer इंस्टेंस के तौर पर, kParamIndexQpOffsetMapBuffer में पास किया जाता है. |
PARAMETER_KEY_QP_OFFSET_RECTS |
वैल्यू को String से
Struct C2QpOffsetRectStruct में बदला जाता है और
C2_PARAMKEY_QP_OFFSET_RECTS में पास किया जाता है. |
गड़बड़ी ठीक करना
ओईएम को लागू करने के दौरान, गड़बड़ी के इन मामलों को ठीक करना होगा:
| गड़बड़ी का मामला | उदाहरण | ठीक करना |
|---|---|---|
| RoI को चालू करने के लिए, वेंडर की कुंजी और स्टैंडर्ड कुंजी, दोनों का इस्तेमाल किया जाता है. | उपयोगकर्ता, RoI को चालू करने के लिए setFeatureEnabled(FEATURE_ROI) और
वेंडर की कुंजी, दोनों का इस्तेमाल करता है. |
RoI को चालू करना होगा. |
| QP ऑफ़सेट, रेंज में है, लेकिन SoC वेंडर इसे इस्तेमाल नहीं करते. | उपयोगकर्ता, QP ऑफ़सेट को 12 पर सेट करता है, लेकिन SoC सिर्फ़ 10 तक के QP ऑफ़सेट को इस्तेमाल कर सकता है. | QP ऑफ़सेट की इस्तेमाल की जा सकने वाली रेंज को, सबसे बेहतर कोशिशों के आधार पर तय किया जाता है. वैल्यू को SoC की इस्तेमाल की जा सकने वाली रेंज के हिसाब से सेट किया जाता है. |
| एक ही फ़्रेम के लिए, RoI के कई कॉन्फ़िगरेशन (चाहे स्टैंडर्ड कुंजी हो या वेंडर के हिसाब से तय की गई कुंजी) सेट किए जाते हैं. | उपयोगकर्ता, फ़्रेम 1 के लिए स्टैंडर्ड कुंजी और वेंडर की कुंजी, दोनों का इस्तेमाल करता है. | अगर उपलब्ध है, तो फ़्रेमवर्क, पहले स्टैंडर्ड rect
कॉन्फ़िगरेशन, पहले स्टैंडर्ड QP_map कॉन्फ़िगरेशन,
या दोनों को बनाए रखता है. हर कैटगरी में, फ़्रेमवर्क, SoC को सिर्फ़ एक स्टैंडर्ड
कॉन्फ़िगरेशन भेजता है. अगर स्टैंडर्ड कॉन्फ़िगरेशन उपलब्ध है,
तो SoC को लागू करने के दौरान, वेंडर के कॉन्फ़िगरेशन को अनदेखा करना होगा. अगर
कई कॉन्फ़िगरेशन SoC को भेजे जाते हैं, तो SoC वेंडर को सिर्फ़ एक RoI कॉन्फ़िगरेशन बनाए रखना होगा और बाकी कॉन्फ़िगरेशन को अनदेखा करना होगा.कॉन्फ़िगरेशन को इस प्राथमिकता के क्रम में बनाए रखा जाता है:
|