From 970622ccf294ce3ce34f230b163bf3ef9464019d Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Fri, 16 Jan 2009 14:27:22 +0100 Subject: [PATCH] The full-featured DVB cards are now given the TS data directly for replay --- CONTRIBUTORS | 2 ++ HISTORY | 8 +++++++- device.h | 11 +++++------ dvbdevice.c | 27 +++++---------------------- 4 files changed, 19 insertions(+), 29 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 7bc1b740..26674359 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -660,6 +660,8 @@ Oliver Endriss the call to cStatus::MsgSetVolume() for providing a driver patch that allows replaying TS->PES converted video in Transfer Mode + for providing a driver patch that allows direct replaying of TS video on full-featured + DVB cards Reinhard Walter Buchner for adding some satellites to 'sources.conf' diff --git a/HISTORY b/HISTORY index 9dd40649..2b26bc3c 100644 --- a/HISTORY +++ b/HISTORY @@ -5912,7 +5912,13 @@ Video Disk Recorder Revision History can handle DVB-S2. The #define is still there to allow people with older drivers who don't need DVB-S2 to use this version without pathcing. -2009-01-06: Version 1.7.4 +2009-01-16: Version 1.7.4 - Removed the '#define FE_CAN_2ND_GEN_MODULATION', since it was wrong and the flag is now in the driver, anyway. +- The full-featured DVB cards are now given the TS data directly for replay + (thanks to Oliver Endriss for enhancing the av7110 driver to make it replay + TS data). The patch from ftp://ftp.cadsoft.de/vdr/Developer/av7110_ts_replay__1.diff + implements this change in the driver. + The the patch av7110_v4ldvb_api5_audiobuf_test_1.diff mentioned in version 1.7.2 + is no longer necessary. diff --git a/device.h b/device.h index 7c4a7098..13a77e39 100644 --- a/device.h +++ b/device.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.h 2.4 2009/01/05 16:28:06 kls Exp $ + * $Id: device.h 2.5 2009/01/10 10:04:30 kls Exp $ */ #ifndef __DEVICE_H @@ -487,7 +487,7 @@ protected: ///< Plays the given data block as video. ///< Data points to exactly one complete PES packet of the given Length. ///< PlayVideo() shall process the packet either as a whole (returning - ///< Length) or not at all (returning 0 or -1 and setting 'errno' to EAGAIN). + ///< Length) or not at all (returning 0 or -1 and setting 'errno' accordingly). ///< \return Returns the number of bytes actually taken from Data, or -1 ///< in case of an error. virtual int PlayAudio(const uchar *Data, int Length, uchar Id); @@ -498,14 +498,14 @@ protected: ///< TS replay). Plugins that need to know this Id shall read it from the ///< actual PES data (it's the 4th byte). ///< PlayAudio() shall process the packet either as a whole (returning - ///< Length) or not at all (returning 0 or -1 and setting 'errno' to EAGAIN). + ///< Length) or not at all (returning 0 or -1 and setting 'errno' accordingly). ///< \return Returns the number of bytes actually taken from Data, or -1 ///< in case of an error. virtual int PlaySubtitle(const uchar *Data, int Length); ///< Plays the given data block as a subtitle. ///< Data points to exactly one complete PES packet of the given Length. ///< PlaySubtitle() shall process the packet either as a whole (returning - ///< Length) or not at all (returning 0 or -1 and setting 'errno' to EAGAIN). + ///< Length) or not at all (returning 0 or -1 and setting 'errno' accordingly). ///< \return Returns the number of bytes actually taken from Data, or -1 ///< in case of an error. virtual int PlayPesPacket(const uchar *Data, int Length, bool VideoOnly = false); @@ -610,8 +610,7 @@ public: ///< Returns -1 in case of error, otherwise the number of actually ///< processed bytes is returned, which must be Length. ///< PlayTs() shall process the packet either as a whole (returning - ///< a positive number, which needs not necessarily be Length) or not at all - ///< (returning 0 or -1 and setting 'errno' to EAGAIN). + ///< Length) or not at all returning 0 or -1 and setting 'errno' accordingly). bool Replaying(void) const; ///< Returns true if we are currently replaying. bool Transferring(void) const; diff --git a/dvbdevice.c b/dvbdevice.c index 3d4fddc9..56001917 100644 --- a/dvbdevice.c +++ b/dvbdevice.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbdevice.c 2.11 2009/01/06 16:54:52 kls Exp $ + * $Id: dvbdevice.c 2.12 2009/01/10 10:07:33 kls Exp $ */ #include "dvbdevice.h" @@ -1297,39 +1297,22 @@ bool cDvbDevice::Flush(int TimeoutMs) int cDvbDevice::PlayVideo(const uchar *Data, int Length) { - int w; - do { - w = WriteAllOrNothing(fd_video, Data, Length, 1000, 10); - if (w < 0 && errno == EAGAIN) { - cPoller Poller(fd_video, true); - Poller.Poll(200); - } - } while (w != Length); - return w; + return WriteAllOrNothing(fd_video, Data, Length, 1000, 10); } int cDvbDevice::PlayAudio(const uchar *Data, int Length, uchar Id) { - int w; - do { - w = WriteAllOrNothing(fd_audio, Data, Length, 1000, 10); - if (w < 0 && errno == EAGAIN) { - cPoller Poller(fd_audio, true); - Poller.Poll(200); - } - } while (w != Length); - return w; + return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10); } int cDvbDevice::PlayTsVideo(const uchar *Data, int Length) { - return cDevice::PlayTsVideo(Data, Length); + return WriteAllOrNothing(fd_video, Data, Length, 1000, 10); } int cDvbDevice::PlayTsAudio(const uchar *Data, int Length) { - int w = PlayAudio(Data, TsGetPayload(&Data), 0); - return w >= 0 ? Length : w; + return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10); } bool cDvbDevice::OpenDvr(void)