diff options
author | Tim-Philipp Müller <tim@centricular.com> | 2019-03-06 23:45:27 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2019-03-08 01:18:39 +0000 |
commit | 92e5c5a85ae39d23704afa52ab8795f2dc125a7b (patch) | |
tree | 1fd4c5b6d8c518f6e4a2aad1e094f20b9e199625 | |
parent | 6dad8b7c787c1d57e944cec681dfccf22b37fc90 (diff) |
closedcaption: cea708decoder: fix some memory leaks
-rw-r--r-- | ext/closedcaption/gstcea708decoder.c | 22 | ||||
-rw-r--r-- | ext/closedcaption/gstcea708decoder.h | 3 | ||||
-rw-r--r-- | ext/closedcaption/gstceaccoverlay.c | 3 |
3 files changed, 28 insertions, 0 deletions
diff --git a/ext/closedcaption/gstcea708decoder.c b/ext/closedcaption/gstcea708decoder.c index fac1546fa..774a48f2c 100644 --- a/ext/closedcaption/gstcea708decoder.c +++ b/ext/closedcaption/gstcea708decoder.c @@ -123,6 +123,7 @@ gst_cea708dec_clear_window_text (Cea708Dec * decoder, guint window_id); static void gst_cea708dec_scroll_window_up (Cea708Dec * decoder, guint window_id); static void gst_cea708dec_init_window (Cea708Dec * decoder, guint window_id); +static void gst_cea708dec_clear_window (Cea708Dec * decoder, cea708Window * w); static void gst_cea708dec_set_pen_attributes (Cea708Dec * decoder, guint8 * dtvcc_buffer, int index); @@ -175,6 +176,20 @@ gst_cea708dec_create (PangoContext * pango_context) } void +gst_cea708dec_free (Cea708Dec * dec) +{ + int i; + + for (i = 0; i < MAX_708_WINDOWS; i++) { + cea708Window *window = dec->cc_windows[i]; + gst_cea708dec_clear_window (dec, window); + g_free (window); + } + memset (dec, 0, sizeof (Cea708Dec)); + g_free (dec); +} + +void gst_cea708dec_set_service_number (Cea708Dec * decoder, gint8 desired_service) { int i = 0; @@ -1299,6 +1314,13 @@ gst_cea708dec_scroll_window_up (Cea708Dec * decoder, guint window_id) } static void +gst_cea708dec_clear_window (Cea708Dec * decoder, cea708Window * window) +{ + g_free (window->text_image); + memset (window, 0, sizeof (cea708Window)); +} + +static void gst_cea708dec_init_window (Cea708Dec * decoder, guint window_id) { cea708Window *window = decoder->cc_windows[window_id]; diff --git a/ext/closedcaption/gstcea708decoder.h b/ext/closedcaption/gstcea708decoder.h index 2d0609c22..0a29b258c 100644 --- a/ext/closedcaption/gstcea708decoder.h +++ b/ext/closedcaption/gstcea708decoder.h @@ -473,6 +473,9 @@ struct _Cea708Dec }; Cea708Dec *gst_cea708dec_create (PangoContext * pango_context); + +void gst_cea708dec_free (Cea708Dec *dec); + void gst_cea708dec_set_service_number (Cea708Dec * decoder, gint8 desired_service); gboolean diff --git a/ext/closedcaption/gstceaccoverlay.c b/ext/closedcaption/gstceaccoverlay.c index 1fd38d9e4..0b02d41c6 100644 --- a/ext/closedcaption/gstceaccoverlay.c +++ b/ext/closedcaption/gstceaccoverlay.c @@ -301,6 +301,9 @@ gst_cea_cc_overlay_finalize (GObject * object) overlay->next_composition = NULL; } + gst_cea708dec_free (overlay->decoder); + overlay->decoder = NULL; + g_mutex_clear (&overlay->lock); g_cond_clear (&overlay->cond); |