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