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
ملونة (تكون النُسخ المنتجة زرقاء خضراء، والنُسخ المستهلكة خضراء).

الشكل 1: نشاط التقاط الصور المستمر في Grafika
يتم نقل الفيديو المرمّز بتنسيق H.264 إلى ذاكرة تخزين مؤقتة دائرية في ذاكرة الوصول العشوائي (RAM) أثناء عملية تشغيل التطبيق.
عندما يضغط المستخدم على زر الالتقاط، تُسجِّل فئة MediaMuxer
الفيديو المشفَّر في ملف MP4 على القرص.
تتم معالجة جميع نُسخ BufferQueue
باستخدام سياق EGL واحد في
التطبيق بينما يتم تنفيذ عمليات GLES في سلسلة مهام واجهة المستخدم. تتم معالجة data
المشفَّرة (إدارة مخزن دوار وكتابته على القرص)
في سلسلة مهام منفصلة.
SurfaceView
، ينشئ الإجراء المُعاد الاتصال به surfaceCreated()
مثيلَي EGLContext
وEGLSurface
لجهاز معالجة عرض الإعلانات وجهاز معالجة
الفيديو. عند وصول إطار جديد، ينفّذ SurfaceTexture
أربعة أنشطة:
- الحصول على الإطار
- توفّر الإطار كنسيج GLES.
- يعرض الإطار باستخدام أوامر GLES.
- تعيد توجيه التحويل والطابع الزمني لكل مثيل من
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
).