एचडीआर ल्यूमिनेंस को एसडीआर के साथ काम करने वाली रेंज के साथ टोन मैप करना

Android 13 में libtonemap नाम की एक स्टैटिक स्टैटिक लाइब्रेरी लॉन्च की गई है, जिसे वेंडर कॉन्फ़िगर कर सकता है. यह टोन मैपिंग ऑपरेशन के बारे में जानकारी देता है. साथ ही, इसे SurfaceFlinger प्रोसेस और हार्डवेयर कंपोज़र (एचडब्ल्यूसी) को लागू करने की प्रोसेस के साथ शेयर किया गया है. इस सुविधा से OEM, फ़्रेमवर्क और वेंडर के बीच डिसप्ले टोन मैपिंग एल्गोरिदम तय कर पाता है और उसे शेयर कर पाता है. इससे टोन मैपिंग के बीच होने वाले अंतर को कम किया जाता है.

Android 13 से पहले वाले वर्शन में, डिसप्ले के हिसाब से टोन मैप करने की सुविधा HW, SurfaceFlinger, और ऐप्लिकेशन के बीच शेयर नहीं की जाती थी. एचडीआर कॉन्टेंट के लिए रेंडरिंग पाथ के आधार पर, इमेज की क्वालिटी में अंतर दिखता था. इसमें एचडीआर कॉन्टेंट की टोन को आउटपुट स्पेस में अलग-अलग तरीकों से मैप किया गया था. ऐसा स्क्रीन रोटेशन जैसे मामलों में देखा जा सकता है, जहां जीपीयू और डीपीयू के बीच कंपोज़िशन स्ट्रेटजी बदलती है. साथ ही, TextureView और SurfaceView के बीच रेंडरिंग के काम करने के व्यवहार में अंतर होता है.

इस पेज पर, libtonemap लाइब्रेरी के इंटरफ़ेस, पसंद के मुताबिक बनाने, और पुष्टि करने की जानकारी दी गई है.

टोन मैपिंग लाइब्रेरी का इंटरफ़ेस

libtonemap लाइब्रेरी में, सीपीयू के साथ काम करने वाले स्किल और SkSL शेडर शामिल होते हैं. इन्हें GPU-बैकएंड कॉम्पोज़िशन के लिए SurfaceFlinger और टोन मैपिंग लुक-अप टेबल (LUT) जनरेट करने के लिए HWC से प्लग इन किया जा सकता है. libtonemap का एंट्री पॉइंट android::tonemap::getToneMapper() है. यह एक ऐसा ऑब्जेक्ट दिखाता है जो ToneMapper इंटरफ़ेस को लागू करता है.

ToneMapper इंटरफ़ेस में ये सुविधाएं काम करती हैं:

  • टोन-मैपिंग LUT जनरेट करें

    इंटरफ़ेस ToneMapper::lookupTonemapGain, libtonemap_LookupTonemapGain() में बताए गए शेडर का सीपीयू वर्शन है. इसका इस्तेमाल फ़्रेमवर्क में यूनिट टेस्ट के लिए किया जाता है. पार्टनर इसका इस्तेमाल, अपनी कलर पाइपलाइन में टोन-मैपिंग एलयूटी जनरेट करने में मदद करने के लिए कर सकते हैं.

    libtonemap_LookupTonemapGain(), कलर वैल्यू को ऐब्सोलूट, नॉर्मलाइज़ नहीं किए गए लीनियर स्पेस में लेता है. यह लीनियर आरजीबी और XYZ, दोनों में होता है. साथ ही, यह एक फ़्लोट वैल्यू दिखाता है, जिसमें यह बताया जाता है कि लीनियर स्पेस में इनपुट कलर को कितना गुणा करना है.

  • एसकेएसएल शेडर जनरेट करें

    इंटरफ़ेस 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_ से होनी चाहिए.
  • एसकेएसएल यूनिफ़ॉर्म जनरेट करें

    इंटरफ़ेस ToneMapper::generateShaderSkSLUniforms() यह दिखाता है कि struct अलग-अलग एचडीआर स्टैंडर्ड और डिसप्ले की स्थितियों के मेटाडेटा के बारे में क्या जानकारी देता है. इस मेटाडेटा में यह जानकारी दी गई है:

    • ऐसे यूनिफ़ॉर्म की सूची जिन पर एसकेएसएल शेडर लगा है.

    • एक जैसी वैल्यू in_libtonemap_displayMaxLuminance और in_libtonemap_inputMaxLuminance. इन वैल्यू का इस्तेमाल, फ़्रेमवर्क शेडर करते हैं. इनका इस्तेमाल तब किया जाता है, जब इनपुट को libtonemap में स्केल किया जाता है और ज़रूरत के हिसाब से आउटपुट को नॉर्मलाइज़ किया जाता है.

    फ़िलहाल, यूनिफ़ॉर्म जनरेट करने की प्रोसेस में इनपुट और आउटपुट डेटास्पेस का कोई फ़र्क़ नहीं पड़ता.

पसंद के मुताबिक बनाएं

libtonemap लाइब्रेरी को लागू करने पर, मान्य नतीजे मिलते हैं. हालांकि, जीपीयू कंपोज़िशन के लिए इस्तेमाल किया जाने वाला टोन मैपिंग एल्गोरिदम, DPU कंपोज़िशन में इस्तेमाल किए गए टोन मैपिंग एल्गोरिदम से अलग हो सकता है. इसलिए, रेफ़रंस को लागू करने का इस्तेमाल करने से रोटेशन ऐनिमेशन जैसे कुछ मामलों में फ़्लिकर हो सकता है. पसंद के मुताबिक बनाने की सुविधा से, वेंडर के हिसाब से इमेज क्वालिटी से जुड़ी समस्याओं को हल किया जा सकता है.

OEM को हमारी सलाह है कि वह libtonemap को लागू करने के तरीके को बदलें, ताकि वह अपनी ToneMapper सब-क्लास तय कर सके, जिसे getToneMapper() से दिखाया जाता है. लागू करने के तरीके में बदलाव करते समय, पार्टनर को इनमें से कोई एक काम करना होगा:

  • libtonemap को लागू करने के तरीके में सीधे बदलाव करें.
  • अपनी स्टैटिक लाइब्रेरी तय करें, लाइब्रेरी को स्टैंडअलोन के तौर पर कॉम्पाइल करें, और libtonemap लाइब्रेरी की .a फ़ाइल को अपनी कस्टम लाइब्रेरी से जनरेट की गई फ़ाइल से बदलें.

वेंडर को किसी भी कर्नेल कोड में बदलाव करने की ज़रूरत नहीं है. हालांकि, उसे सही तरीके से लागू करने के लिए, कई वेंडर को DPU टोन-मैपिंग एल्गोरिदम के बारे में बताना होगा.

पुष्टि करें

लागू होने की पुष्टि करने के लिए, यह तरीका अपनाएं:

  1. एचडीआर वीडियो को किसी भी एचडीआर स्टैंडर्ड की स्क्रीन पर चलाएं. यह स्टैंडर्ड, आपके डिसप्ले सिस्टम पर काम करता हो. जैसे, HLG, HDR10, HDR10+ या DolbyVision.

  2. यह पक्का करने के लिए जीपीयू कंपोज़िशन को टॉगल करें कि उपयोगकर्ता को कोई फ़्लिकर न दिखे.

    जीपीयू कंपोज़िशन को टॉगल करने के लिए, इस adb निर्देश का इस्तेमाल करें:

    adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition,
    1 to force GPU composition>
    
    

सामान्य समस्याएं

इस तरीके को लागू करने पर, ये समस्याएं हो सकती हैं:

  • बैंडिंग तब होती है, जब जीपीयू कंपोज़िशन के लिए इस्तेमाल किया गया रेंडर टारगेट, एचडीआर कॉन्टेंट की सामान्य वैल्यू से कम सटीक होता है. उदाहरण के लिए, जब एचडब्ल्यूसी लागू करने पर एचडीआर के लिए आरजीबीए1010102 या P010 जैसे ओपेक 10-बिट फ़ॉर्मैट के साथ काम करना हो, तब बैंडिंग हो सकती है. हालांकि, ऐल्फ़ा के साथ काम करने के लिए जीपीयू कंपोज़िशन को 8-बिट वाले फ़ॉर्मैट में लिखना ज़रूरी है, जैसे कि RGBA8888.

  • अगर डीपीयू, जीपीयू से अलग सटीक तरीके से काम करता है, तो क्वांटाइज़ेशन में अंतर की वजह से कलर शिफ़्ट होता है.

इनमें से हर एक समस्या, हार्डवेयर की तुलनात्मक सटीक जानकारी से जुड़ी है. एक सामान्य समाधान यह पक्का करने के लिए है कि कम सटीक पाथ में कोई छोटा-बड़ा चरण हो, जिससे किसी भी तरह के सटीक होने के अंतर को कम इंसान देख पाएं.