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

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

आर्किटेक्चर का यह डायग्राम, 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)
            }
        }
    }
}

लागू करना: सरफ़ेस मोड (इनपुट सरफ़ेस, आउटपुट सरफ़ेस)

सरफ़ेस एक्ज़ीक्यूशन मोड (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()