1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Fixed cDevice::PlayTsVideo() and cDevice::PlayTsAudio() in case only part of the buffer has been accepted by the device

This commit is contained in:
Klaus Schmidinger 2009-06-21 13:34:40 +02:00
parent b14d498613
commit e33ba08af4
5 changed files with 36 additions and 4 deletions

View File

@ -1643,6 +1643,8 @@ Udo Richter <udo_richter@gmx.de>
for suggesting to add a note to the INSTALL file about using subdirectories to for suggesting to add a note to the INSTALL file about using subdirectories to
split a large disk into separate areas for VDR's video data and other stuff split a large disk into separate areas for VDR's video data and other stuff
for reporting wrong variable types in cIndexFile for reporting wrong variable types in cIndexFile
for reporting a problem with cDevice::PlayTsVideo() and cDevice::PlayTsAudio() in
case only part of the buffer has been accepted by the device
Sven Kreiensen <svenk@kammer.uni-hannover.de> Sven Kreiensen <svenk@kammer.uni-hannover.de>
for his help in keeping 'channels.conf.terr' up to date for his help in keeping 'channels.conf.terr' up to date

View File

@ -6140,3 +6140,5 @@ Video Disk Recorder Revision History
- Fixed storing the current OSD size in case the device has - Fixed storing the current OSD size in case the device has
changed it in its setup menu (reported by Reinhard Nissl). changed it in its setup menu (reported by Reinhard Nissl).
- Fixed cDevice::PlayTsVideo() and cDevice::PlayTsAudio() in case only part of the
buffer has been accepted by the device (reported by Udo Richter).

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.c 2.23 2009/06/06 13:25:58 kls Exp $ * $Id: device.c 2.24 2009/06/21 13:26:06 kls Exp $
*/ */
#include "device.h" #include "device.h"
@ -1293,6 +1293,8 @@ int cDevice::PlayTsVideo(const uchar *Data, int Length)
int l; int l;
while (const uchar *p = tsToPesVideo.GetPes(l)) { while (const uchar *p = tsToPesVideo.GetPes(l)) {
int w = PlayVideo(p, l); int w = PlayVideo(p, l);
if (w == 0)
tsToPesVideo.SetRepeatLast();
if (w <= 0) if (w <= 0)
return w; return w;
} }
@ -1308,6 +1310,8 @@ int cDevice::PlayTsAudio(const uchar *Data, int Length)
int l; int l;
if (const uchar *p = tsToPesAudio.GetPes(l)) { if (const uchar *p = tsToPesAudio.GetPes(l)) {
int w = PlayAudio(p, l, 0); int w = PlayAudio(p, l, 0);
if (w == 0)
tsToPesAudio.SetRepeatLast();
if (w <= 0) if (w <= 0)
return w; return w;
tsToPesAudio.Reset(); tsToPesAudio.Reset();

22
remux.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "remux.h"
@ -610,7 +610,8 @@ bool cPatPmtParser::GetVersions(int &PatVersion, int &PmtVersion)
cTsToPes::cTsToPes(void) cTsToPes::cTsToPes(void)
{ {
data = NULL; data = NULL;
size = length = offset = 0; size = 0;
Reset();
} }
cTsToPes::~cTsToPes() cTsToPes::~cTsToPes()
@ -641,6 +642,11 @@ void cTsToPes::PutTs(const uchar *Data, int Length)
const uchar *cTsToPes::GetPes(int &Length) const uchar *cTsToPes::GetPes(int &Length)
{ {
if (repeatLast) {
repeatLast = false;
Length = lastLength;
return lastData;
}
if (offset < length && PesLongEnough(length)) { if (offset < length && PesLongEnough(length)) {
if (!PesHasLength(data)) // this is a video PES packet with undefined length if (!PesHasLength(data)) // this is a video PES packet with undefined length
offset = 6; // trigger setting PES length for initial slice offset = 6; // trigger setting PES length for initial slice
@ -661,12 +667,16 @@ const uchar *cTsToPes::GetPes(int &Length)
p[4] = l / 256; p[4] = l / 256;
p[5] = l & 0xFF; p[5] = l & 0xFF;
Length = l + 6; Length = l + 6;
lastLength = Length;
lastData = p;
return p; return p;
} }
else { else {
Length = PesLength(data); Length = PesLength(data);
if (Length <= length) { if (Length <= length) {
offset = Length; // to make sure we break out in case of garbage data offset = Length; // to make sure we break out in case of garbage data
lastLength = Length;
lastData = data;
return data; return data;
} }
} }
@ -674,9 +684,17 @@ const uchar *cTsToPes::GetPes(int &Length)
return NULL; return NULL;
} }
void cTsToPes::SetRepeatLast(void)
{
repeatLast = true;
}
void cTsToPes::Reset(void) void cTsToPes::Reset(void)
{ {
length = offset = 0; length = offset = 0;
lastData = NULL;
lastLength = 0;
repeatLast = false;
} }
// --- Some helper functions for debugging ----------------------------------- // --- Some helper functions for debugging -----------------------------------

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: remux.h 2.17 2009/06/06 13:26:23 kls Exp $ * $Id: remux.h 2.18 2009/06/21 13:01:30 kls Exp $
*/ */
#ifndef __REMUX_H #ifndef __REMUX_H
@ -252,6 +252,9 @@ private:
int size; int size;
int length; int length;
int offset; int offset;
uchar *lastData;
int lastLength;
bool repeatLast;
public: public:
cTsToPes(void); cTsToPes(void);
~cTsToPes(); ~cTsToPes();
@ -279,6 +282,9 @@ public:
///< TS packet that will be given to PutTs() has the "payload start" flag ///< TS packet that will be given to PutTs() has the "payload start" flag
///< set, because this is the only way to determine the end of a video PES ///< set, because this is the only way to determine the end of a video PES
///< packet. ///< packet.
void SetRepeatLast(void);
///< Makes the next call to GetPes() return exactly the same data as the
///< last one (provided there was no call to Reset() in the meantime).
void Reset(void); void Reset(void);
///< Resets the converter. This needs to be called after a PES packet has ///< Resets the converter. This needs to be called after a PES packet has
///< been fetched by a call to GetPes(), and before the next call to ///< been fetched by a call to GetPes(), and before the next call to