summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gst-libs/gst/vaapi/gstvaapicodedbuffer.c6
-rw-r--r--gst-libs/gst/vaapi/gstvaapicodedbufferpool.c7
-rw-r--r--gst-libs/gst/vaapi/gstvaapicontext.c84
-rw-r--r--gst-libs/gst/vaapi/gstvaapicontext.h30
-rw-r--r--gst-libs/gst/vaapi/gstvaapidecoder.c3
-rw-r--r--gst-libs/gst/vaapi/gstvaapiencoder.c7
-rw-r--r--gst-libs/gst/vaapi/gstvaapiencoder_h264_fei.c2
-rw-r--r--gst-libs/gst/vaapi/gstvaapiprofilecaps.c2
8 files changed, 91 insertions, 50 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapicodedbuffer.c b/gst-libs/gst/vaapi/gstvaapicodedbuffer.c
index 3680d2d4..39e5ec8a 100644
--- a/gst-libs/gst/vaapi/gstvaapicodedbuffer.c
+++ b/gst-libs/gst/vaapi/gstvaapicodedbuffer.c
@@ -40,8 +40,8 @@ coded_buffer_create (GstVaapiCodedBuffer * buf, guint buf_size,
GST_VAAPI_DISPLAY_LOCK (display);
success = vaapi_create_buffer (GST_VAAPI_DISPLAY_VADISPLAY (display),
- GST_VAAPI_OBJECT_ID (context), VAEncCodedBufferType, buf_size, NULL,
- &buf_id, NULL);
+ GST_VAAPI_CONTEXT_ID (context), VAEncCodedBufferType, buf_size,
+ NULL, &buf_id, NULL);
GST_VAAPI_DISPLAY_UNLOCK (display);
if (!success)
return FALSE;
@@ -117,7 +117,7 @@ gst_vaapi_coded_buffer_new (GstVaapiContext * context, guint buf_size)
g_return_val_if_fail (context != NULL, NULL);
g_return_val_if_fail (buf_size > 0, NULL);
- display = GST_VAAPI_OBJECT_DISPLAY (context);
+ display = GST_VAAPI_CONTEXT_DISPLAY (context);
g_return_val_if_fail (display != NULL, NULL);
buf = gst_vaapi_object_new (gst_vaapi_coded_buffer_class (), display);
diff --git a/gst-libs/gst/vaapi/gstvaapicodedbufferpool.c b/gst-libs/gst/vaapi/gstvaapicodedbufferpool.c
index a46d5016..3262a946 100644
--- a/gst-libs/gst/vaapi/gstvaapicodedbufferpool.c
+++ b/gst-libs/gst/vaapi/gstvaapicodedbufferpool.c
@@ -47,7 +47,7 @@ static void
coded_buffer_pool_init (GstVaapiCodedBufferPool * pool,
GstVaapiContext * context, gsize buf_size)
{
- pool->context = gst_vaapi_object_ref (context);
+ pool->context = gst_vaapi_context_ref (context);
pool->buf_size = buf_size;
}
@@ -55,7 +55,8 @@ static void
coded_buffer_pool_finalize (GstVaapiCodedBufferPool * pool)
{
gst_vaapi_video_pool_finalize (GST_VAAPI_VIDEO_POOL (pool));
- gst_vaapi_object_replace (&pool->context, NULL);
+ gst_vaapi_context_unref (pool->context);
+ pool->context = NULL;
}
static gpointer
@@ -106,7 +107,7 @@ gst_vaapi_coded_buffer_pool_new (GstVaapiEncoder * encoder, gsize buf_size)
if (!pool)
return NULL;
- gst_vaapi_video_pool_init (pool, GST_VAAPI_OBJECT_DISPLAY (context),
+ gst_vaapi_video_pool_init (pool, GST_VAAPI_CONTEXT_DISPLAY (context),
GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_CODED_BUFFER);
coded_buffer_pool_init (GST_VAAPI_CODED_BUFFER_POOL (pool),
context, buf_size);
diff --git a/gst-libs/gst/vaapi/gstvaapicontext.c b/gst-libs/gst/vaapi/gstvaapicontext.c
index 2be0709b..358fddec 100644
--- a/gst-libs/gst/vaapi/gstvaapicontext.c
+++ b/gst-libs/gst/vaapi/gstvaapicontext.c
@@ -31,8 +31,7 @@
#include "gstvaapicompat.h"
#include "gstvaapicontext.h"
#include "gstvaapidisplay_priv.h"
-#include "gstvaapiobject_priv.h"
-#include "gstvaapisurface.h"
+#include "gstvaapisurface_priv.h"
#include "gstvaapisurfacepool.h"
#include "gstvaapisurfaceproxy.h"
#include "gstvaapivideopool_priv.h"
@@ -54,7 +53,7 @@ ensure_attributes (GstVaapiContext * context)
return TRUE;
context->attribs =
- gst_vaapi_config_surface_attributes_get (GST_VAAPI_OBJECT_DISPLAY
+ gst_vaapi_config_surface_attributes_get (GST_VAAPI_CONTEXT_DISPLAY
(context), context->va_config);
return (context->attribs != NULL);
}
@@ -63,7 +62,7 @@ static inline gboolean
context_get_attribute (GstVaapiContext * context, VAConfigAttribType type,
guint * out_value_ptr)
{
- return gst_vaapi_get_config_attribute (GST_VAAPI_OBJECT_DISPLAY (context),
+ return gst_vaapi_get_config_attribute (GST_VAAPI_CONTEXT_DISPLAY (context),
context->va_profile, context->va_entrypoint, type, out_value_ptr);
}
@@ -80,11 +79,11 @@ context_destroy_surfaces (GstVaapiContext * context)
static void
context_destroy (GstVaapiContext * context)
{
- GstVaapiDisplay *const display = GST_VAAPI_OBJECT_DISPLAY (context);
+ GstVaapiDisplay *const display = GST_VAAPI_CONTEXT_DISPLAY (context);
VAContextID context_id;
VAStatus status;
- context_id = GST_VAAPI_OBJECT_ID (context);
+ context_id = GST_VAAPI_CONTEXT_ID (context);
GST_DEBUG ("context 0x%08x", context_id);
if (context_id != VA_INVALID_ID) {
@@ -94,7 +93,7 @@ context_destroy (GstVaapiContext * context)
GST_VAAPI_DISPLAY_UNLOCK (display);
if (!vaapi_check_status (status, "vaDestroyContext()"))
GST_WARNING ("failed to destroy context 0x%08x", context_id);
- GST_VAAPI_OBJECT_ID (context) = VA_INVALID_ID;
+ GST_VAAPI_CONTEXT_ID (context) = VA_INVALID_ID;
}
if (context->va_config != VA_INVALID_ID) {
@@ -126,7 +125,7 @@ context_ensure_surfaces (GstVaapiContext * context)
for (i = context->surfaces->len; i < num_surfaces; i++) {
surface =
- gst_vaapi_surface_new_from_formats (GST_VAAPI_OBJECT_DISPLAY (context),
+ gst_vaapi_surface_new_from_formats (GST_VAAPI_CONTEXT_DISPLAY (context),
cip->chroma_type, cip->width, cip->height, context->attribs->formats);
if (!surface)
return FALSE;
@@ -142,7 +141,7 @@ static gboolean
context_create_surfaces (GstVaapiContext * context)
{
const GstVaapiContextInfo *const cip = &context->info;
- GstVaapiDisplay *const display = GST_VAAPI_OBJECT_DISPLAY (context);
+ GstVaapiDisplay *const display = GST_VAAPI_CONTEXT_DISPLAY (context);
guint num_surfaces;
num_surfaces = cip->ref_frames + SCRATCH_SURFACES_COUNT;
@@ -168,7 +167,7 @@ static gboolean
context_create (GstVaapiContext * context)
{
const GstVaapiContextInfo *const cip = &context->info;
- GstVaapiDisplay *const display = GST_VAAPI_OBJECT_DISPLAY (context);
+ GstVaapiDisplay *const display = GST_VAAPI_CONTEXT_DISPLAY (context);
VAContextID context_id;
VASurfaceID surface_id;
VAStatus status;
@@ -203,7 +202,7 @@ context_create (GstVaapiContext * context)
goto cleanup;
GST_DEBUG ("context 0x%08x", context_id);
- GST_VAAPI_OBJECT_ID (context) = context_id;
+ GST_VAAPI_CONTEXT_ID (context) = context_id;
success = TRUE;
cleanup:
@@ -216,7 +215,7 @@ static gboolean
config_create (GstVaapiContext * context)
{
const GstVaapiContextInfo *const cip = &context->info;
- GstVaapiDisplay *const display = GST_VAAPI_OBJECT_DISPLAY (context);
+ GstVaapiDisplay *const display = GST_VAAPI_CONTEXT_DISPLAY (context);
VAConfigAttrib attribs[7], *attrib;
VAStatus status;
guint value, va_chroma_format, attrib_index;
@@ -393,15 +392,6 @@ gst_vaapi_context_init (GstVaapiContext * context,
context->attribs = NULL;
}
-static void
-gst_vaapi_context_finalize (GstVaapiContext * context)
-{
- context_destroy (context);
- context_destroy_surfaces (context);
-}
-
-GST_VAAPI_OBJECT_DEFINE_CLASS (GstVaapiContext, gst_vaapi_context);
-
/**
* gst_vaapi_context_new:
* @display: a #GstVaapiDisplay
@@ -421,11 +411,18 @@ gst_vaapi_context_new (GstVaapiDisplay * display,
g_return_val_if_fail (cip->profile, NULL);
g_return_val_if_fail (cip->entrypoint, NULL);
+ g_return_val_if_fail (display, NULL);
- context = gst_vaapi_object_new (gst_vaapi_context_class (), display);
+ context = g_slice_new (GstVaapiContext);
if (!context)
return NULL;
+ GST_VAAPI_CONTEXT_DISPLAY (context) = gst_object_ref (display);
+ GST_VAAPI_CONTEXT_ID (context) = VA_INVALID_ID;
+ g_atomic_int_set (&context->ref_count, 1);
+ context->surfaces = NULL;
+ context->surfaces_pool = NULL;
+
gst_vaapi_context_init (context, cip);
if (!config_create (context))
@@ -448,7 +445,7 @@ done:
/* ERRORS */
error:
{
- gst_vaapi_object_unref (context);
+ gst_vaapi_context_unref (context);
return NULL;
}
}
@@ -537,7 +534,7 @@ gst_vaapi_context_get_id (GstVaapiContext * context)
{
g_return_val_if_fail (context != NULL, VA_INVALID_ID);
- return GST_VAAPI_OBJECT_ID (context);
+ return GST_VAAPI_CONTEXT_ID (context);
}
/**
@@ -655,3 +652,42 @@ gst_vaapi_context_get_surface_attributes (GstVaapiContext * context,
return TRUE;
}
+
+/**
+ * gst_vaapi_context_ref:
+ * @context: a #GstVaapiContext
+ *
+ * Atomically increases the reference count of the given @context by one.
+ *
+ * Returns: The same @context argument
+ */
+GstVaapiContext *
+gst_vaapi_context_ref (GstVaapiContext * context)
+{
+ g_return_val_if_fail (context != NULL, NULL);
+
+ g_atomic_int_inc (&context->ref_count);
+
+ return context;
+}
+
+/**
+ * gst_vaapi_context_unref:
+ * @context: a #GstVaapiContext
+ *
+ * Atomically decreases the reference count of the @context by one. If
+ * the reference count reaches zero, the object will be free'd.
+ */
+void
+gst_vaapi_context_unref (GstVaapiContext * context)
+{
+ g_return_if_fail (context != NULL);
+ g_return_if_fail (context->ref_count > 0);
+
+ if (g_atomic_int_dec_and_test (&context->ref_count)) {
+ context_destroy (context);
+ context_destroy_surfaces (context);
+ gst_vaapi_display_replace (&context->display, NULL);
+ g_slice_free (GstVaapiContext, context);
+ }
+}
diff --git a/gst-libs/gst/vaapi/gstvaapicontext.h b/gst-libs/gst/vaapi/gstvaapicontext.h
index 2dcaaf4d..70281714 100644
--- a/gst-libs/gst/vaapi/gstvaapicontext.h
+++ b/gst-libs/gst/vaapi/gstvaapicontext.h
@@ -41,7 +41,6 @@ G_BEGIN_DECLS
typedef struct _GstVaapiConfigInfoEncoder GstVaapiConfigInfoEncoder;
typedef struct _GstVaapiContextInfo GstVaapiContextInfo;
typedef struct _GstVaapiContext GstVaapiContext;
-typedef struct _GstVaapiContextClass GstVaapiContextClass;
/**
* GstVaapiContextUsage:
@@ -105,30 +104,23 @@ struct _GstVaapiContextInfo
struct _GstVaapiContext
{
/*< private >*/
- GstVaapiObject parent_instance;
+ volatile gint ref_count;
+ GstVaapiDisplay *display;
+ GstVaapiID object_id;
+ /*< public >*/
GstVaapiContextInfo info;
VAProfile va_profile;
VAEntrypoint va_entrypoint;
VAConfigID va_config;
GPtrArray *surfaces;
GstVaapiVideoPool *surfaces_pool;
- GPtrArray *overlays[2];
- guint overlay_id;
gboolean reset_on_resize;
GstVaapiConfigSurfaceAttributes *attribs;
};
-/**
- * GstVaapiContextClass:
- *
- * A VA context wrapper class.
- */
-struct _GstVaapiContextClass
-{
- /*< private >*/
- GstVaapiObjectClass parent_class;
-};
+#define GST_VAAPI_CONTEXT_ID(context) (((GstVaapiContext *)(context))->object_id)
+#define GST_VAAPI_CONTEXT_DISPLAY(context) (((GstVaapiContext *)(context))->display)
G_GNUC_INTERNAL
GstVaapiContext *
@@ -166,6 +158,16 @@ gboolean
gst_vaapi_context_get_surface_attributes (GstVaapiContext * context,
GstVaapiConfigSurfaceAttributes * out_attribs);
+G_GNUC_INTERNAL
+GstVaapiContext *
+gst_vaapi_context_ref (GstVaapiContext * context);
+
+G_GNUC_INTERNAL
+void
+gst_vaapi_context_unref (GstVaapiContext * context);
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVaapiContext, gst_vaapi_context_unref)
+
G_END_DECLS
#endif /* GST_VAAPI_CONTEXT_H */
diff --git a/gst-libs/gst/vaapi/gstvaapidecoder.c b/gst-libs/gst/vaapi/gstvaapidecoder.c
index 5c467021..0e9d2764 100644
--- a/gst-libs/gst/vaapi/gstvaapidecoder.c
+++ b/gst-libs/gst/vaapi/gstvaapidecoder.c
@@ -483,7 +483,8 @@ gst_vaapi_decoder_finalize (GObject * object)
decoder->frames = NULL;
}
- gst_vaapi_object_replace (&decoder->context, NULL);
+ gst_vaapi_context_unref (decoder->context);
+ decoder->context = NULL;
decoder->va_context = VA_INVALID_ID;
gst_vaapi_display_replace (&decoder->display, NULL);
diff --git a/gst-libs/gst/vaapi/gstvaapiencoder.c b/gst-libs/gst/vaapi/gstvaapiencoder.c
index 815660b5..2d29d04d 100644
--- a/gst-libs/gst/vaapi/gstvaapiencoder.c
+++ b/gst-libs/gst/vaapi/gstvaapiencoder.c
@@ -1345,7 +1345,8 @@ gst_vaapi_encoder_finalize (GObject * object)
{
GstVaapiEncoder *encoder = GST_VAAPI_ENCODER (object);
- gst_vaapi_object_replace (&encoder->context, NULL);
+ gst_vaapi_context_unref (encoder->context);
+ encoder->context = NULL;
gst_vaapi_display_replace (&encoder->display, NULL);
encoder->va_display = NULL;
@@ -1485,7 +1486,7 @@ create_test_context_config (GstVaapiEncoder * encoder, GstVaapiProfile profile)
GstVaapiContext *ctxt;
if (encoder->context)
- return gst_vaapi_object_ref (encoder->context);
+ return gst_vaapi_context_ref (encoder->context);
/* if there is no profile, let's figure out one */
if (profile == GST_VAAPI_PROFILE_UNKNOWN)
@@ -1506,7 +1507,7 @@ get_profile_surface_formats (GstVaapiEncoder * encoder, GstVaapiProfile profile)
if (!ctxt)
return NULL;
formats = gst_vaapi_context_get_surface_formats (ctxt);
- gst_vaapi_object_unref (ctxt);
+ gst_vaapi_context_unref (ctxt);
return formats;
}
diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_h264_fei.c b/gst-libs/gst/vaapi/gstvaapiencoder_h264_fei.c
index eeec20aa..92111e0b 100644
--- a/gst-libs/gst/vaapi/gstvaapiencoder_h264_fei.c
+++ b/gst-libs/gst/vaapi/gstvaapiencoder_h264_fei.c
@@ -3798,7 +3798,7 @@ static inline gboolean
context_get_attribute (GstVaapiContext * context, VAConfigAttribType type,
guint * out_value_ptr)
{
- return gst_vaapi_get_config_attribute (GST_VAAPI_OBJECT_DISPLAY (context),
+ return gst_vaapi_get_config_attribute (GST_VAAPI_CONTEXT_DISPLAY (context),
context->va_profile, context->va_entrypoint, type, out_value_ptr);
}
diff --git a/gst-libs/gst/vaapi/gstvaapiprofilecaps.c b/gst-libs/gst/vaapi/gstvaapiprofilecaps.c
index fcd6981f..7efa6a32 100644
--- a/gst-libs/gst/vaapi/gstvaapiprofilecaps.c
+++ b/gst-libs/gst/vaapi/gstvaapiprofilecaps.c
@@ -87,7 +87,7 @@ append_caps_with_context_info (GstVaapiDisplay * display,
return FALSE;
ret = append_caps (context, structure);
- gst_vaapi_object_unref (context);
+ gst_vaapi_context_unref (context);
return ret;
}