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