diff options
author | Felix Domke <tmbinc@elitedvb.ne> | 2007-10-22 15:54:08 +0000 |
---|---|---|
committer | Felix Domke <tmbinc@elitedvb.ne> | 2007-10-22 15:54:08 +0000 |
commit | d9cb87ad509582ae4ae12dbaad242cfcb7e5a083 (patch) | |
tree | f1239870689cb2b0ee162050d2b05282db69c333 /packages/enigma/enigma | |
parent | 61987db8fb77c4fb84d55774454876b4c5646574 (diff) | |
download | openembedded-d9cb87ad509582ae4ae12dbaad242cfcb7e5a083.tar.gz |
enigma: update
Diffstat (limited to 'packages/enigma/enigma')
-rw-r--r-- | packages/enigma/enigma/epgfix_backport.diff | 135 | ||||
-rw-r--r-- | packages/enigma/enigma/subtitlefix_backport.diff | 171 | ||||
-rw-r--r-- | packages/enigma/enigma/timeshiftfix_backport.diff | 75 |
3 files changed, 381 insertions, 0 deletions
diff --git a/packages/enigma/enigma/epgfix_backport.diff b/packages/enigma/enigma/epgfix_backport.diff new file mode 100644 index 0000000000..2a1757244f --- /dev/null +++ b/packages/enigma/enigma/epgfix_backport.diff @@ -0,0 +1,135 @@ +--- enigma_org/include/lib/dvb/epgcache.h 9 Mar 2007 01:04:34 -0000 1.60 ++++ enigma/lib/dvb/epgcache.h 22 Oct 2007 15:14:52 -0000 +@@ -315,7 +315,7 @@ + + int state; + __u8 isRunning, firstStart, haveData; +- void FixOverlapping(std::pair<eventMap,timeMap> &, time_t, int, const timeMap::iterator &, const uniqueEPGKey &); ++ bool FixOverlapping(std::pair<eventMap,timeMap> &, time_t, int, const timeMap::iterator &, const uniqueEPGKey &); + int sectionRead(__u8 *data, int source); + static eEPGCache *instance; + +--- enigma_org/lib/dvb/epgcache.cpp 24 Feb 2007 16:03:12 -0000 1.100 ++++ enigma/lib/dvb/epgcache.cpp 22 Oct 2007 15:14:52 -0000 +@@ -325,7 +325,7 @@ + int sid = data[ptr++] << 8; + sid |= data[ptr++]; + +-// WORKAROUND for wrong transmitted epg data (01.08.2006) ++// WORKAROUND for wrong transmitted epg data (01.10.2007) + if ( onid == 0x85 ) + { + switch( (tsid << 16) | sid ) +@@ -336,6 +336,7 @@ + case 0x0300f5: sid = 0xdc; break; + case 0x0400d2: sid = 0xe2; tsid = 0x11; break; + case 0x1100d3: sid = 0xe3; break; ++ case 0x0100d4: sid = 0xe4; tsid = 4; break; + } + } + //////////////////////////////////////////// +@@ -448,8 +449,9 @@ + } + #endif // ENABLE_PRIVATE_EPG + +-void eEPGCache::FixOverlapping(std::pair<eventMap,timeMap> &servicemap, time_t TM, int duration, const timeMap::iterator &tm_it, const uniqueEPGKey &service) ++bool eEPGCache::FixOverlapping(std::pair<eventMap,timeMap> &servicemap, time_t TM, int duration, const timeMap::iterator &tm_it, const uniqueEPGKey &service) + { ++ bool ret = false; + timeMap::iterator tmp = tm_it; + while ((tmp->first+tmp->second->getDuration()-300) > TM) + { +@@ -464,6 +466,20 @@ + { + __u16 event_id = tmp->second->getEventID(); + servicemap.first.erase(event_id); ++#ifdef EPG_DEBUG ++ { ++ EITEvent evt((eit_event_struct *)tmp->second->get(), service.tsid<<16|service.onid); ++ char tmp[255]; ++ struct tm t; ++ localtime_r(&evt.start_time, &t); ++ snprintf(tmp, 255, "%08x(%d), %d seconds, %02d.%02d, %02d:%02d", ++ evt.event_id, evt.event_id, ++ evt.duration, ++ t.tm_mday, t.tm_mon+1, ++ t.tm_hour, t.tm_min); ++ eDebug("(1)erase no more used event %s", tmp); ++ } ++#endif + delete tmp->second; + if (tmp == servicemap.second.begin()) + { +@@ -472,6 +488,7 @@ + } + else + servicemap.second.erase(tmp--); ++ ret = true; + } + else + { +@@ -495,14 +512,30 @@ + { + __u16 event_id = tmp->second->getEventID(); + servicemap.first.erase(event_id); ++#ifdef EPG_DEBUG ++ { ++ EITEvent evt((eit_event_struct *)tmp->second->get(), service.tsid<<16|service.onid); ++ char tmp[255]; ++ struct tm t; ++ localtime_r(&evt.start_time, &t); ++ snprintf(tmp, 255, "%08x(%d), %d seconds, %02d.%02d, %02d:%02d", ++ evt.event_id, evt.event_id, ++ evt.duration, ++ t.tm_mday, t.tm_mon+1, ++ t.tm_hour, t.tm_min); ++ eDebug("(2)erase no more used event %s", tmp); ++ } ++#endif + delete tmp->second; + servicemap.second.erase(tmp++); ++ ret = true; + } + else + ++tmp; + if (tmp == servicemap.second.end()) + break; + } ++ return ret; + } + + int eEPGCache::sectionRead(__u8 *data, int source) +@@ -658,7 +691,11 @@ + eventData *tmp = ev_it->second; + ev_it->second = tm_it_tmp->second = + new eventData(eit_event, eit_event_size, source); +- FixOverlapping(servicemap, TM, duration, tm_it_tmp, service); ++ if (FixOverlapping(servicemap, TM, duration, tm_it_tmp, service)) ++ { ++ prevEventIt = servicemap.first.end(); ++ prevTimeIt = servicemap.second.end(); ++ } + delete tmp; + goto next; + } +@@ -730,8 +767,6 @@ + tm_it=prevTimeIt=servicemap.second.insert( prevTimeIt, std::pair<const time_t, eventData*>( TM, evt ) ); + } + +- FixOverlapping(servicemap, TM, duration, tm_it, service); +- + #if EPG_DEBUG + if ( consistencyCheck ) + { +@@ -751,6 +786,11 @@ + ev_it->first, event_id ); + } + #endif ++ if (FixOverlapping(servicemap, TM, duration, tm_it, service)) ++ { ++ prevEventIt = servicemap.first.end(); ++ prevTimeIt = servicemap.second.end(); ++ } + } + next: + #if EPG_DEBUG diff --git a/packages/enigma/enigma/subtitlefix_backport.diff b/packages/enigma/enigma/subtitlefix_backport.diff new file mode 100644 index 0000000000..d84f51383c --- /dev/null +++ b/packages/enigma/enigma/subtitlefix_backport.diff @@ -0,0 +1,171 @@ +diff -Naur enigma_org/lib/dvb/subtitle.cpp enigma/lib/dvb/subtitle.cpp +--- enigma_org/lib/dvb/subtitle.cpp 2005-08-02 22:35:36.000000000 +0200 ++++ enigma/lib/dvb/subtitle.cpp 2007-10-19 11:55:36.000000000 +0200 +@@ -337,6 +337,12 @@ + delete page->page_regions; + page->page_regions = p; + } ++ while (page->regions) ++ { ++ struct subtitle_region *p = page->regions->next; ++ delete page->regions; ++ page->regions = p; ++ } + } + + // eDebug("new page.. (%d)", page_state); +@@ -352,7 +358,14 @@ + // go to last entry + while (*r) + r = &(*r)->next; +- ++ ++ if (processed_length == segment_length && !page->page_regions) ++ { ++// eDebug("no regions in page.. clear screen!!"); ++ if (sub->screen_enabled) ++ subtitle_redraw_all(sub); ++ } ++ + while (processed_length < segment_length) + { + struct subtitle_page_region *pr; +@@ -763,20 +776,16 @@ + #if 1 + struct subtitle_page *page = sub->pages; + if ( page ) +- { +- struct subtitle_page_region *region = page->page_regions; +- if ( region ) +- subtitle_clear_screen(sub); +- } ++ subtitle_clear_screen(sub); + while(page) + { + subtitle_redraw(sub, page->page_id); + page = page->next; + } + #else +- subtitle_clear_screen(sub); +- + struct subtitle_page *page = sub->pages; ++ if ( page ) ++ subtitle_clear_screen(sub); + //eDebug("----------- end of display set"); + //eDebug("active pages:"); + while (page) +@@ -878,7 +887,6 @@ + return; + } + +- + //eDebug("iterating regions.."); + /* iterate all regions in this pcs */ + struct subtitle_page_region *region = page->page_regions; +@@ -902,20 +910,19 @@ + { + if (main_clut_id != clut_id) + { +-// eDebug("MULTIPLE CLUTS IN USE! prepare for pixelmuell!"); ++ eDebug("MULTIPLE CLUTS IN USE! prepare for pixelmuell!"); + // exit(0); + } + } + main_clut_id = clut_id; + +- +- //eDebug("copy region %d to %d, %d", region->region_id, region->region_horizontal_address, region->region_vertical_address); +- + int x0 = region->region_horizontal_address; + int y0 = region->region_vertical_address; + int x1 = x0 + reg->region_width; + int y1 = y0 + reg->region_height; +- ++ ++ //eDebug("copy region %d to %d, %d, size %d %d", region->region_id, x0, y0, x1, y1); ++ + if ((x0 < 0) || (y0 < 0) || (x0 > sub->screen_width) || (x0 > sub->screen_height)) + continue; + +diff -Naur enigma_org/lib/dvb/subtitling.cpp enigma/lib/dvb/subtitling.cpp +--- enigma_org/lib/dvb/subtitling.cpp 2005-08-02 22:35:36.000000000 +0200 ++++ enigma/lib/dvb/subtitling.cpp 2007-10-19 11:57:24.000000000 +0200 +@@ -67,26 +67,26 @@ + unsigned long long current = 0; + if (Decoder::getSTC(current)) + eDebug("bloed, going unsyced"); +- eDebug("DEMUX STC: %08llx\n", current); ++ eDebug("DEMUX STC: %08llx", current); + + unsigned long long pts = 0; + +- int enqueue = 0; +- +- if (!queue.empty()) +- enqueue = 1; +- else if (!extractPTS(pts, pkt)) ++ int enqueue = !queue.empty(); ++ ++ if (!extractPTS(pts, pkt)) + { +- eDebug("PES STC: %08llx\n", pts); ++ eDebug("PES STC: %08llx", pts); + signed long long int diff = pts - current; +- eDebug(" STC: %lld\n", diff); +- if (diff > 900000) // 10s +- { +- eDebug("rediculous high delay! showing now"); +- } else if (diff > 2000) ++ eDebug(" diff: %lld(%lldms)", diff, diff/90); ++ if (diff > 1800) + enqueue = 1; ++ else if (enqueue) // this should not happen !! ++ { ++ eDebug("showing instantly, diff small enough... but queue not empy!!!!"); ++ enqueue = 0; ++ } + else +- eDebug("showing instantly, diff small enough!"); ++ eDebug("showing instantly, diff small enough...!"); + } + + if (enqueue) +@@ -98,11 +98,15 @@ + memcpy(pes.pkt, pkt, len); + pes.len = len; + queue.push(pes); ++ eDebug("enqueue"); + if (wasempty) + { +- eDebug("setting timer to %d ms!\n", (pes.pts - current) / 90); ++ eDebug("setting timer to %lld ms!\n", (pes.pts - current) / 90); + timer.start((pes.pts - current) / 90, 1); + } ++ else ++ eDebug(""); ++ + return; + } + subtitle_process_pes(subtitle, pesbuffer, peslen); +@@ -155,13 +159,15 @@ + return; + } + +- eDebug("by the way, actual delay was %lld(%lld msek)\n", current - fpts, (current-fpts)/90 ); ++ eDebug("by the way, actual delay was %lld(%lld msek)", current - fpts, (current-fpts)/90 ); + +- if (queue.empty()) +- return; +- +- signed long long int diff = queue.front().pts - current; +- timer.start(diff / 90, 1); ++ if (!queue.empty()) { ++ signed long long int diff = queue.front().pts - current; ++ timer.start(diff / 90, 1); ++ eDebug("setting timer to %lld ms!\n", diff / 90); ++ } ++ else ++ eDebug(""); + } + + void eSubtitleWidget::gotData(int what) diff --git a/packages/enigma/enigma/timeshiftfix_backport.diff b/packages/enigma/enigma/timeshiftfix_backport.diff new file mode 100644 index 0000000000..d827fc945a --- /dev/null +++ b/packages/enigma/enigma/timeshiftfix_backport.diff @@ -0,0 +1,75 @@ +diff -Naur enigma_org/lib/dvb/decoder.cpp enigma/lib/dvb/decoder.cpp +--- enigma_org/lib/dvb/decoder.cpp 2006-11-12 22:35:31.000000000 +0100 ++++ enigma/lib/dvb/decoder.cpp 2007-10-19 01:10:21.000000000 +0200 +@@ -817,7 +817,7 @@ + { + int wasOpen = fd.mpeg != -1; + if ( !wasOpen ) +- fd.mpeg = ::open("/dev/video", O_WRONLY); ++ fd.mpeg = ::open("/dev/video", O_RDONLY); + { + if (::ioctl(fd.mpeg, VIDEO_FLUSH_CLIP_BUFFER) < 0) + eDebug("VIDEO_FLUSH_BUFFER failed (%m)"); +@@ -833,7 +833,7 @@ + { + int wasOpen = fd.mpeg != -1; + if ( !wasOpen ) +- fd.mpeg=::open("/dev/video", O_WRONLY); ++ fd.mpeg=::open("/dev/video", O_RDONLY); + if ( fd.mpeg > -1 ) + { + if ( ::ioctl(fd.mpeg, VIDEO_CLEAR_SCREEN) < 0 ) +@@ -878,7 +878,7 @@ + { + int wasOpen = fd.mpeg != -1; + if ( !wasOpen ) +- fd.mpeg = ::open("/dev/video", O_WRONLY); ++ fd.mpeg = ::open("/dev/video", O_RDONLY); + if ( fd.mpeg > -1 ) + { + if ( ::ioctl(fd.mpeg, VIDEO_SET_FASTZAP, val) < 0 ) +@@ -895,7 +895,7 @@ + { + int wasOpen = fd.mpeg != -1; + if ( !wasOpen ) +- fd.mpeg = ::open("/dev/video", O_WRONLY); ++ fd.mpeg = ::open("/dev/video", O_RDONLY); + if ( fd.mpeg > -1 ) + { + if ( ::ioctl(fd.mpeg, VIDEO_SET_AUTOFLUSH, on) < 0 ) +diff -Naur enigma_org/src/enigma_main.cpp enigma/src/enigma_main.cpp +--- enigma_org/src/enigma_main.cpp 2007-07-03 11:10:12.000000000 +0200 ++++ enigma/src/enigma_main.cpp 2007-10-19 11:48:20.000000000 +0200 +@@ -3038,17 +3038,25 @@ + { + if ( ref.type == eServiceReference::idDVB && !ref.path && !timeshift ) + { +- if (eSystemInfo::getInstance()->canTimeshift() && +- eSystemInfo::getInstance()->getHwType() != eSystemInfo::DM600PVR && +- eSystemInfo::getInstance()->getHwType() != eSystemInfo::DM500PLUS +- ) ++ if (eSystemInfo::getInstance()->canTimeshift()) + { + if (!eDVB::getInstance()->recorder) + { +- record(); ++ switch(eSystemInfo::getInstance()->getHwType()) ++ { ++ case eSystemInfo::DM600PVR: ++ case eSystemInfo::DM500PLUS: ++ Decoder::setAutoFlushScreen(0); ++ Decoder::Pause(2); // freeze frame ++ record(); ++ break; ++ default: ++ record(); ++ Decoder::setAutoFlushScreen(0); ++ Decoder::Pause(2); // freeze frame ++ break; ++ } + timeshift=1; +- Decoder::Pause(2); // freeze frame +- Decoder::setAutoFlushScreen(0); + handler->serviceCommand(eServiceCommand(eServiceCommand::cmdSetSpeed, -1)); + Decoder::setAutoFlushScreen(1); + } |