Android 15 में, Android वीडियो एन्कोडिंग फ़्रेमवर्क में दिलचस्पी के क्षेत्र (आरओआई) के उपयोगकर्ता कॉन्फ़िगरेशन को इंटिग्रेट करने के लिए, एक स्टैंडर्ड प्रोसेस शुरू की गई है. यह सुविधा, वीडियो एन्कोडर में उपयोगकर्ता कॉन्फ़िगरेशन को इंटिग्रेट और विश्लेषण करने के लिए, सार्वजनिक एपीआई उपलब्ध कराकर, आरओआई के लिए बेहतर कंप्रेसन क्वालिटी की सुविधा देती है.
लागू करना
SoC वेंडर और OEM, FEATURE_Roi
फ़्लैग की मदद से, वीडियो एन्कोडिंग के लिए आरओआई (लागत पर मुनाफ़ा) की सुविधा को कंट्रोल कर सकते हैं. अगर FEATURE_Roi
चालू नहीं है, तो वीडियो एन्कोडर के काम करने के तरीके में कोई बदलाव नहीं होगा.
वीडियो फ़्रेमवर्क में बदलाव
इस सेक्शन में, इस सुविधा को लागू करने के लिए वीडियो फ़्रेमवर्क में किए गए बदलावों के बारे में बताया गया है.
कोडेक2 में मौजूद कुंजियां
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: कोई क्यूपी ऑफ़सेट नहीं है, तो क्यूपी को मूल रेट कंट्रोल से तय किया जाता है.
- अगर ज़ीरो नहीं है: क्यूपी का मतलब मूल दर कंट्रोल और ऑफ़सेट है.
- अगर खराब है: टारगेट एलसीयू में वीडियो की क्वालिटी बूस्ट की जाती है.
- अगर यह वैल्यू पॉज़िटिव है, तो टारगेट एलसीयू में वीडियो की क्वालिटी कम हो जाती है.
इस्तेमाल: उपयोगकर्ता को इस कुंजी को 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
एरिया का क्यूपी ऑफ़सेट दिखाती है. इसकी परिभाषा और इस्तेमाल,kParamIndexQpOffsetMapBuffer
वैल्यू की तरह ही हैं.
मैपिंग एल्गोरिदम
नीचे दी गई टेबल में, सार्वजनिक पासकोड से वीडियो फ़्रेमवर्क तक की मैपिंग दिखाई गई है:
सार्वजनिक कुंजियां या एपीआई | वीडियो फ़्रेमवर्क में मैपिंग |
---|---|
PARAMETER_KEY_QP_OFFSET_MAP |
वैल्यू को C2InfoBuffer इंस्टेंस के तौर पर,
kParamIndexQpOffsetMapBuffer को पास किया जाता है. |
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 लागू करने के लिए वेंडर कॉन्फ़िगरेशन को अनदेखा करना होगा. अगर एसओसी को कई कॉन्फ़िगरेशन भेजे जाते हैं, तो एसओसी वेंडर को सिर्फ़ एक आरओआई कॉन्फ़िगरेशन बनाए रखना चाहिए और बाकी कॉन्फ़िगरेशन को अनदेखा करना चाहिए.कॉन्फ़िगरेशन को प्राथमिकता के इस क्रम में बनाए रखा जाता है:
|