summaryrefslogtreecommitdiff
path: root/remux.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2009-06-21 13:34:40 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2009-06-21 13:34:40 +0200
commite33ba08af4548210034ce628c4bb5fa69b08b4e0 (patch)
treea279fddebc5623aee4f5e80cc220dc90620c5a73 /remux.c
parentb14d498613ce2ccbdf487b5dae2394bbdc8a6478 (diff)
downloadvdr-e33ba08af4548210034ce628c4bb5fa69b08b4e0.tar.gz
vdr-e33ba08af4548210034ce628c4bb5fa69b08b4e0.tar.bz2
Fixed cDevice::PlayTsVideo() and cDevice::PlayTsAudio() in case only part of the buffer has been accepted by the device
Diffstat (limited to 'remux.c')
-rw-r--r--remux.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/remux.c b/remux.c
index 97c139c9..20664d7b 100644
--- a/remux.c
+++ b/remux.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: remux.c 2.24 2009/06/06 13:24:57 kls Exp $
+ * $Id: remux.c 2.25 2009/06/21 13:30:03 kls Exp $
*/
#include "remux.h"
@@ -610,7 +610,8 @@ bool cPatPmtParser::GetVersions(int &PatVersion, int &PmtVersion)
cTsToPes::cTsToPes(void)
{
data = NULL;
- size = length = offset = 0;
+ size = 0;
+ Reset();
}
cTsToPes::~cTsToPes()
@@ -641,6 +642,11 @@ void cTsToPes::PutTs(const uchar *Data, int Length)
const uchar *cTsToPes::GetPes(int &Length)
{
+ if (repeatLast) {
+ repeatLast = false;
+ Length = lastLength;
+ return lastData;
+ }
if (offset < length && PesLongEnough(length)) {
if (!PesHasLength(data)) // this is a video PES packet with undefined length
offset = 6; // trigger setting PES length for initial slice
@@ -661,12 +667,16 @@ const uchar *cTsToPes::GetPes(int &Length)
p[4] = l / 256;
p[5] = l & 0xFF;
Length = l + 6;
+ lastLength = Length;
+ lastData = p;
return p;
}
else {
Length = PesLength(data);
if (Length <= length) {
offset = Length; // to make sure we break out in case of garbage data
+ lastLength = Length;
+ lastData = data;
return data;
}
}
@@ -674,9 +684,17 @@ const uchar *cTsToPes::GetPes(int &Length)
return NULL;
}
+void cTsToPes::SetRepeatLast(void)
+{
+ repeatLast = true;
+}
+
void cTsToPes::Reset(void)
{
length = offset = 0;
+ lastData = NULL;
+ lastLength = 0;
+ repeatLast = false;
}
// --- Some helper functions for debugging -----------------------------------