SurfaceTexture

SurfaceTexture هي مزيج من سطح ونسيج OpenGL ES (GLES). يتم استخدام مثيلات SurfaceTexture لتوفير مساحات عرض تعرض محتوى على زخارف GLES.

يحتوي SurfaceTexture على مثيل من BufferQueue تستهلكه التطبيقات. يُعلم استدعاء onFrameAvailable() التطبيقات عندما يضيف المنتج مخزنًا مؤقتًا جديدًا إلى قائمة الانتظار. بعد ذلك، تستدعي التطبيقات updateTexImage()، ما يؤدي إلى تحرير المخزن المؤقت الذي تم الاحتفاظ به سابقًا، والحصول على المخزن المؤقت الجديد من قائمة الانتظار، وإجراء طلبات EGL لإتاحة المخزن المؤقت لـ GLES كنسيج خارجي.

زخارف GLES الخارجية

تختلف زخارف GLES الخارجية (GL_TEXTURE_EXTERNAL_OES) عن زخارف GLES العادية (GL_TEXTURE_2D) في ما يلي:

  • تعرض المواد الخارجية مضلّعات مزخرفة مباشرةً من البيانات التي تم تلقّيها من BufferQueue.
  • يتم ضبط إعدادات أدوات عرض النسيج الخارجية بشكل مختلف عن أدوات عرض النسيج العادية في GLES.
  • لا يمكن أن تنفّذ مواد العرض الخارجية جميع أنشطة مواد العرض القياسية في GLES.

تتمثّل الفائدة الرئيسية من استخدام مواد العرض الخارجية في إمكانية عرضها مباشرةً من بيانات BufferQueue. يتم ضبط علامات استخدام المستهلك على GRALLOC_USAGE_HW_TEXTURE عند إنشاء مثيلات SurfaceTexture لمواد عرض خارجية للتحقّق من أنّ بيانات المخزن المؤقت يمكن التعرّف عليها من خلال GLES.BufferQueue

بما أنّ مثيلات SurfaceTexture تتفاعل مع سياق EGL، لا يمكن للتطبيق استدعاء طُرقها إلا عندما يكون سياق EGL الذي يملك الملمس هو السياق الحالي في سلسلة التعليمات البرمجية التي يتم استدعاؤها. لمزيد من المعلومات، يُرجى الاطّلاع على مستندات فئة SurfaceTexture.

الطوابع الزمنية وعمليات التحويل

تتضمّن مثيلات SurfaceTexture الطريقة getTimeStamp() التي تسترد طابعًا زمنيًا، والطريقة getTransformMatrix() التي تسترد مصفوفة تحويل. يؤدي استدعاء updateTexImage() إلى ضبط الطابع الزمني ومصفوفة التحويل. يتضمّن كل مخزن مؤقت تمرّره BufferQueue مَعلمات تحويل وطابعًا زمنيًا.

تكون مَعلمات التحويل مفيدة لتحقيق الكفاءة. في بعض الحالات، قد تكون بيانات المصدر في الاتجاه غير الصحيح بالنسبة إلى المستهلك. بدلاً من تدوير البيانات قبل إرسالها إلى المستهلك، أرسِل البيانات في اتجاهها مع عملية تحويل تصحّحها. يمكن دمج مصفوفة التحويل مع عمليات تحويل أخرى عند استخدام البيانات، ما يقلّل من النفقات العامة.

يكون الطابع الزمني مفيدًا لمصادر المخزن المؤقت التي تعتمد على الوقت. على سبيل المثال، عندما يربط setPreviewTexture() واجهة المنتج بمخرجات الكاميرا، يمكن استخدام اللقطات من الكاميرا لإنشاء فيديو. يجب أن تتضمّن كل لقطة طابعًا زمنيًا للعرض التقديمي يحدّد وقت التقاط اللقطة، وليس وقت تلقّي التطبيق لها. يضبط رمز الكاميرا الطابع الزمني المقدَّم مع المخزن المؤقت، ما يؤدي إلى الحصول على سلسلة أكثر اتساقًا من الطوابع الزمنية.

دراسة حالة: ميزة "التقاط مستمر" من Grafika

تتضمّن ميزة "التقاط الصور المتواصل" من Grafika تسجيل لقطات من كاميرا الجهاز وعرض هذه اللقطات على الشاشة. لتسجيل اللقطات، أنشئ مساحة عرض باستخدام طريقة createInputSurface() في الفئة MediaCodec وامرر مساحة العرض إلى الكاميرا. لعرض اللقطات، أنشئ مثيلاً من SurfaceView ومرِّر السطح إلى setPreviewDisplay(). يُرجى العِلم أنّ تسجيل الإطارات وعرضها في الوقت نفسه عملية أكثر تعقيدًا.

يعرض النشاط التقاط الصور بشكل متواصل فيديو من الكاميرا أثناء تسجيله. في هذه الحالة، تتم كتابة الفيديو المرمّز في مخزن مؤقت دائري في الذاكرة يمكن حفظه على القرص في أي وقت.

يتضمّن هذا المسار ثلاث قوائم انتظار مؤقتة:

  • App: يستخدم التطبيق مثيلاً من SurfaceTexture لتلقّي اللقطات من الكاميرا وتحويلها إلى نسيج GLES خارجي.
  • SurfaceFlinger: يعرِّف التطبيق مثيلاً من SurfaceView لعرض اللقطات.
  • MediaServer: اضبط برنامج ترميز MediaCodec باستخدام مساحة إدخال لإنشاء الفيديو.

في الشكل التالي، تشير الأسهم إلى نقل البيانات من الكاميرا. يتم عرض مثيلات BufferQueue، مع مؤشرات مرئية تميّز المنتجين (أزرق مخضر) عن المستهلكين (أخضر).

Grafika continuous
capture activity

الشكل 1. نشاط Grafika المستمر في تسجيل الشاشة

يتم إرسال فيديو H.264 المرمّز إلى مخزن مؤقت دائري في ذاكرة الوصول العشوائي (RAM) ضمن عملية التطبيق. عندما يضغط المستخدم على زر الالتقاط، تكتب الفئة MediaMuxer الفيديو المرمّز في ملف MP4 على القرص.

يتم التعامل مع جميع مثيلات BufferQueue باستخدام سياق EGL واحد في التطبيق أثناء تنفيذ عمليات GLES على سلسلة UI. تتم معالجة البيانات المشفرة (إدارة المخزن المؤقت الدائري وكتابته على القرص) في سلسلة محادثات منفصلة.

عند استخدام الفئة SurfaceView، ينشئ برنامج معالجة surfaceCreated() مثيلَي EGLContext وEGLSurface للعرض وبرنامج ترميز الفيديو. عند وصول إطار جديد، تنفّذ SurfaceTexture أربعة أنشطة:

  1. يحصل على اللقطة.
  2. تتيح إمكانية استخدام الإطار كبنية GLES.
  3. تعرض هذه السمة اللقطة باستخدام أوامر GLES.
  4. تعيد توجيه عملية التحويل والطابع الزمني لكل مثيل من EGLSurface.

بعد ذلك، يسحب مؤشر ترابط برنامج الترميز الناتج المرمّز من MediaCodec ويخزّنه في الذاكرة.

تشغيل فيديوهات محمية بحقوق الطبع والنشر

يتيح نظام التشغيل Android لوحدة معالجة الرسومات إجراء معالجة لاحقة لمحتوى الفيديو المحمي. يتيح ذلك للتطبيقات استخدام وحدة معالجة الرسومات لتطبيق تأثيرات فيديو معقّدة وغير خطية (مثل التشوهات)، ورسم محتوى الفيديو المحمي على الأنسجة لاستخدامه في مشاهد الرسومات العامة (على سبيل المثال، باستخدام GLES)، والواقع الافتراضي (VR).

تشغيل فيديوهات محمية بنسيج آمن

الشكل 2. تشغيل فيديوهات محمية بحقوق الطبع والنشر

يتم تفعيل التوافق باستخدام الإضافتين التاليتين:

  • إضافة EGL:‏ (EGL_EXT_protected_content) تتيح إنشاء سياقات GL ومساحات عرض محمية، ويمكن أن يعمل كلاهما على المحتوى المحمي.
  • إضافة GLES — (GL_EXT_protected_textures) تتيح إضافة علامات إلى مواد العرض على أنّها محمية، ما يتيح استخدامها كمرفقات لمواد عرض إطارات المخزن المؤقت.

يتيح نظام التشغيل Android استخدام SurfaceTexture وACodec (libstagefright.so) لإرسال المحتوى المحمي حتى إذا لم تكن مساحة العرض في النافذة تتضمّن قائمة انتظار SurfaceFlinger، كما يوفّر مساحة عرض فيديو محمية لاستخدامها في سياق محمي. يتم ذلك من خلال ضبط بت المستهلك المحمي (GRALLOC_USAGE_PROTECTED) على مساحات العرض التي تم إنشاؤها في سياق محمي (تم التحقّق منه بواسطة ACodec).

يوفّر تشغيل الفيديو المحمي بنسيج آمن الأساس لتنفيذ قوي لنظام إدارة الحقوق الرقمية (DRM) في بيئة OpenGL ES. وبدون تنفيذ قوي لإدارة الحقوق الرقمية، مثل Widevine المستوى 1، لا يسمح العديد من مقدّمي المحتوى بعرض محتواهم القيّم في بيئة OpenGL ES، ما يمنع حالات استخدام مهمة للواقع الافتراضي، مثل مشاهدة محتوى محمي بموجب إدارة الحقوق الرقمية في الواقع الافتراضي.

يتضمّن "مشروع Android المفتوح المصدر" (AOSP) رمز إطار عمل لتشغيل الفيديو بشكل آمن. يقع توفير برامج التشغيل على عاتق الشركات المصنّعة للمعدات الأصلية. على مطوّري الأجهزة تنفيذ الإضافتين EGL_EXT_protected_content وGL_EXT_protected_textures. عند استخدام مكتبة برامج ترميز خاصة بك (لاستبدال libstagefright)، يُرجى ملاحظة التغييرات في /frameworks/av/media/libstagefright/SurfaceUtils.cpp التي تتيح إرسال المخازن المؤقتة التي تم وضع علامة GRALLOC_USAGE_PROTECTED عليها إلى ANativeWindow (حتى إذا لم يضع ANativeWindow المخازن المؤقتة في قائمة الانتظار مباشرةً إلى أداة إنشاء النوافذ) طالما أنّ وحدات استخدام المستهلك تحتوي على GRALLOC_USAGE_PROTECTED. للحصول على مستندات مفصّلة حول تنفيذ الإضافات، يُرجى الرجوع إلى سجلات Khronos ( EGL_EXT_protected_content) و ( GL_EXT_protected_textures).