SurfaceTexture
হল একটি পৃষ্ঠ এবং একটি OpenGL ES (GLES) টেক্সচারের সমন্বয়। GLES টেক্সচারে আউটপুট SurfaceTexture
টেক্সচার ইনস্ট্যান্স ব্যবহার করা হয়।
SurfaceTexture
BufferQueue
এর একটি উদাহরণ রয়েছে যার জন্য অ্যাপগুলি গ্রাহক। যখন প্রযোজক একটি নতুন বাফার সারিবদ্ধ করে তখন onFrameAvailable()
কলব্যাক অ্যাপগুলিকে বিজ্ঞপ্তি দেয়৷ তারপরে, অ্যাপস কল updateTexImage()
, যা পূর্বে রাখা বাফারটি প্রকাশ করে, সারি থেকে নতুন বাফারটি অর্জন করে এবং EGL কল করে যাতে GLES-এর কাছে বহিরাগত টেক্সচার হিসাবে বাফার উপলব্ধ করা যায়।
বাহ্যিক 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 ভিডিও অ্যাপ প্রক্রিয়ায় RAM-তে একটি বৃত্তাকার বাফারে যায়। যখন একজন ব্যবহারকারী ক্যাপচার বোতাম টিপে, তখন MediaMuxer
ক্লাস ডিস্কের একটি MP4 ফাইলে এনকোড করা ভিডিও লেখে।
সমস্ত BufferQueue
দৃষ্টান্তগুলি অ্যাপে একটি একক EGL প্রসঙ্গ দিয়ে পরিচালনা করা হয় যখন GLES অপারেশনগুলি UI থ্রেডে সঞ্চালিত হয়। এনকোড করা ডেটা পরিচালনা করা (একটি বৃত্তাকার বাফার পরিচালনা করা এবং এটি ডিস্কে লেখা) একটি পৃথক থ্রেডে করা হয়।
SurfaceView
ক্লাস ব্যবহার করার সময়, surfaceCreated()
কলব্যাক প্রদর্শন এবং ভিডিও এনকোডারের জন্য EGLContext
এবং EGLSurface
উদাহরণ তৈরি করে। যখন একটি নতুন ফ্রেম আসে, SurfaceTexture
চারটি ক্রিয়াকলাপ সম্পাদন করে:- ফ্রেম অর্জন করে।
- ফ্রেমটিকে একটি GLES টেক্সচার হিসাবে উপলব্ধ করে।
- GLES কমান্ড সহ ফ্রেম রেন্ডার করে।
-
EGLSurface
এর প্রতিটি উদাহরণের জন্য রূপান্তর এবং টাইমস্ট্যাম্প ফরোয়ার্ড করে।
এনকোডার থ্রেড তারপর MediaCodec
থেকে এনকোড করা আউটপুট টেনে আনে এবং মেমরিতে আটকে রাখে।
সুরক্ষিত টেক্সচার ভিডিও প্লেব্যাক
Android সুরক্ষিত ভিডিও সামগ্রীর GPU পোস্ট-প্রসেসিং সমর্থন করে। এটি অ্যাপগুলিকে জটিল, ননলাইনার ভিডিও ইফেক্টের (যেমন ওয়ার্পস), সাধারণ গ্রাফিক্স দৃশ্যে (উদাহরণস্বরূপ, GLES ব্যবহার করে) এবং ভার্চুয়াল রিয়েলিটি (VR) ব্যবহার করার জন্য টেক্সচারে সুরক্ষিত ভিডিও সামগ্রী ম্যাপ করার জন্য GPU ব্যবহার করতে দেয়।
নিম্নলিখিত দুটি এক্সটেনশন ব্যবহার করে সমর্থন সক্রিয় করা হয়েছে:
- EGL এক্সটেনশন — (
EGL_EXT_protected_content
) সুরক্ষিত GL প্রসঙ্গ এবং পৃষ্ঠতল তৈরি করতে সক্ষম করে, যা উভয়ই সুরক্ষিত সামগ্রীতে কাজ করতে পারে। - GLES এক্সটেনশন — (
GL_EXT_protected_textures
) ট্যাগিং টেক্সচারগুলিকে সুরক্ষিত হিসাবে সক্ষম করে যাতে সেগুলি ফ্রেমবাফার টেক্সচার সংযুক্তি হিসাবে ব্যবহার করা যেতে পারে।
Android SurfaceTexture
এবং ACodec ( libstagefright.so
) কে সুরক্ষিত সামগ্রী পাঠাতে সক্ষম করে এমনকি যদি উইন্ডোর পৃষ্ঠটি SurfaceFlinger
এ সারিতে না থাকে এবং একটি সুরক্ষিত প্রেক্ষাপটে ব্যবহারের জন্য একটি সুরক্ষিত ভিডিও পৃষ্ঠ প্রদান করে। এটি সুরক্ষিত প্রেক্ষাপটে (ACodec দ্বারা যাচাইকৃত) তৈরি করা পৃষ্ঠগুলিতে সুরক্ষিত ভোক্তা বিট ( GRALLOC_USAGE_PROTECTED
) সেট করে করা হয়।
সুরক্ষিত টেক্সচার ভিডিও প্লেব্যাক OpenGL ES পরিবেশে শক্তিশালী DRM বাস্তবায়নের ভিত্তি স্থাপন করে। ওয়াইডিভাইন লেভেল 1-এর মতো একটি শক্তিশালী DRM বাস্তবায়ন ছাড়া, অনেক সামগ্রী প্রদানকারী তাদের উচ্চ-মূল্যের বিষয়বস্তু OpenGL ES পরিবেশে রেন্ডার করার অনুমতি দেয় না, VR-এ DRM-সুরক্ষিত সামগ্রী দেখার মতো গুরুত্বপূর্ণ VR ব্যবহারের ক্ষেত্রে বাধা দেয়।
AOSP সুরক্ষিত টেক্সচার ভিডিও প্লেব্যাকের জন্য ফ্রেমওয়ার্ক কোড অন্তর্ভুক্ত করে। ড্রাইভার সমর্থন OEMs পর্যন্ত. ডিভাইস বাস্তবায়নকারীদের অবশ্যই 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
)।