Hi,
bei der Vorbereitung auf das heutige HDTV-Event 'SpiderMan' auf ProSieben HD ist mir ein Fehler in meinem cDolbyRepacker aufgefallen, der sich auf die Aufzeichnung und Wiedergabe der Dolby-Tonspur auswirkt.
Folgender Patch behebt das Problem:
Diff
--- ../vdr-1.3.22-orig/remux.c 2005-02-13 15:36:23.000000000 +0100
+++ remux.c 2005-03-13 12:03:43.243312676 +0100
@@ -46,6 +46,8 @@ private:
int fragmentTodo;
uchar pesHeader[6 + 3 + 255 + 4 + 4];
int pesHeaderLen;
+ uchar pesHeaderBackup[6 + 3 + 255];
+ int pesHeaderBackupLen;
uchar chk1;
uchar chk2;
int ac3todo;
@@ -131,6 +133,7 @@ void cDolbyRepacker::Reset(void)
chk2 = 0;
fragmentLen = 0;
fragmentTodo = 0;
+ pesHeaderBackupLen = 0;
}
bool cDolbyRepacker::FinishRemainder(cRingBufferLinear *ResultBuffer, const uchar *const Data, cons
t int Todo, int &Done, int &Bite)
@@ -229,12 +232,17 @@ int cDolbyRepacker::Put(cRingBufferLinea
if ((Data[6] & 0xC0) != 0x80)
return 0;
+ // backup PES header
+ if (Data[6] != 0x80 || Data[7] != 0x00 || Data[8] != 0x00) {
+ pesHeaderBackupLen = 6 + 3 + Data[8];
+ memcpy(pesHeaderBackup, Data, pesHeaderBackupLen);
+ }
+
// skip PES header
int done = 6 + 3 + Data[8];
int todo = Count - done;
const uchar *data = Data + done;
- bool headerCopied = false;
-
+
// look for 0x0B 0x77 <chk1> <chk2> <frameSize>
while (todo > 0) {
switch (state) {
@@ -242,10 +250,10 @@ int cDolbyRepacker::Put(cRingBufferLinea
if (*data == 0x0B) {
++(int &)state;
// copy header information once for later use
- if (!headerCopied) {
- headerCopied = true;
- pesHeaderLen = 6 + 3 + Data[8];
- memcpy(pesHeader, Data, pesHeaderLen);
+ if (pesHeaderBackupLen > 0) {
+ pesHeaderLen = pesHeaderBackupLen;
+ pesHeaderBackupLen = 0;
+ memcpy(pesHeader, pesHeaderBackup, pesHeaderLen);
AppendSubStreamID();
}
}
@@ -279,9 +287,8 @@ int cDolbyRepacker::Put(cRingBufferLinea
ac3todo = 2 * frameSizes[*data];
// frameSizeCode was invalid => restart searching
if (ac3todo <= 0) {
- // reset PES header instead of using/copying a wrong one
+ // reset PES header instead of using a wrong one
ResetPesHeader();
- headerCopied = true;
if (chk1 == 0x0B) {
if (chk2 == 0x77) {
state = store_chk1;
Display More
Bye.