diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 052438cc..42b074d2 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -203,6 +203,7 @@ Andreas Schultz for suggesting to remove the Mute() call from cDvbDevice::StillPicture() for suggesting to separate the startup of a plugin into an "early" and a "late" phase for changing C++ style comments in libdtv into C style to avoid warnings in gcc 3.x + for implementing the TerrestrialDeliverySystemDescriptor in libdtv Aaron Holtzman for writing 'ac3dec' diff --git a/HISTORY b/HISTORY index 96f99811..098c10dc 100644 --- a/HISTORY +++ b/HISTORY @@ -2115,7 +2115,8 @@ Video Disk Recorder Revision History the startup of a plugin into an "early" (Initialize()) and "late" (Start()) phase (suggested by Andreas Schultz). Plugin authors should please read the section about "Getting started" in PLUGINS.html and adapt their code if applicable. -- Implemented the CableDeliverySystemDescriptor in libdtv (thanks to Sven Grothklags) +- Implemented the CableDeliverySystemDescriptor and TerrestrialDeliverySystemDescriptor + in libdtv (thanks to Sven Grothklags and Andreas Schultz) - Fixed keeping live video active in case the primary device doesn't have an MPEG decoder (thanks to Wolfgang Goeller for reporting this one). - Implemented cDevice::ActualDevice(), which returns the actual receiving device in diff --git a/libdtv/libsi/include/libsi.h b/libdtv/libsi/include/libsi.h index a5e587b2..fca96ba7 100644 --- a/libdtv/libsi/include/libsi.h +++ b/libdtv/libsi/include/libsi.h @@ -1037,18 +1037,20 @@ struct SatelliteDeliverySystemDescriptor { unsigned short Tag; long Frequency; short OrbitalPosition; + short Modulation; char Polarization; long SymbolRate; char FEC; }; -#define CreateSatelliteDeliverySystemDescriptor(descr, freq, orb, polar, sr, fec) \ +#define CreateSatelliteDeliverySystemDescriptor(descr, freq, orb, mod, polar, sr, fec) \ do \ { \ xCreateNode (((struct SatelliteDeliverySystemDescriptor *)descr), NULL); \ ((struct SatelliteDeliverySystemDescriptor *)descr)->Tag = DESCR_SAT_DEL_SYS; \ ((struct SatelliteDeliverySystemDescriptor *)descr)->Frequency = freq; \ ((struct SatelliteDeliverySystemDescriptor *)descr)->OrbitalPosition = orb; \ + ((struct SatelliteDeliverySystemDescriptor *)descr)->Modulation = mod; \ ((struct SatelliteDeliverySystemDescriptor *)descr)->Polarization = polar; \ ((struct SatelliteDeliverySystemDescriptor *)descr)->SymbolRate = sr; \ ((struct SatelliteDeliverySystemDescriptor *)descr)->FEC = fec; \ @@ -1061,21 +1063,55 @@ struct CableDeliverySystemDescriptor { unsigned short Tag; long Frequency; long SymbolRate; - char FEC; + char FECouter; + char FECinner; char Modulation; }; -#define CreateCableDeliverySystemDescriptor(descr, freq, sr, fec, mod) \ +#define CreateCableDeliverySystemDescriptor(descr, freq, sr, fec_o, fec_i, mod) \ do \ { \ xCreateNode (((struct CableDeliverySystemDescriptor *)descr), NULL); \ ((struct CableDeliverySystemDescriptor *)descr)->Tag = DESCR_CABLE_DEL_SYS; \ ((struct CableDeliverySystemDescriptor *)descr)->Frequency = freq; \ ((struct CableDeliverySystemDescriptor *)descr)->SymbolRate = sr; \ - ((struct CableDeliverySystemDescriptor *)descr)->FEC = fec; \ + ((struct CableDeliverySystemDescriptor *)descr)->FECouter = fec_o; \ + ((struct CableDeliverySystemDescriptor *)descr)->FECinner = fec_i; \ ((struct CableDeliverySystemDescriptor *)descr)->Modulation = mod; \ } while (0) +/* TerrestrialDeliverySystemDescriptor */ + +struct TerrestrialDeliverySystemDescriptor { + struct NODE Node; + unsigned short Tag; + long Frequency; + char Bandwidth; + char Constellation; + char Hierarchy; + char CodeRateHP; + char CodeRateLP; + char GuardInterval; + char TransmissionMode; + char OtherFrequencyFlag; +}; + +#define CreateTerrestrialDeliverySystemDescriptor(descr, freq, bw, cst, hr, crh, crl, gi, tm, ofm) \ + do \ + { \ + xCreateNode (((struct CableDeliverySystemDescriptor *)descr), NULL); \ + ((struct TerrestrialDeliverySystemDescriptor *)descr)->Tag = DESCR_TERR_DEL_SYS; \ + ((struct TerrestrialDeliverySystemDescriptor *)descr)->Frequency = freq; \ + ((struct TerrestrialDeliverySystemDescriptor *)descr)->Bandwidth = bw; \ + ((struct TerrestrialDeliverySystemDescriptor *)descr)->Constellation = cst; \ + ((struct TerrestrialDeliverySystemDescriptor *)descr)->Hierarchy = hr; \ + ((struct TerrestrialDeliverySystemDescriptor *)descr)->CodeRateHP = crh; \ + ((struct TerrestrialDeliverySystemDescriptor *)descr)->CodeRateLP = crl; \ + ((struct TerrestrialDeliverySystemDescriptor *)descr)->GuardInterval = gi; \ + ((struct TerrestrialDeliverySystemDescriptor *)descr)->TransmissionMode = tm; \ + ((struct TerrestrialDeliverySystemDescriptor *)descr)->OtherFrequencyFlag = ofm; \ + } while (0) + /* ServiceListDescriptor */ struct ServiceListDescriptor { diff --git a/libdtv/libsi/include/si_tables.h b/libdtv/libsi/include/si_tables.h index 9da31a0f..f5e659ca 100644 --- a/libdtv/libsi/include/si_tables.h +++ b/libdtv/libsi/include/si_tables.h @@ -1126,7 +1126,41 @@ typedef struct item_subtitling_struct { typedef struct descr_terrestrial_delivery_struct { u_char descriptor_tag :8; u_char descriptor_length :8; - /* TBD */ + u_char frequency1 :8; + u_char frequency2 :8; + u_char frequency3 :8; + u_char frequency4 :8; +#if BYTE_ORDER == BIG_ENDIAN + u_char bandwidth :3; + u_char reserved1 :5; +#else + u_char reserved1 :5; + u_char bandwidth :3; +#endif +#if BYTE_ORDER == BIG_ENDIAN + u_char constellation :2; + u_char hierarchy :3; + u_char code_rate_HP :3; +#else + u_char code_rate_HP :3; + u_char hierarchy :3; + u_char constellation :2; +#endif +#if BYTE_ORDER == BIG_ENDIAN + u_char code_rate_LP :3; + u_char guard_interval :2; + u_char transmission_mode :2; + u_char other_frequency_flag :1; +#else + u_char other_frequency_flag :1; + u_char transmission_mode :2; + u_char guard_interval :2; + u_char code_rate_LP :3; +#endif + u_char reserver2 :8; + u_char reserver3 :8; + u_char reserver4 :8; + u_char reserver5 :8; } descr_terrestrial_delivery_system_t; #define CastTerrestrialDeliverySystemDescriptor(x) ((descr_terrestrial_delivery_system_t *)(x)) diff --git a/libdtv/libsi/si_debug_services.c b/libdtv/libsi/si_debug_services.c index 9138d803..1ff74000 100644 --- a/libdtv/libsi/si_debug_services.c +++ b/libdtv/libsi/si_debug_services.c @@ -535,6 +535,7 @@ void siDebugDescriptors (char *Prepend, struct LIST *Descriptors) printf ("%s Frequency: %ld\n", Prepend, sds->Frequency); printf ("%s OrbitalPosition: %d\n", Prepend, sds->OrbitalPosition); printf ("%s Polarization: %c\n", Prepend, sds->Polarization); + printf ("%s Modulation: %c\n", Prepend, sds->Modulation); printf ("%s SymbolRate: %ld\n", Prepend, sds->SymbolRate); printf ("%s FEC: %c\n", Prepend, sds->FEC); } @@ -548,11 +549,30 @@ void siDebugDescriptors (char *Prepend, struct LIST *Descriptors) printf ("%sDescriptor: Cable Delivery System\n", Prepend); printf ("%s Frequency: %ld\n", Prepend, cds->Frequency); printf ("%s SymbolRate: %ld\n", Prepend, cds->SymbolRate); - printf ("%s FEC: %d\n", Prepend, cds->FEC); + printf ("%s FEC outer: %d\n", Prepend, cds->FECouter); + printf ("%s FEC inner: %d\n", Prepend, cds->FECinner); printf ("%s Modulation: %d\n", Prepend, cds->Modulation); } break; + case DESCR_TERR_DEL_SYS: + { + struct TerrestrialDeliverySystemDescriptor *tds = + (struct TerrestrialDeliverySystemDescriptor *)Descriptor; + + printf ("%sDescriptor: Terrestrial Delivery System\n", Prepend); + printf ("%s Frequency: %ld\n", Prepend, tds->Frequency); + printf ("%s Bandwidth: %d\n", Prepend, tds->Bandwidth); + printf ("%s Constellation: %d\n", Prepend, tds->Constellation); + printf ("%s Hierarchy: %d\n", Prepend, tds->Hierarchy); + printf ("%s CodeRateHP: %d\n", Prepend, tds->CodeRateHP); + printf ("%s CodeRateLP: %d\n", Prepend, tds->CodeRateLP); + printf ("%s GuardInterval: %d\n", Prepend, tds->GuardInterval); + printf ("%s TransmissionMode: %d\n", Prepend, tds->TransmissionMode); + printf ("%s OtherFrequencyFlag: %d\n", Prepend, tds->OtherFrequencyFlag); + } + break; + case DESCR_SERVICE_LIST: { struct ServiceListEntry *Entry; @@ -589,7 +609,6 @@ void siDebugDescriptors (char *Prepend, struct LIST *Descriptors) case DESCR_VBI_TELETEXT: case DESCR_MOSAIC: case DESCR_TELEPHONE: - case DESCR_TERR_DEL_SYS: case DESCR_ML_NW_NAME: case DESCR_ML_BQ_NAME: case DESCR_ML_SERVICE_NAME: diff --git a/libdtv/libsi/si_parser.c b/libdtv/libsi/si_parser.c index 1ca311be..a922b7e3 100644 --- a/libdtv/libsi/si_parser.c +++ b/libdtv/libsi/si_parser.c @@ -1050,6 +1050,7 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer) (sds->west_east_flag ? 1 : -1) * (BcdCharToInt (sds->orbital_position1) * 100 + BcdCharToInt (sds->orbital_position2)), + sds->modulation, sds->polarization, BcdCharToInt (sds->symbol_rate1) * 10 * 1000 + BcdCharToInt (sds->symbol_rate2) * 100 + @@ -1082,8 +1083,40 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer) BcdCharToInt (cds->symbol_rate1) * 10 * 1000 + BcdCharToInt (cds->symbol_rate2) * 100 + BcdCharToInt (cds->symbol_rate3), + cds->fec_outer, cds->fec_inner, - cds->modulation + cds->modulation + ); + } + /* else + { + fprintf (stderr, "Illegal cds descriptor\n"); + siDumpDescriptor (Buffer); + } */ + } + break; + + case DESCR_TERR_DEL_SYS: +// fprintf (stderr, "got descriptor 0x%x\n", GetDescriptorTag(Buffer)); + { + descr_terrestrial_delivery_system_t *tds; + tds = (descr_terrestrial_delivery_system_t *) Ptr; + if (CheckBcdChar (tds->frequency1) && CheckBcdChar (tds->frequency2) && + CheckBcdChar (tds->frequency3) && CheckBcdChar (tds->frequency4)) + { + CreateTerrestrialDeliverySystemDescriptor (Descriptor, + BcdCharToInt (tds->frequency1) * 100 * 1000 * 1000 + + BcdCharToInt (tds->frequency2) * 1000 * 1000 + + BcdCharToInt (tds->frequency3) * 10 * 1000 + + BcdCharToInt (tds->frequency4) * 100, + tds->bandwidth, + tds->constellation, + tds->hierarchy, + tds->code_rate_HP, + tds->code_rate_LP, + tds->guard_interval, + tds->transmission_mode, + tds->other_frequency_flag ); } /* else @@ -1153,7 +1186,6 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer) case DESCR_VBI_TELETEXT: case DESCR_MOSAIC: case DESCR_TELEPHONE: - case DESCR_TERR_DEL_SYS: case DESCR_ML_NW_NAME: case DESCR_ML_BQ_NAME: case DESCR_ML_SERVICE_NAME: