summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTORS1
-rw-r--r--HISTORY5
-rw-r--r--cutter.c10
-rw-r--r--remux.c24
-rw-r--r--remux.h5
5 files changed, 40 insertions, 5 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 4d433c75..62061156 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -670,6 +670,7 @@ Oliver Endriss <o.endriss@gmx.de>
for adding missing AUDIO_PAUSE/AUDIO_CONTINUE calls to cDvbDevice
for reporting that the video type is unnecessarily written into channels.conf if
VPID is 0
+ for reporting chirping sound disturbences at editing points in TS recordings
Reinhard Walter Buchner <rw.buchner@freenet.de>
for adding some satellites to 'sources.conf'
diff --git a/HISTORY b/HISTORY
index 232cd63f..5b7ee097 100644
--- a/HISTORY
+++ b/HISTORY
@@ -6049,3 +6049,8 @@ Video Disk Recorder Revision History
- Fixed detecting the frame rate for streams with PTS distances of 1800, which
apparently split one frame over two payload units.
- Added missing 'const' to cRecording::FramesPerSecond() (thanks to Joachim Wilke).
+- Any TS packets in the first "frame" after a cut in an edited recording that don't
+ belong to a payload unit that started in that frame now get their TEI flag set,
+ so that a decoder will ignore them together with any PES data collected for that
+ PID so far (thanks to Oliver Endriss for reporting chirping sound disturbences at
+ editing points in TS recordings).
diff --git a/cutter.c b/cutter.c
index 73ac873f..e83c5ac1 100644
--- a/cutter.c
+++ b/cutter.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: cutter.c 2.2 2009/01/24 15:19:26 kls Exp $
+ * $Id: cutter.c 2.3 2009/04/19 10:56:33 kls Exp $
*/
#include "cutter.h"
@@ -18,6 +18,7 @@
class cCuttingThread : public cThread {
private:
const char *error;
+ bool isPesRecording;
cUnbufferedFile *fromFile, *toFile;
cFileName *fromFileName, *toFileName;
cIndexFile *fromIndex, *toIndex;
@@ -39,7 +40,7 @@ cCuttingThread::cCuttingThread(const char *FromFileName, const char *ToFileName)
fromFileName = toFileName = NULL;
fromIndex = toIndex = NULL;
cRecording Recording(FromFileName);
- bool isPesRecording = Recording.IsPesRecording();
+ isPesRecording = Recording.IsPesRecording();
if (fromMarks.Load(FromFileName, Recording.FramesPerSecond(), isPesRecording) && fromMarks.Count()) {
fromFileName = new cFileName(FromFileName, false, true, isPesRecording);
toFileName = new cFileName(ToFileName, true, true, isPesRecording);
@@ -140,7 +141,10 @@ void cCuttingThread::Action(void)
LastIFrame = 0;
if (cutIn) {
- cRemux::SetBrokenLink(buffer, Length);
+ if (isPesRecording)
+ cRemux::SetBrokenLink(buffer, Length);
+ else
+ TsSetTeiOnBrokenPackets(buffer, Length);
cutIn = false;
}
}
diff --git a/remux.c b/remux.c
index f428dcb2..10e5145c 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.18 2009/04/18 14:53:42 kls Exp $
+ * $Id: remux.c 2.19 2009/04/19 10:59:56 kls Exp $
*/
#include "remux.h"
@@ -124,6 +124,24 @@ int64_t TsGetPts(const uchar *p, int l)
return -1;
}
+void TsSetTeiOnBrokenPackets(uchar *p, int l)
+{
+ bool Processed[MAXPID] = { false };
+ while (l >= TS_SIZE) {
+ if (*p != TS_SYNC_BYTE)
+ break;
+ int Pid = TsPid(p);
+ if (!Processed[Pid]) {
+ if (!TsPayloadStart(p))
+ p[1] |= TS_ERROR;
+ else
+ Processed[Pid] = true;
+ }
+ l -= TS_SIZE;
+ p += TS_SIZE;
+ }
+}
+
// --- cPatPmtGenerator ------------------------------------------------------
cPatPmtGenerator::cPatPmtGenerator(cChannel *Channel)
@@ -582,6 +600,10 @@ cTsToPes::~cTsToPes()
void cTsToPes::PutTs(const uchar *Data, int Length)
{
+ if (TsError(Data)) {
+ Reset();
+ return; // ignore packets with TEI set, and drop any PES data collected so far
+ }
if (TsPayloadStart(Data))
Reset();
else if (!size)
diff --git a/remux.h b/remux.h
index ccb38821..063acaa6 100644
--- a/remux.h
+++ b/remux.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: remux.h 2.9 2009/03/27 13:38:59 kls Exp $
+ * $Id: remux.h 2.10 2009/04/19 10:57:09 kls Exp $
*/
#ifndef __REMUX_H
@@ -49,6 +49,8 @@ public:
#define TS_ADAPT_TP_PRIVATE 0x02
#define TS_ADAPT_EXTENSION 0x01
+#define MAXPID 0x2000 // for arrays that use a PID as the index
+
inline bool TsHasPayload(const uchar *p)
{
return p[3] & TS_PAYLOAD_EXISTS;
@@ -104,6 +106,7 @@ inline int TsGetAdaptationField(const uchar *p)
// The following functions all take a pointer to a sequence of complete TS packets.
int64_t TsGetPts(const uchar *p, int l);
+void TsSetTeiOnBrokenPackets(uchar *p, int l);
// Some PES handling tools:
// The following functions that take a pointer to PES data all assume that