X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Fsubtitle.cpp;h=3787ab1b4effdbc4b1efd722fbc9c2a45741be77;hp=7ae49db5f1f91fa31ac627a60f57b221b9a40a50;hb=cddb13ae57507610df08f5f11e0b19a7e36f63cb;hpb=7e3fc622d3a9dfcec4009d3fff223c6303e497ab diff --git a/lib/dvb/subtitle.cpp b/lib/dvb/subtitle.cpp index 7ae49db..3787ab1 100644 --- a/lib/dvb/subtitle.cpp +++ b/lib/dvb/subtitle.cpp @@ -81,7 +81,7 @@ void eDVBSubtitleParser::subtitle_process_line(subtitle_page *page, int object_i } // //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); + memcpy((__u8*)region->region_buffer->surface->data + region->region_buffer->surface->stride * y + x, data, len); } object = object->next; } @@ -243,17 +243,17 @@ int eDVBSubtitleParser::subtitle_process_pixel_data(subtitle_page *page, int obj bitstream_init(&bit, data, 4); for ( int i=0; i < 4; ++i ) bitstream_get(&bit); - break; + return 2 + 1; case 0x21: // ignore 2 -> 8bit map table bitstream_init(&bit, data, 8); for ( int i=0; i < 4; ++i ) bitstream_get(&bit); - break; + return 4 + 1; case 0x22: // ignore 4 -> 8bit map table bitstream_init(&bit, data, 8); for ( int i=0; i < 16; ++i ) bitstream_get(&bit); - break; + return 16 + 1; case 0xF0: subtitle_process_line(page, object_id, *linenr, line, *linep); /* { @@ -345,6 +345,8 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment) } } + page->state = page_state; + //eDebug("page updated: old: %d, new: %d", page->page_version_number, page_version_number); // when acquisition point or mode change: remove all displayed pages. if ((page_state == 1) || (page_state == 2)) @@ -360,6 +362,13 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment) { subtitle_region *p = page->regions->next; //eDebug("delete region %d", page->regions->region_id); + while(page->regions->region_objects) + { + //eDebug("delete region object"); + subtitle_region_object *ob = page->regions->region_objects->next; + delete page->regions->region_objects; + page->regions->region_objects = ob; + } delete page->regions; page->regions = p; } @@ -451,6 +460,7 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment) else if (region->region_version_number != region_version_number) { subtitle_region_object *objects = region->region_objects; + //eDebug("unequal version %p %p", objects, objects?objects->next:objects); while (objects) { subtitle_region_object *n = objects->next; @@ -480,7 +490,8 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment) region->region_height |= *segment++; processed_length += 2; - region->region_buffer = new gPixmap(eSize(region->region_width, region->region_height), 8); + region->region_buffer = new gPixmap(eSize(region->region_width, region->region_height), 8, 1); + memset(region->region_buffer->surface->data, 0, region->region_height * region->region_buffer->surface->stride); //eDebug("new region_buffer %p", &(*region->region_buffer)); int region_level_of_compatibility, region_depth; @@ -796,7 +807,8 @@ void eDVBSubtitleParser::subtitle_redraw_all() subtitle_page *page = m_pages; while(page) { - subtitle_redraw(page->page_id); + if (page->state != 0) + subtitle_redraw(page->page_id); page = page->next; } #else