Common subdirectories: vdr-1.4.6-orig/PLUGINS and vdr-1.4.6/PLUGINS diff -u vdr-1.4.6-orig/device.h vdr-1.4.6/device.h --- vdr-1.4.6-orig/device.h 2007-06-19 10:42:07.000000000 +0300 +++ vdr-1.4.6/device.h 2007-06-19 10:43:33.000000000 +0300 @@ -452,6 +452,9 @@ ///< which is necessary for trick modes like 'fast forward'. ///< Data must point to one single, complete PES packet. public: +#define DEVICE_SUPPORTS_IBP_TRICKSPEED + virtual bool HasIBPTrickSpeed(void) { return false; } + ///< Returns true if this device can all frames in fast fwd trick speeds. virtual int64_t GetSTC(void); ///< Gets the current System Time Counter, which can be used to ///< synchronize audio and video. If this device is unable to Only in vdr-1.4.6: device.h.flc Only in vdr-1.4.6: device.h~ diff -u vdr-1.4.6-orig/dvbplayer.c vdr-1.4.6/dvbplayer.c --- vdr-1.4.6-orig/dvbplayer.c 2007-06-19 10:42:07.000000000 +0300 +++ vdr-1.4.6/dvbplayer.c 2007-06-19 10:51:19.000000000 +0300 @@ -400,7 +400,13 @@ uchar FileNumber; int FileOffset; bool TimeShiftMode = index->IsStillRecording(); - int Index = index->GetNextIFrame(readIndex, playDir == pdForward, &FileNumber, &FileOffset, &Length, TimeShiftMode); + int Index = -1; + if (DeviceHasIBPTrickSpeed() && playDir == pdForward) { + if (index->Get(readIndex+1, &FileNumber, &FileOffset, NULL, &Length)) + Index = readIndex+1; + } + else + Index = index->GetNextIFrame(readIndex, playDir == pdForward, &FileNumber, &FileOffset, &Length, TimeShiftMode); if (Index >= 0) { if (!NextFile(FileNumber, FileOffset)) continue; @@ -530,7 +536,8 @@ else { LOCK_THREAD; if (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward)) - Empty(); + if (!(DeviceHasIBPTrickSpeed() && playDir == pdForward)) + Empty(); DeviceFreeze(); playMode = pmPause; } @@ -541,7 +548,8 @@ if (playMode != pmPlay) { LOCK_THREAD; if (playMode == pmStill || playMode == pmFast || (playMode == pmSlow && playDir == pdBackward)) - Empty(); + if (!(DeviceHasIBPTrickSpeed() && playDir == pdForward)) + Empty(); DevicePlay(); playMode = pmPlay; playDir = pdForward; @@ -564,7 +572,8 @@ // run into pmPlay case pmPlay: { LOCK_THREAD; - Empty(); + if (! DeviceHasIBPTrickSpeed()) + Empty(); DeviceMute(); playMode = pmFast; playDir = pdForward; Only in vdr-1.4.6: dvbplayer.c.orig Only in vdr-1.4.6: dvbplayer.c~ Common subdirectories: vdr-1.4.6-orig/libsi and vdr-1.4.6/libsi diff -u vdr-1.4.6-orig/player.h vdr-1.4.6/player.h --- vdr-1.4.6-orig/player.h 2007-06-19 10:42:07.000000000 +0300 +++ vdr-1.4.6/player.h 2007-06-19 10:42:20.000000000 +0300 @@ -24,6 +24,7 @@ bool DeviceSetCurrentAudioTrack(eTrackType Type) { return device ? device->SetCurrentAudioTrack(Type) : false; } bool DevicePoll(cPoller &Poller, int TimeoutMs = 0) { return device ? device->Poll(Poller, TimeoutMs) : false; } bool DeviceFlush(int TimeoutMs = 0) { return device ? device->Flush(TimeoutMs) : true; } + bool DeviceHasIBPTrickSpeed(void) { return device ? device->HasIBPTrickSpeed() : false; } void DeviceTrickSpeed(int Speed) { if (device) device->TrickSpeed(Speed); } void DeviceClear(void) { if (device) device->Clear(); } void DevicePlay(void) { if (device) device->Play(); } Common subdirectories: vdr-1.4.6-orig/symbols and vdr-1.4.6/symbols