आरओआई लागू करने के लिए OEM के लिए दिशा-निर्देश

Android 15 में, Android वीडियो एन्कोडिंग फ़्रेमवर्क में दिलचस्पी के क्षेत्र (आरओआई) के उपयोगकर्ता कॉन्फ़िगरेशन को इंटिग्रेट करने के लिए, स्टैंडर्ड प्रोसेस को शामिल किया गया है. यह सुविधा, वीडियो एन्कोडर में उपयोगकर्ता कॉन्फ़िगरेशन को इंटिग्रेट और विश्लेषण करने के लिए, सार्वजनिक एपीआई उपलब्ध कराकर, आरओआई के लिए बेहतर कम्प्रेशन क्वालिटी की सुविधा देती है.

लागू करना

SoC वेंडर और OEM, FEATURE_Roi फ़्लैग की मदद से, वीडियो एन्कोडिंग के लिए आरओआई (लागत पर मुनाफ़ा) की सुविधा को कंट्रोल कर सकते हैं. अगर FEATURE_Roi चालू नहीं है, तो वीडियो एन्कोडर के काम करने के तरीके में कोई बदलाव नहीं होता.

वीडियो फ़्रेमवर्क में बदलाव

इस सेक्शन में, इस सुविधा को लागू करने के लिए वीडियो फ़्रेमवर्क में किए गए बदलावों के बारे में बताया गया है.

Codec2 में कुंजियां

Android 15 में, क्वांटाइज़ेशन पैरामीटर मैप (QP_map) और रेक्टैंगल कॉन्फ़िगरेशन (rect) को आरओआई कॉन्फ़िगरेशन टाइप के तौर पर तय किया गया है. इसके अलावा, इन नए टाइप के साथ काम करने के लिए, Codec2 (C2) में दो कुंजियां जोड़ी गई हैं. दोनों पासकोड का इस्तेमाल, पब्लिक एपीआई की तरह ही किया जाता है. एन्कोडर के फ़्रेम लूप में, कॉन्फ़िगरेशन को चलाने के दौरान डाइनैमिक तौर पर अडजस्ट किया जाता है. ऐसा, इनपुट बफ़र को कतार में लगाने से पहले किया जाता है. इस बारे में यहां बताया गया है:

  • स्टिकी स्थिति में, अगर मौजूदा फ़्रेम के लिए कोई आरओआई कॉन्फ़िगरेशन नहीं दिया गया है, तो एन्कोडर पिछले फ़्रेम के कॉन्फ़िगरेशन का इस्तेमाल करता है.

  • डाइनैमिक स्थिति में, आरओआई कॉन्फ़िगरेशन टाइप डाइनैमिक तौर पर बदल सकते हैं.

C2 में मौजूद नई कुंजियों के बारे में, नीचे दिए गए सेक्शन में बताया गया है.

kParamIndexQpOffsetMapBuffer

kParamIndexQpOffsetMapBuffer बटन, किसी फ़्रेम के लिए qp-offset मैप को सिग्नल भेजता है. इसकी वैल्यू, setParameters से इनपुट पैरामीटर PARAMETER_KEY_QP_OFFSET_MAP का इस्तेमाल करके सेट की जाती है.

kParamIndexQpOffsetMapBuffer, C2InfoBuffer में एक बाइट कलेक्शन है. इसमें ये एट्रिब्यूट होते हैं:

  • लंबाई: एक फ़्रेम में 16x16 ब्लॉक की संख्या.

  • वैल्यू: ऐरे की हर वैल्यू, क्षेत्र -51~51 में 16x16 ब्लॉक का क्यूपी ऑफ़सेट होती है. टारगेट की गई सबसे बड़ी कोडिंग यूनिट (एलसीयू) के क्यूपी का हिसाब, एन्कोडर रेट कंट्रोल और ऑफ़सेट से लगाया जाता है. अगर हिसाब लगाने पर नतीजा 0 से 51 के दायरे से ज़्यादा आता है, तो वैल्यू को 0 से 51 के दायरे में काट दिया जाता है.

    • अगर 0: कोई क्यूपी ऑफ़सेट नहीं है, तो क्यूपी का फ़ैसला मूल रेट कंट्रोल से लिया जाता है.
    • अगर शून्य से ज़्यादा है, तो QP, मूल रेट कंट्रोल और ऑफ़सेट होता है.
    • अगर नेगेटिव है, तो टारगेट किए गए एलसीयू में वीडियो की क्वालिटी बेहतर हो जाती है.
    • अगर यह वैल्यू पॉज़िटिव है, तो टारगेट एलसीयू में वीडियो की क्वालिटी कम हो जाती है.
  • इस्तेमाल: उपयोगकर्ता को इस कुंजी को 16x16 ब्लॉक के तौर पर कॉन्फ़िगर करना होगा. एन्कोडर, एलसीयू में 16x16 ब्लॉक की वैल्यू का औसत निकालकर, कॉन्फ़िगरेशन को एलसीयू के असल साइज़ के हिसाब से अडजस्ट करता है.

C2_PARAMKEY_QP_OFFSET_RECTS

C2_PARAMKEY_QP_OFFSET_RECTS बटन (coding.qp-offset-rects पर सेट) पर क्लिक करने पर, आरओआई को 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: आयताकार आकार में आरओआई के निर्देशांक. एलसीयू की सीमाओं के साथ अलाइन करने के लिए, आरओआई को बड़ा किया जाता है. यह वैल्यू, हर पिक्सल के ऊपरी बाएं कोने को दिखाती है. जैसे, ((0,0), (16, 16)) से पूरे 16x16 ब्लॉक का पता चलता है.

  • qpOffset: ऐरे की हर वैल्यू, टारगेट किए गए rect एरिया के क्यूपी ऑफ़सेट को दिखाती है. इसकी परिभाषा और इस्तेमाल, kParamIndexQpOffsetMapBuffer वैल्यू के जैसे ही है.

मैपिंग एल्गोरिदम

नीचे दी गई टेबल में, सार्वजनिक कुंजियों से वीडियो फ़्रेमवर्क तक की मैपिंग की जानकारी दी गई है:

सार्वजनिक कुंजियां या एपीआई वीडियो फ़्रेमवर्क में मैपिंग
PARAMETER_KEY_QP_OFFSET_MAP वैल्यू को kParamIndexQpOffsetMapBuffer में C2InfoBuffer इंस्टेंस के तौर पर पास किया जाता है.
PARAMETER_KEY_QP_OFFSET_RECTS वैल्यू को String से बदलकर Struct C2QpOffsetRectStruct कर दिया गया और C2_PARAMKEY_QP_OFFSET_RECTS को भेज दिया गया.

गड़बड़ी ठीक करना

OEM को गड़बड़ी के इन मामलों को मैनेज करना होगा:

गड़बड़ी का मामला उदाहरण फ़ोन के रखरखाव का सही तरीका
आरओआई चालू करने के लिए, वेंडर की कुंजी और स्टैंडर्ड की गई कुंजी, दोनों का इस्तेमाल किया जाता है. आरओआई चालू करने के लिए, उपयोगकर्ता setFeatureEnabled(FEATURE_ROI) और वेंडर की दोनों कुंजियों को कॉल करता है. आरओआई की सुविधा चालू होनी चाहिए.
क्यूपी ऑफ़सेट, तय सीमा के अंदर है, लेकिन SoC वेंडर इसे इस्तेमाल नहीं कर सकते. उपयोगकर्ता, क्यूपी ऑफ़सेट को 12 पर सेट करता है, लेकिन SoC सिर्फ़ 10 तक के क्यूपी ऑफ़सेट के साथ काम करता है. काम करने वाले क्यूपी ऑफ़सेट की सीमा, बेहतर कोशिश के तौर पर छोड़ी जाती है. वैल्यू को, SoC की तय सीमा के हिसाब से क्लैंप किया जाता है.
एक से ज़्यादा आरओआई कॉन्फ़िगरेशन (स्टैंडर्ड पासकोड या वेंडर के हिसाब से पासकोड) एक ही फ़्रेम पर सेट किए जाते हैं. उपयोगकर्ता, फ़्रेम 1 के लिए स्टैंडर्ड की और वेंडर की, दोनों का इस्तेमाल करता है. अगर उपलब्ध हो, तो फ़्रेमवर्क में पहले स्टैंडर्ड rect कॉन्फ़िगरेशन, पहले स्टैंडर्ड QP_map कॉन्फ़िगरेशन या दोनों को बनाए रखा जाता है. हर कैटगरी में, फ़्रेमवर्क SoC को सिर्फ़ एक स्टैंडर्ड कॉन्फ़िगरेशन भेजता है. अगर स्टैंडर्ड कॉन्फ़िगरेशन उपलब्ध है, तो SoC लागू करने के लिए वेंडर कॉन्फ़िगरेशन को अनदेखा करना होगा. अगर एसओसी को कई कॉन्फ़िगरेशन भेजे जाते हैं, तो एसओसी वेंडर को सिर्फ़ एक आरओआई कॉन्फ़िगरेशन बनाए रखना चाहिए और बाकी कॉन्फ़िगरेशन को अनदेखा करना चाहिए.

कॉन्फ़िगरेशन को इस प्राथमिकता के क्रम में बनाए रखा जाता है:

  1. स्टैंडर्ड rect
  2. स्टैंडर्ड QP_map
  3. वेंडर rect
  4. वेंडर QP_map