📄 dvb_descriptor.c
字号:
/*$Id: dvb_descriptor.c,v 1.29 2004/02/10 22:57:54 rasc Exp $ DVBSNOOP a dvb sniffer and mpeg2 stream analyzer tool http://dvbsnoop.sourceforge.net/ (c) 2001-2004 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.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 "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_AdaptionFieldData(b); break; case 0x71: descriptorDVB_ServiceIdentifier(b); break; case 0x72: descriptorDVB_ServiceAvailability(b); break; default: if (b[0] < 0x80) { out_nl (0," ----> ERROR: unimplemented descriptor (dvb context), Report!"); } descriptor_any (b); break; } return len; // (descriptor total length)}/* --------------------------------------------------------------- well known DVB descriptors --------------------------------------------------------------- *//* 0x40 NetName descriptor (network name descriptor)*/void descriptorDVB_NetName (u_char *b){ /* ETSI 300 468 */ int len; // tag = b[0]; len = b[1]; print_text_468A (4, "Network_name: ", b+2,len);}/* 0x41 Service List Descriptor */void descriptorDVB_ServList (u_char *b){ /* ETSI 300 468 6.2.xx */ typedef struct _descServList { u_int descriptor_tag; u_int descriptor_length; // N ... Service ID & Types } descServList; typedef struct _descServList2 { u_int service_id; u_int service_type; } descServList2; descServList d; descServList2 d2; int len; d.descriptor_tag = b[0]; d.descriptor_length = b[1]; len = d.descriptor_length - 2; b += 2; indent (+1); while (len > 0) { d2.service_id = getBits (b, 0, 0, 16); d2.service_type = getBits (b, 0, 16, 8); b += 3; len -= 3; out_S2W_NL (4,"Service_ID: ",d2.service_id, " --> refers to PMS program_number"); out_S2B_NL (4,"Service_type: ",d2.service_type, dvbstrService_TYPE(d2.service_type)); 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)*/void descriptorDVB_SatDelivSys (u_char *b){ /* ETSI 300 468 6.2.xx */ 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)*/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.%05lx 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*/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);}/* 0x48 Service descriptor ETSI EN 300 468 6.2.xx*/void descriptorDVB_Service (u_char *b){ typedef struct _descService { u_int descriptor_tag; u_int descriptor_length; u_int service_type; u_int service_provider_name_length; // N char // char *service_provider_name; u_int service_name_length; // N2 char // char *service_name; } descService; descService d; d.descriptor_tag = b[0]; d.descriptor_length = b[1]; d.service_type = getBits (b, 0, 16, 8); d.service_provider_name_length = getBits (b, 0, 24, 8); b += 4; out_S2B_NL (4,"Service_type: ",d.service_type, dvbstrService_TYPE(d.service_type)); out_SB_NL (5,"Service_provider_name_length: ",d.service_provider_name_length); print_text_468A (4, "Service_provider_name: ", b,d.service_provider_name_length);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -