The full-featured DVB cards are now given the TS data directly for replay

This commit is contained in:
Klaus Schmidinger 2009-01-16 14:27:22 +01:00
parent 60c5248a36
commit 970622ccf2
4 changed files with 19 additions and 29 deletions

View File

@ -660,6 +660,8 @@ Oliver Endriss <o.endriss@gmx.de>
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 <rw.buchner@freenet.de>
for adding some satellites to 'sources.conf'

View File

@ -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.

View File

@ -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;

View File

@ -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)