Android 13 में, वेंडर के हिसाब से कॉन्फ़िगर की जा सकने वाली एक स्टैटिक लाइब्रेरी जोड़ी गई है. इसे libtonemap कहा जाता है. यह टोन मैपिंग की प्रोसेस तय करती है. साथ ही, इसे SurfaceFlinger प्रोसेस और हार्डवेयर कंपोज़र (एचडब्ल्यूसी) के साथ शेयर किया जाता है.
इस सुविधा की मदद से, ओईएम अपने डिसप्ले टोन मैपिंग एल्गोरिदम को फ़्रेमवर्क और वेंडर के बीच तय और शेयर कर सकते हैं. इससे टोन मैपिंग में होने वाली गड़बड़ी को कम किया जा सकता है.
Android 13 से पहले, डिसप्ले के हिसाब से टोन मैपिंग की प्रोसेस को एचडब्ल्यूसी, SurfaceFlinger, और ऐप्लिकेशन के बीच शेयर नहीं किया जाता था. एचडीआर कॉन्टेंट के लिए, रेंडरिंग पाथ के आधार पर, इमेज क्वालिटी में गड़बड़ियां होती थीं. ऐसा इसलिए, क्योंकि एचडीआर कॉन्टेंट को अलग-अलग तरीकों से आउटपुट स्पेस में टोन मैप किया जाता था. स्क्रीन रोटेशन जैसे मामलों में, यह गड़बड़ी साफ़ तौर पर दिखती थी. ऐसा इसलिए, क्योंकि जीपीयू और डीपीयू के बीच कंपोज़िशन की रणनीति बदल जाती है. इसके अलावा, TextureView और SurfaceView के बीच रेंडरिंग के तरीके में भी अंतर होता है.
इस पेज पर, libtonemap लाइब्रेरी के इंटरफ़ेस, पसंद के मुताबिक बनाने की सुविधा, और पुष्टि की जानकारी दी गई है.
टोन मैपिंग लाइब्रेरी का इंटरफ़ेस
libtonemap
लाइब्रेरी में, सीपीयू-बैक अप वाले कॉन्फ़िगरेशन और SkSL शेडर शामिल होते हैं. इन्हें
SurfaceFlinger, जीपीयू-बैकएंड कंपोज़िशन के लिए और एचडब्ल्यूसी, टोन मैपिंग लुक-अप टेबल (एलयूटी) जनरेट करने के लिए
प्लग इन कर सकता है. libtonemap
का एंट्री पॉइंट android::tonemap::getToneMapper() है. यह एक ऐसा ऑब्जेक्ट दिखाता है जो
ToneMapper इंटरफ़ेस को लागू करता है.
ToneMapper इंटरफ़ेस इन सुविधाओं के साथ काम करता है:
टोन-मैपिंग एलयूटी जनरेट करना
`ToneMapper::lookupTonemapGain` इंटरफ़ेस, `libtonemap_LookupTonemapGain()` में तय किए गए शेडर का सीपीयू कॉन्फ़िगरेशन है.The interface
ToneMapper::lookupTonemapGainis a CPU implementation of the shader defined inlibtonemap_LookupTonemapGain(). इसका इस्तेमाल, फ़्रेमवर्क में यूनिट टेस्ट के लिए किया जाता है. साथ ही, पार्टनर इसका इस्तेमाल, अपने कलर पाइपलाइन में टोन-मैपिंग एलयूटी जनरेट करने में मदद पाने के लिए कर सकते हैं.libtonemap_LookupTonemapGain()में, एब्सॉल्यूट, अननॉर्मलाइज़्ड लीनियर स्पेस में कलर वैल्यू शामिल होती हैं. ये वैल्यू, लीनियर आरजीबी और एक्सवाईज़ेड, दोनों में होती हैं. साथ ही, यह एक फ़्लोट दिखाता है, जिससे यह पता चलता है कि लीनियर स्पेस में इनपुट कलर को कितने से गुणा करना है.SkSL शेडर जनरेट करना
`ToneMapper::generateTonemapGainShaderSkSL()` इंटरफ़ेस, सोर्स और डेस्टिनेशन डेटास्पेस के हिसाब से, एक SkSL शेडर स्ट्रिंग दिखाता है.
ToneMapper::generateTonemapGainShaderSkSL()SkSL शेडर को ,RenderEngineके लिए Skia कॉन्फ़िगरेशन में प्लग इन किया जाता है. यह SurfaceFlinger के लिए , जीपीयू-ऐक्सलरेटेड कंपोज़िटिंग कॉम्पोनेंट है. शेडर कोlibhwuiमें भी प्लग इन किया जाता है, ताकिTextureViewके लिए, एचडीआर से एसडीआर टोन मैपिंग को असरदार तरीके से किया जा सके. जनरेट की गई स्ट्रिंग को, Skia के इस्तेमाल किए जाने वाले अन्य SkSL शेडर में इन-लाइन किया जाता है. इसलिए, शेडर को इन नियमों का पालन करना होगा:- शेडर स्ट्रिंग में,
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)सिग्नेचर वाला एक एंट्री पॉइंट होना चाहिए. इसमेंlinearRGBलीनियर स्पेस में आरजीबी पिक्सल के एब्सॉल्यूट निट्स की वैल्यू है औरxyzएक्सवाईज़ेड में कनवर्ट किया गयाlinearRGBहै. - शेडर स्ट्रिंग में इस्तेमाल किए गए किसी भी हेल्पर तरीके के पहले,
libtonemap_स्ट्रिंग का प्रीफ़िक्स होना चाहिए, ताकि फ़्रेमवर्क शेडर की डेफ़िनिशन में कोई टकराव न हो. इसी तरह, इनपुट यूनिफ़ॉर्म के पहले,in_libtonemap_का प्रीफ़िक्स होना चाहिए.
- शेडर स्ट्रिंग में,
SkSL यूनिफ़ॉर्म जनरेट करना
ToneMapper::generateShaderSkSLUniforms()इंटरफ़ेस, अलग-अलग एचडीआर स्टैंडर्ड और डिसप्ले की स्थितियों से जुड़े मेटाडेटा के बारे में बताने वाला एक मेटाडेटाstructदिखाता है:यूनिफ़ॉर्म की एक सूची, जो SkSL शेडर से बाउंड होती है.
एक जैसे वैल्यू
in_libtonemap_displayMaxLuminanceऔरin_libtonemap_inputMaxLuminance.libtonemapमें इनपुट को स्केल करते समय और ज़रूरत के हिसाब से आउटपुट को नॉर्मलाइज़ करते समय, फ़्रेमवर्क शेडर इन वैल्यू का इस्तेमाल करते हैं.
फ़िलहाल, यूनिफ़ॉर्म जनरेट करने की प्रोसेस, इनपुट और आउटपुट डेटास्पेस के हिसाब से अलग-अलग होती है.
पसंद के मुताबिक बनाएं
libtonemap लाइब्रेरी का रेफ़रंस कॉन्फ़िगरेशन, स्वीकार किए जा सकने वाले नतीजे देता है. हालांकि, जीपीयू कंपोज़िशन में इस्तेमाल किया जाने वाला टोन मैपिंग एल्गोरिदम, डीपीयू कंपोज़िशन में इस्तेमाल किए जाने वाले एल्गोरिदम से अलग हो सकता है. इसलिए, रेफ़रंस कॉन्फ़िगरेशन का इस्तेमाल करने पर, कुछ मामलों में फ़्लिकर हो सकता है. जैसे, रोटेशन ऐनिमेशन. पसंद के मुताबिक बनाने की सुविधा से, वेंडर के हिसाब से इमेज क्वालिटी से जुड़ी ऐसी समस्याओं को हल किया जा सकता है.
ओईएम को libtonemap के कॉन्फ़िगरेशन को बदलने का सुझाव दिया जाता है, ताकि वे अपनी ToneMapper सब-क्लास तय कर सकें. यह सब-क्लास, getToneMapper() से मिलती है.
कॉन्फ़िगरेशन को पसंद के मुताबिक बनाते समय, पार्टनर से इनमें से कोई एक काम करने की उम्मीद की जाती है:
libtonemapके कॉन्फ़िगरेशन में सीधे तौर पर बदलाव करना.- अपनी स्टैटिक लाइब्रेरी तय करना, लाइब्रेरी को स्टैंडअलोन के तौर पर कंपाइल करना, और
libtonemapलाइब्रेरी की.aफ़ाइल को अपनी पसंद के मुताबिक बनाई गई लाइब्रेरी से जनरेट की गई फ़ाइल से बदलना.
वेंडर को कर्नल कोड में कोई बदलाव करने की ज़रूरत नहीं होती. हालांकि, सही तरीके से लागू करने के लिए, कई वेंडर को डीपीयू टोन-मैपिंग एल्गोरिदम के बारे में जानकारी शेयर करनी होगी.
सत्यापन
अपने कॉन्फ़िगरेशन की पुष्टि करने के लिए, यह तरीका अपनाएं:
एचडीआर वीडियो को, आपके डिसप्ले सिस्टम के साथ काम करने वाले किसी भी एचडीआर स्टैंडर्ड की स्क्रीन पर चलाएं, जैसे, एचएलजी, एचडीआर10, एचडीआर10+, या DolbyVision.
जीपीयू कंपोज़िशन को टॉगल करें, ताकि यह पक्का किया जा सके कि उपयोगकर्ता को फ़्लिकर न दिखे.
जीपीयू कंपोज़िशन को टॉगल करने के लिए, यह
adbनिर्देश इस्तेमाल करें:adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition, 1 to force GPU composition>
सामान्य समस्याएं
इस कॉन्फ़िगरेशन में ये समस्याएं हो सकती हैं:
बैंडिंग तब होती है, जब जीपीयू कंपोज़िशन में इस्तेमाल किया जाने वाला रेंडर टारगेट, एचडीआर कॉन्टेंट की सामान्य वैल्यू से कम सटीक होता है. उदाहरण के लिए, बैंडिंग तब हो सकती है, जब एचडब्ल्यूसी कॉन्फ़िगरेशन, एचडीआर के लिए अपारदर्शी 10-बिट फ़ॉर्मैट के साथ काम करता है. जैसे, RGBA1010102 या P010. हालांकि, इसके लिए यह ज़रूरी है कि जीपीयू कंपोज़िशन, ऐल्फ़ा के साथ काम करने के लिए, RGBA8888 जैसे 8-बिट फ़ॉर्मैट में लिखे.
क्वांटाइज़ेशन में अंतर की वजह से, रंग में मामूली बदलाव होता है. ऐसा तब होता है, जब डीपीयू, जीपीयू की तुलना में अलग सटीक वैल्यू पर काम करता है.
इनमें से हर समस्या, पहले से मौजूद हार्डवेयर की सटीक वैल्यू में अंतर से जुड़ी होती है. इससे बचने का एक सामान्य तरीका यह है कि कम सटीक वैल्यू वाले पाथ में, डिथरिंग का इस्तेमाल किया जाए. इससे, सटीक वैल्यू में होने वाले अंतर को कम किया जा सकता है.