From 7e0ffb04996b7e905b0357d20c9113a24c42e9cd Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sat, 12 Feb 2005 13:52:35 +0100 Subject: [PATCH] Removed the "Cleared/PlayPes(NULL, 0)" handling from cTransfer::Action(); Making sure the buffer reserve in cTransfer::Action() is re-established after clearing the buffer --- CONTRIBUTORS | 2 ++ HISTORY | 4 ++++ transfer.c | 29 +++++++++++++++-------------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 0260a40b..9bc892c7 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1138,6 +1138,8 @@ Marco Schl for adding CMD_SPU_CHG_COLCON to cDvbSpuDecoder::setTime() for suggesting to force a new resync after a call to cRemux::Clear() for suggestions that led to the addition of the 'Id' parameter to cAudio::Play(). + for removing the "Cleared/PlayPes(NULL, 0)" handling from cTransfer::Action(), since + this is now done when attaching the player to the device Jürgen Schmitz for reporting a bug in displaying the current channel when switching via the SVDRP diff --git a/HISTORY b/HISTORY index eaf01f6b..30e49dd5 100644 --- a/HISTORY +++ b/HISTORY @@ -3392,3 +3392,7 @@ Video Disk Recorder Revision History the function the substream id of the given audio packet, so that a plugin can take the right action for the various kinds if audio data (based on suggestions by Werner Fink and Macro Schlüßler). +- Removed the "Cleared/PlayPes(NULL, 0)" handling from cTransfer::Action(), since this + is now done when attaching the player to the device (thanks to Marco Schlüßler). +- Making sure the buffer reserve in cTransfer::Action() is re-established after + clearing the buffer. diff --git a/transfer.c b/transfer.c index b3cbec45..9dd91497 100644 --- a/transfer.c +++ b/transfer.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: transfer.c 1.25 2005/01/23 14:27:40 kls Exp $ + * $Id: transfer.c 1.26 2005/02/12 13:51:21 kls Exp $ */ #include "transfer.h" @@ -61,17 +61,12 @@ void cTransfer::Action(void) int Result = 0; #define FW_NEEDS_BUFFER_RESERVE_FOR_AC3 #ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3 - bool Cleared = false; bool GotBufferReserve = false; #endif active = true; while (active) { #ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3 - if (needsBufferReserve) { - if (IsAttached() && !Cleared) { - PlayPes(NULL, 0); - Cleared = true; - } + if (needsBufferReserve && !GotBufferReserve) { //XXX For dolby we've to fill the buffer because the firmware does //XXX not decode dolby but use a PCM stream for transport, therefore //XXX the firmware has not enough buffer for noiseless skipping early @@ -79,14 +74,12 @@ void cTransfer::Action(void) //XXX audio is mostly to early in comparison to video). //XXX To resolve this, the remuxer or PlayPes() should synchronize //XXX audio with the video frames. 2004/09/09 Werner - if (!GotBufferReserve) { - if (ringBuffer->Available() < 3 * KILOBYTE(192) / 2) { // used to be MAXFRAMESIZE, but the HDTV value of KILOBYTE(512) is way too much here - cCondWait::SleepMs(20); // allow the buffer to collect some reserve - continue; - } - else - GotBufferReserve = true; + if (ringBuffer->Available() < 3 * KILOBYTE(192) / 2) { // used to be MAXFRAMESIZE, but the HDTV value of KILOBYTE(512) is way too much here + cCondWait::SleepMs(20); // allow the buffer to collect some reserve + continue; } + else + GotBufferReserve = true; } #endif int Count; @@ -98,10 +91,14 @@ void cTransfer::Action(void) // So let's clear the buffer instead of suffering from permanent // overflows. dsyslog("clearing transfer buffer to avoid overflows"); + DeviceClear(); ringBuffer->Clear(); remux->Clear(); PlayPes(NULL, 0); p = NULL; +#ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3 + GotBufferReserve = false; +#endif continue; } Count = remux->Put(b, Count); @@ -132,7 +129,11 @@ void cTransfer::Action(void) DeviceClear(); ringBuffer->Clear(); remux->Clear(); + PlayPes(NULL, 0); p = NULL; +#ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3 + GotBufferReserve = false; +#endif } } }