#!/bin/sh debian/patches/dpatch.sh ## jumpplay patch - version 0.5 for vdr-1.2.x - see README.jumpplay for details ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: Play after jump to next mark. Automatically jump over commercial breaks. @DPATCH@ diff -Naur old/README.jumpplay new/README.jumpplay --- old/README.jumpplay Thu Jan 1 01:00:00 1970 +++ new/README.jumpplay Sat Aug 21 14:45:35 2004 @@ -0,0 +1,74 @@ +JumpPlay patch for VDR +---------------------- + +This patch changes the replay behaviour for recordings that contain editing +marks. It allows to immediately continue the replay after jumping forward to +the next mark, and to automatically jump over the commercial break to the next +"start" mark, if an "end" mark is reached. + +The features of this patch can be turned on or off with the following entries +in the replay setup. + + +* Parameters in the "Setup" menu "Replay" + + Jump&Play = yes|no Turns playing on or off after jumping forward to the + next editing mark with the '9' key. + + Play&Jump = yes|no Turns automatic jumping over commercial breaks on or + off. This includes jumping to the first mark, if the + replay starts at the beginning of a recording - and + stopping the replay at the last mark. + With this setting enabled, the behaviour of the '8' + key during replay is changed too. It moves the actual + replay position not only three seconds before the + next "start" mark, but also before the next "end" + mark. This can be used to test, if the editing marks + are correctly positioned for a "smooth" jump over a + commercial break. + + +* History + + 2003-07-04: jumpandrun.diff - the Noad + Jump&Play + + 2003-12-06: Version 0.0 - Torsten Kunkel + Play&Jump (only if progressbar is visible) + Setup parameters Jump&Play and Play&Jump in the replay setup + + 2004-01-20: Version 0.1 - Thomas Günther + Jump&Play: + - fixed speed after jump + - fixed removing of marks + Play&Jump: + - jump only on "end" marks + + 2004-01-27: Version 0.2 - Thomas Günther + Jump&Play: + - fixed double jump + Play&Jump: + - fixed mark detection: fuzzy detection (until 3 seconds after mark) + - jump without progressbar + - mode "progressbar only" for old behaviour + + 2004-01-31: Version 0.3 - Thomas Günther + Jump&Play: + - fixed display frames + Play&Jump: + - fixed end of playing at last mark + + 2004-07-11: Version 0.4 - Thomas Günther + Jump&Play: + - don't play after jump to end + Play&Jump: + - don't prevent jumping after hide or show + Less conflicts with other patches (Elchi/AutoPID) + + 2004-08-21: Version 0.5 - Thomas Günther + Play&Jump: + - exact jumps, replay like edited recording (no fuzzy mark detection) + - jump to first mark if replay starts at the beginning + - check jump marks with '8' key + - mode "progressbar only" removed + Description in README.jumpplay diff -Naur old/config.c new/config.c --- old/config.c Fri Oct 17 16:11:27 2003 +++ new/config.c Sat Aug 21 14:48:50 2004 @@ -284,6 +284,8 @@ MultiSpeedMode = 0; ShowReplayMode = 0; ResumeID = 0; + JumpPlay = 0; + PlayJump = 0; memset(CaCaps, sizeof(CaCaps), 0); CurrentChannel = -1; CurrentVolume = MAXVOLUME; @@ -436,6 +438,8 @@ else if (!strcasecmp(Name, "MultiSpeedMode")) MultiSpeedMode = atoi(Value); else if (!strcasecmp(Name, "ShowReplayMode")) ShowReplayMode = atoi(Value); else if (!strcasecmp(Name, "ResumeID")) ResumeID = atoi(Value); + else if (!strcasecmp(Name, "JumpPlay")) JumpPlay = atoi(Value); + else if (!strcasecmp(Name, "PlayJump")) PlayJump = atoi(Value); else if (!strcasecmp(Name, "CaCaps")) return ParseCaCaps(Value); else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value); else if (!strcasecmp(Name, "CurrentVolume")) CurrentVolume = atoi(Value); @@ -486,6 +490,8 @@ Store("MultiSpeedMode", MultiSpeedMode); Store("ShowReplayMode", ShowReplayMode); Store("ResumeID", ResumeID); + Store("JumpPlay", JumpPlay); + Store("PlayJump", PlayJump); StoreCaCaps("CaCaps"); Store("CurrentChannel", CurrentChannel); Store("CurrentVolume", CurrentVolume); diff -Naur old/config.h new/config.h --- old/config.h Fri Nov 14 14:29:13 2003 +++ new/config.h Fri Aug 20 15:22:40 2004 @@ -237,6 +237,8 @@ int MultiSpeedMode; int ShowReplayMode; int ResumeID; + int JumpPlay; + int PlayJump; int CaCaps[MAXDEVICES][MAXCACAPS]; int CurrentChannel; int CurrentVolume; diff -Naur old/dvbplayer.c new/dvbplayer.c --- old/dvbplayer.c Sat May 24 11:04:26 2003 +++ new/dvbplayer.c Sat Aug 21 14:42:35 2004 @@ -186,6 +186,7 @@ cNonBlockingFileReader *nonBlockingFileReader; cRingBufferFrame *ringBuffer; cBackTrace *backTrace; + cMarks *marks; cFileName *fileName; cIndexFile *index; int replayFile; @@ -211,7 +212,7 @@ virtual void Activate(bool On); virtual void Action(void); public: - cDvbPlayer(const char *FileName); + cDvbPlayer(const char *FileName, cMarks *Marks = NULL); virtual ~cDvbPlayer(); bool Active(void) { return active; } void Pause(void); @@ -234,7 +235,7 @@ #define SPEED_MULT 12 // the speed multiplier int cDvbPlayer::Speeds[] = { 0, -2, -4, -8, 1, 2, 4, 12, 0 }; -cDvbPlayer::cDvbPlayer(const char *FileName) +cDvbPlayer::cDvbPlayer(const char *FileName, cMarks *Marks) { nonBlockingFileReader = NULL; ringBuffer = NULL; @@ -267,6 +268,7 @@ index = NULL; } backTrace = new cBackTrace; + marks = Marks; } cDvbPlayer::~cDvbPlayer() @@ -410,11 +412,24 @@ uchar *b = NULL; uchar *p = NULL; int pc = 0; + bool cutIn = false; readIndex = Resume(); if (readIndex >= 0) isyslog("resuming replay at index %d (%s)", readIndex, IndexToHMSF(readIndex, true)); + if (Setup.PlayJump && readIndex <= 0 && marks->First() && index) { + int Index = marks->First()->position; + uchar FileNumber; + int FileOffset; + if (index->Get(Index, &FileNumber, &FileOffset) && + NextFile(FileNumber, FileOffset)) { + isyslog("PlayJump: start replay at first mark %d (%s)", + Index, IndexToHMSF(Index, true)); + readIndex = Index; + } + } + nonBlockingFileReader = new cNonBlockingFileReader; int Length = 0; int AudioTrack = 0; // -1 = any, 0 = none, >0 = audioTrack @@ -457,6 +472,26 @@ uchar FileNumber; int FileOffset; readIndex++; + if (Setup.PlayJump && marks) { + // check for end mark - jump to next start mark + cMark *m = marks->Get(readIndex); + if (m && (m->Index() & 0x01) != 0) { + m = marks->Next(m); + int Index; + if (m) + Index = m->position; + else // on last mark jump to end of recording + Index = index->Last() - 1; + // don't jump in edited recordings + if (Index > index->GetNextIFrame(readIndex, true)) { + isyslog("PlayJump: %d frames to %d (%s)", + Index - readIndex, Index, + IndexToHMSF(Index, true)); + readIndex = Index; + cutIn = true; + } + } + } if (!(index->Get(readIndex, &FileNumber, &FileOffset, NULL, &Length) && NextFile(FileNumber, FileOffset))) { readIndex = -1; eof = true; @@ -497,6 +532,10 @@ // Store the frame in the buffer: if (readFrame) { + if (cutIn) { + cRemux::SetBrokenLink(readFrame->Data(), readFrame->Count()); + cutIn = false; + } if (ringBuffer->Put(readFrame)) readFrame = NULL; } @@ -788,6 +827,11 @@ cDvbPlayerControl::cDvbPlayerControl(const char *FileName) :cControl(player = new cDvbPlayer(FileName)) +{ +} + +cDvbPlayerControl::cDvbPlayerControl(const char *FileName, cMarks *Marks) +:cControl(player = new cDvbPlayer(FileName, Marks)) { } diff -Naur old/dvbplayer.h new/dvbplayer.h --- old/dvbplayer.h Sun Jun 23 12:13:51 2002 +++ new/dvbplayer.h Fri Aug 20 15:17:35 2004 @@ -20,6 +20,7 @@ cDvbPlayer *player; public: cDvbPlayerControl(const char *FileName); + cDvbPlayerControl(const char *FileName, cMarks *Marks); // Sets up a player for the given file. virtual ~cDvbPlayerControl(); bool Active(void); diff -Naur old/i18n.c new/i18n.c --- old/i18n.c Thu Sep 11 15:51:56 2003 +++ new/i18n.c Fri Aug 20 15:25:18 2004 @@ -2612,6 +2612,40 @@ "Lejátszás ID", "ID de Continuar", }, + { "Setup.Replay$Jump&Play", + "Wiedergabe nach Sprung", + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "", // Suomi + "", // Polski + "", // Español + "", // Greek + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català + }, + { "Setup.Replay$Play&Jump", + "Sprung bei Schnittmarke", + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "", // Suomi + "", // Polski + "", // Español + "", // Greek + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català + }, { "Setup.Miscellaneous$Min. event timeout (min)", "Mindest Event Pause (min)", "Najmanjsi cas dogodka (min)", diff -Naur old/menu.c new/menu.c --- old/menu.c Fri Oct 3 16:36:20 2003 +++ new/menu.c Fri Aug 20 15:27:04 2004 @@ -2242,6 +2242,8 @@ Add(new cMenuEditBoolItem(tr("Setup.Replay$Multi speed mode"), &data.MultiSpeedMode)); Add(new cMenuEditBoolItem(tr("Setup.Replay$Show replay mode"), &data.ShowReplayMode)); Add(new cMenuEditIntItem(tr("Setup.Replay$Resume ID"), &data.ResumeID, 0, 99)); + Add(new cMenuEditBoolItem(tr("Setup.Replay$Jump&Play"), &data.JumpPlay)); + Add(new cMenuEditBoolItem(tr("Setup.Replay$Play&Jump"), &data.PlayJump)); } // --- cMenuSetupMisc -------------------------------------------------------- @@ -3280,7 +3282,7 @@ char *cReplayControl::title = NULL; cReplayControl::cReplayControl(void) -:cDvbPlayerControl(fileName) +:cDvbPlayerControl(fileName, &marks) { visible = modeOnly = shown = displayFrames = false; lastCurrent = lastTotal = -1; @@ -3534,8 +3536,10 @@ ShowTimed(2); bool Play, Forward; int Speed; - if (GetReplayMode(Play, Forward, Speed) && !Play) + if (GetReplayMode(Play, Forward, Speed) && !Play) { Goto(Current, true); + displayFrames = true; + } } marks.Save(); } @@ -3547,10 +3551,20 @@ int Current, Total; if (GetIndex(Current, Total)) { cMark *m = Forward ? marks.GetNext(Current) : marks.GetPrev(Current); - if (m) - Goto(m->position, true); + if (m) { + bool Play2, Forward2; + int Speed; + if (Setup.JumpPlay && GetReplayMode(Play2, Forward2, Speed) && + Play2 && Forward && m->position < Total - SecondsToFrames(3)) { + Goto(m->position); + Play(); + } + else { + Goto(m->position, true); + displayFrames = true; + } + } } - displayFrames = true; } } @@ -3603,7 +3617,7 @@ if (!m) m = marks.GetNext(Current); if (m) { - if ((m->Index() & 0x01) != 0) + if ((m->Index() & 0x01) != 0 && !Setup.PlayJump) m = marks.Next(m); if (m) { Goto(m->position - SecondsToFrames(3));