Added full handling of the stream types of Dolby Digital pids

This commit is contained in:
Klaus Schmidinger 2010-06-05 13:50:56 +02:00
parent 174eaaffbd
commit 9377d831b3
7 changed files with 39 additions and 17 deletions

View File

@ -2369,6 +2369,7 @@ Alexander Riedel <alexander-riedel@t-online.de>
Jose Alberto Reguero <jareguero@telefonica.net> Jose Alberto Reguero <jareguero@telefonica.net>
for a patch that fixed part of a crash in i18n character set conversion for a patch that fixed part of a crash in i18n character set conversion
for fixing cDvbPlayer::NextFile() to handle files larger than 2GB for fixing cDvbPlayer::NextFile() to handle files larger than 2GB
for implementing full handling of the stream types of Dolby Digital pids
Patrice Staudt <staudt@engsystem.net> Patrice Staudt <staudt@engsystem.net>
for adding full weekday names to i18n.c for plugins to use for adding full weekday names to i18n.c for plugins to use

View File

@ -6463,3 +6463,5 @@ Video Disk Recorder Revision History
See man vdr(5) on how the APID section of channels has been extended to store See man vdr(5) on how the APID section of channels has been extended to store
this information. this information.
- Added detecting channels that use service type 0x16. - Added detecting channels that use service type 0x16.
- Added full handling of the stream types of Dolby Digital pids
(thanks to Jose Alberto Reguero).

View File

@ -4,13 +4,14 @@
* 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: channels.c 2.15 2010/05/16 11:44:31 kls Exp $ * $Id: channels.c 2.16 2010/06/05 13:33:57 kls Exp $
*/ */
#include "channels.h" #include "channels.h"
#include <ctype.h> #include <ctype.h>
#include "device.h" #include "device.h"
#include "epg.h" #include "epg.h"
#include "libsi/si.h"
#include "timers.h" #include "timers.h"
// IMPORTANT NOTE: in the 'sscanf()' calls there is a blank after the '%d' // IMPORTANT NOTE: in the 'sscanf()' calls there is a blank after the '%d'
@ -294,12 +295,12 @@ static int IntArrayToString(char *s, const int *a, int Base = 10, const char n[]
return q - s; return q - s;
} }
void cChannel::SetPids(int Vpid, int Ppid, int Vtype, int *Apids, int *Atypes, char ALangs[][MAXLANGCODE2], int *Dpids, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid) void cChannel::SetPids(int Vpid, int Ppid, int Vtype, int *Apids, int *Atypes, char ALangs[][MAXLANGCODE2], int *Dpids, int *Dtypes, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid)
{ {
int mod = CHANNELMOD_NONE; int mod = CHANNELMOD_NONE;
if (vpid != Vpid || ppid != Ppid || vtype != Vtype || tpid != Tpid) if (vpid != Vpid || ppid != Ppid || vtype != Vtype || tpid != Tpid)
mod |= CHANNELMOD_PIDS; mod |= CHANNELMOD_PIDS;
int m = IntArraysDiffer(apids, Apids, alangs, ALangs) | IntArraysDiffer(atypes, Atypes) | IntArraysDiffer(dpids, Dpids, dlangs, DLangs) | IntArraysDiffer(spids, Spids, slangs, SLangs); int m = IntArraysDiffer(apids, Apids, alangs, ALangs) | IntArraysDiffer(atypes, Atypes) | IntArraysDiffer(dpids, Dpids, dlangs, DLangs) | IntArraysDiffer(dtypes, Dtypes) | IntArraysDiffer(spids, Spids, slangs, SLangs);
if (m & STRDIFF) if (m & STRDIFF)
mod |= CHANNELMOD_LANGS; mod |= CHANNELMOD_LANGS;
if (m & VALDIFF) if (m & VALDIFF)
@ -312,14 +313,14 @@ void cChannel::SetPids(int Vpid, int Ppid, int Vtype, int *Apids, int *Atypes, c
q += IntArrayToString(q, apids, 10, alangs, atypes); q += IntArrayToString(q, apids, 10, alangs, atypes);
if (dpids[0]) { if (dpids[0]) {
*q++ = ';'; *q++ = ';';
q += IntArrayToString(q, dpids, 10, dlangs); q += IntArrayToString(q, dpids, 10, dlangs, dtypes);
} }
*q = 0; *q = 0;
q = NewApidsBuf; q = NewApidsBuf;
q += IntArrayToString(q, Apids, 10, ALangs, Atypes); q += IntArrayToString(q, Apids, 10, ALangs, Atypes);
if (Dpids[0]) { if (Dpids[0]) {
*q++ = ';'; *q++ = ';';
q += IntArrayToString(q, Dpids, 10, DLangs); q += IntArrayToString(q, Dpids, 10, DLangs, Dtypes);
} }
*q = 0; *q = 0;
const int SBufferSize = MAXSPIDS * (5 + 1 + MAXLANGCODE2) + 10; // 5 digits plus delimiting ',' or ';' plus optional '=cod', +10: paranoia const int SBufferSize = MAXSPIDS * (5 + 1 + MAXLANGCODE2) + 10; // 5 digits plus delimiting ',' or ';' plus optional '=cod', +10: paranoia
@ -344,6 +345,7 @@ void cChannel::SetPids(int Vpid, int Ppid, int Vtype, int *Apids, int *Atypes, c
apids[MAXAPIDS] = 0; apids[MAXAPIDS] = 0;
for (int i = 0; i < MAXDPIDS; i++) { for (int i = 0; i < MAXDPIDS; i++) {
dpids[i] = Dpids[i]; dpids[i] = Dpids[i];
dtypes[i] = Dtypes[i];
strn0cpy(dlangs[i], DLangs[i], MAXLANGCODE2); strn0cpy(dlangs[i], DLangs[i], MAXLANGCODE2);
} }
dpids[MAXDPIDS] = 0; dpids[MAXDPIDS] = 0;
@ -499,7 +501,7 @@ cString cChannel::ToText(const cChannel *Channel)
q += IntArrayToString(q, Channel->apids, 10, Channel->alangs, Channel->atypes); q += IntArrayToString(q, Channel->apids, 10, Channel->alangs, Channel->atypes);
if (Channel->dpids[0]) { if (Channel->dpids[0]) {
*q++ = ';'; *q++ = ';';
q += IntArrayToString(q, Channel->dpids, 10, Channel->dlangs); q += IntArrayToString(q, Channel->dpids, 10, Channel->dlangs, Channel->dtypes);
} }
*q = 0; *q = 0;
char caidbuf[MAXCAIDS * 5 + 10]; // 5: 4 digits plus delimiting ',', 10: paranoia char caidbuf[MAXCAIDS * 5 + 10]; // 5: 4 digits plus delimiting ',', 10: paranoia
@ -557,6 +559,7 @@ bool cChannel::Parse(const char *s)
apids[0] = 0; apids[0] = 0;
atypes[0] = 0; atypes[0] = 0;
dpids[0] = 0; dpids[0] = 0;
dtypes[0] = 0;
ok = false; ok = false;
if (parambuf && sourcebuf && vpidbuf && apidbuf) { if (parambuf && sourcebuf && vpidbuf && apidbuf) {
parameters = parambuf; parameters = parambuf;
@ -617,9 +620,15 @@ bool cChannel::Parse(const char *s)
char *strtok_next; char *strtok_next;
while ((q = strtok_r(p, ",", &strtok_next)) != NULL) { while ((q = strtok_r(p, ",", &strtok_next)) != NULL) {
if (NumDpids < MAXDPIDS) { if (NumDpids < MAXDPIDS) {
dtypes[NumDpids] = SI::AC3DescriptorTag; // backwards compatibility
char *l = strchr(q, '='); char *l = strchr(q, '=');
if (l) { if (l) {
*l++ = 0; *l++ = 0;
char *t = strchr(l, '@');
if (t) {
*t++ = 0;
dtypes[NumDpids] = strtol(t, NULL, 10);
}
strn0cpy(dlangs[NumDpids], l, MAXLANGCODE2); strn0cpy(dlangs[NumDpids], l, MAXLANGCODE2);
} }
else else
@ -631,6 +640,7 @@ bool cChannel::Parse(const char *s)
p = NULL; p = NULL;
} }
dpids[NumDpids] = 0; dpids[NumDpids] = 0;
dtypes[NumDpids] = 0;
} }
if (caidbuf) { if (caidbuf) {

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: channels.h 2.11 2010/05/16 11:06:52 kls Exp $ * $Id: channels.h 2.12 2010/06/05 13:12:54 kls Exp $
*/ */
#ifndef __CHANNELS_H #ifndef __CHANNELS_H
@ -107,6 +107,7 @@ private:
int atypes[MAXAPIDS + 1]; // list is zero-terminated int atypes[MAXAPIDS + 1]; // list is zero-terminated
char alangs[MAXAPIDS][MAXLANGCODE2]; char alangs[MAXAPIDS][MAXLANGCODE2];
int dpids[MAXDPIDS + 1]; // list is zero-terminated int dpids[MAXDPIDS + 1]; // list is zero-terminated
int dtypes[MAXAPIDS + 1]; // list is zero-terminated
char dlangs[MAXDPIDS][MAXLANGCODE2]; char dlangs[MAXDPIDS][MAXLANGCODE2];
int spids[MAXSPIDS + 1]; // list is zero-terminated int spids[MAXSPIDS + 1]; // list is zero-terminated
char slangs[MAXSPIDS][MAXLANGCODE2]; char slangs[MAXSPIDS][MAXLANGCODE2];
@ -158,6 +159,7 @@ public:
const char *Dlang(int i) const { return (0 <= i && i < MAXDPIDS) ? dlangs[i] : ""; } const char *Dlang(int i) const { return (0 <= i && i < MAXDPIDS) ? dlangs[i] : ""; }
const char *Slang(int i) const { return (0 <= i && i < MAXSPIDS) ? slangs[i] : ""; } const char *Slang(int i) const { return (0 <= i && i < MAXSPIDS) ? slangs[i] : ""; }
int Atype(int i) const { return (0 <= i && i < MAXAPIDS) ? atypes[i] : 0; } int Atype(int i) const { return (0 <= i && i < MAXAPIDS) ? atypes[i] : 0; }
int Dtype(int i) const { return (0 <= i && i < MAXDPIDS) ? dtypes[i] : 0; }
uchar SubtitlingType(int i) const { return (0 <= i && i < MAXSPIDS) ? subtitlingTypes[i] : uchar(0); } uchar SubtitlingType(int i) const { return (0 <= i && i < MAXSPIDS) ? subtitlingTypes[i] : uchar(0); }
uint16_t CompositionPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? compositionPageIds[i] : uint16_t(0); } uint16_t CompositionPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? compositionPageIds[i] : uint16_t(0); }
uint16_t AncillaryPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? ancillaryPageIds[i] : uint16_t(0); } uint16_t AncillaryPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? ancillaryPageIds[i] : uint16_t(0); }
@ -187,7 +189,7 @@ public:
void SetId(int Nid, int Tid, int Sid, int Rid = 0); void SetId(int Nid, int Tid, int Sid, int Rid = 0);
void SetName(const char *Name, const char *ShortName, const char *Provider); void SetName(const char *Name, const char *ShortName, const char *Provider);
void SetPortalName(const char *PortalName); void SetPortalName(const char *PortalName);
void SetPids(int Vpid, int Ppid, int Vtype, int *Apids, int *Atypes, char ALangs[][MAXLANGCODE2], int *Dpids, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid); void SetPids(int Vpid, int Ppid, int Vtype, int *Apids, int *Atypes, char ALangs[][MAXLANGCODE2], int *Dpids, int *Dtypes, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid);
void SetCaIds(const int *CaIds); // list must be zero-terminated void SetCaIds(const int *CaIds); // list must be zero-terminated
void SetCaDescriptors(int Level); void SetCaDescriptors(int Level);
void SetLinkChannels(cLinkChannels *LinkChannels); void SetLinkChannels(cLinkChannels *LinkChannels);

8
pat.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: pat.c 2.10 2010/05/16 11:12:57 kls Exp $ * $Id: pat.c 2.11 2010/06/05 13:26:47 kls Exp $
*/ */
#include "pat.h" #include "pat.h"
@ -334,6 +334,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
int Apids[MAXAPIDS + 1] = { 0 }; // these lists are zero-terminated int Apids[MAXAPIDS + 1] = { 0 }; // these lists are zero-terminated
int Atypes[MAXDPIDS + 1] = { 0 }; int Atypes[MAXDPIDS + 1] = { 0 };
int Dpids[MAXDPIDS + 1] = { 0 }; int Dpids[MAXDPIDS + 1] = { 0 };
int Dtypes[MAXDPIDS + 1] = { 0 };
int Spids[MAXSPIDS + 1] = { 0 }; int Spids[MAXSPIDS + 1] = { 0 };
uchar SubtitlingTypes[MAXSPIDS + 1] = { 0 }; uchar SubtitlingTypes[MAXSPIDS + 1] = { 0 };
uint16_t CompositionPageIds[MAXSPIDS + 1] = { 0 }; uint16_t CompositionPageIds[MAXSPIDS + 1] = { 0 };
@ -399,6 +400,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
//XXX case 8: // STREAMTYPE_13818_DSMCC //XXX case 8: // STREAMTYPE_13818_DSMCC
{ {
int dpid = 0; int dpid = 0;
int dtype = 0;
char lang[MAXLANGCODE1] = { 0 }; char lang[MAXLANGCODE1] = { 0 };
SI::Descriptor *d; SI::Descriptor *d;
for (SI::Loop::Iterator it; (d = stream.streamDescriptors.getNext(it)); ) { for (SI::Loop::Iterator it; (d = stream.streamDescriptors.getNext(it)); ) {
@ -406,6 +408,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
case SI::AC3DescriptorTag: case SI::AC3DescriptorTag:
case SI::EnhancedAC3DescriptorTag: case SI::EnhancedAC3DescriptorTag:
dpid = esPid; dpid = esPid;
dtype = d->getDescriptorTag();
ProcessCaDescriptors = true; ProcessCaDescriptors = true;
break; break;
case SI::SubtitlingDescriptorTag: case SI::SubtitlingDescriptorTag:
@ -446,6 +449,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
if (dpid) { if (dpid) {
if (NumDpids < MAXDPIDS) { if (NumDpids < MAXDPIDS) {
Dpids[NumDpids] = dpid; Dpids[NumDpids] = dpid;
Dtypes[NumDpids] = dtype;
strn0cpy(DLangs[NumDpids], lang, MAXLANGCODE1); strn0cpy(DLangs[NumDpids], lang, MAXLANGCODE1);
NumDpids++; NumDpids++;
} }
@ -485,7 +489,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
} }
} }
if (Setup.UpdateChannels >= 2) { if (Setup.UpdateChannels >= 2) {
Channel->SetPids(Vpid, Ppid, Vtype, Apids, Atypes, ALangs, Dpids, DLangs, Spids, SLangs, Tpid); Channel->SetPids(Vpid, Ppid, Vtype, Apids, Atypes, ALangs, Dpids, Dtypes, DLangs, Spids, SLangs, Tpid);
Channel->SetCaIds(CaDescriptors->CaIds()); Channel->SetCaIds(CaDescriptors->CaIds());
Channel->SetSubtitlingDescriptors(SubtitlingTypes, CompositionPageIds, AncillaryPageIds); Channel->SetSubtitlingDescriptors(SubtitlingTypes, CompositionPageIds, AncillaryPageIds);
} }

13
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.46 2010/05/16 12:23:12 kls Exp $ * $Id: remux.c 2.47 2010/06/05 13:32:15 kls Exp $
*/ */
#include "remux.h" #include "remux.h"
@ -188,10 +188,10 @@ int cPatPmtGenerator::MakeStream(uchar *Target, uchar Type, int Pid)
return i; return i;
} }
int cPatPmtGenerator::MakeAC3Descriptor(uchar *Target) int cPatPmtGenerator::MakeAC3Descriptor(uchar *Target, uchar Type)
{ {
int i = 0; int i = 0;
Target[i++] = SI::AC3DescriptorTag; Target[i++] = Type;
Target[i++] = 0x01; // length Target[i++] = 0x01; // length
Target[i++] = 0x00; Target[i++] = 0x00;
IncEsInfoLength(i); IncEsInfoLength(i);
@ -327,7 +327,7 @@ void cPatPmtGenerator::GeneratePmt(const cChannel *Channel)
} }
for (int n = 0; Channel->Dpid(n); n++) { for (int n = 0; Channel->Dpid(n); n++) {
i += MakeStream(buf + i, 0x06, Channel->Dpid(n)); i += MakeStream(buf + i, 0x06, Channel->Dpid(n));
i += MakeAC3Descriptor(buf + i); i += MakeAC3Descriptor(buf + i, Channel->Dtype(n));
i += MakeLanguageDescriptor(buf + i, Channel->Dlang(n)); i += MakeLanguageDescriptor(buf + i, Channel->Dlang(n));
} }
for (int n = 0; Channel->Spid(n); n++) { for (int n = 0; Channel->Spid(n); n++) {
@ -552,13 +552,16 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
case 0x06: // STREAMTYPE_13818_PES_PRIVATE case 0x06: // STREAMTYPE_13818_PES_PRIVATE
{ {
int dpid = 0; int dpid = 0;
int dtype = 0;
char lang[MAXLANGCODE1] = ""; char lang[MAXLANGCODE1] = "";
SI::Descriptor *d; SI::Descriptor *d;
for (SI::Loop::Iterator it; (d = stream.streamDescriptors.getNext(it)); ) { for (SI::Loop::Iterator it; (d = stream.streamDescriptors.getNext(it)); ) {
switch (d->getDescriptorTag()) { switch (d->getDescriptorTag()) {
case SI::AC3DescriptorTag: case SI::AC3DescriptorTag:
case SI::EnhancedAC3DescriptorTag:
dbgpatpmt(" AC3"); dbgpatpmt(" AC3");
dpid = stream.getPid(); dpid = stream.getPid();
dtype = d->getDescriptorTag();
break; break;
case SI::SubtitlingDescriptorTag: case SI::SubtitlingDescriptorTag:
dbgpatpmt(" subtitling"); dbgpatpmt(" subtitling");
@ -605,7 +608,7 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
if (dpid) { if (dpid) {
if (NumDpids < MAXDPIDS) { if (NumDpids < MAXDPIDS) {
dpids[NumDpids] = dpid; dpids[NumDpids] = dpid;
dtypes[NumDpids] = stream.getStreamType(); dtypes[NumDpids] = dtype;
strn0cpy(dlangs[NumDpids], lang, sizeof(dlangs[NumDpids])); strn0cpy(dlangs[NumDpids], lang, sizeof(dlangs[NumDpids]));
if (updatePrimaryDevice && Setup.UseDolbyDigital) if (updatePrimaryDevice && Setup.UseDolbyDigital)
cDevice::PrimaryDevice()->SetAvailableTrack(ttDolby, NumDpids, dpid, lang); cDevice::PrimaryDevice()->SetAvailableTrack(ttDolby, NumDpids, dpid, lang);

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.25 2010/05/13 14:29:45 kls Exp $ * $Id: remux.h 2.26 2010/06/05 13:27:55 kls Exp $
*/ */
#ifndef __REMUX_H #ifndef __REMUX_H
@ -169,7 +169,7 @@ private:
void IncEsInfoLength(int Length); void IncEsInfoLength(int Length);
protected: protected:
int MakeStream(uchar *Target, uchar Type, int Pid); int MakeStream(uchar *Target, uchar Type, int Pid);
int MakeAC3Descriptor(uchar *Target); int MakeAC3Descriptor(uchar *Target, uchar Type);
int MakeSubtitlingDescriptor(uchar *Target, const char *Language, uchar SubtitlingType, uint16_t CompositionPageId, uint16_t AncillaryPageId); int MakeSubtitlingDescriptor(uchar *Target, const char *Language, uchar SubtitlingType, uint16_t CompositionPageId, uint16_t AncillaryPageId);
int MakeLanguageDescriptor(uchar *Target, const char *Language); int MakeLanguageDescriptor(uchar *Target, const char *Language);
int MakeCRC(uchar *Target, const uchar *Data, int Length); int MakeCRC(uchar *Target, const uchar *Data, int Length);