summaryrefslogtreecommitdiff
path: root/VDR-1.3.5.patch
diff options
context:
space:
mode:
Diffstat (limited to 'VDR-1.3.5.patch')
-rw-r--r--VDR-1.3.5.patch251
1 files changed, 251 insertions, 0 deletions
diff --git a/VDR-1.3.5.patch b/VDR-1.3.5.patch
new file mode 100644
index 0000000..8a1a32c
--- /dev/null
+++ b/VDR-1.3.5.patch
@@ -0,0 +1,251 @@
+diff -upr ./DIST/Makefile ./Makefile
+--- ./DIST/Makefile 2004-01-18 15:16:53.000000000 +0100
++++ ./Makefile 2004-03-01 05:19:59.000000000 +0100
+@@ -37,7 +37,8 @@ OBJS = audio.o channels.o ci.o config.o
+ dvbplayer.o dvbspu.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
+ lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o rcu.o\
+ receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o sources.o\
+- spu.o status.o svdrp.o thread.o timers.o tools.o transfer.o vdr.o videodir.o
++ spu.o status.o svdrp.o thread.o timers.o tools.o transfer.o vdr.o videodir.o\
++ vdrttxtsubshooks.o
+
+ FIXFONT_ISO8859_1 = -adobe-courier-bold-r-normal--25-*-100-100-m-*-iso8859-1
+ OSDFONT_ISO8859_1 = -adobe-helvetica-medium-r-normal--23-*-100-100-p-*-iso8859-1
+diff -upr ./DIST/dvbplayer.c ./dvbplayer.c
+--- ./DIST/dvbplayer.c 2003-10-18 13:31:54.000000000 +0200
++++ ./dvbplayer.c 2004-03-01 05:18:15.000000000 +0100
+@@ -14,6 +14,7 @@
+ #include "ringbuffer.h"
+ #include "thread.h"
+ #include "tools.h"
++#include "vdrttxtsubshooks.h"
+
+ // --- cBackTrace ----------------------------------------------------------
+
+@@ -323,6 +324,12 @@ void cDvbPlayer::StripAudioPackets(uchar
+ int l = b[i + 4] * 256 + b[i + 5] + 6;
+ switch (c) {
+ case 0xBD: // dolby
++#ifdef VDRTTXTSUBSHOOKS
++ if (b[i + 8] == 0x24 && b[i + 45] >= 0x10 && b[i + 45] < 0x20) {
++ break; // run these through the ring buffer to get somewhat correct
++ // timing for the subtitles
++ } else
++#endif
+ if (Except)
+ PlayAudio(&b[i], l);
+ // continue with deleting the data - otherwise it disturbs DVB replay
+@@ -349,6 +356,40 @@ void cDvbPlayer::StripAudioPackets(uchar
+ }
+ }
+
++#ifdef VDRTTXTSUBSHOOKS
++static void StripTtxtPackets(uchar *b, int Length)
++{
++ for (int i = 0; i < Length - 6; i++) {
++ if (b[i] == 0x00 && b[i + 1] == 0x00 && b[i + 2] == 0x01) {
++ uchar c = b[i + 3];
++ int l = b[i + 4] * 256 + b[i + 5] + 6;
++ switch (c) {
++ case 0xBD: // dolby
++ {
++ if (b[i + 8] == 0x24 && b[i + 45] >= 0x10 && b[i + 45] < 0x20) {
++ // EBU Teletext data, ETSI EN 300 472
++ cVDRTtxtsubsHookListener::Hook()->PlayerTeletextData(&b[i], l);
++ }
++ // continue with deleting the data - otherwise it disturbs DVB replay
++ int n = l;
++ for (int j = i; j < Length && n--; j++)
++ b[j] = 0x00;
++ break;
++ }
++ default:
++ break;
++ }
++ if (l)
++ i += l - 1; // the loop increments, too!
++ }
++ /*XXX
++ else
++ esyslog("ERROR: broken packet header");
++ XXX*/
++ }
++}
++#endif
++
+ bool cDvbPlayer::NextFile(uchar FileNumber, int FileOffset)
+ {
+ if (FileNumber > 0)
+@@ -522,6 +563,11 @@ void cDvbPlayer::Action(void)
+ StripAudioPackets(p, pc, AudioTrack);
+ }
+ }
++#ifdef VDRTTXTSUBSHOOKS
++ // pick out the teletext packets here
++ if(p)
++ StripTtxtPackets((uchar *) p, pc);
++#endif
+ if (p) {
+ int w = PlayVideo(p, pc);
+ if (w > 0) {
+diff -upr ./DIST/menu.c ./menu.c
+--- ./DIST/menu.c 2004-02-29 15:11:16.000000000 +0100
++++ ./menu.c 2004-03-01 05:18:15.000000000 +0100
+@@ -3104,8 +3104,18 @@ cRecordControl::cRecordControl(cDevice *
+ isyslog("record %s", fileName);
+ if (MakeDirs(fileName, true)) {
+ const cChannel *ch = timer->Channel();
++#ifdef VDRTTXTSUBSHOOKS
++ cTtxtSubsRecorderBase *subsRecorder = cVDRTtxtsubsHookListener::Hook()
++ ->NewTtxtSubsRecorder(device, ch);
++ recorder = new cRecorder(fileName, ch->Ca(), timer->Priority(), ch->Vpid(), ch->Apid1(), ch->Apid2(), ch->Dpid1(), ch->Dpid2(), subsRecorder);
++#else
+ recorder = new cRecorder(fileName, ch->Ca(), timer->Priority(), ch->Vpid(), ch->Apid1(), ch->Apid2(), ch->Dpid1(), ch->Dpid2());
++#endif
+ if (device->AttachReceiver(recorder)) {
++#ifdef VDRTTXTSUBSHOOKS
++ if(subsRecorder)
++ subsRecorder->DeviceAttach();
++#endif
+ Recording.WriteSummary();
+ cStatus::MsgRecording(device, Recording.Name());
+ if (!Timer && !cReplayControl::LastReplayed()) // an instant recording, maybe from cRecordControls::PauseLiveVideo()
+diff -upr ./DIST/menu.h ./menu.h
+--- ./DIST/menu.h 2004-02-15 15:11:28.000000000 +0100
++++ ./menu.h 2004-03-01 05:18:15.000000000 +0100
+@@ -15,6 +15,7 @@
+ #include "epg.h"
+ #include "osd.h"
+ #include "dvbplayer.h"
++#include "vdrttxtsubshooks.h"
+ #include "recorder.h"
+ #include "recording.h"
+
+diff -upr ./DIST/osd.c ./osd.c
+--- ./DIST/osd.c 2003-06-04 18:13:00.000000000 +0200
++++ ./osd.c 2004-03-01 05:18:15.000000000 +0100
+@@ -12,6 +12,7 @@
+ #include "device.h"
+ #include "i18n.h"
+ #include "status.h"
++#include "vdrttxtsubshooks.h"
+
+ // --- cOsd ------------------------------------------------------------------
+
+@@ -62,6 +63,10 @@ void cOsd::SetColor(eDvbColor colorFg, e
+
+ cOsdBase *cOsd::OpenRaw(int x, int y)
+ {
++#ifdef VDRTTXTSUBSHOOKS
++ // OSD_HOOK_2 - Information to Checkpatch.sh
++ cVDRTtxtsubsHookListener::Hook()->HideOSD();
++#endif
+ #ifdef DEBUG_OSD
+ return NULL;
+ #else
+@@ -138,6 +143,9 @@ void cOsd::Close(void)
+ delete osd;
+ osd = NULL;
+ #endif
++#ifdef VDRTTXTSUBSHOOKS
++ cVDRTtxtsubsHookListener::Hook()->ShowOSD();
++#endif
+ }
+
+ void cOsd::Clear(void)
+diff -upr ./DIST/recorder.c ./recorder.c
+--- ./DIST/recorder.c 2003-10-18 13:35:02.000000000 +0200
++++ ./recorder.c 2004-03-01 05:18:15.000000000 +0100
+@@ -10,6 +10,8 @@
+ #include <stdarg.h>
+ #include <stdio.h>
+ #include <unistd.h>
++#include <stdint.h>
++#include "vdrttxtsubshooks.h"
+ #include "recorder.h"
+
+ // The size of the array used to buffer video data:
+@@ -23,7 +25,11 @@
+ #define MINFREEDISKSPACE (512) // MB
+ #define DISKCHECKINTERVAL 100 // seconds
+
++#ifdef VDRTTXTSUBSHOOKS
++cRecorder::cRecorder(const char *FileName, int Ca, int Priority, int VPid, int APid1, int APid2, int DPid1, int DPid2, cTtxtSubsRecorderBase *tsr)
++#else
+ cRecorder::cRecorder(const char *FileName, int Ca, int Priority, int VPid, int APid1, int APid2, int DPid1, int DPid2)
++#endif
+ :cReceiver(Ca, Priority, 5, VPid, APid1, APid2, DPid1, DPid2)
+ ,cThread("recording")
+ {
+@@ -35,6 +41,9 @@ cRecorder::cRecorder(const char *FileNam
+ fileSize = 0;
+ active = false;
+ lastDiskSpaceCheck = time(NULL);
++#ifdef VDRTTXTSUBSHOOKS
++ ttxtSubsRecorder = tsr;
++#endif
+
+ // Make sure the disk is up and running:
+
+@@ -56,6 +65,10 @@ cRecorder::cRecorder(const char *FileNam
+ cRecorder::~cRecorder()
+ {
+ Detach();
++#ifdef VDRTTXTSUBSHOOKS
++ if(ttxtSubsRecorder)
++ delete ttxtSubsRecorder;
++#endif
+ delete index;
+ delete fileName;
+ delete remux;
+@@ -128,6 +141,19 @@ void cRecorder::Action(void)
+ break;
+ }
+ fileSize += Result;
++#ifdef VDRTTXTSUBSHOOKS
++ // not sure if the pictureType test is needed, but it seems we can get
++ // incomplete pes packets from remux if we are not getting pictures?
++ if (ttxtSubsRecorder && pictureType != NO_PICTURE) {
++ uint8_t *subsp;
++ size_t len;
++ if(ttxtSubsRecorder->GetPacket(&subsp, &len)) {
++ safe_write(recordFile, subsp, len);
++ fileSize += len;
++ // fprintf(stderr, "cRecorder::Action: Wrote ttxtsubs data len %d\n", len); // XXX
++ }
++ }
++#endif
+ }
+ else
+ break;
+diff -upr ./DIST/recorder.h ./recorder.h
+--- ./DIST/recorder.h 2002-06-08 11:35:03.000000000 +0200
++++ ./recorder.h 2004-03-01 05:18:15.000000000 +0100
+@@ -15,6 +15,7 @@
+ #include "remux.h"
+ #include "ringbuffer.h"
+ #include "thread.h"
++#include "vdrttxtsubshooks.h"
+
+ class cRecorder : public cReceiver, cThread {
+ private:
+@@ -29,12 +30,19 @@ private:
+ time_t lastDiskSpaceCheck;
+ bool RunningLowOnDiskSpace(void);
+ bool NextFile(void);
++#ifdef VDRTTXTSUBSHOOKS
++ cTtxtSubsRecorderBase *ttxtSubsRecorder;
++#endif
+ protected:
+ virtual void Activate(bool On);
+ virtual void Receive(uchar *Data, int Length);
+ virtual void Action(void);
+ public:
++#ifdef VDRTTXTSUBSHOOKS
++ cRecorder(const char *FileName, int Ca, int Priority, int VPid, int APid1, int APid2, int DPid1, int DPid2, cTtxtSubsRecorderBase *tsr);
++#else
+ cRecorder(const char *FileName, int Ca, int Priority, int VPid, int APid1, int APid2, int DPid1, int DPid2);
++#endif
+ // Creates a new recorder that requires conditional access Ca, has
+ // the given Priority and will record the given PIDs into the file FileName.
+ virtual ~cRecorder();