From 7a21a194991d80d93096f2f5c2bdf7dc06cc6886 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 27 Dec 2010 11:10:53 +0000 Subject: [PATCH] dvbsuboverlay: clean-up: allocate flat array of rectangles instead of an array of pointers to individually-allocated rectangles. --- gst/dvbsuboverlay/dvb-sub.c | 30 +++++++++++------------------- gst/dvbsuboverlay/dvb-sub.h | 4 ++-- gst/dvbsuboverlay/gstdvbsuboverlay.c | 2 +- 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/gst/dvbsuboverlay/dvb-sub.c b/gst/dvbsuboverlay/dvb-sub.c index c562319..2593622 100644 --- a/gst/dvbsuboverlay/dvb-sub.c +++ b/gst/dvbsuboverlay/dvb-sub.c @@ -1185,11 +1185,8 @@ static gint _dvb_sub_parse_end_of_display_set (DvbSub * dvb_sub, guint16 page_id, guint8 * buf, gint buf_size, guint64 pts) { - DVBSubtitles *sub = g_slice_new0 (DVBSubtitles); - - DVBSubRegion *region; DVBSubRegionDisplay *display; - DVBSubtitleRect *rect; + DVBSubtitles *sub; DVBSubCLUT *clut; guint32 *clut_table; int i; @@ -1198,21 +1195,17 @@ _dvb_sub_parse_end_of_display_set (DvbSub * dvb_sub, guint16 page_id, GST_DEBUG ("DISPLAY SET END: page_id = %u, length = %d", page_id, buf_size); - sub->rects = NULL; + sub = g_slice_new0 (DVBSubtitles); + #if 0 /* FIXME: PTS stuff not figured out yet */ sub->start_display_time = 0; sub->end_display_time = priv->page_time_out * 1000; sub->format = 0; /* 0 = graphics */ #endif + /* N.B. g_new0() will return NULL if num_rects is 0 */ sub->num_rects = dvb_sub->display_list_size; - - if (sub->num_rects > 0) { - // FIXME-MEMORY-LEAK: This structure is not freed up yet - sub->rects = g_malloc0 (sizeof (*sub->rects) * sub->num_rects); /* GSlice? */ - for (i = 0; i < sub->num_rects; i++) - sub->rects[i] = g_malloc0 (sizeof (*sub->rects[i])); /* GSlice? */ - } + sub->rects = g_new0 (DVBSubtitleRect, sub->num_rects); i = 0; @@ -1220,12 +1213,15 @@ _dvb_sub_parse_end_of_display_set (DvbSub * dvb_sub, guint16 page_id, sub->display_def = dvb_sub->display_def; for (display = dvb_sub->display_list; display; display = display->next) { + DVBSubtitleRect *rect; + DVBSubRegion *region; + region = get_region (dvb_sub, display->region_id); - rect = sub->rects[i]; if (!region) continue; + rect = &sub->rects[i]; rect->x = display->x_pos; rect->y = display->y_pos; rect->w = region->width; @@ -1298,18 +1294,14 @@ void dvb_subtitles_free (DVBSubtitles * sub) { int i; - DVBSubtitleRect *rect; if (sub == NULL) return; /* Now free up all the temporary memory we allocated */ for (i = 0; i < sub->num_rects; ++i) { - rect = sub->rects[i]; - - g_free (rect->pict.palette); - g_free (rect->pict.data); - g_free (rect); + g_free (sub->rects[i].pict.palette); + g_free (sub->rects[i].pict.data); } g_free (sub->rects); g_slice_free (DVBSubtitles, sub); diff --git a/gst/dvbsuboverlay/dvb-sub.h b/gst/dvbsuboverlay/dvb-sub.h index 180047a..7faa31f 100644 --- a/gst/dvbsuboverlay/dvb-sub.h +++ b/gst/dvbsuboverlay/dvb-sub.h @@ -103,8 +103,8 @@ typedef struct DVBSubtitleWindow { typedef struct DVBSubtitles { guint64 pts; guint8 page_time_out; - unsigned int num_rects; - DVBSubtitleRect **rects; + guint num_rects; + DVBSubtitleRect *rects; DVBSubtitleWindow display_def; } DVBSubtitles; diff --git a/gst/dvbsuboverlay/gstdvbsuboverlay.c b/gst/dvbsuboverlay/gstdvbsuboverlay.c index f2b9734..a2b7b1e 100644 --- a/gst/dvbsuboverlay/gstdvbsuboverlay.c +++ b/gst/dvbsuboverlay/gstdvbsuboverlay.c @@ -527,7 +527,7 @@ blit_i420 (GstDVBSubOverlay * overlay, DVBSubtitles * subs, GstBuffer * buffer) gint32 sx = 0, sy; /* 16.16 fixed point */ gint32 xstep, ystep; /* 16.16 fixed point */ - sub_region = subs->rects[counter]; + sub_region = &subs->rects[counter]; if (sub_region->y > height || sub_region->x > width) continue; -- 2.7.4