सरफ़ेस मोड में मीडिया बेहतर बनाने की सुविधा के लाइफ़साइकल के बारे में जानकारी

Media Enhancement API, उपयोगकर्ता के डिवाइस पर काम करने वाला एआई सलूशन है. यह कम इंतज़ार के समय में काम करता है और निजता बनाए रखता है. यह हार्डवेयर से तेज़ी लाने का इस्तेमाल करता है, ताकि अच्छी क्वालिटी वाले मीडिया में सुधार किया जा सके. साथ ही, इससे APK का साइज़ भी नहीं बढ़ता. ज़्यादा जानकारी के लिए, मीडिया को बेहतर बनाने की सुविधाओं के बारे में जानें लेख पढ़ें.

यहां दिए गए आर्किटेक्चर डायग्राम में, Media Enhancement API के एसिंक्रोनस सर्फ़ेस मोड के एक्ज़ीक्यूशन के लाइफ़साइकल के बारे में बताया गया है. यह मोड, हार्डवेयर बफ़र को सीधे तौर पर लिंक करता है. इससे, सीपीयू और जीपीयू मेमोरी बफ़र के बीच बिना कंप्रेस किए गए फ़्रेम को कॉपी करने की परफ़ॉर्मेंस से जुड़ी समस्या को हल किया जा सकता है.

इस डायग्राम में, Media Enhancement API के एसिंक्रोनस सर्फ़ेस-टू-सर्फ़ेस लाइफ़साइकल के सात चरणों के बारे में बताया गया है.
पहली इमेज. एसिंक्रोनस सर्फ़ेस मोड के एक्ज़ीक्यूशन का लाइफ़साइकल और बेहतर बनाने की प्रोसेस के सात चरण.

बेहतर बनाने वाली पाइपलाइन को इन चरणों में लागू किया जाता है:

पहला चरण. बेहतर सेशन सेट अप करना

1. इनपुट सरफेस उपलब्ध कराएं: आपका ऐप्लिकेशन, प्रोसेसिंग के लिए फ़्रेम ऐक्सेस करने के लिए, बेहतर बनाने वाले फ़्रेमवर्क को इनपुट सरफेस हैंडल उपलब्ध कराता है.

2. आउटपुट सर्फ़ेस सेट करना: आपका ऐप्लिकेशन, रेंडरिंग टारगेट (जैसे कि SurfaceView या TextureView) को सीधे तौर पर फ़्रेमवर्क से जोड़ता है.

दूसरा चरण. इनपुट फ़्रेम जनरेट करना

3. बेस मीडिया तैयार करना: आपका ऐप्लिकेशन, बिना कंप्रेस किया गया बेस मीडिया वापस पाता है. उदाहरण के लिए, लोकल डिस्क से कोई फ़ाइल पढ़कर.

4. फ़्रेम डेटा इंजेक्ट करना: आपका ऐप्लिकेशन, रॉ इमेज पेलोड को सीधे तौर पर बाउंड इनपुट सर्फ़ेस पाइपलाइन में लिखता है.

तीसरा चरण. प्रोसेस करना और बेहतर बनाना

5. एआई की मदद से डेटा प्रोसेस करने की सुविधा: फ़्रेमवर्क, डिवाइस के जीपीयू या एनपीयू पर फ़्रेम को प्रोसेस करता है. साथ ही, मशीन लर्निंग की सुविधाओं को लागू करता है. जैसे, टोनमैपिंग, फ़ोटो या वीडियो से ब्लर हटाना या क्वालिटी को बेहतर बनाने की प्रोसेस.

6. बेहतर फ़्रेम डिलीवर करना: इंजन, बेहतर और फ़ुल-रिज़ॉल्यूशन वाले फ़्रेम को सीधे तौर पर बाउंड आउटपुट सर्फ़ेस पर भेजता है.

चौथा चरण. नतीजा दिखाना या सेव करना

7. आउटपुट को फ़ाइनल करना: आपका ऐप्लिकेशन, प्रोसेस किए गए हार्डवेयर स्ट्रीम बफ़र को यूज़र इंटरफ़ेस (यूआई) में रेंडर करने या उसे स्टोरेज में वापस सेव करने के लिए इस्तेमाल करता है.

EnhancementSession एक हैवीवेट कॉन्टेक्स्ट ऑब्जेक्ट है. यह लगातार जीपीयू या एनपीयू मेमोरी पाइपलाइन को बनाए रखता है. यह वीडियो रैम (वीआरएएम) और नेटिव सिस्टम हैंडल को अलग से असाइन करता है. मेमोरी लीक और संभावित OutOfMemoryError क्रैश से बचने के लिए, लाइफ़साइकल के इन सिद्धांतों का पालन करें:

  • लेज़ी इंस्टैंटिएशन: जब तक उपयोगकर्ता कोई बेहतर कार्रवाई शुरू नहीं करता, तब तक सेशन न बनाएं.
  • रणनीतिक तौर पर दोबारा इस्तेमाल करना: एक जैसे कॉन्फ़िगरेशन (डाइमेंशन और टॉगल किए गए विकल्प) वाली स्ट्रीम या फ़्रेम को प्रोसेस करते समय, एक ही सेशन इंस्टेंस को बनाए रखें और उसका दोबारा इस्तेमाल करें.
  • प्रॉम्प्ट को बंद करना: विज़ुअल टास्क बंद होने पर, शेयर किए गए हार्डवेयर संसाधनों को खाली करने के लिए, session.release() को तुरंत बंद करें.

बेहतर बनाने वाले इंजन को शुरू करना

इस तरीके से, दो चरणों में जांच की जाती है. इससे यह पुष्टि की जाती है कि डिवाइस का हार्डवेयर, ऐक्सेलरेटर के साथ काम करता है या नहीं. इसके बाद, यह पक्का किया जाता है कि ज़रूरी मशीन लर्निंग मॉड्यूल मौजूद हैं या नहीं.

इसे पहले से ही चलाकर, रनटाइम के दौरान शुरू होने में होने वाली गड़बड़ियों को रोका जा सकता है. ऐसा इसलिए, क्योंकि यह आपके ऐप्लिकेशन के मीडिया को प्रोसेस करने से पहले, क्षमताओं की पुष्टि करता है.

class MediaSetupViewModel(application: Application) : AndroidViewModel(application) {
    private val enhancementClient = Enhancement.getClient(application)
    fun initializeEnhancementEngine() {
        viewModelScope.launch {
            try {
                // 1. Verify hardware capability
                val isSupported = enhancementClient.isDeviceSupportedAsync()
                if (!isSupported) {
                    notifyUiDeviceIncompatible()
                    return@launch
                }
                // 2. Verify and download the Google Play services ML modules
                val isInstalled = enhancementClient.isModuleInstalledAsync()
                if (!isInstalled) {
                    notifyUiDownloadingModels()
                    enhancementClient.installModule().await()
                }
                notifyUiEngineReady()
            } catch (e: Exception) {
                // Handle potential errors during session creation or image
                // processing.
                handleInitializationError(e)
            }
        }
    }
}

Implementation: Surface mode (surface in, surface out)

सरफ़ेस एक्ज़ीक्यूशन मोड (EnhancementMode.SURFACE) में, सीपीयू और जीपीयू मेमोरी बफ़र के बीच फ़्रेम को ले जाने से परफ़ॉर्मेंस पर पड़ने वाले असर से बचा जा सकता है. इसके बजाय, एन्हांसमेंट लाइब्रेरी सीधे तौर पर रॉ हार्डवेयर बफ़र को मैप करती है. यह इनपुट सरफेस से फ़्रेम पढ़ती है, उन्हें नेटिव तौर पर प्रोसेस करती है, और उन्हें सीधे आउटपुट सरफेस पर पाइप करती है.

सिंगल-फ़्रेम वाले, सतह के स्नैपशॉट

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

// Provisions input Surface (for example, ImageReader) and output Surface (for
// example, SurfaceView)
val inputSurface: Surface = imageReader.surface
val outputSurface: Surface = surfaceView.holder.surface
// 1. Configure parameters for SURFACE mode
val surfaceOptions = EnhancementOptions(
    imageReader.width,
    imageReader.height,
    EnhancementMode.SURFACE,
    enableTonemap = true,
    enableDeblurDenoise = true,
    enableFaceDetection = false
).also {
    // 2. Bind hardware surfaces
    it.setInputSurface(inputSurface)
    it.setOutputSurface(outputSurface)
}

// 3. Create the session to process the hardware frame
val singleFrameSession = enhancementClient.createSessionAsync(surfaceOptions, executor)
// The API processes the single frame. Upon completion, release the session.
singleFrameSession.release()