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