📄 dvb_descriptor.c
字号:
/*$Id: dvb_descriptor.c,v 1.41 2005/01/17 19:41:22 rasc Exp $ DVBSNOOP a dvb sniffer and mpeg2 stream analyzer tool http://dvbsnoop.sourceforge.net/ (c) 2001-2005 Rainer.Scherg@gmx.de (rasc) -- DVB Descriptors ETSI 300 468 -- EN/ISO/TR document references in comments may habe been changed -- during updates of documents by ETSI.$Log: dvb_descriptor.c,v $Revision 1.41 2005/01/17 19:41:22 rascBugfix: data broadcast descriptor (tnx to Sergio SAGLIOCCO, SecureLAB)Revision 1.40 2004/11/03 21:00:50 rasc - New: "premiere.de" private tables and descriptors (tnx to Peter.Pavlov, Premiere) - New: cmd option "-privateprovider <provider name>" - New: Private provider sections and descriptors decoding - Changed: complete restructuring of private descriptors and sectionsRevision 1.39 2004/08/27 23:25:52 rasc - Update: changes due to EN 300 468 v1.6.1 - Bugfix: Multilingual component descriptor (tnx to Karsten Siebert)Revision 1.38 2004/08/25 19:51:09 rasc - Update: EN 300 468 v1.6.1 Terrestrial delivery system descriptorRevision 1.37 2004/08/24 21:30:22 rascmore MetadataRevision 1.36 2004/08/22 18:36:45 rasc - Bugfix: multilang service descriptor fix (tnx to Karsten Siebert) - New: MetaData Section (Basic) (H.222.0 AMD1)Revision 1.35 2004/08/07 22:10:00 rascBugfix: NIT cable frequency display (reported by Karsten Siebert )Revision 1.34 2004/08/01 21:33:08 rascminor TVA stuff (TS 102 323)Revision 1.33 2004/07/25 20:12:58 rasc - New: content_identifier_descriptor (TS 102 323) - New: TVA_id_descriptor (TS 102 323) - New: related_content_descriptor (TS 102 323) - New: default_authority_descriptor (TS 102 323)Revision 1.32 2004/07/24 11:44:44 rascEN 301 192 update - New: ECM_repetition_rate_descriptor (EN 301 192 v1.4.1) - New: time_slice_fec_identifier_descriptor (EN 301 192 v1.4.1) - New: Section MPE_FEC EN 301 192 v1.4 - BugfixesRevision 1.31 2004/04/15 03:38:50 rascnew: TransportStream sub-decoding (ts2PES, ts2SEC) [-tssubdecode]checks for continuity errors, etc. and decode in TS enclosed sections/pes packetsRevision 1.30 2004/04/05 17:32:13 rascmass typo fix adaption --> adaptationRevision 1.29 2004/02/10 22:57:54 rascMHP descriptor, missing DVB descriptor doneRevision 1.28 2004/02/09 22:56:59 rascBugfix VBI Data descriptorRevision 1.27 2004/02/09 21:24:57 rascAIT descriptorsminor redesign on output routinesRevision 1.26 2004/01/02 16:40:34 rascDSM-CC INT/UNT descriptors completeminor changes and fixesRevision 1.25 2004/01/01 20:35:26 rascPES program stream map, minor descriptor cleanupRevision 1.24 2004/01/01 20:31:22 rascPES program stream map, minor descriptor cleanupRevision 1.23 2004/01/01 20:09:19 rascDSM-CC INT/UNT descriptorsPES-sync changed, TS sync changed,descriptor scopeother changesRevision 1.22 2003/12/27 22:02:43 rascdsmcc INT UNT descriptors startedRevision 1.21 2003/12/27 14:35:00 rascdvb-t descriptorsDSM-CC: SSU Linkage/DataBroadcast descriptorsRevision 1.20 2003/12/26 23:27:39 rascDSM-CC UNT sectionRevision 1.19 2003/11/26 23:54:47 rasc-- bugfixes on Linkage descriptorRevision 1.18 2003/11/26 16:27:45 rasc- mpeg4 descriptors- simplified bit decoding and output functionRevision 1.17 2003/11/24 23:52:16 rasc-sync option, some TS and PES stuff;dsm_addr inactive, may be wrong - due to missing ISO 13818-6Revision 1.16 2003/11/09 20:48:34 rascpes data packet (DSM-CC)Revision 1.15 2003/11/07 16:33:32 rascno messageRevision 1.14 2003/11/01 21:40:27 rascsome broadcast/linkage descriptor stuffRevision 1.13 2003/10/29 20:54:56 rascmore PES stuff, DSM descriptors, testdataRevision 1.12 2003/10/26 21:36:19 rascprivate DSM-CC descriptor Tags started,INT-Section completed..Revision 1.11 2003/10/26 19:06:27 rascno messageRevision 1.10 2003/10/25 19:11:49 rascno messageRevision 1.9 2003/10/24 22:45:04 rasccode reorg...Revision 1.8 2003/10/24 22:17:17 rasccode reorg...Revision 1.7 2003/10/21 21:31:29 rascno messageRevision 1.6 2003/10/21 19:54:43 rascno messageRevision 1.5 2003/10/19 22:31:38 rasc- some datacarousell stuff startedRevision 1.4 2003/10/19 22:22:57 rasc- some datacarousell stuff startedRevision 1.3 2003/10/19 21:05:53 rasc- some datacarousell stuff startedRevision 1.2 2003/10/16 19:02:28 rascsome updates to dvbsnoop...- small bugfixes- tables updates from ETR 162Revision 1.1 2003/07/08 19:59:50 rascrestructuring... some new, some fixes,trying to include DSM-CC, Well someone a ISO13818-6 and latest version of ISO 18313-1 to spare?*/#include "dvbsnoop.h"#include "descriptor.h"#include "dvb_descriptor.h"#include "private/userdefs.h"#include "strings/dvb_str.h"#include "strings/dsmcc_str.h"#include "misc/hexprint.h"#include "misc/output.h"/* determine descriptor type and print it... EN 300 468: descriptor_tag: The descriptor tag is an 8-bit field which identifies each descriptor. Those values with MPEG-2 normative meaning are described in ISO/IEC 13818-1 [1]. return byte length*/int descriptorDVB (u_char *b){ int len; int id; id = (int) b[0]; len = ((int) b[1]) + 2; out_NL (4); out_S2B_NL (4,"DVB-DescriptorTag: ",id, dvbstrDVBDescriptorTAG(id)); out_SB_NL (5,"Descriptor_length: ",b[1]); // empty ?? len = ((int)b[1]) + 2; if (b[1] == 0) return len; // print hex buf of descriptor printhex_buf (9, b,len); switch (b[0]) { case 0x40: descriptorDVB_NetName (b); break; case 0x41: descriptorDVB_ServList (b); break; case 0x42: descriptorDVB_Stuffing (b); break; case 0x43: descriptorDVB_SatDelivSys (b); break; case 0x44: descriptorDVB_CableDelivSys (b); break; case 0x45: descriptorDVB_VBI_Data (b); break; case 0x46: descriptorDVB_VBI_Teletext (b); break; case 0x47: descriptorDVB_BouquetName (b); break; case 0x48: descriptorDVB_Service (b); break; case 0x49: descriptorDVB_CountryAvail (b); break; case 0x4A: descriptorDVB_Linkage (b); break; case 0x4B: descriptorDVB_NVOD_Reference (b); break; case 0x4C: descriptorDVB_TimeShiftedService (b); break; case 0x4D: descriptorDVB_ShortEvent (b); break; case 0x4E: descriptorDVB_ExtendedEvent (b); break; case 0x4F: descriptorDVB_TimeShiftedEvent(b); break; case 0x50: descriptorDVB_Component(b); break; case 0x51: descriptorDVB_Mosaic(b); break; case 0x52: descriptorDVB_StreamIdent (b); break; case 0x53: descriptorDVB_CAIdentifier (b); break; case 0x54: descriptorDVB_Content (b); break; case 0x55: descriptorDVB_ParentalRating(b); break; case 0x56: descriptorDVB_Teletext (b); break; case 0x57: descriptorDVB_Telephone (b); break; case 0x58: descriptorDVB_LocalTimeOffset (b); break; case 0x59: descriptorDVB_Subtitling (b); break; case 0x5A: descriptorDVB_TerrestDelivSys (b); break; case 0x5B: descriptorDVB_MultilingNetworkName (b); break; case 0x5C: descriptorDVB_MultilingBouquetName (b); break; case 0x5D: descriptorDVB_MultilingServiceName (b); break; case 0x5E: descriptorDVB_MultilingComponent (b); break; case 0x5F: descriptorDVB_PrivateDataSpecifier (b); break; case 0x60: descriptorDVB_ServiceMove (b); break; case 0x61: descriptorDVB_ShortSmoothingBuffer (b); break; case 0x62: descriptorDVB_FrequencyList (b); break; case 0x63: descriptorDVB_PartialTransportStream(b); break; case 0x64: descriptorDVB_DataBroadcast(b); break; case 0x65: descriptorDVB_CASystem(b); break; /* $$$ reserved now ?? */ case 0x66: descriptorDVB_DataBroadcastID(b); break; case 0x67: descriptorDVB_TransportStream(b); break; case 0x68: descriptorDVB_DSNG(b); break; case 0x69: descriptorDVB_PDC(b); break; case 0x6A: descriptorDVB_AC3(b); break; case 0x6B: descriptorDVB_AncillaryData(b); break; case 0x6C: descriptorDVB_CellList(b); break; case 0x6D: descriptorDVB_CellFrequencyLink(b); break; case 0x6E: descriptorDVB_AnnouncementSupport(b); break; case 0x6F: descriptorDVB_ApplicationSignalling(b); break; case 0x70: descriptorDVB_AdaptationFieldData(b); break; case 0x71: descriptorDVB_ServiceIdentifier(b); break; case 0x72: descriptorDVB_ServiceAvailability(b); break; // TV ANYTIME TS 102 323 case 0x73: descriptorDVB_DefaultAuthority(b); break; case 0x74: descriptorDVB_RelatedContent(b); break; case 0x75: descriptorDVB_TVA_ID(b); break; case 0x76: descriptorDVB_ContentIdentifier(b); break; // EN 301 192 v1.4.1 MPE_FEC case 0x77: descriptorDVB_TimesliceFecIdentifier(b); break; case 0x78: descriptorDVB_ECM_RepetitionRate(b); break; default: if (b[0] < 0x80) { out_nl (0," ----> ERROR: unimplemented descriptor (dvb context), Report!"); } // descriptor_any (b); descriptor_PRIVATE (b, DVB_SI); break; } return len; // (descriptor total length)}/* --------------------------------------------------------------- well known DVB descriptors --------------------------------------------------------------- *//* 0x40 NetName descriptor (network name descriptor) EN 300 468 -- checked v1.6.1*/void descriptorDVB_NetName (u_char *b){ int len; // tag = b[0]; len = b[1]; print_text_468A (4, "Network_name: ", b+2,len);}/* 0x41 Service List Descriptor EN 300 468 -- adapted v1.6.1*/void descriptorDVB_ServList (u_char *b){ int len; // tag = b[0]; len = b[1]; b += 2; len -= 2; indent (+1); while (len > 0) { int stype; stype = b[2]; // prefetch service_type == (b, 16,8) outBit_Sx (4,"service_ID: ", b, 0, 16); if (stype != 0x04) { // 0x04 = NVOD out (4, "[ --> refers to PMT program_number]"); } out_NL (4); outBit_S2x_NL (4,"service_type: ", b, 16, 8, (char *(*)(u_long)) dvbstrService_TYPE ); b += 3; len -= 3; out_NL (4); } indent (-1);}/* 0x42 Stuffing descriptor ETSI EN 300 468 */void descriptorDVB_Stuffing (u_char *b){ descriptor_any (b);}/* 0x43 SatDelivSys descriptor (Satellite delivery system descriptor) EN 300 468 -- adapted v1.6.1*/void descriptorDVB_SatDelivSys (u_char *b){ typedef struct _descSDS { u_int descriptor_tag; u_int descriptor_length; u_long frequency; u_int orbital_position; u_int west_east_flag; u_int polarisation; u_int modulation; u_long symbol_rate; u_int FEC_inner; } descSDS; descSDS d; //int i; d.descriptor_tag = b[0]; d.descriptor_length = b[1]; d.frequency = getBits (b, 0, 16, 32); d.orbital_position = getBits (b, 0, 48, 16); d.west_east_flag = getBits (b, 0, 64, 1); d.polarisation = getBits (b, 0, 65, 2); d.modulation = getBits (b, 0, 67, 5); d.symbol_rate = getBits (b, 0, 72, 28); d.FEC_inner = getBits (b, 0, 100, 4); out_nl (4,"Frequency: %lu (= %3lx.%05lx GHz)",d.frequency, d.frequency >> 20, d.frequency & 0x000FFFFF ); out_nl (4,"Orbital_position: %u (= %3x.%01x)",d.orbital_position, d.orbital_position >> 4, d.orbital_position & 0x000F); out_S2B_NL (4,"West_East_flag: ",d.west_east_flag, dvbstrWEST_EAST_FLAG(d.west_east_flag)); out_S2B_NL (4,"Polarisation: ",d.polarisation, dvbstrPolarisation_FLAG(d.polarisation)); out_S2B_NL (4,"Modulation (Sat): ",d.modulation, dvbstrModulationSAT_FLAG(d.modulation)); out_nl (4,"Symbol_rate: %u (= %3x.%04x)",d.symbol_rate, d.symbol_rate >> 16, d.symbol_rate & 0x0000FFFF ); out_S2B_NL (4,"FEC_inner: ",d.FEC_inner, dvbstrFECinner_SCHEME (d.FEC_inner));}/* 0x44 CableDelivSys descriptor (Cable delivery system descriptor) EN 300 468 -- adapted v1.6.1*/void descriptorDVB_CableDelivSys (u_char *b){ /* ETSI 300 468 6.2.xx */ typedef struct _descCDS { u_int descriptor_tag; u_int descriptor_length; u_long frequency; u_int FEC_outer; u_int reserved_1; u_int modulation; u_long symbol_rate; u_int FEC_inner; } descCDS; descCDS d; //int i; d.descriptor_tag = b[0]; d.descriptor_length = b[1]; d.frequency = getBits (b, 0, 16, 32); d.reserved_1 = getBits (b, 0, 48, 12); d.FEC_outer = getBits (b, 0, 60, 4); d.modulation = getBits (b, 0, 64, 8); d.symbol_rate = getBits (b, 0, 72, 28); d.FEC_inner = getBits (b, 0, 100, 4); out_nl (4,"Frequency: %lu (= %3lx.%04lx MHz)",d.frequency, d.frequency >> 16, d.frequency & 0x0000FFFF ); out_S2B_NL (4,"FEC_outer: ",d.FEC_outer, dvbstrFECouter_SCHEME (d.FEC_outer)); out_SB_NL (6,"reserved_1: ",d.reserved_1); out_S2B_NL (4,"Modulation (Cable): ",d.modulation, dvbstrModulationCable_FLAG(d.modulation)); out_nl (4," Symbol_rate: %u (= %4x.%04x)",d.symbol_rate, d.symbol_rate >> 16, d.symbol_rate & 0x0000FFFF ); out_S2B_NL (4,"FEC_inner: ",d.FEC_inner, dvbstrFECinner_SCHEME (d.FEC_inner));}/* 0x45 VBI Data descriptor ETSI EN 300 468 2.2.42 -- checked v1.6.1*/void descriptorDVB_VBI_Data (u_char *b){ int len1; // dtag = b[0]; len1 = b[1]; b += 2; indent (+1); while (len1 > 0) { int ds_id; int len2; out_NL (4); ds_id = outBit_S2x_NL (4,"Data_service_id: ", b, 0, 8, (char *(*)(u_long)) dvbstrDataService_ID); len2 = outBit_Sx_NL (4,"Data_service_descriptor_length: ", b, 8, 8); b += 2; len1 -= 2; if ((ds_id >= 1 && ds_id <= 7) && (ds_id != 3) ) { indent (+1); while (len2 > 0) { out_NL (4); outBit_Sx_NL (6,"reserved_1: ", b, 0, 2); outBit_Sx_NL (4,"field_parity: ", b, 2, 1); outBit_Sx_NL (4,"line_offset: ", b, 3, 5); b++; len2--; len1--; } indent (-1); } else { print_databytes (6,"Reserved Data:", b,len2); b += len2; len1 -= len2; } } indent (-1);}/* 0x46 VBI teletext descriptor ETSI EN 300 468 6.2.xx*/void descriptorDVB_VBI_Teletext (u_char *b){ descriptorDVB_Teletext (b);}/* 0x47 Bouquet Name descriptor ETSI EN 300 468 6.2.xx*/void descriptorDVB_BouquetName (u_char *b){ int len; // tag = b[0]; len = b[1]; print_text_468A (4, "BouquetName: ", b+2,len);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -