aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-11-01 23:52:32 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-11-01 23:52:32 +0000
commit7e5b66316f891fd526991891196308f098ceece9 (patch)
tree02e244bb67d9446528c4f9435ac7605a7dc9194a /lib
parentaa4de06095cc1f7aba8f7da402d3717d696d5407 (diff)
downloadenigma2-7e5b66316f891fd526991891196308f098ceece9.tar.gz
enigma2-7e5b66316f891fd526991891196308f098ceece9.zip
fix possible dvb subtitles segfault
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/subtitle.cpp32
-rw-r--r--lib/dvb/subtitle.h3
2 files changed, 19 insertions, 16 deletions
diff --git a/lib/dvb/subtitle.cpp b/lib/dvb/subtitle.cpp
index f9666bc0..60d48ff7 100644
--- a/lib/dvb/subtitle.cpp
+++ b/lib/dvb/subtitle.cpp
@@ -80,6 +80,7 @@ void eDVBSubtitleParser::subtitle_process_line(subtitle_page *page, int object_i
break;
}
// //eDebug("inserting %d bytes (into region %d)", len, region->region_id);
+// eDebug("put data to region_buffer %p", &(*region->region_buffer));
memcpy((__u8*)region->region_buffer->surface->data + region->region_width * y + x, data, len);
}
object = object->next;
@@ -339,7 +340,7 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment)
// if no update, just skip this data.
if (page->page_version_number == page_version_number)
{
- eDebug("skip data... ");
+// eDebug("skip data... ");
break;
}
}
@@ -429,6 +430,7 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment)
{
*pregion = region = new subtitle_region;
region->next = 0;
+ region->committed = false;
}
else if (region->region_version_number != region_version_number)
{
@@ -441,10 +443,10 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment)
}
if (region->region_buffer)
{
- if (region->region_buffer->surface)
- delete region->region_buffer->surface;
+// eDebug("no more need of region_buffer %p", &(*region->region_buffer));
region->region_buffer=0;
}
+ region->committed = false;
}
else
break;
@@ -463,6 +465,7 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment)
processed_length += 2;
region->region_buffer = new gPixmap(eSize(region->region_width, region->region_height), 8);
+// eDebug("new region_buffer %p", &(*region->region_buffer));
int region_level_of_compatibility, region_depth;
@@ -489,6 +492,7 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment)
if (region_fill_flag)
{
+// eDebug("region fill region_buffer %p", &(*region->region_buffer));
if (region_depth == 1)
memset(region->region_buffer->surface->data, region_2bit_pixel_code, region->region_height * region->region_width);
else if (region_depth == 2)
@@ -844,8 +848,7 @@ void eDVBSubtitleParser::subtitle_reset()
if (region->region_buffer)
{
- if (region->region_buffer->surface)
- delete region->region_buffer->surface;
+// eDebug("no more need of region_buffer 2 %p", &(*region->region_buffer));
region->region_buffer=0;
}
@@ -870,7 +873,7 @@ void eDVBSubtitleParser::subtitle_redraw(int page_id)
{
subtitle_page *page = m_pages;
- //eDebug("displaying page id %d", page_id);
+// eDebug("displaying page id %d", page_id);
while (page)
{
@@ -903,6 +906,8 @@ void eDVBSubtitleParser::subtitle_redraw(int page_id)
}
if (reg)
{
+ if (reg->committed)
+ continue;
// eDebug("copy region %d to %d, %d", region->region_id, region->region_horizontal_address, region->region_vertical_address);
int x0 = region->region_horizontal_address;
@@ -928,15 +933,8 @@ void eDVBSubtitleParser::subtitle_redraw(int page_id)
int clut_size = reg->region_buffer->surface->clut.colors = reg->region_depth == subtitle_region::bpp2 ?
4 : reg->region_depth == subtitle_region::bpp4 ? 16 : 256;
- if (reg->region_buffer->surface->clut.data &&
- clut_size != reg->region_buffer->surface->clut.colors)
- {
- delete [] reg->region_buffer->surface->clut.data;
- reg->region_buffer->surface->clut.data = 0;
- }
-
- if (!reg->region_buffer->surface->clut.data)
- reg->region_buffer->surface->clut.data = new gRGB[clut_size];
+ reg->region_buffer->surface->clut.data = new gRGB[clut_size];
+// eDebug("create clut data for region_buffer %p", &(*reg->region_buffer));
gRGB *palette = reg->region_buffer->surface->clut.data;
@@ -1077,12 +1075,14 @@ void eDVBSubtitleParser::subtitle_redraw(int page_id)
}
}
}
-
+
+// eDebug("commit region_buffer %p", &(*reg->region_buffer));
eDVBSubtitleRegion Region;
Region.m_pixmap = reg->region_buffer;
Region.m_position.setX(x0);
Region.m_position.setY(y0);
Page.m_regions.push_back(Region);
+ reg->committed = true;
}
else
eDebug("region not found");
diff --git a/lib/dvb/subtitle.h b/lib/dvb/subtitle.h
index 6335a337..fb9c51a2 100644
--- a/lib/dvb/subtitle.h
+++ b/lib/dvb/subtitle.h
@@ -54,6 +54,7 @@ struct subtitle_region
int region_version_number;
int region_height, region_width;
enum depth { bpp2=1, bpp4=2, bpp8=3 } region_depth;
+
ePtr<gPixmap> region_buffer;
int clut_id;
@@ -61,6 +62,8 @@ struct subtitle_region
subtitle_region_object *region_objects;
subtitle_region *next;
+
+ bool committed;
};
struct subtitle_page