dvbsuboverlay: clean-up: allocate flat array of rectangles

instead of an array of pointers to individually-allocated rectangles.
This commit is contained in:
Tim-Philipp Müller 2010-12-27 11:10:53 +00:00
parent 857e3dda46
commit 7a21a19499
3 changed files with 14 additions and 22 deletions

View file

@ -1185,11 +1185,8 @@ static gint
_dvb_sub_parse_end_of_display_set (DvbSub * dvb_sub, guint16 page_id, _dvb_sub_parse_end_of_display_set (DvbSub * dvb_sub, guint16 page_id,
guint8 * buf, gint buf_size, guint64 pts) guint8 * buf, gint buf_size, guint64 pts)
{ {
DVBSubtitles *sub = g_slice_new0 (DVBSubtitles);
DVBSubRegion *region;
DVBSubRegionDisplay *display; DVBSubRegionDisplay *display;
DVBSubtitleRect *rect; DVBSubtitles *sub;
DVBSubCLUT *clut; DVBSubCLUT *clut;
guint32 *clut_table; guint32 *clut_table;
int i; 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); 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 */ #if 0 /* FIXME: PTS stuff not figured out yet */
sub->start_display_time = 0; sub->start_display_time = 0;
sub->end_display_time = priv->page_time_out * 1000; sub->end_display_time = priv->page_time_out * 1000;
sub->format = 0; /* 0 = graphics */ sub->format = 0; /* 0 = graphics */
#endif #endif
/* N.B. g_new0() will return NULL if num_rects is 0 */
sub->num_rects = dvb_sub->display_list_size; sub->num_rects = dvb_sub->display_list_size;
sub->rects = g_new0 (DVBSubtitleRect, sub->num_rects);
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? */
}
i = 0; 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; sub->display_def = dvb_sub->display_def;
for (display = dvb_sub->display_list; display; display = display->next) { for (display = dvb_sub->display_list; display; display = display->next) {
DVBSubtitleRect *rect;
DVBSubRegion *region;
region = get_region (dvb_sub, display->region_id); region = get_region (dvb_sub, display->region_id);
rect = sub->rects[i];
if (!region) if (!region)
continue; continue;
rect = &sub->rects[i];
rect->x = display->x_pos; rect->x = display->x_pos;
rect->y = display->y_pos; rect->y = display->y_pos;
rect->w = region->width; rect->w = region->width;
@ -1298,18 +1294,14 @@ void
dvb_subtitles_free (DVBSubtitles * sub) dvb_subtitles_free (DVBSubtitles * sub)
{ {
int i; int i;
DVBSubtitleRect *rect;
if (sub == NULL) if (sub == NULL)
return; return;
/* Now free up all the temporary memory we allocated */ /* Now free up all the temporary memory we allocated */
for (i = 0; i < sub->num_rects; ++i) { for (i = 0; i < sub->num_rects; ++i) {
rect = sub->rects[i]; g_free (sub->rects[i].pict.palette);
g_free (sub->rects[i].pict.data);
g_free (rect->pict.palette);
g_free (rect->pict.data);
g_free (rect);
} }
g_free (sub->rects); g_free (sub->rects);
g_slice_free (DVBSubtitles, sub); g_slice_free (DVBSubtitles, sub);

View file

@ -103,8 +103,8 @@ typedef struct DVBSubtitleWindow {
typedef struct DVBSubtitles { typedef struct DVBSubtitles {
guint64 pts; guint64 pts;
guint8 page_time_out; guint8 page_time_out;
unsigned int num_rects; guint num_rects;
DVBSubtitleRect **rects; DVBSubtitleRect *rects;
DVBSubtitleWindow display_def; DVBSubtitleWindow display_def;
} DVBSubtitles; } DVBSubtitles;

View file

@ -527,7 +527,7 @@ blit_i420 (GstDVBSubOverlay * overlay, DVBSubtitles * subs, GstBuffer * buffer)
gint32 sx = 0, sy; /* 16.16 fixed point */ gint32 sx = 0, sy; /* 16.16 fixed point */
gint32 xstep, ystep; /* 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) if (sub_region->y > height || sub_region->x > width)
continue; continue;