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
örneğini içerir. onFrameAvailable() geri çağırma işlevi, üretici yeni bir arabellek sıraya aldığında uygulamaları bilgilendirir. Ardından, uygulamalar updateTexImage() işlevini çağırır. Bu işlev, daha önce tutulan arabelleği serbest bırakır, kuyruktan yeni arabelleği alır ve arabelleği harici doku olarak GLES'e sunmak için EGL çağrıları yapar.
Harici GLES dokuları
Harici GLES dokuları (GL_TEXTURE_EXTERNAL_OES), standart GLES dokularından (GL_TEXTURE_2D) şu yönleriyle farklıdır:
- Harici dokular,
BufferQueue'dan alınan verilerden dokulu poligonları doğrudan oluşturur. - Harici doku oluşturucular, standart GLES doku oluşturuculardan farklı şekilde yapılandırılır.
- Harici dokular, tüm standart GLES doku etkinliklerini gerçekleştiremez.
Harici dokuların temel avantajı, doğrudan BufferQueue verilerinden oluşturulabilmeleridir. SurfaceTexture örnekleri, arabellekteki verilerin GLES tarafından tanınabilir olduğunu doğrulamak için harici dokulara yönelik BufferQueue örnekleri oluştururken tüketici kullanım işaretlerini GRALLOC_USAGE_HW_TEXTURE olarak ayarlar.
SurfaceTexture örnekleri bir EGL bağlamıyla etkileşime girdiğinden, bir uygulama yalnızca dokunun sahibi 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, zaman damgası alan getTimeStamp()
yöntemini ve dönüştürme matrisi alan getTransformMatrix()
yöntemini içerir. Calling
updateTexImage() hem zaman damgasını hem de dönüşüm matrisini ayarlar. BufferQueue tarafından iletilen her arabellek, dönüştürme parametreleri ve bir zaman damgası içerir.
Dönüşüm parametreleri verimlilik açısından faydalıdır. Bazı durumlarda kaynak veriler, tüketici için yanlış yönde olabilir. Verileri tüketiciye göndermeden önce döndürmek yerine, verileri düzeltici bir dönüştürme işlemiyle birlikte yönlendirmesiyle gönderin. Dönüşüm matrisi, veriler kullanılırken diğer dönüşümlerle birleştirilebilir ve ek yük 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 kameradan alınan kareler video oluşturmak için kullanılabilir. Her karenin, uygulama kareyi aldığında değil, kare yakalandığında geçerli olan bir sunum zaman damgası içermesi gerekir. Kamera kodu, arabellekle birlikte sağlanan zaman damgasını ayarlar. Bu da daha tutarlı bir zaman damgası serisiyle sonuçlanır.
Örnek olay: Grafika'nın sürekli çekim özelliği
Grafika'nın sürekli yakalama özelliği, bir cihazın kamerasından alınan karelerin kaydedilip ekranda gösterilmesini sağlar. Kare kaydetmek için
MediaCodec sınıfının createInputSurface() yöntemiyle bir yüzey oluşturun
ve yüzeyi kameraya iletin. Kareleri görüntülemek için SurfaceView örneği oluşturun ve yüzeyi setPreviewDisplay()'ye iletin.
Karelerin kaydedilip aynı anda gösterilmesinin daha karmaşık bir süreç olduğunu unutmayın.
Kesintisiz çekim etkinliği, kayıt sırasında kameradan alınan videoyu gösterir. Bu durumda, kodlanmış video, bellekteki dairesel bir arabelleğe yazılır ve bu arabellek, istenildiği zaman diske kaydedilebilir.
Bu akışta üç arabellek sırası bulunur:
App— Uygulama, kameradan gelen kareleri almak ve bunları harici bir GLES dokusuna dönüştürmek içinSurfaceTextureörneğini kullanır.SurfaceFlinger: Uygulama, kareleri göstermek içinSurfaceViewörneği bildirir.MediaServer— Videoyu oluşturmak için giriş yüzeyine sahip birMediaCodeckodlayıcı yapılandırın.
Aşağıdaki şekilde oklar, kameradan veri yayılımını gösterir. Üreticileri (turkuaz) tüketicilerden (yeşil) ayıran görsel göstergelerle birlikte BufferQueue örnek gösterilir.
Şekil 1. Grafika'nın sürekli çekim etkinliği
Kodlanmış H.264 video, uygulama sürecinde RAM'deki dairesel arabelleğe gider.
Kullanıcı yakalama düğmesine bastığında MediaMuxer sınıfı, kodlanmış videoyu diskteki bir MP4 dosyasına yazar.
GLES işlemleri kullanıcı arayüzü iş parçacığında gerçekleştirilirken uygulamadaki tüm BufferQueue örnekleri tek bir EGL bağlamıyla işlenir. Kodlanmış verilerin işlenmesi (dairesel arabellek yönetimi ve diske yazma) ayrı bir iş parçacığında yapılır.
SurfaceView sınıfı kullanılırken surfaceCreated() geri çağırma işlevi, ekran ve video kodlayıcı için EGLContext ve EGLSurface örneklerini oluşturur. Yeni bir kare geldiğinde SurfaceTexture dört işlem yapar:
- Çerçeveyi edinir.
- Çerçevenin GLES dokusu olarak kullanılmasını sağlar.
- GLES komutlarıyla kare oluşturur.
EGLSurfaceöğesinin her örneği için dönüşümü ve zaman damgasını yönlendirir.
Kodlayıcı iş parçacığı, kodlanmış çıkışı MediaCodec
konumundan çekip belleğe yerleştirir.
Güvenli doku video oynatma
Android, korumalı video içeriklerinin GPU ile sonradan işlenmesini destekler. Bu sayede uygulamalar, karmaşık ve doğrusal olmayan video efektleri (ör. çarpıtmalar), korumalı video içeriklerini genel grafik sahnelerinde kullanılmak üzere dokulara eşleme (ör. GLES kullanma) ve sanal gerçeklik (VR) için GPU'yu kullanabilir.
Şekil 2. Güvenli doku video oynatma
Destek, aşağıdaki iki uzantı kullanılarak etkinleştirilir:
- EGL uzantısı —
(
EGL_EXT_protected_content) Hem korumalı içerikte çalışabilen hem de korumalı GL bağlamlarının ve yüzeylerinin oluşturulmasını sağlar. - GLES uzantısı —
(
GL_EXT_protected_textures) Doku eklerinin, korunmuş olarak etiketlenmesini sağlar. Böylece, doku ekleri çerçeve arabelleği dokusu ekleri olarak kullanılabilir.
Android, pencerenin yüzeyi SurfaceFlinger için sıraya alınmasa bile SurfaceTexture ve ACodec
(libstagefright.so) öğelerinin korumalı içerik göndermesini sağlar ve korumalı bir bağlamda kullanılmak üzere korumalı bir video yüzeyi sunar. Bu işlem, korumalı bir bağlamda (ACodec tarafından doğrulanır) oluşturulan yüzeylerde korumalı tüketici bitini (GRALLOC_USAGE_PROTECTED) ayarlayarak yapılır.
Güvenli doku video oynatma, OpenGL ES ortamında güçlü bir Dijital Hak Yönetimi (DRM) uygulaması için temel oluşturur. Widevine Level 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 durum, DRM ile korunan içerikleri VR'da izlemek gibi önemli VR kullanım alanlarını engeller.
Android Açık Kaynak Projesi (AOSP), güvenli doku video 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 uzantılarını 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 /frameworks/av/media/libstagefright/SurfaceUtils.cpp içindeki değişikliklerin, GRALLOC_USAGE_PROTECTED ile işaretlenmiş arabelleklerin ANativeWindow'e gönderilmesine (ANativeWindow doğrudan pencere oluşturucuya sıraya almasa bile) izin verdiğini unutmayın. Uzantıları uygulama hakkında ayrıntılı dokümanlar için Khronos kayıtlarına (
EGL_EXT_protected_content) ve (
GL_EXT_protected_textures) bakın.