applemedia/videocache: make a GObject subclass
authorMatthew Waters <matthew@centricular.com>
Mon, 26 Aug 2019 06:51:03 +0000 (16:51 +1000)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Mon, 9 Dec 2019 01:49:30 +0000 (01:49 +0000)
sys/applemedia/avfvideosrc.m
sys/applemedia/videotexturecache.h
sys/applemedia/videotexturecache.m
sys/applemedia/vtdec.c

index 749fb6a233cbce812ca9965c6106564189c97c44..bc7bf19e4d95bed6b288d619f667689e6e29a436 100644 (file)
@@ -899,7 +899,7 @@ static AVCaptureVideoOrientation GstAVFVideoSourceOrientation2AVCaptureVideoOrie
   bufQueue = nil;
 
   if (textureCache)
-    gst_video_texture_cache_free (textureCache);
+    g_object_unref (textureCache);
   textureCache = NULL;
 
   if (ctxh)
@@ -1092,7 +1092,7 @@ didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
     GST_INFO_OBJECT (element, "pushing textures, context %p old context %p",
         ctxh->context, textureCache ? textureCache->ctx : NULL);
     if (textureCache && textureCache->ctx != ctxh->context) {
-      gst_video_texture_cache_free (textureCache);
+      g_object_unref (textureCache);
       textureCache = NULL;
     }
     if (!textureCache)
index fb9f59826787189245eb18ba67dfd77aa08a1e3e..fcfcf2a43982b4dfbfcf47e5404e26d2e97a0707 100644 (file)
 
 G_BEGIN_DECLS
 
+#define GST_TYPE_VIDEO_TEXTURE_CACHE         (gst_video_texture_cache_get_type())
+#define GST_VIDEO_TEXTURE_CACHE(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_TYPE_VIDEO_TEXTURE_CACHE, GstVideoTextureCache))
+#define GST_VIDEO_TEXTURE_CACHE_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), GST_TYPE_VIDEO_TEXTURE_CACHE, GstVideoTextureCacheClass))
+#define GST_IS_VIDEO_TEXTURE_CACHE(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_TYPE_VIDEO_TEXTURE_CACHE))
+#define GST_IS_VIDEO_TEXTURE_CACHE_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_TYPE_VIDEO_TEXTURE_CACHE))
+#define GST_VIDEO_TEXTURE_CACHE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_TYPE_VIDEO_TEXTURE_CACHE, GstVideoTextureCacheClass))
+GType gst_video_texture_cache_get_type     (void);
+
 typedef struct _GstVideoTextureCache
 {
+  GObject parent;
+
   GstGLContext *ctx;
 #if HAVE_IOS
   CVOpenGLESTextureCacheRef cache;
@@ -42,12 +52,19 @@ typedef struct _GstVideoTextureCache
   GstCaps *out_caps;
 } GstVideoTextureCache;
 
-GstVideoTextureCache *gst_video_texture_cache_new (GstGLContext * ctx);
-void gst_video_texture_cache_free (GstVideoTextureCache * cache);
-void gst_video_texture_cache_set_format (GstVideoTextureCache * cache,
-    GstVideoFormat in_format, GstCaps * out_caps);
-GstMemory *gst_video_texture_cache_create_memory (GstVideoTextureCache * cache,
-    GstAppleCoreVideoPixelBuffer *gpixbuf, guint plane, gsize size);
+typedef struct _GstVideoTextureCacheClass
+{
+  GObjectClass parent_class;
+} GstVideoTextureCacheClass;
+
+GstVideoTextureCache *  gst_video_texture_cache_new             (GstGLContext * ctx);
+void                    gst_video_texture_cache_set_format      (GstVideoTextureCache * cache,
+                                                                 GstVideoFormat in_format,
+                                                                 GstCaps * out_caps);
+GstMemory *             gst_video_texture_cache_create_memory   (GstVideoTextureCache * cache,
+                                                                 GstAppleCoreVideoPixelBuffer *gpixbuf,
+                                                                 guint plane,
+                                                                 gsize size);
 
 G_END_DECLS
 
index e356d59fc3b815cf6e0a929692b262a1234aabc7..21e0bb1bd8712186451dc8d988f92b237a5dad9d 100644 (file)
@@ -31,6 +31,8 @@
 #include "corevideobuffer.h"
 #include "vtutil.h"
 
+G_DEFINE_TYPE (GstVideoTextureCache, gst_video_texture_cache, G_TYPE_OBJECT);
+
 typedef struct _ContextThreadData
 {
   GstVideoTextureCache *cache;
@@ -43,45 +45,33 @@ typedef struct _ContextThreadData
 typedef struct _TextureWrapper
 {
 #if HAVE_IOS
-    CVOpenGLESTextureCacheRef cache;
-    CVOpenGLESTextureRef texture;
+  CVOpenGLESTextureCacheRef cache;
+  CVOpenGLESTextureRef texture;
 #else
-    CVOpenGLTextureCacheRef cache;
-    CVOpenGLTextureRef texture;
+  CVOpenGLTextureCacheRef cache;
+  CVOpenGLTextureRef texture;
 #endif
-
 } TextureWrapper;
 
+enum
+{
+  PROP_0,
+  PROP_CONTEXT,
+};
+
 GstVideoTextureCache *
 gst_video_texture_cache_new (GstGLContext * ctx)
 {
-  g_return_val_if_fail (ctx != NULL, NULL);
-
-  GstVideoTextureCache *cache = g_new0 (GstVideoTextureCache, 1);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (ctx), NULL);
 
-  cache->ctx = gst_object_ref (ctx);
-  gst_video_info_init (&cache->input_info);
-
-#if HAVE_IOS
-  CFMutableDictionaryRef cache_attrs =
-      CFDictionaryCreateMutable (NULL, 0, &kCFTypeDictionaryKeyCallBacks,
-      &kCFTypeDictionaryValueCallBacks);
-  CVOpenGLESTextureCacheCreate (kCFAllocatorDefault, (CFDictionaryRef) cache_attrs,
-      (__bridge CVEAGLContext) (gpointer)gst_gl_context_get_gl_context (ctx), NULL, &cache->cache);
-#else
-  gst_ios_surface_memory_init ();
-#if 0
-  cache->pool = GST_BUFFER_POOL (gst_gl_buffer_pool_new (ctx));
-#endif
-#endif
-
-  return cache;
+  return g_object_new (GST_TYPE_VIDEO_TEXTURE_CACHE,
+      "context", ctx, NULL);
 }
 
-void
-gst_video_texture_cache_free (GstVideoTextureCache * cache)
+static void
+gst_video_texture_cache_finalize (GObject * object)
 {
-  g_return_if_fail (cache != NULL);
+  GstVideoTextureCache *cache = GST_VIDEO_TEXTURE_CACHE (object);
 
 #if HAVE_IOS
   CFRelease (cache->cache); /* iOS has no "CVOpenGLESTextureCacheRelease" */
@@ -97,6 +87,83 @@ gst_video_texture_cache_free (GstVideoTextureCache * cache)
   if (cache->out_caps)
     gst_caps_unref (cache->out_caps);
   g_free (cache);
+
+  G_OBJECT_CLASS (gst_video_texture_cache_parent_class)->finalize (object);
+}
+
+static void
+gst_video_texture_cache_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec)
+{
+  GstVideoTextureCache *cache = GST_VIDEO_TEXTURE_CACHE (object);
+
+  switch (prop_id) {
+    case PROP_CONTEXT:
+      cache->ctx = g_value_dup_object (value);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_video_texture_cache_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec)
+{
+  GstVideoTextureCache *cache = GST_VIDEO_TEXTURE_CACHE (object);
+
+  switch (prop_id) {
+    case PROP_CONTEXT:
+      g_value_set_object (value, cache->ctx);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_video_texture_cache_constructed (GObject * object)
+{
+  GstVideoTextureCache * cache = GST_VIDEO_TEXTURE_CACHE (object);
+
+  g_return_if_fail (GST_IS_GL_CONTEXT (cache->ctx));
+
+#if HAVE_IOS
+  CFMutableDictionaryRef cache_attrs =
+      CFDictionaryCreateMutable (NULL, 0, &kCFTypeDictionaryKeyCallBacks,
+      &kCFTypeDictionaryValueCallBacks);
+  CVOpenGLESTextureCacheCreate (kCFAllocatorDefault, (CFDictionaryRef) cache_attrs,
+      (__bridge CVEAGLContext) (gpointer)gst_gl_context_get_gl_context (cache->ctx), NULL, &cache->cache);
+#else
+  gst_ios_surface_memory_init ();
+#if 0
+  cache->pool = GST_BUFFER_POOL (gst_gl_buffer_pool_new (ctx));
+#endif
+#endif
+}
+
+static void
+gst_video_texture_cache_init (GstVideoTextureCache * cache)
+{
+  gst_video_info_init (&cache->input_info);
+}
+
+static void
+gst_video_texture_cache_class_init (GstVideoTextureCacheClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->set_property = gst_video_texture_cache_set_property;
+  gobject_class->get_property = gst_video_texture_cache_get_property;
+  gobject_class->constructed = gst_video_texture_cache_constructed;
+  gobject_class->finalize = gst_video_texture_cache_finalize;
+
+  g_object_class_install_property (gobject_class, PROP_CONTEXT,
+      g_param_spec_object ("context", "Context",
+          "Associated OpenGL context", GST_TYPE_GL_CONTEXT,
+          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
 }
 
 void
@@ -139,10 +206,12 @@ gst_video_texture_cache_set_format (GstVideoTextureCache * cache,
 }
 
 #if HAVE_IOS
-void gst_video_texture_cache_release_texture(TextureWrapper *data) {
-    CFRelease(data->texture);
-    CFRelease(data->cache);
-    g_free(data);
+static void
+gst_video_texture_cache_release_texture (TextureWrapper *data)
+{
+  CFRelease(data->texture);
+  CFRelease(data->cache);
+  g_free(data);
 }
 
 static void
index 705a70d4b38c493ccbbf35bcd70125dee24466e8..fadfb451ba1a4dd32adc93d45731e678b43453fc 100644 (file)
@@ -198,7 +198,7 @@ gst_vtdec_stop (GstVideoDecoder * decoder)
     gst_vtdec_invalidate_session (vtdec);
 
   if (vtdec->texture_cache)
-    gst_video_texture_cache_free (vtdec->texture_cache);
+    g_object_unref (vtdec->texture_cache);
   vtdec->texture_cache = NULL;
 
   if (vtdec->ctxh)
@@ -323,7 +323,7 @@ gst_vtdec_negotiate (GstVideoDecoder * decoder)
   }
 
   if (vtdec->texture_cache != NULL && !output_textures) {
-    gst_video_texture_cache_free (vtdec->texture_cache);
+    g_object_unref (vtdec->texture_cache);
     vtdec->texture_cache = NULL;
   }
 
@@ -341,7 +341,7 @@ gst_vtdec_negotiate (GstVideoDecoder * decoder)
 
     if (vtdec->texture_cache
         && vtdec->texture_cache->ctx != vtdec->ctxh->context) {
-      gst_video_texture_cache_free (vtdec->texture_cache);
+      g_object_unref (vtdec->texture_cache);
       vtdec->texture_cache = NULL;
     }
     if (!vtdec->texture_cache)