Yüzey dokusu

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 bir SurfaceTexture örneği kullanır.
  • SurfaceFlinger — Uygulama, çerçeveleri görüntülemek için bir SurfaceView örneği bildirir.
  • MediaServer — Videoyu oluşturmak için bir giriş yüzeyiyle bir MediaCodec 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).

Grafika sürekli yakalama etkinliği

Şekil 1. Grafika'nın sürekli yakalama etkinliği

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:
  1. Çerçeveyi alır.
  2. Çerçeveyi GLES dokusu olarak kullanılabilir hale getirir.
  3. Çerçeveyi GLES komutlarıyla işler.
  4. 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.

Güvenli Doku Video Oynatma

Şekil 2. Güvenli doku video oynatma

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.