From 9f0a06245b36c25bc127efe035ab4d8426ddd6fd Mon Sep 17 00:00:00 2001 From: Chris Bass Date: Tue, 21 Mar 2017 13:50:12 +0000 Subject: [PATCH] ttml: add refcounting to GstSubtitleStlyeSet type https://bugzilla.gnome.org/show_bug.cgi?id=780402 --- ext/ttml/gstttmlrender.c | 2 +- ext/ttml/subtitle.c | 42 +++++++++++++++++++++++----------------- ext/ttml/subtitle.h | 40 +++++++++++++++++++++++++++++++++++--- 3 files changed, 62 insertions(+), 22 deletions(-) diff --git a/ext/ttml/gstttmlrender.c b/ext/ttml/gstttmlrender.c index 25b2700896..26b130c68e 100644 --- a/ext/ttml/gstttmlrender.c +++ b/ext/ttml/gstttmlrender.c @@ -1242,7 +1242,7 @@ map_fail: typedef struct { - const GstSubtitleElement *element; + GstSubtitleElement *element; gchar *text; } UnifiedElement; diff --git a/ext/ttml/subtitle.c b/ext/ttml/subtitle.c index 2beac79a80..51724ca212 100644 --- a/ext/ttml/subtitle.c +++ b/ext/ttml/subtitle.c @@ -32,6 +32,22 @@ #include "subtitle.h" +/** + * gst_subtitle_style_set_free: + * @style_set: A #GstSubtitleStyleSet. + * + * Free @style_set and its associated memory. + */ +static void +_gst_subtitle_style_set_free (GstSubtitleStyleSet * style_set) +{ + g_return_if_fail (style_set != NULL); + g_free (style_set->font_family); + g_slice_free (GstSubtitleStyleSet, style_set); +} + +GST_DEFINE_MINI_OBJECT_TYPE (GstSubtitleStyleSet, gst_subtitle_style_set); + /** * gst_subtitle_style_set_new: * @@ -46,6 +62,10 @@ gst_subtitle_style_set_new (void) GstSubtitleColor white = { 255, 255, 255, 255 }; GstSubtitleColor transparent = { 0, 0, 0, 0 }; + gst_mini_object_init (GST_MINI_OBJECT_CAST (ret), 0, + gst_subtitle_style_set_get_type (), NULL, NULL, + (GstMiniObjectFreeFunction) _gst_subtitle_style_set_free); + ret->font_family = g_strdup ("default"); ret->font_size = 1.0; ret->line_height = 1.25; @@ -60,26 +80,12 @@ gst_subtitle_style_set_new (void) return ret; } -/** - * gst_subtitle_style_set_free: - * @style_set: A #GstSubtitleStyleSet. - * - * Free @style_set and its associated memory. - */ -void -gst_subtitle_style_set_free (GstSubtitleStyleSet * style_set) -{ - g_return_if_fail (style_set != NULL); - g_free (style_set->font_family); - g_slice_free (GstSubtitleStyleSet, style_set); -} - static void _gst_subtitle_element_free (GstSubtitleElement * element) { g_return_if_fail (element != NULL); - gst_subtitle_style_set_free (element->style_set); + gst_subtitle_style_set_unref (element->style_set); g_slice_free (GstSubtitleElement, element); } @@ -121,7 +127,7 @@ static void _gst_subtitle_block_free (GstSubtitleBlock * block) { g_return_if_fail (block != NULL); - gst_subtitle_style_set_free (block->style_set); + gst_subtitle_style_set_unref (block->style_set); g_ptr_array_unref (block->elements); g_slice_free (GstSubtitleBlock, block); } @@ -202,7 +208,7 @@ gst_subtitle_block_get_element_count (const GstSubtitleBlock * block) * function does not return a reference; the caller should obtain a reference * using gst_subtitle_element_ref(), if needed. */ -const GstSubtitleElement * +GstSubtitleElement * gst_subtitle_block_get_element (const GstSubtitleBlock * block, guint index) { g_return_val_if_fail (block != NULL, NULL); @@ -217,7 +223,7 @@ static void _gst_subtitle_region_free (GstSubtitleRegion * region) { g_return_if_fail (region != NULL); - gst_subtitle_style_set_free (region->style_set); + gst_subtitle_style_set_unref (region->style_set); g_ptr_array_unref (region->blocks); g_slice_free (GstSubtitleRegion, region); } diff --git a/ext/ttml/subtitle.h b/ext/ttml/subtitle.h index 95333d3542..6724cc6d60 100644 --- a/ext/ttml/subtitle.h +++ b/ext/ttml/subtitle.h @@ -366,7 +366,10 @@ typedef enum { * all object types. The types to which each attribute applies is given in the * description of that attribute below. */ -struct _GstSubtitleStyleSet { +struct _GstSubtitleStyleSet +{ + GstMiniObject mini_object; + GstSubtitleTextDirection text_direction; gchar *font_family; gdouble font_size; @@ -388,11 +391,42 @@ struct _GstSubtitleStyleSet { GstSubtitleWritingMode writing_mode; GstSubtitleBackgroundMode show_background; GstSubtitleOverflowMode overflow; + + /*< private >*/ + gpointer _gst_reserved[GST_PADDING]; }; +GType gst_subtitle_style_set_get_type (void); + GstSubtitleStyleSet * gst_subtitle_style_set_new (void); -void gst_subtitle_style_set_free (GstSubtitleStyleSet * style_set); +/** + * gst_subtitle_style_set_ref: + * @style_set: A #GstSubtitleStyleSet. + * + * Increments the refcount of @style_set. + * + * Returns: (transfer full): @style_set. + */ +static inline GstSubtitleStyleSet * +gst_subtitle_style_set_ref (GstSubtitleStyleSet * style_set) +{ + return (GstSubtitleStyleSet *) + gst_mini_object_ref (GST_MINI_OBJECT_CAST (style_set)); +} + +/** + * gst_subtitle_style_set_unref: + * @style_set: (transfer full): A #GstSubtitleStyleSet. + * + * Decrements the refcount of @style_set. If the refcount reaches 0, @style_set + * will be freed. + */ +static inline void +gst_subtitle_style_set_unref (GstSubtitleStyleSet * style_set) +{ + gst_mini_object_unref (GST_MINI_OBJECT_CAST (style_set)); +} /** @@ -489,7 +523,7 @@ void gst_subtitle_block_add_element ( guint gst_subtitle_block_get_element_count (const GstSubtitleBlock * block); -const GstSubtitleElement * gst_subtitle_block_get_element ( +GstSubtitleElement * gst_subtitle_block_get_element ( const GstSubtitleBlock * block, guint index); /**