SurfaceTexture
, bir yüzey ile OpenGL ES (GLES) dokusu kombinasyonudur. SurfaceTexture
örnekleri, GLES dokularına çıkış veren yüzeyler sağlamak için kullanılır.
SurfaceTexture
, uygulamaların tüketici olduğu bir BufferQueue
örneği içerir. onFrameAvailable()
geri çağırma işlevi, üretici yeni bir arabellek sıraya eklediğinde uygulamaları bilgilendirir. Ardından uygulamalar updateTexImage()
çağrısı yapar. Bu çağrı, daha önce tutulan arabelleği serbest bırakır, yeni arabelleği kuyruktan alır ve arabelleği harici bir doku olarak GLES'e sunmak için EGL çağrıları yapar.
Harici GLES dokuları
Harici GLES dokuları (GL_TEXTURE_EXTERNAL_OES
), geleneksel GLES dokularından (GL_TEXTURE_2D
) aşağıdaki açılardan farklıdır:
- Harici dokular, dokulu poligonları doğrudan
BufferQueue
'ten alınan verilerden oluşturur. - Harici doku oluşturma araçları, geleneksel GLES doku oluşturma araçlarından farklı şekilde yapılandırılır.
- Harici dokular, tüm geleneksel GLES doku işlemlerini gerçekleştiremez.
Harici dokuların en büyük avantajı, doğrudan BufferQueue
verilerinden oluşturulabilmesidir. SurfaceTexture
örnekleri, harici dokular için BufferQueue
örnekleri oluştururken arabelleğe alınan verilerin GLES tarafından tanınmasını sağlamak için tüketici kullanım işaretlerini GRALLOC_USAGE_HW_TEXTURE
olarak ayarlar.
SurfaceTexture
örnekleri bir EGL bağlamıyla etkileşimde bulunduğundan, bir uygulama yalnızca dokuya sahip olan EGL bağlamı çağıran iş parçacığında mevcutken bu yöntemleri çağırabilir. Daha fazla bilgi için SurfaceTexture
sınıf dokümanlarını inceleyin.
Zaman damgaları ve dönüşümler
SurfaceTexture
örnekleri, bir zaman damgası döndüren getTimeStamp()
yöntemini ve bir dönüşüm matrisi döndüren getTransformMatrix()
yöntemini içerir. updateTexImage()
çağrısı, hem zaman damgasını hem de dönüşüm matrisini ayarlar. BufferQueue
tarafından iletilen her arabellek, dönüşüm parametrelerini ve bir zaman damgasını içerir.
Dönüşüm parametreleri, verimlilik için kullanışlıdır. Bazı durumlarda, kaynak veriler tüketici için yanlış yönde olabilir. Tüketiciye göndermeden önce verileri döndürmek yerine, verileri düzelten bir dönüştürmeyle kendi yönlerinde gönderin. Veriler kullanıldığında dönüşüm matrisi diğer dönüşümlerle birleştirilebilir. Bu sayede ek maliyet en aza indirilir.
Zaman damgası, zamana bağlı arabellek kaynakları için kullanışlıdır. Örneğin, setPreviewTexture()
üretici arayüzünü kameranın çıkışına bağladığında kameradaki kareler video oluşturmak için kullanılabilir. Her karenin, uygulamanın kareyi aldığı andan değil, karenin yakalandığı andan itibaren bir sunum zaman damgası olmalıdır. Kamera kodu, arabelleğe sağlanan zaman damgasını ayarlar. Bu sayede daha tutarlı bir zaman damgası dizisi elde edilir.
Örnek olay: Grafika'nın sürekli çekimi
Grafika'nın kesintisiz yakalama özelliği, cihazın kamerasından kareler kaydedip bu kareleri ekranda görüntülemeyi içerir.
Kare kaydetmek için MediaCodec sınıfının createInputSurface()
yöntemiyle bir yüzey oluşturun ve yüzeyi kameraya iletin. Çerçeve görüntülemek için SurfaceView
örneği oluşturun ve yüzeyi setPreviewDisplay()
'a iletin. Kareleri kaydedip aynı anda göstermenin daha karmaşık bir işlem olduğunu unutmayın.
Sürekli kayıt etkinliği, video kaydedilirken kameradan gelen videoyu gösterir. Bu durumda, kodlanmış video, bellekteki dairesel bir arabelleğe yazılır ve bu arabelleğe dilediğiniz zaman diske kaydedilebilir.
Bu akış üç arabellek kuyruğu içerir:
App
: Uygulama, kameradan kare almak için birSurfaceTexture
örneği kullanır ve bunları harici bir GLES dokusuna dönüştürür.SurfaceFlinger
: Uygulama, kareleri görüntülemek için birSurfaceView
örneği beyan eder.MediaServer
: Videoyu oluşturmak için bir giriş yüzeyi içeren birMediaCodec
kodlayıcı yapılandırın.
Aşağıdaki şekilde, oklarla kameradan veri aktarımı gösterilmektedir.
BufferQueue
örnekleri renklidir (üreticiler turkuaz, tüketiciler yeşildir).

Şekil 1. Grafika'nın sürekli yakalama etkinliği
Kodlanmış H.264 video, uygulama sürecindeki RAM'de dairesel bir arabelleğe gider.
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şlenir. GLES işlemleri ise kullanıcı arayüzü iş parçacığında gerçekleştirilir. Kodlanmış verilerin işlenmesi (dairesel bir arabelleği yönetme ve diske yazma), ayrı bir iş parçacığında yapılır.
SurfaceView
sınıfı kullanıldığında surfaceCreated()
geri çağırma işlevi, görüntülü reklam ve video kodlayıcı için EGLContext
ve EGLSurface
örneklerini oluşturur. Yeni bir çerçeve geldiğinde SurfaceTexture
dört işlem gerçekleştirir:
- Çerçeveyi alır.
- Çerçeveyi GLES dokusu olarak kullanılabilir hale getirir.
- Çerçeveyi GLES komutlarıyla oluşturur.
- Her
EGLSurface
örneği için dönüştürme işlemini ve zaman damgasını yönlendirir.
Ardından kodlayıcı iş parçacığı, kodlanmış çıkışı MediaCodec
'ten alır ve belleğe yerleştirir.
Güvenli doku video oynatma
Android, korumalı video içeriğinin GPU ile son işleme özelliğini destekler. Bu sayede uygulamalar, karmaşık, doğrusal olmayan video efektleri (ör. bozulma) için GPU'yu kullanabilir, korunan video içeriğini genel grafik sahnelerinde (ör. GLES kullanılarak) ve sanal gerçeklikte (VR) kullanmak üzere dokulara eşleyebilir.

Şekil 2. Güvenli doku video oynatma
Destek, aşağıdaki iki uzantı kullanılarak etkinleştirilir:
- EGL uzantısı:
(
EGL_EXT_protected_content
) Korunan içerikte çalışabilen korunan GL bağlamları ve yüzeylerinin oluşturulmasını sağlar. - GLES uzantısı:
(
GL_EXT_protected_textures
) Kare çerçeve doku ekleri olarak kullanılabilmeleri için dokuların korunan olarak etiketlenmesini sağlar.
Android, pencerenin yüzeyi SurfaceFlinger
'ye sıraya eklenmese bile SurfaceTexture
ve ACodec'in (libstagefright.so
) korumalı içerik göndermesini sağlar ve korumalı bir bağlamda kullanılmak üzere korumalı bir video yüzeyi sağlar. Bu, korumalı bir bağlamda oluşturulan yüzeylerde (ACodec tarafından doğrulanır) korumalı tüketici biti (GRALLOC_USAGE_PROTECTED
) ayarlanarak yapılır.
Güvenli doku video oynatma, OpenGL ES ortamında güçlü DRM uygulamanın temelini oluşturur. Widevine 1. seviye 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ği VR'de izleme gibi önemli VR kullanım alanlarını engeller.
AOSP, güvenli doku videosu oynatma için çerçeve kodu içerir. Sürücü desteği OEM'lere bağlıdır. Cihaz uygulayıcıları EGL_EXT_protected_content
ve GL_EXT_protected_textures extensions
'ü uygulamalıdır. Kendi codec kitaplığınızı (libstagefright
yerine) kullanırken, tüketici kullanım bitleri GRALLOC_USAGE_PROTECTED
içerdiği sürece GRALLOC_USAGE_PROTECTED
ile işaretlenmiş arabelleklerin ANativeWindow
'a gönderilmesine (ANativeWindow
doğrudan pencere derleyiciye sıraya eklenmese bile) olanak tanıyan /frameworks/av/media/libstagefright/SurfaceUtils.cpp
'teki değişikliklere dikkat edin. Uzantıların uygulanmasıyla ilgili ayrıntılı dokümanlar için Khronos kayıt defterlerine (EGL_EXT_protected_content
ve GL_EXT_protected_textures
) bakın.