summaryrefslogtreecommitdiff
path: root/device.c
diff options
context:
space:
mode:
authorphintuka <phintuka>2010-02-10 18:44:06 +0000
committerphintuka <phintuka>2010-02-10 18:44:06 +0000
commitf5783339fa3dca633a4b7a809be3d8e8f90eeedd (patch)
treee2647670e4596a5d4d711d1d6824bf7425ce37d3 /device.c
parentccfc1fbef780a31af53a77e2fb9dc4ffef45df15 (diff)
downloadxineliboutput-f5783339fa3dca633a4b7a809be3d8e8f90eeedd.tar.gz
xineliboutput-f5783339fa3dca633a4b7a809be3d8e8f90eeedd.tar.bz2
New backward trick speed mode for vdr-1.7.5+
Diffstat (limited to 'device.c')
-rw-r--r--device.c41
1 files changed, 36 insertions, 5 deletions
diff --git a/device.c b/device.c
index 4038e776..a8029cf7 100644
--- a/device.c
+++ b/device.c
@@ -4,7 +4,7 @@
* See the main source file 'xineliboutput.c' for copyright information and
* how to reach the author.
*
- * $Id: device.c,v 1.95 2010-02-07 22:43:01 rofafor Exp $
+ * $Id: device.c,v 1.96 2010-02-10 18:44:06 phintuka Exp $
*
*/
@@ -671,9 +671,13 @@ bool cXinelibDevice::SetPlayMode(ePlayMode PlayMode)
// m_TrickSpeedMode flags
#define trs_IPB_frames 0x01 // stream has all frame types
#define trs_I_frames 0x02 // stream has only I-frames
-#define trs_PTS_recalc 0x04 // PTS must be re-calculated
#define trs_NoAudio 0x08 // no audio in trick speed mode
-#define trs_PTS_check 0x80 // detect in PlayVideo if PTS must be recalculated
+#if VDRVERSNUM < 10705
+#define trs_PTS_recalc 0x10 // PTS must be re-calculated
+#define trs_PTS_check 0x20 // detect in PlayVideo if PTS must be recalculated
+#else
+#define trs_Backward 0x40 // palying backwards -- same as regen pts ???
+#endif
void cXinelibDevice::TrickSpeed(int Speed)
{
@@ -718,31 +722,55 @@ void cXinelibDevice::TrickSpeed(int Speed)
// ForEach(m_clients, &cXinelibThread::Clear);
//}
+#if VDRVERSNUM < 10705
// only I-frames, backwards, pts must be re-generated
m_TrickSpeedMode = trs_I_frames | trs_PTS_recalc | trs_NoAudio;
// change decoder and UDP/RTP scheduler clock rates
ForEach(m_clients, &cXinelibThread::TrickSpeed, RealSpeed);
+#else
+ m_TrickSpeedMode = trs_I_frames | trs_Backward | trs_NoAudio;
+ ForEach(m_clients, &cXinelibThread::TrickSpeed, RealSpeed, true);
+#endif
}
else if(Speed == 6 || Speed == 3 || Speed == 1) {
RealSpeed = 12/Speed;
LOGTRICKSPEED(" Fast (%dx speed), direction unknown", RealSpeed);
+ if (m_StreamStart) {
+ LOGTRICKSPEED(" Fast (%dx speed), STREAM START --> BACKWARDS", RealSpeed);
+ }
+
if(RealSpeed > xc.max_trickspeed) {
RealSpeed = xc.max_trickspeed;
LOGTRICKSPEED(" Trick speed limited to %dx speed", RealSpeed);
}
+#if VDRVERSNUM < 10705
/* only I-frames, backwards, pts must be re-generated if playing backwards */
m_TrickSpeedMode |= trs_PTS_check;
/* backward/forward state is unknown until first PTS is seen
so, clear() must be done in PlayVideo. */
/* previous trick speed state is not overwritten yet ... ! */
-
+
// change decoder and UDP/RTP scheduler clock rates
ForEach(m_clients, &cXinelibThread::TrickSpeed, -RealSpeed);
+#else
+ if (m_StreamStart || (m_TrickSpeedMode & trs_Backward)) {
+ m_TrickSpeedMode |= trs_I_frames | trs_Backward | trs_NoAudio;
+
+ ForEach(m_clients, &cXinelibThread::TrickSpeed, -RealSpeed, true);
+ ForEach(m_clients, &cXinelibThread::Sync);
+
+ } else {
+
+ m_TrickSpeedMode |= trs_IPB_frames;
+
+ ForEach(m_clients, &cXinelibThread::TrickSpeed, -RealSpeed);
+ }
+#endif
}
else if(Speed==-1 || Speed == 0) {
@@ -765,13 +793,16 @@ void cXinelibDevice::TrickSpeed(int Speed)
// LOGMSG(" -> Clear");
// ForEach(m_clients, &cXinelibThread::Clear);
//}
+
m_TrickSpeedMode = 0;
- }
+ }
else {
LOGTRICKSPEED(" Unknown trickspeed %d !", Speed);
+
m_TrickSpeedMode = 0;
m_TrickSpeed = -1;
+
ForEach(m_clients, &cXinelibThread::TrickSpeed, -1);
}
}