SurfaceTexture
एक सतह और OpenGL ES (GLES) बनावट का एक संयोजन है। SurfaceTexture
उदाहरणों का उपयोग GLES बनावट को आउटपुट देने वाली सतहें प्रदान करने के लिए किया जाता है।
SurfaceTexture
में BufferQueue
का एक उदाहरण शामिल है जिसके लिए ऐप्स उपभोक्ता हैं। जब निर्माता एक नया बफ़र कतारबद्ध करता है तो onFrameAvailable()
कॉलबैक ऐप्स को सूचित करता है। फिर, ऐप्स updateTexImage()
को कॉल करते हैं, जो पहले रखे गए बफ़र को रिलीज़ करता है, कतार से नया बफ़र प्राप्त करता है, और बफ़र को बाहरी बनावट के रूप में GLES को उपलब्ध कराने के लिए EGL कॉल करता है।
बाहरी GLES बनावट
बाहरी GLES बनावट ( GL_TEXTURE_EXTERNAL_OES
) पारंपरिक GLES बनावट ( GL_TEXTURE_2D
) से निम्नलिखित तरीकों से भिन्न हैं:
- बाहरी बनावट
BufferQueue
से प्राप्त डेटा से सीधे बनावट वाले बहुभुज प्रस्तुत करती है। - बाहरी बनावट रेंडरर्स को पारंपरिक GLES बनावट रेंडरर्स की तुलना में अलग तरीके से कॉन्फ़िगर किया गया है।
- बाहरी बनावट सभी पारंपरिक GLES बनावट गतिविधियाँ नहीं कर सकतीं।
बाहरी बनावट का मुख्य लाभ BufferQueue
डेटा से सीधे प्रस्तुत करने की उनकी क्षमता है। SurfaceTexture
इंस्टेंस उपभोक्ता उपयोग फ़्लैग को GRALLOC_USAGE_HW_TEXTURE
पर सेट करता है जब यह बाहरी बनावट के लिए BufferQueue
इंस्टेंस बनाता है ताकि यह सुनिश्चित हो सके कि बफ़र में डेटा GLES द्वारा पहचानने योग्य है।
क्योंकि SurfaceTexture
इंस्टेंसेस EGL संदर्भ के साथ इंटरैक्ट करता है, एक ऐप केवल इसके तरीकों को कॉल कर सकता है जबकि बनावट का मालिकाना हक रखने वाला EGL संदर्भ कॉलिंग थ्रेड पर मौजूद होता है। अधिक जानकारी के लिए SurfaceTexture
वर्ग दस्तावेज़ देखें।
टाइमस्टैम्प और परिवर्तन
SurfaceTexture
उदाहरणों में getTimeStamp()
विधि शामिल है, जो एक टाइमस्टैम्प पुनर्प्राप्त करती है, और getTransformMatrix()
विधि, जो एक परिवर्तन मैट्रिक्स पुनर्प्राप्त करती है। updateTexImage()
को कॉल करने से टाइमस्टैम्प और ट्रांसफ़ॉर्मेशन मैट्रिक्स दोनों सेट हो जाते हैं। BufferQueue
पारित प्रत्येक बफ़र में परिवर्तन पैरामीटर और एक टाइमस्टैम्प शामिल होता है।
दक्षता के लिए परिवर्तन पैरामीटर उपयोगी होते हैं। कुछ मामलों में, स्रोत डेटा उपभोक्ता के लिए गलत दिशा में हो सकता है। उपभोक्ता को भेजने से पहले डेटा को घुमाने के बजाय, डेटा को उसके ओरिएंटेशन में एक ट्रांसफॉर्म के साथ भेजें जो इसे सही करता है। जब डेटा का उपयोग किया जाता है, तो परिवर्तन मैट्रिक्स को अन्य परिवर्तनों के साथ विलय किया जा सकता है, जिससे ओवरहेड कम हो जाता है।
टाइमस्टैम्प उन बफ़र स्रोतों के लिए उपयोगी है जो समय पर निर्भर हैं। उदाहरण के लिए, जब setPreviewTexture()
निर्माता इंटरफ़ेस को कैमरे के आउटपुट से जोड़ता है, तो कैमरे से फ़्रेम का उपयोग वीडियो बनाने के लिए किया जा सकता है। प्रत्येक फ़्रेम में फ़्रेम कैप्चर किए जाने के समय से प्रेजेंटेशन टाइमस्टैम्प होना आवश्यक है, न कि उस समय से जब ऐप को फ़्रेम प्राप्त हुआ था। कैमरा कोड बफ़र के साथ प्रदान किए गए टाइमस्टैम्प को सेट करता है, जिसके परिणामस्वरूप टाइमस्टैम्प की अधिक सुसंगत श्रृंखला होती है।
केस स्टडी: ग्राफिका का लगातार कब्जा
ग्राफ़िका के निरंतर कैप्चर में डिवाइस के कैमरे से फ़्रेम रिकॉर्ड करना और उन फ़्रेमों को स्क्रीन पर प्रदर्शित करना शामिल है। फ़्रेम रिकॉर्ड करने के लिए, MediaCodec क्लास की createInputSurface()
विधि से एक सतह बनाएं और सतह को कैमरे तक पास करें। फ़्रेम प्रदर्शित करने के लिए, SurfaceView
का एक उदाहरण बनाएं और सतह को setPreviewDisplay()
पर पास करें। ध्यान दें कि फ़्रेम रिकॉर्ड करना और उन्हें एक ही समय में प्रदर्शित करना एक अधिक शामिल प्रक्रिया है।
निरंतर कैप्चर गतिविधि कैमरे से वीडियो प्रदर्शित करती है क्योंकि वीडियो रिकॉर्ड किया जा रहा है। इस मामले में, एन्कोडेड वीडियो मेमोरी में एक गोलाकार बफर पर लिखा जाता है जिसे किसी भी समय डिस्क पर सहेजा जा सकता है।
इस प्रवाह में तीन बफ़र कतारें शामिल हैं:
-
App
- ऐप कैमरे से फ़्रेम प्राप्त करने के लिएSurfaceTexture
इंस्टेंस का उपयोग करता है, उन्हें बाहरी GLES बनावट में परिवर्तित करता है। -
SurfaceFlinger
- ऐप फ़्रेम प्रदर्शित करने के लिएSurfaceView
इंस्टेंस घोषित करता है। -
MediaServer
- वीडियो बनाने के लिए इनपुट सतह के साथMediaCodec
एनकोडर को कॉन्फ़िगर करें।
नीचे दिए गए चित्र में, तीर कैमरे से डेटा प्रसार को दर्शाते हैं। BufferQueue
उदाहरण रंग में हैं (निर्माता चैती हैं, उपभोक्ता हरे हैं)।
एन्कोडेड H.264 वीडियो ऐप प्रक्रिया में रैम में एक गोलाकार बफर में जाता है। जब कोई उपयोगकर्ता कैप्चर बटन दबाता है, तो MediaMuxer
क्लास एन्कोडेड वीडियो को डिस्क पर MP4 फ़ाइल में लिखता है।
सभी BufferQueue
उदाहरणों को ऐप में एकल ईजीएल संदर्भ के साथ नियंत्रित किया जाता है जबकि जीएलईएस संचालन यूआई थ्रेड पर किया जाता है। एन्कोडेड डेटा का प्रबंधन (एक गोलाकार बफर को प्रबंधित करना और इसे डिस्क पर लिखना) एक अलग थ्रेड पर किया जाता है।
SurfaceView
क्लास का उपयोग करते समय, surfaceCreated()
कॉलबैक डिस्प्ले और वीडियो एनकोडर के लिए EGLContext
और EGLSurface
इंस्टेंस बनाता है। जब कोई नया फ़्रेम आता है, SurfaceTexture
चार गतिविधियाँ करता है:- फ्रेम प्राप्त करता है.
- फ़्रेम को GLES बनावट के रूप में उपलब्ध कराता है।
- GLES कमांड के साथ फ्रेम प्रस्तुत करता है।
-
EGLSurface
के प्रत्येक उदाहरण के लिए परिवर्तन और टाइमस्टैम्प को अग्रेषित करता है।
एनकोडर थ्रेड फिर MediaCodec
से एन्कोडेड आउटपुट को खींचता है और इसे मेमोरी में संग्रहीत करता है।
सुरक्षित बनावट वीडियो प्लेबैक
एंड्रॉइड संरक्षित वीडियो सामग्री की पोस्ट-प्रोसेसिंग जीपीयू का समर्थन करता है। यह ऐप्स को जटिल, गैर-रेखीय वीडियो प्रभावों (जैसे वॉर्प्स) के लिए जीपीयू का उपयोग करने, सामान्य ग्राफिक्स दृश्यों में उपयोग के लिए संरक्षित वीडियो सामग्री को बनावट पर मैप करने (उदाहरण के लिए, जीएलईएस का उपयोग करके) और आभासी वास्तविकता (वीआर) की सुविधा देता है।
निम्नलिखित दो एक्सटेंशन का उपयोग करके समर्थन सक्षम किया गया है:
- ईजीएल एक्सटेंशन - (
EGL_EXT_protected_content
) संरक्षित जीएल संदर्भों और सतहों के निर्माण को सक्षम बनाता है, जो दोनों संरक्षित सामग्री पर काम कर सकते हैं। - GLES एक्सटेंशन - (
GL_EXT_protected_textures
) बनावट को संरक्षित के रूप में टैग करने में सक्षम बनाता है ताकि उन्हें फ़्रेमबफ़र बनावट अनुलग्नकों के रूप में उपयोग किया जा सके।
एंड्रॉइड SurfaceTexture
और ACodec ( libstagefright.so
) को संरक्षित सामग्री भेजने में सक्षम बनाता है, भले ही विंडो की सतह SurfaceFlinger
पर कतारबद्ध न हो और संरक्षित संदर्भ में उपयोग के लिए एक संरक्षित वीडियो सतह प्रदान करता है। यह संरक्षित उपभोक्ता बिट ( GRALLOC_USAGE_PROTECTED
) को संरक्षित संदर्भ (एसीओडेक द्वारा सत्यापित) में बनाई गई सतहों पर सेट करके किया जाता है।
सुरक्षित बनावट वीडियो प्लेबैक ओपनजीएल ईएस वातावरण में मजबूत डीआरएम कार्यान्वयन की नींव रखता है। एक मजबूत डीआरएम कार्यान्वयन के बिना, जैसे कि वाइडवाइन लेवल 1, कई सामग्री प्रदाता ओपनजीएल ईएस वातावरण में अपनी उच्च-मूल्य वाली सामग्री को प्रस्तुत करने की अनुमति नहीं देते हैं, जिससे वीआर में डीआरएम-संरक्षित सामग्री देखने जैसे महत्वपूर्ण वीआर उपयोग के मामलों को रोका जा सकता है।
एओएसपी में सुरक्षित बनावट वीडियो प्लेबैक के लिए फ्रेमवर्क कोड शामिल है। ड्राइवर समर्थन ओईएम पर निर्भर है। डिवाइस कार्यान्वयनकर्ताओं को EGL_EXT_protected_content
और GL_EXT_protected_textures extensions
लागू करना होगा। अपनी स्वयं की कोडेक लाइब्रेरी का उपयोग करते समय ( libstagefright
बदलने के लिए), /frameworks/av/media/libstagefright/SurfaceUtils.cpp
में परिवर्तनों पर ध्यान दें जो GRALLOC_USAGE_PROTECTED
के साथ चिह्नित बफ़र्स को ANativeWindow
पर भेजने की अनुमति देते हैं (भले ही ANativeWindow
सीधे कतार में न हो विंडो कंपोज़र) जब तक उपभोक्ता उपयोग बिट्स में GRALLOC_USAGE_PROTECTED
शामिल है। एक्सटेंशन लागू करने पर विस्तृत दस्तावेज़ीकरण के लिए, ख्रोनोस रजिस्ट्रीज़ ( EGL_EXT_protected_content
, और GL_EXT_protected_textures
) देखें।