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

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

लागू करना

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

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

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

कोडेक2 में मौजूद कुंजियां

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

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

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

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

kParamIndexQpOffsetMapBuffer

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

kParamIndexQpOffsetMapBuffer, इसमें एक बाइट अरे है C2InfoBuffer, और इन एट्रिब्यूट की वैल्यू सबमिट करें:

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

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

    • अगर 0: कोई क्यूपी ऑफ़सेट नहीं है, तो क्यूपी को मूल रेट कंट्रोल से तय किया जाता है.
    • अगर ज़ीरो नहीं है: क्यूपी का मतलब मूल दर कंट्रोल और ऑफ़सेट है.
    • अगर खराब है: टारगेट एलसीयू में वीडियो की क्वालिटी बूस्ट की जाती है.
    • अगर पॉज़िटिव होता है: टारगेट एलसीयू में वीडियो की क्वालिटी घट जाती है.
  • इस्तेमाल: उपयोगकर्ता को इस कुंजी को 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: आयताकार आकार में आरओआई के निर्देशांक. एलसीयू की सीमाओं के साथ अलाइन करने के लिए, आरओआई को बड़ा किया जाता है. यह वैल्यू दिखाती है हर पिक्सल का सबसे ऊपरी बायां कोना, जिससे कि ((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 लागू करने के लिए वेंडर कॉन्फ़िगरेशन को अनदेखा करना होगा. अगर आपने कई कॉन्फ़िगरेशन, SoC को भेजे जाते हैं, तो SoC वेंडर को उसे बनाए रखना होगा सिर्फ़ एक आरओआई कॉन्फ़िगरेशन हो जाता है और बाकी कॉन्फ़िगरेशन को अनदेखा कर दिया जाता है.

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

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