SurfaceTexture
, bir yüzey ile OpenGL ES (GLES) dokusunun birleşimidir. SurfaceTexture
örnekleri, GLES dokularına çıktı veren yüzeyler sağlamak için kullanılır.
SurfaceTexture
uygulamaların tüketici olduğu BufferQueue
bir örneğini içerir. onFrameAvailable()
geri çağrısı, yapımcı yeni bir arabelleği kuyruğa aldığında uygulamaları bilgilendirir. Daha sonra uygulamalar, önceden tutulan arabelleği serbest bırakan, kuyruktan yeni arabelleği alan ve arabelleği harici bir doku olarak GLES'in kullanımına sunmak için EGL çağrılarını yapan updateTexImage()
öğesini çağırır.
Harici GLES dokuları
Harici GLES dokuları ( GL_TEXTURE_EXTERNAL_OES
), geleneksel GLES dokularından ( GL_TEXTURE_2D
) aşağıdaki yönlerden farklılık gösterir:
- Dış dokular dokulu çokgenleri doğrudan
BufferQueue
alınan verilerden işler. - Harici doku oluşturucular, geleneksel GLES doku oluşturuculardan farklı şekilde yapılandırılmıştır.
- Dış dokular, geleneksel GLES doku etkinliklerinin tümünü gerçekleştiremez.
Dış dokuların temel faydası doğrudan BufferQueue
verilerinden oluşturulma yetenekleridir. SurfaceTexture
örnekleri, arabellekteki verilerin GLES tarafından tanınabilmesini sağlamak amacıyla harici dokular için BufferQueue
örnekleri oluşturduğunda tüketici kullanım bayraklarını GRALLOC_USAGE_HW_TEXTURE
olarak ayarlar.
SurfaceTexture
örnekleri bir EGL bağlamıyla etkileşime girdiğinden, bir uygulama yalnızca dokuya sahip olan EGL bağlamı çağıran iş parçacığında geçerliyken yöntemlerini çağırabilir. Daha fazla bilgi için SurfaceTexture
sınıfı belgelerine bakın.
Zaman damgaları ve dönüşümler
SurfaceTexture
örnekleri, bir zaman damgası alan getTimeStamp()
yöntemini ve bir dönüştürme matrisi alan getTransformMatrix()
yöntemini içerir. updateTexImage()
işlevinin çağrılması hem zaman damgasını hem de dönüşüm matrisini ayarlar. BufferQueue
geçirdiği her arabellek, dönüştürme parametrelerini ve bir zaman damgasını içerir.
Dönüşüm parametreleri verimlilik açısından faydalıdır. Bazı durumlarda kaynak veriler tüketici açısından yanlış yönde olabilir. Verileri tüketiciye göndermeden önce döndürmek yerine, verileri düzelten bir dönüşümle kendi yönünde gönderin. Dönüşüm matrisi, veriler kullanıldığında diğer dönüşümlerle birleştirilebilir ve böylece ek yük en aza indirilir.
Zaman damgası, zamana bağlı arabellek kaynakları için kullanışlıdır. Örneğin setPreviewTexture()
, yapımcı arayüzünü kameranın çıkışına bağladığında, kameradaki kareler bir video oluşturmak için kullanılabilir. Her karenin, uygulamanın kareyi aldığı zamana değil, karenin çekildiği zamana ait bir sunum zaman damgasına sahip olması gerekir. Kamera kodu, arabellekle sağlanan zaman damgasını ayarlayarak daha tutarlı bir zaman damgası dizisi elde edilmesini sağlar.
Örnek olay: Grafika'nın sürekli yakalaması
Grafika'nın sürekli yakalaması, bir cihazın kamerasından karelerin kaydedilmesini ve bu karelerin ekranda görüntülenmesini içerir. Kareleri kaydetmek için MediaCodec sınıfının createInputSurface()
yöntemiyle bir yüzey oluşturun ve yüzeyi kameraya aktarın. Çerçeveleri görüntülemek için bir SurfaceView
örneği oluşturun ve yüzeyi setPreviewDisplay()
öğesine iletin. Kareleri kaydetmenin ve bunları aynı anda görüntülemenin daha karmaşık bir süreç olduğunu unutmayın.
Sürekli yakalama etkinliği, video kaydedilirken kameradan gelen videoyu görüntüler. Bu durumda, kodlanmış video, herhangi bir zamanda diske kaydedilebilecek olan bellekteki dairesel bir ara belleğe yazılır.
Bu akış üç arabellek kuyruğunu içerir:
-
App
— Uygulama, kameradan kareler almak ve bunları harici bir GLES dokusuna dönüştürmek için birSurfaceTexture
örneği kullanır. -
SurfaceFlinger
— Uygulama, çerçeveleri görüntülemek için birSurfaceView
örneği bildirir. -
MediaServer
— Videoyu oluşturmak için bir giriş yüzeyiyle birMediaCodec
kodlayıcıyı yapılandırın.
Aşağıdaki şekilde oklar kameradan veri yayılımını göstermektedir. BufferQueue
örnekleri renklidir (üreticiler deniz mavisi, tüketiciler ise yeşildir).
Kodlanmış H.264 video, uygulama sürecinde RAM'deki dairesel bir arabelleğe gider. Bir kullanıcı yakalama düğmesine bastığında MediaMuxer
sınıfı kodlanmış videoyu diskteki bir MP4 dosyasına yazar.
Tüm BufferQueue
örnekleri, uygulamada tek bir EGL bağlamıyla işlenirken, GLES işlemleri UI iş parçacığında gerçekleştirilir. Kodlanmış verilerin işlenmesi (dairesel arabelleğin yönetilmesi ve diske yazılması) ayrı bir iş parçacığında yapılır.
SurfaceView
sınıfını kullanırken, surfaceCreated()
geri çağrısı, ekran ve video kodlayıcı için EGLContext
ve EGLSurface
örneklerini oluşturur. Yeni bir çerçeve geldiğinde SurfaceTexture
dört etkinlik gerçekleştirir:- Çerçeveyi alır.
- Çerçeveyi GLES dokusu olarak kullanılabilir hale getirir.
- Çerçeveyi GLES komutlarıyla işler.
- Her
EGLSurface
örneği için dönüşümü ve zaman damgasını iletir.
Kodlayıcı iş parçacığı daha sonra kodlanmış çıktıyı MediaCodec
çeker ve bellekte saklar.
Güvenli doku video oynatma
Android, korumalı video içeriğinin GPU ile işlenmesini destekler. Bu, uygulamaların karmaşık, doğrusal olmayan video efektleri (çözgüler gibi) için GPU'yu kullanmasına, korumalı video içeriğini genel grafik sahnelerinde (örneğin, GLES kullanarak) ve sanal gerçeklikte (VR) kullanılmak üzere dokulara eşlemesine olanak tanır.
Destek aşağıdaki iki uzantı kullanılarak etkinleştirilir:
- EGL uzantısı — (
EGL_EXT_protected_content
) Her ikisi de korumalı içerik üzerinde çalışabilen korumalı GL bağlamları ve yüzeylerinin oluşturulmasını sağlar. - GLES uzantısı — (
GL_EXT_protected_textures
) Dokuların korumalı olarak etiketlenmesini sağlar, böylece çerçeve arabelleği doku eklentileri olarak kullanılabilirler.
Android, SurfaceTexture
ve ACodec'in ( libstagefright.so
), pencerenin yüzeyi SurfaceFlinger
sıraya girmese bile korumalı içerik göndermesine olanak tanır ve korumalı bir bağlamda kullanılmak üzere korumalı bir video yüzeyi sağlar. Bu, korumalı bir bağlamda (ACodec tarafından doğrulanmıştır) oluşturulan yüzeylere korumalı tüketici bitinin ( GRALLOC_USAGE_PROTECTED
) ayarlanmasıyla yapılır.
Güvenli doku video oynatımı, OpenGL ES ortamında güçlü DRM uygulamasının temelini oluşturur. Widevine Düzey 1 gibi güçlü bir DRM uygulaması olmadan birçok içerik sağlayıcı, yüksek değerli içeriklerinin OpenGL ES ortamında oluşturulmasına izin vermez, bu da DRM korumalı içeriğin VR'de izlenmesi gibi önemli VR kullanım durumlarını engeller.
AOSP, güvenli doku video oynatımı için çerçeve kodunu içerir. Sürücü desteği OEM'lere bağlıdır. Cihaz uygulayıcılarının EGL_EXT_protected_content
ve GL_EXT_protected_textures extensions
uygulaması gerekir. Kendi codec kitaplığınızı kullanırken ( libstagefright
yerine), /frameworks/av/media/libstagefright/SurfaceUtils.cpp
dosyasında GRALLOC_USAGE_PROTECTED
ile işaretlenmiş arabelleklerin ANativeWindow
gönderilmesine izin veren değişikliklere dikkat edin ( ANativeWindow
doğrudan sıraya girmese bile). tüketici kullanım bitleri GRALLOC_USAGE_PROTECTED
içerdiği sürece pencere oluşturucusu). Uzantıların uygulanmasına ilişkin ayrıntılı belgeler için Khronos kayıt defterlerine ( EGL_EXT_protected_content
ve GL_EXT_protected_textures
) bakın.