Android 13 में, वेंडर के हिसाब से कॉन्फ़िगर की जा सकने वाली एक स्टैटिक लाइब्रेरी जोड़ी गई है. इसे libtonemap कहा जाता है. यह टोन मैपिंग की प्रोसेस तय करती है और इसे SurfaceFlinger प्रोसेस और हार्डवेयर कंपोज़र (एचडब्ल्यूसी) के साथ शेयर किया जाता है. इस सुविधा की मदद से, ओईएम अपने डिसप्ले टोन मैपिंग एल्गोरिदम को फ़्रेमवर्क और वेंडर के बीच तय और शेयर कर सकते हैं. इससे टोन मैपिंग में होने वाली गड़बड़ी कम हो जाती है.
Android 12 और उससे पहले के वर्शन में, डिसप्ले के हिसाब से टोन मैपिंग की प्रोसेस को एचडब्ल्यूसी, SurfaceFlinger, और ऐप्लिकेशन के बीच शेयर नहीं किया जाता था. एचडीआर कॉन्टेंट के लिए, रेंडरिंग पाथ के आधार पर, इमेज की क्वालिटी में गड़बड़ियां होती थीं. ऐसा इसलिए, क्योंकि एचडीआर कॉन्टेंट को अलग-अलग तरीकों से आउटपुट स्पेस में टोन मैप किया जाता था. स्क्रीन रोटेशन जैसे मामलों में यह गड़बड़ी साफ़ तौर पर दिखती थी. ऐसा इसलिए, क्योंकि जीपीयू और डीपीयू के बीच कंपोज़िशन की रणनीति बदल जाती है. इसके अलावा, TextureView और SurfaceView के बीच रेंडरिंग के तरीके में भी अंतर होता है.
इस पेज पर, libtonemap लाइब्रेरी के इंटरफ़ेस, पसंद के मुताबिक बनाने की सुविधा, और पुष्टि की जानकारी दी गई है.
टोन मैपिंग लाइब्रेरी का इंटरफ़ेस
The libtonemap
लाइब्रेरी में, सीपीयू-बैकड इंप्लीमेंटेशन और SkSL शेडर शामिल होते हैं. इन्हें SurfaceFlinger, जीपीयू-बैकएंड कंपोज़िशन के लिए और एचडब्ल्यूसी, टोन मैपिंग लुक-अप टेबल (एलयूटी) जनरेट करने के लिए प्लग इन कर सकता है. libtonemap
का एंट्री पॉइंट
android::tonemap::getToneMapperहै.
यह एक ऐसा ऑब्जेक्ट दिखाता है जो
ToneMapper
इंटरफ़ेस को लागू करता है.
ToneMapper इंटरफ़ेस में ये सुविधाएं उपलब्ध हैं:
टोन-मैपिंग एलयूटी जनरेट करना
ToneMapper::lookupTonemapGainइंटरफ़ेस,libtonemap_LookupTonemapGainमें तय किए गए शेडर का सीपीयू इंप्लीमेंटेशन है. इसका इस्तेमाल, फ़्रेमवर्क में यूनिट टेस्ट के लिए किया जाता है. साथ ही, पार्टनर इसका इस्तेमाल, अपने कलर पाइपलाइन में टोन-मैपिंग एलयूटी जनरेट करने में मदद पाने के लिए कर सकते हैं.libtonemap_LookupTonemapGain, ऐब्सलूट, अननॉर्मलाइज़्ड लीनियर स्पेस में कलर वैल्यू लेता है. यह लीनियर आरजीबी और एक्सवाईज़ेड, दोनों में हो सकता है. इसके अलावा, यह एक फ़्लोट दिखाता है, जिससे यह पता चलता है कि लीनियर स्पेस में इनपुट कलर को कितने से गुणा करना है.SkSL शेडर जनरेट करना
इंटरफ़ेस
ToneMapper::generateTonemapGainShaderSkSLसोर्स और डेस्टिनेशन डेटास्पेस के हिसाब से, SkSL शेडर स्ट्रिंग दिखाता है. The 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फ़ाइल को अपनी पसंद के मुताबिक बनाई गई लाइब्रेरी से जनरेट की गई फ़ाइल से बदलना.
वेंडर को कर्नल कोड में कोई बदलाव करने की ज़रूरत नहीं होती. हालांकि, सही तरीके से लागू करने के लिए, कई वेंडर को डीपीयू टोन-मैपिंग एल्गोरिदम के बारे में जानकारी शेयर करनी होगी.
पुष्टि करना
अपने इंप्लीमेंटेशन की पुष्टि करने के लिए, यह तरीका अपनाएं:
जीपीयू कंपोज़िशन को टॉगल करें, ताकि यह पक्का किया जा सके कि उपयोगकर्ता को फ़्लिकर न दिखे.
जीपीयू कंपोज़िशन को टॉगल करने के लिए, यह
adbनिर्देश इस्तेमाल करें:adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition, 1 to force GPU composition>
सामान्य समस्याएं
इस इंप्लीमेंटेशन में ये समस्याएं आ सकती हैं:
बैंडिंग तब होती है, जब जीपीयू कंपोज़िशन के इस्तेमाल किए जाने वाले रेंडर टारगेट की सटीक वैल्यू, एचडीआर कॉन्टेंट की सामान्य वैल्यू से कम होती है. उदाहरण के लिए, बैंडिंग तब हो सकती है, जब एचडब्ल्यूसी इंप्लीमेंटेशन, एचडीआर के लिए अपारदर्शी 10-बिट फ़ॉर्मैट के साथ काम करता है. जैसे, RGBA1010102 या P010. हालांकि, इसके लिए ज़रूरी है कि जीपीयू कंपोज़िशन, ऐल्फ़ा के साथ काम करने के लिए, RGBA8888 जैसे 8-बिट फ़ॉर्मैट में लिखे.
अगर डीपीयू, जीपीयू से अलग सटीक वैल्यू पर काम करता है, तो क्वॉन्टाइज़ेशन में अंतर की वजह से, रंग में मामूली बदलाव हो सकता है.
इनमें से हर समस्या, शामिल हार्डवेयर की सटीक वैल्यू में अंतर से जुड़ी है. इससे बचने का एक सामान्य तरीका यह है कि कम सटीक वैल्यू वाले पाथ में डिथरिंग का तरीका अपनाया जाए. इससे सटीक वैल्यू में होने वाले अंतर को कम किया जा सकता है.