نسيج السطح

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

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

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

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

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

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

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

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

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

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

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

دراسة حالة: تسجيل Grafika المستمر

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

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

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

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

في الشكل أدناه، تشير الأسهم إلى انتشار البيانات من الكاميرا. تكون نُسخ BufferQueue ملونة (تكون النُسخ المنتجة زرقاء خضراء، والنُسخ المستهلكة خضراء).

نشاط تسجيل
متواصل في Grafika

الشكل 1: نشاط التقاط الصور المستمر في Grafika

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

تتم معالجة جميع نُسخ BufferQueue باستخدام سياق EGL واحد في التطبيق بينما يتم تنفيذ عمليات GLES في سلسلة مهام واجهة المستخدم. تتم معالجة data المشفَّرة (إدارة مخزن دوار وكتابته على القرص) في سلسلة مهام منفصلة.

عند استخدام فئة SurfaceView، ينشئ الإجراء المُعاد الاتصال به surfaceCreated() مثيلَي EGLContext وEGLSurface لجهاز معالجة عرض الإعلانات وجهاز معالجة الفيديو. عند وصول إطار جديد، ينفّذ SurfaceTexture أربعة أنشطة:
  1. الحصول على الإطار
  2. توفّر الإطار كنسيج GLES.
  3. يعرض الإطار باستخدام أوامر GLES.
  4. تعيد توجيه التحويل والطابع الزمني لكل مثيل من EGLSurface.

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

تشغيل فيديوهات ذات بنية آمنة

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

تشغيل الفيديوهات ذات المحتوى النصي بأمان

الشكل 2: تشغيل فيديوهات ذات بنية آمنة

يتم تفعيل الميزة باستخدام الإضافةَين التاليتَين:

  • إضافة EGL: (EGL_EXT_protected_content) تتيح إنشاء مساحات عرض وسياقات GL محمية، ويمكن لكلاهما العمل على المحتوى المحمي.
  • إضافة GLES: (GL_EXT_protected_textures) تتيح إضافة علامة "محمية" على مواد النسيج حتى يمكن استخدامها كمرفقات لمواد النسيج في إطار الذاكرة.

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

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

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