diff options
Diffstat (limited to 'libdtv/libsi')
-rw-r--r-- | libdtv/libsi/include/libsi.h | 44 | ||||
-rw-r--r-- | libdtv/libsi/include/si_tables.h | 36 | ||||
-rw-r--r-- | libdtv/libsi/si_debug_services.c | 23 | ||||
-rw-r--r-- | libdtv/libsi/si_parser.c | 36 |
4 files changed, 130 insertions, 9 deletions
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: |