YüzeyDokusu

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 bir SurfaceTexture örneği kullanır ve bunları harici bir GLES dokusuna dönüştürür.
  • SurfaceFlinger: Uygulama, kareleri görüntülemek için bir SurfaceView örneği beyan eder.
  • MediaServer: Videoyu oluşturmak için bir giriş yüzeyi içeren bir MediaCodec 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).

Grafika sürekli yakalama etkinliği

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

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) 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.