diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2007-11-03 14:32:03 +0100 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2007-11-03 14:32:03 +0100 |
commit | 06f813d2a81b889ac1d1e2e8eb9c805243408abe (patch) | |
tree | 0463d5675384e28b505f82989dac09341574066e /device.c | |
parent | 2fa568654d92277511ee53e66fc73b5dc6efd376 (diff) | |
download | vdr-06f813d2a81b889ac1d1e2e8eb9c805243408abe.tar.gz vdr-06f813d2a81b889ac1d1e2e8eb9c805243408abe.tar.bz2 |
Added a workaround for recovering from wrongfully interpreted "pre 1.3.19 PS1 packets"
Diffstat (limited to 'device.c')
-rw-r--r-- | device.c | 24 |
1 files changed, 16 insertions, 8 deletions
@@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 1.146 2007/10/17 18:31:02 kls Exp $ + * $Id: device.c 1.147 2007/11/03 13:30:09 kls Exp $ */ #include "device.h" @@ -209,6 +209,9 @@ int cPesAssembler::PacketSize(const uchar *data) // The default priority for non-primary devices: #define DEFAULTPRIORITY -1 +// The minimum number of unknown PS1 packets to consider this a "pre 1.3.19 private stream": +#define MIN_PRE_1_3_19_PRIVATESTREAM 10 + int cDevice::numDevices = 0; int cDevice::useDevice = 0; int cDevice::nextCardIndex = 0; @@ -931,7 +934,7 @@ void cDevice::ClrAvailableTracks(bool DescriptionsOnly, bool IdsOnly) } else memset(availableTracks, 0, sizeof(availableTracks)); - pre_1_3_19_PrivateStream = false; + pre_1_3_19_PrivateStream = 0; SetAudioChannel(0); // fall back to stereo currentAudioTrackMissingCount = 0; currentAudioTrack = ttNone; @@ -1245,11 +1248,13 @@ int cDevice::PlayPesPacket(const uchar *Data, int Length, bool VideoOnly) // Compatibility mode for old VDR recordings, where 0xBD was only AC3: pre_1_3_19_PrivateStreamDeteced: - if (pre_1_3_19_PrivateStream) { + if (pre_1_3_19_PrivateStream > MIN_PRE_1_3_19_PRIVATESTREAM) { SubStreamId = c; SubStreamType = 0x80; SubStreamIndex = 0; } + else if (pre_1_3_19_PrivateStream) + pre_1_3_19_PrivateStream--; // every known PS1 packet counts down towards 0 to recover from glitches... switch (SubStreamType) { case 0x20: // SPU case 0x30: // SPU @@ -1277,11 +1282,14 @@ pre_1_3_19_PrivateStreamDeteced: break; default: // Compatibility mode for old VDR recordings, where 0xBD was only AC3: - if (!pre_1_3_19_PrivateStream) { - dsyslog("switching to pre 1.3.19 Dolby Digital compatibility mode"); - ClrAvailableTracks(); - pre_1_3_19_PrivateStream = true; - goto pre_1_3_19_PrivateStreamDeteced; + if (pre_1_3_19_PrivateStream <= MIN_PRE_1_3_19_PRIVATESTREAM) { + dsyslog("unknown PS1 packet, substream id = %02X (counter is at %d)", SubStreamId, pre_1_3_19_PrivateStream); + pre_1_3_19_PrivateStream += 2; // ...and every unknown PS1 packet counts up (the very first one counts twice, but that's ok) + if (pre_1_3_19_PrivateStream > MIN_PRE_1_3_19_PRIVATESTREAM) { + dsyslog("switching to pre 1.3.19 Dolby Digital compatibility mode - substream id = %02X", SubStreamId); + ClrAvailableTracks(); + goto pre_1_3_19_PrivateStreamDeteced; + } } } } |