एक एसडीआर-संगत रेंज के लिए टोन मैपिंग एचडीआर ल्यूमिनेंस

एंड्रॉइड 13 एक विक्रेता-कॉन्फ़िगर करने योग्य स्थिर पुस्तकालय पेश करता है जिसे libtonemap कहा जाता है, जो टोन मैपिंग संचालन को परिभाषित करता है और इसे सर्फेसफ्लिंगर प्रक्रिया और हार्डवेयर कम्पोज़र (एचडब्ल्यूसी) कार्यान्वयन के साथ साझा किया जाता है। यह सुविधा ओईएम को फ्रेमवर्क और विक्रेताओं के बीच अपने डिस्प्ले टोन मैपिंग एल्गोरिदम को परिभाषित करने और साझा करने में सक्षम बनाती है, जिससे टोन मैपिंग में बेमेल कम होता है।

Android 13 से पहले, HWC, SurfaceFlinger और ऐप्स के बीच डिस्प्ले-विशिष्ट टोन मैपिंग ऑपरेशन साझा नहीं किए जाते थे। रेंडरिंग पथ के आधार पर, एचडीआर सामग्री के लिए, इससे छवि गुणवत्ता में बेमेल हो गया, जहां एचडीआर सामग्री को अलग-अलग तरीकों से आउटपुट स्पेस में टोन मैप किया गया था। यह स्क्रीन रोटेशन जैसे परिदृश्यों में बोधगम्य था, जहां GPU और DPU के बीच संरचना रणनीति बदलती है, और TextureView और SurfaceView के बीच व्यवहार को प्रस्तुत करने में अंतर होता है।

यह पृष्ठ libtonemap पुस्तकालय के इंटरफ़ेस, अनुकूलन और सत्यापन विवरण का वर्णन करता है।

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

libtonemap लाइब्रेरी में सीपीयू-समर्थित कार्यान्वयन और एसकेएसएल शेडर्स शामिल हैं, जिन्हें जीपीयू-बैकएंड संरचना के लिए सर्फेसफ्लिंगर द्वारा और टोन मैपिंग लुक-अप टेबल (एलयूटी) उत्पन्न करने के लिए एचडब्ल्यूसी द्वारा प्लग किया जा सकता है। libtonemap का प्रवेश बिंदु android::tonemap::getToneMapper() है, जो एक ऑब्जेक्ट देता है जो ToneMapper इंटरफ़ेस को लागू करता है।

ToneMapper इंटरफ़ेस निम्नलिखित क्षमताओं का समर्थन करता है:

  • एक टोन-मैपिंग LUT उत्पन्न करें

    इंटरफ़ेस ToneMapper::lookupTonemapGain , libtonemap_LookupTonemapGain() में परिभाषित शेडर का CPU कार्यान्वयन है। इसका उपयोग ढांचे में इकाई परीक्षणों द्वारा किया जाता है, और भागीदारों द्वारा उनकी रंग पाइपलाइन के अंदर टोन-मैपिंग एलयूटी उत्पन्न करने में सहायता के लिए उपयोग किया जा सकता है।

    libtonemap_LookupTonemapGain() रैखिक RGB और XYZ दोनों में, निरपेक्ष, असामान्य रैखिक स्थान में रंग मान लेता है, और एक फ्लोट देता है जो बताता है कि रैखिक अंतरिक्ष में इनपुट रंगों को कितना गुणा करना है।

  • एक एसकेएसएल शेडर उत्पन्न करें

    इंटरफ़ेस ToneMapper::generateTonemapGainShaderSkSL() एक स्रोत और गंतव्य डेटा स्थान दिए जाने पर एक SkSL शेडर स्ट्रिंग देता है। एसकेएसएल शेडर को रेंडरइंजिन के लिए स्की कार्यान्वयन में प्लग किया गया है, RenderEngine के लिए जीपीयू-त्वरित कंपोजिटिंग घटक। शेडर को libhwui में भी प्लग किया गया है, ताकि बनावट दृश्य के लिए एचडीआर-टू-एसडीआर टोन मैपिंग कुशलतापूर्वक किया जा TextureView । चूंकि उत्पन्न स्ट्रिंग स्कीया द्वारा उपयोग किए जाने वाले अन्य एसकेएसएल शेडर्स में इन-लाइन है, इसलिए शेडर को निम्नलिखित नियमों का पालन करना चाहिए:

    • शेडर स्ट्रिंग में 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 लाइब्रेरी का संदर्भ कार्यान्वयन स्वीकार्य परिणाम देता है। हालाँकि, क्योंकि GPU संरचना द्वारा उपयोग किया जाने वाला टोन मैपिंग एल्गोरिथ्म DPU संरचना द्वारा उपयोग किए जाने वाले से भिन्न हो सकता है, संदर्भ कार्यान्वयन का उपयोग करने से कुछ परिदृश्यों में झिलमिलाहट हो सकती है जैसे कि रोटेशन एनीमेशन। अनुकूलन ऐसे विक्रेता-विशिष्ट छवि गुणवत्ता मुद्दों को हल कर सकता है।

OEM को दृढ़ता से प्रोत्साहित किया जाता है कि वे अपने स्वयं के ToneMapper उपवर्ग को परिभाषित करने के लिए libtonemap के कार्यान्वयन को ओवरराइड करें, जो getToneMapper() द्वारा लौटाया जाता है। कार्यान्वयन को अनुकूलित करते समय, भागीदारों से निम्न में से एक करने की अपेक्षा की जाती है:

  • सीधे libtonemap के कार्यान्वयन को संशोधित करें।
  • अपने स्वयं के स्थिर पुस्तकालय को परिभाषित करें, पुस्तकालय को एक स्टैंडअलोन के रूप में संकलित करें, और libtonemap पुस्तकालय की .a फ़ाइल को उनके कस्टम पुस्तकालय से उत्पन्न फ़ाइल से बदलें।

विक्रेताओं को किसी भी कर्नेल कोड को संशोधित करने की आवश्यकता नहीं है, लेकिन कई विक्रेताओं को उचित कार्यान्वयन के लिए डीपीयू टोन-मैपिंग एल्गोरिदम के बारे में विवरण देना चाहिए।

मान्यकरण

अपने कार्यान्वयन को सत्यापित करने के लिए इन चरणों का पालन करें:

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

  2. यह सुनिश्चित करने के लिए कि कोई उपयोगकर्ता बोधगम्य झिलमिलाहट नहीं है, GPU संरचना को टॉगल करें।

    GPU संरचना को चालू करने के लिए निम्नलिखित adb कमांड का उपयोग करें:

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

सामान्य मुद्दे

इस कार्यान्वयन के साथ निम्नलिखित समस्याएँ हो सकती हैं:

  • बैंडिंग तब होती है जब GPU संरचना द्वारा उपयोग किया गया रेंडर लक्ष्य HDR सामग्री के लिए विशिष्ट मान से कम सटीकता का होता है। उदाहरण के लिए, बैंडिंग तब हो सकती है जब एचडब्ल्यूसी कार्यान्वयन एचडीआर के लिए अपारदर्शी 10-बिट प्रारूपों जैसे आरजीबीए 1010102 या पी010 का समर्थन करता है, लेकिन इसके लिए आवश्यक है कि जीपीयू संरचना अल्फा का समर्थन करने के लिए आरजीबीए 8888 जैसे 8-बिट प्रारूप में लिखती है।

  • यदि डीपीयू जीपीयू की तुलना में एक अलग परिशुद्धता पर काम करता है तो एक सूक्ष्म रंग परिवर्तन परिमाणीकरण अंतर के कारण होता है।

इनमें से प्रत्येक समस्या अंतर्निहित हार्डवेयर के सापेक्ष सटीक अंतर से संबंधित है। एक विशिष्ट समाधान यह सुनिश्चित करना है कि कम सटीक पथों में एक कठिन कदम है, जिससे किसी भी सटीक अंतर को कम मानवीय बोधगम्य बना दिया जाता है।