X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/0e3e7773e5d8e7ff159316db3de7fcfad57bb9e8..beb76be8b094d0deeded0ad42f1258222e1210cb:/lib/dvb/subtitle.cpp diff --git a/lib/dvb/subtitle.cpp b/lib/dvb/subtitle.cpp index f9666bc0..87dadba5 100644 --- a/lib/dvb/subtitle.cpp +++ b/lib/dvb/subtitle.cpp @@ -80,7 +80,8 @@ void eDVBSubtitleParser::subtitle_process_line(subtitle_page *page, int object_i break; } // //eDebug("inserting %d bytes (into region %d)", len, region->region_id); - memcpy((__u8*)region->region_buffer->surface->data + region->region_width * y + x, data, len); +// eDebug("put data to region_buffer %p", &(*region->region_buffer)); + memcpy((__u8*)region->region_buffer->surface->data + region->region_buffer->surface->stride * y + x, data, len); } object = object->next; } @@ -289,9 +290,9 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment) return segment_length + 6; if (page_id != m_composition_page_id && page_id != m_ancillary_page_id) return segment_length + 6; -// //eDebug("have %d bytes of segment data", segment_length); + //eDebug("have %d bytes of segment data", segment_length); -// //eDebug("page_id %d, segtype %02x", page_id, segment_type); + //eDebug("page_id %d, segtype %02x", page_id, segment_type); subtitle_page *page, **ppage; @@ -339,24 +340,42 @@ 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; } } -// eDebug("page updated: old: %d, new: %d", page->page_version_number, page_version_number); + 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)) { while (page->page_regions) { subtitle_page_region *p = page->page_regions->next; + //eDebug("delete page_region %d", page->page_regions->region_id); delete page->page_regions; page->page_regions = p; } + while (page->regions) + { + 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; + } + } -// eDebug("new page.. (%d)", page_state); + //eDebug("new page.. (%d)", page_state); page->page_time_out = page_time_out; @@ -370,6 +389,12 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment) while (*r) r = &(*r)->next; + if (processed_length == segment_length && !page->page_regions) + { + //eDebug("no regions in page.. clear screen!!"); + subtitle_redraw(page->page_id); + } + while (processed_length < segment_length) { subtitle_page_region *pr; @@ -427,12 +452,15 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment) if (!region) { + //eDebug("create region !!!!!!!!!!"); *pregion = region = new subtitle_region; region->next = 0; + region->committed = false; } 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; @@ -441,10 +469,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; @@ -462,7 +490,9 @@ 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; @@ -489,6 +519,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) @@ -665,7 +696,7 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment) bottom_field_data_blocklength = *segment++ << 8; bottom_field_data_blocklength |= *segment++; - //eDebug("%d / %d bytes", top_field_data_blocklength, bottom_field_data_blocklength); + eDebug("%d / %d bytes", top_field_data_blocklength, bottom_field_data_blocklength); processed_length += 4; i = 0; @@ -714,7 +745,7 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment) } case 0x80: // end of display set segment { -// eDebug("end of display set segment"); + //eDebug("end of display set segment"); subtitle_redraw_all(); } case 0xFF: // stuffing @@ -728,9 +759,10 @@ int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment) void eDVBSubtitleParser::subtitle_process_pes(__u8 *pkt, int len) { -// eDebug("subtitle_process_pes"); + eDebugNoNewLine("subtitle_process_pes"); if (!extract_pts(m_show_time, pkt)) { + eDebug(" %lld", m_show_time); pkt += 6; len -= 6; // skip PES header pkt++; len--; @@ -762,11 +794,11 @@ void eDVBSubtitleParser::subtitle_process_pes(__u8 *pkt, int len) pkt += l; len -= l; } - // if (len && *pkt != 0xFF) - // eDebug("strange data at the end"); + if (len && *pkt != 0xFF) + eDebug("strange data at the end"); } else - eDebug("dvb subtitle packet without PTS.. ignore!!"); + eDebug("\ndvb subtitle packet without PTS.. ignore!!"); } void eDVBSubtitleParser::subtitle_redraw_all() @@ -775,41 +807,42 @@ 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 subtitle_page *page = m_pages; - //eDebug("----------- end of display set"); - //eDebug("active pages:"); + eDebug("----------- end of display set"); + eDebug("active pages:"); while (page) { - //eDebug(" page_id %02x", page->page_id); - //eDebug(" page_version_number: %d", page->page_version_number); - //eDebug(" active regions:"); + eDebug(" page_id %02x", page->page_id); + eDebug(" page_version_number: %d", page->page_version_number); + eDebug(" active regions:"); { subtitle_page_region *region = page->page_regions; while (region) { - //eDebug(" region_id: %04x", region->region_id); - //eDebug(" region_horizontal_address: %d", region->region_horizontal_address); - //eDebug(" region_vertical_address: %d", region->region_vertical_address); + eDebug(" region_id: %04x", region->region_id); + eDebug(" region_horizontal_address: %d", region->region_horizontal_address); + eDebug(" region_vertical_address: %d", region->region_vertical_address); region = region->next; } } subtitle_redraw(page->page_id); - //eDebug("defined regions:"); + eDebug("defined regions:"); subtitle_region *region = page->regions; while (region) { - //eDebug(" region_id %04x, version %d, %dx%d", region->region_id, region->region_version_number, region->region_width, region->region_height); + eDebug(" region_id %04x, version %d, %dx%d", region->region_id, region->region_version_number, region->region_width, region->region_height); subtitle_region_object *object = region->region_objects; while (object) { - //eDebug(" object %02x, type %d, %d:%d", object->object_id, object->object_type, object->object_horizontal_position, object->object_vertical_position); + eDebug(" object %02x, type %d, %d:%d", object->object_id, object->object_type, object->object_horizontal_position, object->object_vertical_position); object = object->next; } region = region->next; @@ -844,8 +877,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 +902,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 +935,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 +962,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 +1104,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");