Added support for "registration descriptor"

This commit is contained in:
Klaus Schmidinger 2010-11-01 15:47:59 +01:00
parent 4f50c34824
commit cfb37a7edf
8 changed files with 103 additions and 21 deletions

View File

@ -1100,6 +1100,7 @@ Rolf Ahrenberg <rahrenbe@cc.hut.fi>
for implementing handling of HD resolution subtitles according to v1.3.1 of for implementing handling of HD resolution subtitles according to v1.3.1 of
ETSI EN 300 743, chapter 7.2.1 ETSI EN 300 743, chapter 7.2.1
for fixing the array size of Atypes in cPatFilter::Process() for fixing the array size of Atypes in cPatFilter::Process()
for adding support for "registration descriptor" to 'libsi' and using it in pat.c
Ralf Klueber <ralf.klueber@vodafone.com> Ralf Klueber <ralf.klueber@vodafone.com>
for reporting a bug in cutting a recording if there is only a single editing mark for reporting a bug in cutting a recording if there is only a single editing mark

View File

@ -6500,3 +6500,5 @@ Video Disk Recorder Revision History
channels. To fix the index of existing recordings from such channels, just delete the channels. To fix the index of existing recordings from such channels, just delete the
'index' file of the recording and VDR will generate a new one the next time you play it. 'index' file of the recording and VDR will generate a new one the next time you play it.
You should also change the line "F 25" to "F 50" in the 'info' file of that recording. You should also change the line "F 25" to "F 50" in the 'info' file of that recording.
- Added support for "registration descriptor" to 'libsi' and using it in pat.c (thanks
to Rolf Ahrenberg).

View File

@ -6,7 +6,7 @@
* the Free Software Foundation; either version 2 of the License, or * * the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. * * (at your option) any later version. *
* * * *
* $Id: descriptor.c 1.22 2007/02/03 11:45:58 kls Exp $ * $Id: descriptor.c 2.1 2010/11/01 15:24:31 kls Exp $
* * * *
***************************************************************************/ ***************************************************************************/
@ -1032,4 +1032,15 @@ void MHP_ApplicationIconsDescriptor::Parse() {
data.setPointerAndOffset<const descr_application_icons_descriptor_end>(s, offset); data.setPointerAndOffset<const descr_application_icons_descriptor_end>(s, offset);
} }
int RegistrationDescriptor::getFormatIdentifier() const {
return HILOHILO(s->format_identifier);
}
void RegistrationDescriptor::Parse() {
int offset=0;
data.setPointerAndOffset<const descr_registration>(s, offset);
if (checkSize(getLength()-offset))
privateData.assign(data.getData(offset), getLength()-offset);
}
} //end of namespace } //end of namespace

View File

@ -6,7 +6,7 @@
* the Free Software Foundation; either version 2 of the License, or * * the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. * * (at your option) any later version. *
* * * *
* $Id: descriptor.h 1.16 2007/02/03 11:45:58 kls Exp $ * $Id: descriptor.h 2.1 2010/11/01 15:24:32 kls Exp $
* * * *
***************************************************************************/ ***************************************************************************/
@ -660,6 +660,16 @@ private:
const descr_application_icons_descriptor_end *s; const descr_application_icons_descriptor_end *s;
}; };
class RegistrationDescriptor : public Descriptor {
public:
int getFormatIdentifier() const;
CharArray privateData;
protected:
virtual void Parse();
private:
const descr_registration *s;
};
} //end of namespace } //end of namespace
#endif //LIBSI_TABLE_H #endif //LIBSI_TABLE_H

View File

@ -10,7 +10,7 @@
* the Free Software Foundation; either version 2 of the License, or * * the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. * * (at your option) any later version. *
* * * *
* $Id: headers.h 1.9 2007/02/03 11:45:58 kls Exp $ * $Id: headers.h 2.1 2010/11/01 15:24:32 kls Exp $
* * * *
***************************************************************************/ ***************************************************************************/
@ -2006,6 +2006,18 @@ struct item_premiere_content_transmission_time {
u_char start_time_s :8; u_char start_time_s :8;
}; };
/* 0x05 registration_descriptor */
#define DESCR_REGISTRATION_LEN 6
struct descr_registration {
u_char descriptor_tag :8;
u_char descriptor_length :8;
u_char format_identifier_hi_hi :8;
u_char format_identifier_hi_lo :8;
u_char format_identifier_lo_hi :8;
u_char format_identifier_lo_lo :8;
};
} //end of namespace } //end of namespace
#endif //LIBSI_HEADERS_H #endif //LIBSI_HEADERS_H

View File

@ -6,7 +6,7 @@
* the Free Software Foundation; either version 2 of the License, or * * the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. * * (at your option) any later version. *
* * * *
* $Id: si.c 2.2 2010/02/13 10:31:52 kls Exp $ * $Id: si.c 2.3 2010/11/01 15:24:32 kls Exp $
* * * *
***************************************************************************/ ***************************************************************************/
@ -606,6 +606,9 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain,
case ExtensionDescriptorTag: case ExtensionDescriptorTag:
d=new ExtensionDescriptor(); d=new ExtensionDescriptor();
break; break;
case RegistrationDescriptorTag:
d=new RegistrationDescriptor();
break;
//note that it is no problem to implement one //note that it is no problem to implement one
//of the unimplemented descriptors. //of the unimplemented descriptors.
@ -614,7 +617,6 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain,
case VideoStreamDescriptorTag: case VideoStreamDescriptorTag:
case AudioStreamDescriptorTag: case AudioStreamDescriptorTag:
case HierarchyDescriptorTag: case HierarchyDescriptorTag:
case RegistrationDescriptorTag:
case DataStreamAlignmentDescriptorTag: case DataStreamAlignmentDescriptorTag:
case TargetBackgroundGridDescriptorTag: case TargetBackgroundGridDescriptorTag:
case VideoWindowDescriptorTag: case VideoWindowDescriptorTag:

View File

@ -6,7 +6,7 @@
* the Free Software Foundation; either version 2 of the License, or * * the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. * * (at your option) any later version. *
* * * *
* $Id: util.h 2.1 2008/05/22 10:49:08 kls Exp $ * $Id: util.h 2.2 2010/11/01 15:24:32 kls Exp $
* * * *
***************************************************************************/ ***************************************************************************/
@ -19,6 +19,7 @@
#include <time.h> #include <time.h>
#define HILO(x) (x##_hi << 8 | x##_lo) #define HILO(x) (x##_hi << 8 | x##_lo)
#define HILOHILO(x) (x##_hi_hi << 24 | x##_hi_lo << 16 | x##_lo_hi << 8 | x##_lo_lo)
#define BCD_TIME_TO_SECONDS(x) ((3600 * ((10*((x##_h & 0xF0)>>4)) + (x##_h & 0xF))) + \ #define BCD_TIME_TO_SECONDS(x) ((3600 * ((10*((x##_h & 0xF0)>>4)) + (x##_h & 0xF))) + \
(60 * ((10*((x##_m & 0xF0)>>4)) + (x##_m & 0xF))) + \ (60 * ((10*((x##_m & 0xF0)>>4)) + (x##_m & 0xF))) + \
((10*((x##_s & 0xF0)>>4)) + (x##_s & 0xF))) ((10*((x##_s & 0xF0)>>4)) + (x##_s & 0xF)))

73
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.13 2010/06/13 11:12:12 kls Exp $ * $Id: pat.c 2.14 2010/11/01 15:34:28 kls Exp $
*/ */
#include "pat.h" #include "pat.h"
@ -456,21 +456,63 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
} }
} }
break; break;
case 0x80: // STREAMTYPE_USER_PRIVATE
{
SI::Descriptor *d;
for (SI::Loop::Iterator it; (d = stream.streamDescriptors.getNext(it)); ) {
switch (d->getDescriptorTag()) {
case SI::RegistrationDescriptorTag: {
SI::RegistrationDescriptor *rd = (SI::RegistrationDescriptor *)d;
// http://www.smpte-ra.org/mpegreg/mpegreg.html
switch (rd->getFormatIdentifier()) {
case 0x44434949: // 'DCII' DigiChipher II
Vpid = esPid;
Ppid = pmt.getPCRPid();
Vtype = stream.getStreamType();
ProcessCaDescriptors = true;
break;
default:
//printf("Format identifier: 0x08X\n", rd->getFormatIdentifier());
break;
}
}
break;
default: ;
}
delete d;
}
}
break;
case 0x81: // STREAMTYPE_USER_PRIVATE case 0x81: // STREAMTYPE_USER_PRIVATE
if (Channel->IsAtsc()) { // ATSC AC-3 {
char lang[MAXLANGCODE1] = { 0 }; char lang[MAXLANGCODE1] = { 0 };
SI::Descriptor *d; bool IsAc3 = false;
for (SI::Loop::Iterator it; (d = stream.streamDescriptors.getNext(it)); ) { SI::Descriptor *d;
switch (d->getDescriptorTag()) { for (SI::Loop::Iterator it; (d = stream.streamDescriptors.getNext(it)); ) {
case SI::ISO639LanguageDescriptorTag: { switch (d->getDescriptorTag()) {
SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d; case SI::RegistrationDescriptorTag: {
strn0cpy(lang, I18nNormalizeLanguageCode(ld->languageCode), MAXLANGCODE1); SI::RegistrationDescriptor *rd = (SI::RegistrationDescriptor *)d;
} // http://www.smpte-ra.org/mpegreg/mpegreg.html
break; switch (rd->getFormatIdentifier()) {
default: ; case 0x41432D33: // 'AC-3'
} IsAc3 = true;
delete d; break;
} default:
//printf("Format identifier: 0x08X\n", rd->getFormatIdentifier());
break;
}
}
break;
case SI::ISO639LanguageDescriptorTag: {
SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d;
strn0cpy(lang, I18nNormalizeLanguageCode(ld->languageCode), MAXLANGCODE1);
}
break;
default: ;
}
delete d;
}
if (IsAc3) {
if (NumDpids < MAXDPIDS) { if (NumDpids < MAXDPIDS) {
Dpids[NumDpids] = esPid; Dpids[NumDpids] = esPid;
Dtypes[NumDpids] = SI::AC3DescriptorTag; Dtypes[NumDpids] = SI::AC3DescriptorTag;
@ -479,6 +521,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
} }
ProcessCaDescriptors = true; ProcessCaDescriptors = true;
} }
}
break; break;
default: ;//printf("PID: %5d %5d %2d %3d %3d\n", pmt.getServiceId(), stream.getPid(), stream.getStreamType(), pmt.getVersionNumber(), Channel->Number()); default: ;//printf("PID: %5d %5d %2d %3d %3d\n", pmt.getServiceId(), stream.getPid(), stream.getStreamType(), pmt.getVersionNumber(), Channel->Number());
} }