aboutsummaryrefslogtreecommitdiffstats
path: root/packages/enigma/enigma
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.ne>2007-10-22 15:54:08 +0000
committerFelix Domke <tmbinc@elitedvb.ne>2007-10-22 15:54:08 +0000
commitd9cb87ad509582ae4ae12dbaad242cfcb7e5a083 (patch)
treef1239870689cb2b0ee162050d2b05282db69c333 /packages/enigma/enigma
parent61987db8fb77c4fb84d55774454876b4c5646574 (diff)
downloadopenembedded-d9cb87ad509582ae4ae12dbaad242cfcb7e5a083.tar.gz
enigma: update
Diffstat (limited to 'packages/enigma/enigma')
-rw-r--r--packages/enigma/enigma/epgfix_backport.diff135
-rw-r--r--packages/enigma/enigma/subtitlefix_backport.diff171
-rw-r--r--packages/enigma/enigma/timeshiftfix_backport.diff75
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);
+ }