आरओआई लागू करने के लिए ओईएम से जुड़े दिशा-निर्देश

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

लागू करना

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

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

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

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

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

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

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

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

kParamIndexQpOffsetMapBuffer

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

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

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

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

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

सी2_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: RoI के निर्देशांक, जिनका आकार आयताकार होता है. आरओआई एलसीयू की सीमाओं के मुताबिक बनाया गया है. यह वैल्यू दिखाती है हर पिक्सल का सबसे ऊपरी बायां कोना, जिससे कि ((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