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 #include #include +#include +#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();