diff options
author | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2013-03-26 10:31:10 +0100 |
---|---|---|
committer | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2013-03-26 10:33:27 +0100 |
commit | 140fa66be339f9574dd8ae6193e4d9b89099cb9a (patch) | |
tree | 47a6fa51f61dba187152e3e329dda180a1cdd73f | |
parent | 63fedf67676275b8842e88f08a4590fa29b76fcf (diff) |
plugins: integrate GstVaapiVideoMeta from libgstvaapi.
Move GstVaapiVideoMeta from core libgstvaapi decoding library to the
actual plugin elements. That's only useful there. Also inline reference
counting code from GstVaapiMiniObject.
-rw-r--r-- | docs/reference/libs/libs-sections.txt | 28 | ||||
-rw-r--r-- | gst-libs/gst/vaapi/Makefile.am | 2 | ||||
-rw-r--r-- | gst/vaapi/Makefile.am | 2 | ||||
-rw-r--r-- | gst/vaapi/gstvaapidecode.c | 1 | ||||
-rw-r--r-- | gst/vaapi/gstvaapidownload.c | 1 | ||||
-rw-r--r-- | gst/vaapi/gstvaapipostproc.c | 1 | ||||
-rw-r--r-- | gst/vaapi/gstvaapisink.c | 2 | ||||
-rw-r--r-- | gst/vaapi/gstvaapiupload.c | 1 | ||||
-rw-r--r-- | gst/vaapi/gstvaapiuploader.c | 1 | ||||
-rw-r--r-- | gst/vaapi/gstvaapivideobuffer.h | 2 | ||||
-rw-r--r-- | gst/vaapi/gstvaapivideoconverter_glx.c | 2 | ||||
-rw-r--r-- | gst/vaapi/gstvaapivideometa.c (renamed from gst-libs/gst/vaapi/gstvaapivideometa.c) | 81 | ||||
-rw-r--r-- | gst/vaapi/gstvaapivideometa.h (renamed from gst-libs/gst/vaapi/gstvaapivideometa.h) | 29 |
13 files changed, 80 insertions, 73 deletions
diff --git a/docs/reference/libs/libs-sections.txt b/docs/reference/libs/libs-sections.txt index 71e1ab9f..14023236 100644 --- a/docs/reference/libs/libs-sections.txt +++ b/docs/reference/libs/libs-sections.txt @@ -172,34 +172,6 @@ GST_VAAPI_IMAGE_POOL_GET_CLASS </SECTION> <SECTION> -<FILE>gstvaapivideometa</FILE> -<TITLE>GstVaapiVideoMeta</TITLE> -gst_vaapi_video_meta_new -gst_vaapi_video_meta_new_from_pool -gst_vaapi_video_meta_new_with_image -gst_vaapi_video_meta_new_with_surface -gst_vaapi_video_meta_new_with_surface_proxy -gst_vaapi_video_meta_ref -gst_vaapi_video_meta_unref -gst_vaapi_video_meta_replace -gst_vaapi_video_meta_get_display -gst_vaapi_video_meta_get_image -gst_vaapi_video_meta_set_image -gst_vaapi_video_meta_set_image_from_pool -gst_vaapi_video_meta_get_surface -gst_vaapi_video_meta_set_surface -gst_vaapi_video_meta_set_surface_from_pool -gst_vaapi_video_meta_set_surface_converter -gst_vaapi_video_meta_get_surface_converter -gst_vaapi_video_meta_get_surface_proxy -gst_vaapi_video_meta_set_surface_proxy -gst_vaapi_video_meta_get_render_flags -gst_vaapi_video_meta_set_render_flags -<SUBSECTION Standard> -gst_vaapi_video_meta_get_type -</SECTION> - -<SECTION> <FILE>gstvaapitypes</FILE> <TITLE>Basic data structures</TITLE> GstVaapiID diff --git a/gst-libs/gst/vaapi/Makefile.am b/gst-libs/gst/vaapi/Makefile.am index 90ec07b8..16a27a60 100644 --- a/gst-libs/gst/vaapi/Makefile.am +++ b/gst-libs/gst/vaapi/Makefile.am @@ -68,7 +68,6 @@ libgstvaapi_source_c = \ gstvaapisurfaceproxy.c \ gstvaapiutils.c \ gstvaapivalue.c \ - gstvaapivideometa.c \ gstvaapivideopool.c \ gstvaapiwindow.c \ $(NULL) @@ -94,7 +93,6 @@ libgstvaapi_source_h = \ gstvaapisurfaceproxy.h \ gstvaapitypes.h \ gstvaapivalue.h \ - gstvaapivideometa.h \ gstvaapivideopool.h \ gstvaapiwindow.h \ $(NULL) diff --git a/gst/vaapi/Makefile.am b/gst/vaapi/Makefile.am index b2e442c4..c5955cb4 100644 --- a/gst/vaapi/Makefile.am +++ b/gst/vaapi/Makefile.am @@ -39,6 +39,7 @@ libgstvaapi_source_c = \ gstvaapiupload.c \ gstvaapiuploader.c \ gstvaapivideobuffer.c \ + gstvaapivideometa.c \ $(NULL) libgstvaapi_source_h = \ @@ -50,6 +51,7 @@ libgstvaapi_source_h = \ gstvaapiupload.h \ gstvaapiuploader.h \ gstvaapivideobuffer.h \ + gstvaapivideometa.h \ $(NULL) if USE_GLX diff --git a/gst/vaapi/gstvaapidecode.c b/gst/vaapi/gstvaapidecode.c index 8d19182a..18377fe8 100644 --- a/gst/vaapi/gstvaapidecode.c +++ b/gst/vaapi/gstvaapidecode.c @@ -30,7 +30,6 @@ #include "gst/vaapi/sysdeps.h" #include <gst/vaapi/gstvaapidisplay.h> -#include <gst/vaapi/gstvaapivideometa.h> #include <gst/video/videocontext.h> #include "gstvaapidecode.h" diff --git a/gst/vaapi/gstvaapidownload.c b/gst/vaapi/gstvaapidownload.c index 9bb032f8..f90cfa2a 100644 --- a/gst/vaapi/gstvaapidownload.c +++ b/gst/vaapi/gstvaapidownload.c @@ -31,7 +31,6 @@ #include <gst/gst.h> #include <gst/video/video.h> #include <gst/video/videocontext.h> -#include <gst/vaapi/gstvaapivideometa.h> #include "gstvaapidownload.h" #include "gstvaapipluginutil.h" diff --git a/gst/vaapi/gstvaapipostproc.c b/gst/vaapi/gstvaapipostproc.c index e2f0e5ca..bb0d76c1 100644 --- a/gst/vaapi/gstvaapipostproc.c +++ b/gst/vaapi/gstvaapipostproc.c @@ -31,7 +31,6 @@ #include "gst/vaapi/sysdeps.h" #include <gst/video/video.h> #include <gst/video/videocontext.h> -#include <gst/vaapi/gstvaapivideometa.h> #include "gstvaapipostproc.h" #include "gstvaapipluginutil.h" diff --git a/gst/vaapi/gstvaapisink.c b/gst/vaapi/gstvaapisink.c index ff062ba0..0669d229 100644 --- a/gst/vaapi/gstvaapisink.c +++ b/gst/vaapi/gstvaapisink.c @@ -34,7 +34,6 @@ #include <gst/video/video.h> #include <gst/video/videocontext.h> #include <gst/vaapi/gstvaapivalue.h> -#include <gst/vaapi/gstvaapivideometa.h> #if USE_DRM # include <gst/vaapi/gstvaapidisplay_drm.h> #endif @@ -56,6 +55,7 @@ #include "gstvaapisink.h" #include "gstvaapipluginutil.h" +#include "gstvaapivideometa.h" #define GST_PLUGIN_NAME "vaapisink" #define GST_PLUGIN_DESC "A VA-API based videosink" diff --git a/gst/vaapi/gstvaapiupload.c b/gst/vaapi/gstvaapiupload.c index 9ac8d7a5..ecb0743e 100644 --- a/gst/vaapi/gstvaapiupload.c +++ b/gst/vaapi/gstvaapiupload.c @@ -32,7 +32,6 @@ #include <gst/gst.h> #include <gst/video/video.h> #include <gst/video/videocontext.h> -#include <gst/vaapi/gstvaapivideometa.h> #include "gstvaapiupload.h" #include "gstvaapipluginutil.h" diff --git a/gst/vaapi/gstvaapiuploader.c b/gst/vaapi/gstvaapiuploader.c index 1c898d37..a0d5ef13 100644 --- a/gst/vaapi/gstvaapiuploader.c +++ b/gst/vaapi/gstvaapiuploader.c @@ -26,7 +26,6 @@ #include <gst/vaapi/gstvaapisurface.h> #include <gst/vaapi/gstvaapiimagepool.h> #include <gst/vaapi/gstvaapisurfacepool.h> -#include <gst/vaapi/gstvaapivideometa.h> #include "gstvaapiuploader.h" #include "gstvaapivideobuffer.h" diff --git a/gst/vaapi/gstvaapivideobuffer.h b/gst/vaapi/gstvaapivideobuffer.h index e658172f..36bbd28a 100644 --- a/gst/vaapi/gstvaapivideobuffer.h +++ b/gst/vaapi/gstvaapivideobuffer.h @@ -23,7 +23,7 @@ #ifndef GST_VAAPI_VIDEO_BUFFER_H #define GST_VAAPI_VIDEO_BUFFER_H -#include <gst/vaapi/gstvaapivideometa.h> +#include "gstvaapivideometa.h" G_BEGIN_DECLS diff --git a/gst/vaapi/gstvaapivideoconverter_glx.c b/gst/vaapi/gstvaapivideoconverter_glx.c index 7cbd6547..323013f3 100644 --- a/gst/vaapi/gstvaapivideoconverter_glx.c +++ b/gst/vaapi/gstvaapivideoconverter_glx.c @@ -22,10 +22,10 @@ */ #include "gst/vaapi/sysdeps.h" -#include <gst/vaapi/gstvaapivideometa.h> #include <gst/vaapi/gstvaapitexture.h> #include "gstvaapivideoconverter_glx.h" #include "gstvaapipluginutil.h" +#include "gstvaapivideometa.h" typedef gboolean (*GstSurfaceUploadFunction)(GstSurfaceConverter *, GstSurfaceBuffer *); diff --git a/gst-libs/gst/vaapi/gstvaapivideometa.c b/gst/vaapi/gstvaapivideometa.c index 95f01684..2b437009 100644 --- a/gst-libs/gst/vaapi/gstvaapivideometa.c +++ b/gst/vaapi/gstvaapivideometa.c @@ -25,15 +25,13 @@ * @short_description: VA video meta for GStreamer */ -#include "sysdeps.h" +#include "gst/vaapi/sysdeps.h" +#include <gst/vaapi/gstvaapiimagepool.h> +#include <gst/vaapi/gstvaapisurfacepool.h> #include "gstvaapivideometa.h" -#include "gstvaapiminiobject.h" -#include "gstvaapiimagepool.h" -#include "gstvaapisurfacepool.h" -#include "gstvaapiobject_priv.h" -#define DEBUG 1 -#include "gstvaapidebug.h" +#define GST_VAAPI_TYPE_VIDEO_META \ + (gst_vaapi_video_meta_get_type()) #define GST_VAAPI_VIDEO_META(obj) \ ((GstVaapiVideoMeta *)(obj)) @@ -42,6 +40,7 @@ (GST_VAAPI_VIDEO_META(obj) != NULL) struct _GstVaapiVideoMeta { + gint ref_count; GstVaapiDisplay *display; GstVaapiVideoPool *image_pool; GstVaapiImage *image; @@ -65,14 +64,14 @@ static inline void set_image(GstVaapiVideoMeta *meta, GstVaapiImage *image) { meta->image = g_object_ref(image); - set_display(meta, GST_VAAPI_OBJECT_DISPLAY(image)); + set_display(meta, gst_vaapi_object_get_display(GST_VAAPI_OBJECT(image))); } static inline void set_surface(GstVaapiVideoMeta *meta, GstVaapiSurface *surface) { meta->surface = g_object_ref(surface); - set_display(meta, GST_VAAPI_OBJECT_DISPLAY(surface)); + set_display(meta, gst_vaapi_object_get_display(GST_VAAPI_OBJECT(surface))); } static void @@ -101,7 +100,7 @@ gst_vaapi_video_meta_destroy_surface(GstVaapiVideoMeta *meta) g_clear_object(&meta->surface_pool); } -GType +static GType gst_vaapi_video_meta_get_type(void) { static gsize g_type; @@ -127,6 +126,7 @@ gst_vaapi_video_meta_finalize(GstVaapiVideoMeta *meta) static void gst_vaapi_video_meta_init(GstVaapiVideoMeta *meta) { + meta->ref_count = 1; meta->display = NULL; meta->image_pool = NULL; meta->image = NULL; @@ -137,28 +137,29 @@ gst_vaapi_video_meta_init(GstVaapiVideoMeta *meta) meta->render_flags = 0; } -static inline const GstVaapiMiniObjectClass * -gst_vaapi_video_meta_class(void) -{ - static const GstVaapiMiniObjectClass GstVaapiVideoMetaClass = { - sizeof(GstVaapiVideoMeta), - (GDestroyNotify)gst_vaapi_video_meta_finalize - }; - return &GstVaapiVideoMetaClass; -} - static inline GstVaapiVideoMeta * _gst_vaapi_video_meta_new(void) { GstVaapiVideoMeta *meta; - meta = (GstVaapiVideoMeta *) - gst_vaapi_mini_object_new(gst_vaapi_video_meta_class()); - if (meta) - gst_vaapi_video_meta_init(meta); + meta = g_slice_alloc(sizeof(*meta)); + if (!meta) + return NULL; + gst_vaapi_video_meta_init(meta); return meta; } +static inline void +_gst_vaapi_video_meta_free(GstVaapiVideoMeta *meta) +{ + g_atomic_int_inc(&meta->ref_count); + + gst_vaapi_video_meta_finalize(meta); + + if (G_LIKELY(g_atomic_int_dec_and_test(&meta->ref_count))) + g_slice_free1(sizeof(*meta), meta); +} + /** * gst_vaapi_video_meta_new: * @display: a #GstVaapiDisplay @@ -317,8 +318,10 @@ gst_vaapi_video_meta_new_with_surface_proxy(GstVaapiSurfaceProxy *proxy) GstVaapiVideoMeta * gst_vaapi_video_meta_ref(GstVaapiVideoMeta *meta) { - return (GstVaapiVideoMeta *) - gst_vaapi_mini_object_ref(GST_VAAPI_MINI_OBJECT(meta)); + g_return_val_if_fail(meta != NULL, NULL); + + g_atomic_int_inc(&meta->ref_count); + return meta; } /** @@ -331,7 +334,11 @@ gst_vaapi_video_meta_ref(GstVaapiVideoMeta *meta) void gst_vaapi_video_meta_unref(GstVaapiVideoMeta *meta) { - gst_vaapi_mini_object_unref(GST_VAAPI_MINI_OBJECT(meta)); + g_return_if_fail(meta != NULL); + g_return_if_fail(meta->ref_count > 0); + + if (g_atomic_int_dec_and_test(&meta->ref_count)) + _gst_vaapi_video_meta_free(meta); } /** @@ -347,8 +354,24 @@ void gst_vaapi_video_meta_replace(GstVaapiVideoMeta **old_meta_ptr, GstVaapiVideoMeta *new_meta) { - gst_vaapi_mini_object_replace((GstVaapiMiniObject **)(old_meta_ptr), - (GstVaapiMiniObject *)(new_meta)); + GstVaapiVideoMeta *old_meta; + + g_return_if_fail(old_meta_ptr != NULL); + + old_meta = g_atomic_pointer_get((gpointer *)old_meta_ptr); + + if (old_meta == new_meta) + return; + + if (new_meta) + gst_vaapi_video_meta_ref(new_meta); + + while (!g_atomic_pointer_compare_and_exchange((gpointer *)old_meta_ptr, + old_meta, new_meta)) + old_meta = g_atomic_pointer_get((gpointer *)old_meta_ptr); + + if (old_meta) + gst_vaapi_video_meta_unref(old_meta); } /** diff --git a/gst-libs/gst/vaapi/gstvaapivideometa.h b/gst/vaapi/gstvaapivideometa.h index 42bda676..47d07e34 100644 --- a/gst-libs/gst/vaapi/gstvaapivideometa.h +++ b/gst/vaapi/gstvaapivideometa.h @@ -31,85 +31,102 @@ G_BEGIN_DECLS -#define GST_VAAPI_TYPE_VIDEO_META \ - (gst_vaapi_video_meta_get_type()) - typedef struct _GstVaapiVideoMeta GstVaapiVideoMeta; -GType -gst_vaapi_video_meta_get_type(void) G_GNUC_CONST; - +G_GNUC_INTERNAL GstVaapiVideoMeta * gst_vaapi_video_meta_new(GstVaapiDisplay *display); +G_GNUC_INTERNAL GstVaapiVideoMeta * gst_vaapi_video_meta_new_from_pool(GstVaapiVideoPool *pool); +G_GNUC_INTERNAL GstVaapiVideoMeta * gst_vaapi_video_meta_new_with_image(GstVaapiImage *image); +G_GNUC_INTERNAL GstVaapiVideoMeta * gst_vaapi_video_meta_new_with_surface(GstVaapiSurface *surface); +G_GNUC_INTERNAL GstVaapiVideoMeta * gst_vaapi_video_meta_new_with_surface_proxy(GstVaapiSurfaceProxy *proxy); +G_GNUC_INTERNAL GstVaapiVideoMeta * gst_vaapi_video_meta_ref(GstVaapiVideoMeta *meta); +G_GNUC_INTERNAL void gst_vaapi_video_meta_unref(GstVaapiVideoMeta *meta); +G_GNUC_INTERNAL void gst_vaapi_video_meta_replace(GstVaapiVideoMeta **old_meta_ptr, GstVaapiVideoMeta *new_meta); +G_GNUC_INTERNAL GstVaapiDisplay * gst_vaapi_video_meta_get_display(GstVaapiVideoMeta *meta); +G_GNUC_INTERNAL GstVaapiImage * gst_vaapi_video_meta_get_image(GstVaapiVideoMeta *meta); +G_GNUC_INTERNAL void gst_vaapi_video_meta_set_image(GstVaapiVideoMeta *meta, GstVaapiImage *image); +G_GNUC_INTERNAL gboolean gst_vaapi_video_meta_set_image_from_pool(GstVaapiVideoMeta *meta, GstVaapiVideoPool *pool); +G_GNUC_INTERNAL GstVaapiSurface * gst_vaapi_video_meta_get_surface(GstVaapiVideoMeta *meta); +G_GNUC_INTERNAL void gst_vaapi_video_meta_set_surface(GstVaapiVideoMeta *meta, GstVaapiSurface *surface); +G_GNUC_INTERNAL gboolean gst_vaapi_video_meta_set_surface_from_pool(GstVaapiVideoMeta *meta, GstVaapiVideoPool *pool); +G_GNUC_INTERNAL GstVaapiSurfaceProxy * gst_vaapi_video_meta_get_surface_proxy(GstVaapiVideoMeta *meta); +G_GNUC_INTERNAL void gst_vaapi_video_meta_set_surface_proxy(GstVaapiVideoMeta *meta, GstVaapiSurfaceProxy *proxy); +G_GNUC_INTERNAL GFunc gst_vaapi_video_meta_get_surface_converter(GstVaapiVideoMeta *meta); +G_GNUC_INTERNAL void gst_vaapi_video_meta_set_surface_converter(GstVaapiVideoMeta *meta, GFunc func); +G_GNUC_INTERNAL guint gst_vaapi_video_meta_get_render_flags(GstVaapiVideoMeta *meta); +G_GNUC_INTERNAL void gst_vaapi_video_meta_set_render_flags(GstVaapiVideoMeta *meta, guint flags); +G_GNUC_INTERNAL GstVaapiVideoMeta * gst_buffer_get_vaapi_video_meta(GstBuffer *buffer); +G_GNUC_INTERNAL void gst_buffer_set_vaapi_video_meta(GstBuffer *buffer, GstVaapiVideoMeta *meta); |