void PES_decodeDATA_EBU_etc (u_char *b, int len) { // -- PES_DATA_bytes EBU // -- Data Buffer starts at PES_DATA_BYTES... // --> see parent int data_identifier; out_nl (4,"EBU data:"); indent (+1); data_identifier = outBit_S2x_NL (4,"data_identifier: ", b, 0, 8, (char *(*)(u_long)) dvbstrPESDataIdentifier); b++; len--; while (len > 0) { int len2; int dui; int n=0; out_NL (4); dui = outBit_S2x_NL (4,"data_unit_id: ", b, 0, 8, (char *(*)(u_long)) dvbstrPES_EBUDataUnitID); len2 = outBit_Sx_NL (4,"data_unit_length: ", b, 8, 8); b += 2; len -= 2; if (dui==0x02 || dui==0x03 || dui==0xC0 || dui==0xC1) { n = teletext_data_field (4, b, len2); } else if (dui==0xC3) { n = vps_data_field(4, b,len2); } else if (dui==0xC4) { n = wss_data_field (4, b,len2); } else if (dui==0xC5) { n = closed_caption_data_field (4, b,len2); } else if (dui==0xC6) { n = monochrome_data_field (4, b,len2); } else if (dui==0xFF) { /* No data field */ n = 0; } if ( (len2-n) > 0 ) { print_databytes (4,"stuffing bytes:", b+n, len2-n); } b += len2; len -= len2; } indent (-1); }
void section_TDT (u_char *b, int len) { u_int table_id; u_long UTC_time_MJD; u_long UTC_time_UTC; out_nl (3,"TDT-decoding...."); table_id = outBit_S2x_NL (3,"Table_ID: ", b, 0, 8, (char *(*)(u_long)) dvbstrTableID ); if (table_id != 0x70) { out_nl (3,"wrong Table ID"); return; } outBit_Sx_NL (3,"section_syntax_indicator: ", b, 8, 1); outBit_Sx_NL (6,"reserved_1: ", b, 9, 1); outBit_Sx_NL (6,"reserved_2: ", b, 10, 2); outBit_Sx_NL (3,"Section_length: ", b, 12, 12); out (3,"UTC_time: "); UTC_time_MJD = getBits (b, 0, 24, 16); UTC_time_UTC = getBits (b, 0, 40, 24); print_time40 (3, UTC_time_MJD,UTC_time_UTC); out_NL (3); }
static int teletext_data_field (int v, u_char *b, int len) { int v1 = v+1; int len2; out_nl (v,"Teletext data:"); indent (+1); ebu_rfl_out (v1,b); outBit_S2x_NL (v1,"frame_coding: ", b, 8, 8, (char *(*)(u_long)) dvbstrTELETEXT_framingcode ); b += 2; len -= 2; print_databytes (8,"data_block:", b, 42); out_nl (v1," => decoded:"); indent (+1); invertBuffer (b, 42); len2 = print_teletext_control_decode (v1, b, 42); b += len2; len -= len2; indent (-1); indent (-1); return 44; }
void mpeg_system_header (int v, u_char *b, int len) { /* z.B. H.222 ISO 13818-1 Table 2-34 */ /* ISO 11172-1 system header */ if (len == 0) return; out_nl (v,"System_header: "); indent (+1); if (len > 0) { // -- within PES packet, not PS! outBit_Sx_NL (v,"system_header_start_code: ", b, 0, 32); } // -- get real length from system_header data len = outBit_Sx_NL (v,"header_length: ", b, 32, 16); outBit_Sx_NL (v,"marker_bit: ", b, 48, 1); outBit_Sx_NL (v,"rate_bound: ", b, 49, 22); outBit_Sx_NL (v,"marker_bit: ", b, 71, 1); outBit_Sx_NL (v,"audio_bound: ", b, 72, 6); outBit_Sx_NL (v,"fixed_flag: ", b, 78, 1); outBit_Sx_NL (v,"CSPS_flag: ", b, 79, 1); outBit_Sx_NL (v,"system_audio_lock_flag: ", b, 80, 1); outBit_Sx_NL (v,"system_video_lock_flag: ", b, 81, 1); outBit_Sx_NL (v,"marker_bit: ", b, 82, 1); outBit_Sx_NL (v,"video_bound: ", b, 83, 5); outBit_Sx_NL (v,"packet_rate_restriction_flag: ", b, 88, 1); outBit_Sx_NL (v,"reserved_byte: ", b, 89, 7); b += 12; len -= 12; // while (nextbits () == '1') { // while ((bit = getBits (b, 0,0,1)) == 0x01) { while ( (*b & 0x80) ) { if (len <= 0) break; out_NL (v); outBit_S2x_NL(v,"Stream_id: ", b, 0, 8, (char *(*)(u_long))dvbstrPESstream_ID ); outBit_Sx_NL (v,"fixed (0x02): ", b, 8, 2); outBit_Sx_NL (v,"P-STD_buffer_bound_scale: ", b, 10, 1); outBit_Sx_NL (v,"P-STD_buffer_size_bound: ", b, 11, 13); b += 3; len -= 3; if (len < 0) out_nl (1, "$$$ something wrong here (length<0)"); } indent (-1); }
void descriptorMHP_AIT_ip_signalling (u_char *b) { // descriptor_tag = b[0]; // len = b[1]; b +=2; outBit_S2x_NL (4,"platform_id: ", b, 0, 24, (char *(*)(u_long)) dsmccStrPlatform_ID); }
int descriptorMHP_AIT (u_char *b) { int len; int tag; out_NL (4); tag = outBit_S2x_NL (4,"MHP_AIT-DescriptorTag: ", b, 0, 8, (char *(*)(u_long))dsmccStrMHP_AIT_DescriptorTAG); len = outBit_Sx_NL (4,"descriptor_length: ", b, 8, 8); // empty ?? if (len == 0) return len; // print hex buf of descriptor printhex_buf (9, b,len+2); switch (tag) { case 0x00: descriptorMHP_AIT_application (b); break; case 0x01: descriptorMHP_AIT_application_name (b); break; case 0x02: descriptorMHP_AIT_transport_protocol (b); break; case 0x03: descriptorMHP_AIT_dvb_j_application (b); break; case 0x04: descriptorMHP_AIT_dvb_j_application_location (b); break; case 0x05: descriptorMHP_AIT_external_application_authorisation (b); break; // case 0x06: reserved // case 0x07: reserved case 0x08: descriptorMHP_AIT_dvb_html_application (b); break; case 0x09: descriptorMHP_AIT_dvb_html_application_location (b); break; case 0x0A: descriptorMHP_AIT_dvb_html_application_boundary (b); break; case 0x0B: descriptorMHP_AIT_application_icons (b); break; case 0x0C: descriptorMHP_AIT_pre_fetch (b); break; case 0x0D: descriptorMHP_AIT_DII_location (b); break; case 0x0E: descriptorMHP_AIT_delegated_application (b); break; case 0x0F: descriptorMHP_AIT_plug_in (b); break; case 0x10: descriptorMHP_AIT_application_storage (b); break; case 0x11: descriptorMHP_AIT_ip_signalling (b); break; case 0x5F: descriptorDVB_PrivateDataSpecifier (b); break; default: if (tag < 0x80) { out_nl (0," ----> ERROR: unimplemented descriptor (MHP_AIT context), Report!"); } descriptor_PRIVATE (b,MHP_AIT); break; } return len+2; // (descriptor total length) }
u_long BIOP_TAG_dispatch (int v, u_char *b) { u_long id_tag; u_long len; id_tag = getBits (b, 0, 0, 32); // ID_tag prefetch switch (id_tag) { case 0x42494F50: // "BIOP" // BIOP::FileMessage // BIOP::DirectoryMessage // BIOP::StreamMessage // BIOP::StreamEventMessage len = BIOP_Message (v, b); break; case 0x49534f05: // TAG_LITE_OPTIONS len = BIOP_LiteOptionsProfileBody (v, b); break; case 0x49534f06: // TAG_BIOP // BIOPProfileBody len = BIOP_BIOPProfileBody (v, b); break; case 0x49534f40: // TAG_ConnBinder // DSM::ConnBinder len = BIOP_DSM_ConnBinder (v, b); break; case 0x49534f46: // TAG_SERVICE_LOCATION len = BIOP_DSM_ServiceLocation (v, b); break; case 0x49534f50: // TAG_ObjectLocation // DSM::ConnBinder len = BIOP_ObjectLocation (v, b); break; default: // unknown !!! // $$$ TODO: we wildly guess, that there is a 32b length field! // $$$ TODO: this may break the decoding process, if not true outBit_S2x_NL (v,"profileId_tag: ", b, 0, 32, (char *(*)(u_long)) dsmccStrIOP_ProfileID ); len = outBit_Sx_NL (v,"profile_data_length: ", b, 32, 32); print_databytes (v,"unkown profile_data:", b+8, len); len += 8; break; } out_NL (v); return len; }
void descriptorMHP_AIT_application_storage (u_char *b) { // descriptor_tag = b[0]; // len = b[1]; b +=2; outBit_S2x_NL(4,"storage_property: ", b, 0, 8, (char *(*)(u_long)) dsmccStrMHP_storage_property); outBit_Sx_NL (4,"not_launchable_from_broadcast: ", b, 8, 1); outBit_Sx_NL (4,"reserved: ", b, 9, 7); outBit_Sx_NL (4,"version: ", b, 16, 32); outBit_Sx_NL (4,"priority: ", b, 48, 8); }
void descriptor_PRIVATE_PremiereDE_ContentTransmission (u_char *b) { int len, str_tim_len; u_int time_MJD, time_UTC; // tag = b[0]; len = b[1]; out_nl (4,"--> Premiere Content Transmission descriptor "); outBit_Sx_NL (4,"transport_stream_ID: ", b, 16, 16); outBit_S2x_NL (4,"original_network_id: ", b, 32, 16, (char *(*)(u_long)) dvbstrOriginalNetwork_ID); outBit_S2Tx_NL(4,"service_ID: ", b, 48, 16, " --> refers to PMT program_number"); b += 8; len -= 6; out_NL(4); while (len>0) { out (4,"Start_date: "); time_MJD = getBits (b, 0, 0, 16); print_time_mjd (4, time_MJD); out_NL (4); str_tim_len = outBit_Sx_NL (5,"start_time_loop_length: ", b, 16, 8); b += 3; len -= 3; indent (+1); for(; str_tim_len>0; str_tim_len-=3) { out (4,"Start_time: "); time_UTC = getBits (b, 0, 0, 24); print_time_utc (4, time_UTC); out_NL (4); b += 3; len -= 3; } out_NL (4); indent (-1); } }
int llc_snap (int v, u_char *b) { int dsap, ssap, ctrl; int oui, prot; out_nl (v,"LLC/SNAP:"); indent (+1); out_nl (v,"LLC:"); dsap = outBit_Sx_NL (v," DSAP: ", b, 0, 8); ssap = outBit_Sx_NL (v," SSAP: ", b, 8, 8); ctrl = outBit_Sx_NL (v," Control: ", b,16, 8); out_nl (v,"SNAP:"); oui = outBit_S2x_NL (v," Org. Unique ID: ", b,24,24, (char *(*)(u_long))dsmccStrOUI ); prot = outBit_S2x_NL (v," Protocol Identifier: ", b,48,16, (char *(*)(u_long))dsmccStr_LLC_SNAP_prot ); indent (-1); return 8; }
void descriptorMHP_AIT_application (u_char *b) { int len; int len2; // descriptor_tag = b[0]; len = b[1]; len2 = outBit_Sx_NL (4,"application_profile_length: ", b, 16, 8); b += 3; len -= 1; indent (+1); while (len2 > 0) { int x; out_NL(4); x = mhp_application_profile_version (4, b); b += x; len -= x; len2 -= x; } out_NL(4); indent (-1); outBit_Sx_NL (4,"service_bound_flag: ", b, 0, 1); outBit_S2x_NL(4,"visibility: ", b, 1, 2, (char *(*)(u_long)) dsmccStrMHP_visibility_state ); outBit_Sx_NL (4,"reserved: ", b, 3, 5); outBit_Sx_NL (4,"application_priority: ", b, 8, 8); b += 2; len -= 2; while (len > 0) { outBit_Sx_NL (4,"transport_protocol_label: ", b, 0, 8); b++; len--; } }
int print_vps_decode (int v, u_char *b, int len) { // warning! Nipples e.g. _2_7 may not be msb...lsb order! // see: ETSI EN 300 231 for this notation! u_int pcs; u_int cni_1_4; u_int pil; u_int pty; u_int day, month, hour, minute; u_int country_5_8; u_int npp, npp_0_1, npp_2_7; out_nl (v,"VPS data:"); print_databytes (8,"Data:", b, len); indent (+1); // -- starts at EN 300 231 8.2.2 Fig.9 Table // -- Byte 3..15 , so byte 3 => [0] // -- vps_data_block: // -- Byte 3+4: not relevant to PDC // -- Info from datasheet SAA4700 (Philips) outBit_Sx_NL (v,"(program source identification (binary coded)): ", b, 0, 8); outBit_Sx_NL (v,"(program source identification (ASCII seq)): ", b+1, 0, 8); // -- PCS pcs = outBit_S2x_NL (v,"PCS audio: ", b+2, 0, 2, (char *(*)(u_long)) dvbstrVPS_pcs_audio ); pcs = outBit_Sx_NL (v,"PCS reserved: ", b+2, 2, 2); cni_1_4 = outBit_Sx (v,"CNI reserved: ", b+2, 4, 4); if (cni_1_4 == 0x0F) out_nl (4, " [= Unenhanced VPS]"); else out_nl (4, " [= Enhanced VPS]"); // -- Byte 6..10: not relevant to PDC // -- Info from datasheet SAA4700 (Philips) outBit_Sx_NL (v,"(program/test picture identification): ", b+3, 0, 8); outBit_Sx_NL (v,"(internal information exchange): ", b+4, 0, 8); outBit_Sx_NL (v,"(address assignment of signal distribution): ", b+5, 0, 16); outBit_Sx_NL (v,"(messages/commands): ", b+7, 0, 8); pil = getBits (b, 8, 2, 20); npp_0_1 = getBits (b, 8, 0, 2); day = getBits (b, 8, 2, 5); month = getBits (b, 8, 7, 4); hour = getBits (b, 8, 11, 5); minute = getBits (b, 8, 16, 6); country_5_8 = getBits (b, 8, 22, 4); npp_2_7 = getBits (b, 8, 26, 6); pty = getBits (b, 8, 32, 8); // byte 15 out_SB_NL (v,"NPP_1: ", npp_0_1); out_ST (v,"Program Identificaion Label (PIL): ", pil); if (day != 0x00) { out_nl (v," [= month=%d day=%d hour=%d min=%d]", month, day, hour, minute); } else { char *s; switch (pil) { case 0x07FFF: s = "Timer-control code (TC)"; break; case 0x07FBF: s = "Record inhibit/Terminate (RI/T)"; break; case 0x07F7F: s = "Interrruption code (INT)"; break; case 0x07F3F: s = "Continuation code"; break; case 0xFFFFF: s = "Program selected by PTY"; break; default: s = "UNKOWN code"; break; } out_nl (v," [= %s]",s); } out_S2B_NL (v,"Country: ", country_5_8, dvbstrVPS_cni_countrycode(1+(country_5_8 << 4)) ); out_SB_NL (v,"NPP_2: ", npp_2_7); npp = (npp_0_1 << 6) + (npp_2_7); // msb ... lsb out_S2B_NL (v," ==> Network/Program Provider (NPP): ", npp, dvbstrVPS_npp(npp) ); out_S2B_NL (v,"Program Type (PTY): ", pty, dvbstrVPS_pty(pty) ); indent (-1); return len; }
int BIOP_TAP (int v, const char *str, u_char *b) { u_char *b_org = b; int use; int n; out_nl (v, "%s::TAP:"); indent (+1); outBit_Sx_NL (v,"id: ", b, 0, 16); use = outBit_S2x_NL(v,"use: ", b, 16, 16, (char *(*)(u_long))dsmccStrBIOP_TAP_Use ); outBit_Sx_NL (v,"association_tag: ", b, 32, 16); n = outBit_Sx_NL (v,"selector_length: ", b, 48, 8); b += 7; // -- a TAP may have a Selector() if (n >= 2) { int stype; stype = outBit_S2x_NL(v,"selector_type: ", b, 0, 16, (char *(*)(u_long))dsmccStrBIOP_TAP_SelectorType ); indent (+1); switch (stype) { case 0x0001: // MessageSelector dsmcc_print_transactionID_32 (v, b+2); outBit_S2Tx_NL (v,"timeout: ", b, 48, 32, "usec."); break; case 0x0109: // ATSC A95: TSFS_selector outBit_Sx_NL (v,"carouselId: ", b, 16, 32); outBit_S2Tx_NL (v,"DSI_timeout: ", b, 48, 32, "usec."); if (n > 10) { print_databytes (v,"URI_byte:", b+10, n-10); } break; case 0x0000: // ISO/IEC reserved default: // unknown, default print_databytes (v,"selector_data:", b+2, n-2); break; } indent (-1); } else { if (n > 0) { print_databytes (v,"selector_data:", b, n); } } b += n; indent (-1); out_NL (v); return (int) (b - b_org); }
void section_TVA_RNT (u_char *b, int len) { /* TS 102 323 */ u_int len1,len2; u_int table_id; u_int section_length; out_nl (3,"RNT-decoding...."); table_id = outBit_S2x_NL (3,"Table_ID: ", b, 0, 8, (char *(*)(u_long))dvbstrTableID ); if (table_id != 0x79) { out_nl (3,"wrong Table ID"); return; } outBit_Sx_NL (3,"Section_syntax_indicator: ", b, 8, 1); outBit_Sx_NL (6,"reserved: ", b, 9, 1); outBit_Sx_NL (6,"reserved: ", b,10, 2); section_length = outBit_Sx_NL (5,"section_length: ", b,12,12); outBit_Sx_NL (3,"context_id: ", b,24, 16); outBit_Sx_NL (6,"reserved_3: ", b,40, 2); outBit_Sx_NL (3,"version_number: ", b,42, 5); outBit_S2x_NL(3,"Current_next_indicator: ", b,47, 1, (char *(*)(u_long))dvbstrCurrentNextIndicator ); outBit_Sx_NL (3,"Section_number: ", b,48, 8); outBit_Sx_NL (3,"Last_section_number: ", b,56, 8); outBit_S2x_NL(3,"context_id_type: ", b,64, 8, (char *(*)(u_long))dvbstrTVA_content_id_type ); len2 = outBit_Sx_NL (3,"common_descriptor_length: ", b,72, 12); outBit_Sx_NL (6,"reserved: ", b,84, 4); b += 11; len1 = section_length - 8; // common descriptor loop out_nl (3,"Common_descriptor_loop:"); indent (+1); while (len2 > 0) { int i; i = descriptor (b, TVA_RNT); b += i; len1 -= i; len2 -= i; out_NL (4); } indent (-1); // resolution provider info loop out_nl (3,"resolution_provider_info_loop:"); indent (+1); while (len1 > 0) { int len2, len3; len2 = outBit_Sx_NL (3,"resolution_provider_info_length: ", b, 0, 12); outBit_Sx_NL (6,"reserved: ", b, 12, 4); len3 = outBit_Sx_NL (3,"resolution_provider_name_length: ", b, 16, 8); print_std_ascii (3,"resolution_provider_name: ", b+3, len3); b += len3 + 3; len1 -= len3 + 3; len2 -= len3 + 3; // resolution_provider_descriptors loop len3 = outBit_Sx_NL (3,"resolution_provider_descriptor_length: ", b, 0, 12); outBit_Sx_NL (6,"reserved: ", b, 12, 4); b += 2; len1 -= 2; len2 -= 2; out_nl (3,"resolution_provider_descriptor_loop:"); indent (+1); while (len3 > 0) { int i; i = descriptor (b, TVA_RNT); b += i; len1 -= i; len2 -= i; len3 -= i; out_NL (4); } indent (-1); // CRID_authority loop out_nl (3,"CRID_authority_loop:"); indent (+1); while (len2 > 0) { len3 = outBit_Sx_NL (3,"CRID_authority_name_length: ", b, 0, 8); print_std_ascii (3,"CRID_authority_name: ", b+1, len3); b += len3 + 1; len1 -= len3 + 1; len2 -= len3 + 1; // CRID_authority_descriptors loop len3 = outBit_Sx_NL (3,"CRID_authority_descriptors_length: ", b, 0, 12); outBit_Sx_NL (6,"reserved: ", b, 12, 4); b += 2; len1 -= 2; len2 -= 2; out_nl (3,"CRID_authority_descriptor_loop:"); indent (+1); while (len3 > 0) { int i; i = descriptor (b, TVA_RNT); b += i; len1 -= i; len2 -= i; len3 -= i; out_NL (4); } indent (-1); } indent (-1); } indent (-1); outBit_Sx_NL (5,"CRC: ", b,0,32); }
static u_long body_DirectoryMessage (int v, u_char *b) { u_char *b_org = b; int i; u_int nx,n2,n5,n7,n9; n2 = outBit_Sx_NL (v,"objectInfo_length: ", b, 0, 16); print_databytes(v,"objectInfo_data:", b+2, n2); b += 2 + n2; out_NL (v); nx = do_ServiceContentList (v, b); b += nx; outBit_Sx_NL (v,"messageBody_length: ", b, 0, 32); n5 = outBit_Sx_NL (v,"bindings_count: ", b, 32, 16); b += 6; indent (+1); for (i=0; i < n5; i++) { int n6; u_long kinddata; n6 = BIOP_Name (v, b, &kinddata); b += n6; outBit_S2x_NL (v,"BindingType: ", b, 0, 8, (char *(*)(u_long)) dsmccStrBIOP_BindingType); b += 1; n7 = IOP_IOR (v, b); b += n7; n9 = outBit_Sx_NL (v,"objectInfo_length: ", b, 0, 16); b += 2; if (n9) { if (kinddata == 0x66696c00) { // "fil" outBit64_Sx_NL (v,"DSM::File::ContentSize: ", b, 16, 64); b += 8; n9 -= 8; } if (n9 > 0) { print_databytes (v,"descriptor_bytes (PLEASE REPORT!!!):", b, n9); b += n9; // $$$ TODO: to be checked...!!! (instead of print_databytes) // // out_nl (v, "Descriptor_loop:"); // indent (+1); // while (n9 > 0) { // int x; // // x = descriptor (b, DSMCC_CAROUSEL); // b += x; // n9 -= x; // out_NL (v); // } // indent (-1); } // if n9 > 0 } // if n9 } // loop n5 indent (-1); return (u_long) (b - b_org); }
void decodeTS_iso13818 (u_char *b, int len) { /* ISO 13818-1 2.4.3.2 */ int n; TSPHD h; // // -- decode packet header (32 bit) // n = decodeTS_PacketHeader (b, &h); len -= n; b += n; if (h.afc & 0x2) { indent (+1); out_nl (3,"Adaptation_field: "); indent (+1); n = ts_adaptation_field (b); b += n; len -= n; indent (-1); indent (-1); } if (h.afc & 0x1) { indent (+1); out_nl (3,"Payload: (len: %d)",len); // -- if payload_start, check PES/SECTION if (h.pusi && ! (h.tsc || h.tei) ) { indent (+1); if (b[0]==0x00 && b[1]==0x00 && b[2]==0x01) { // -- PES outBit_S2x_NL (4,"==> PES-stream: ", b+3, 0,8, (char *(*)(u_long))dvbstrPESstream_ID ); } else { // -- section (eval pointer field) int pointer = b[0]+1; outBit_Sx_NL (4,"==> pointer_field: ", b, 0,8); outBit_S2x_NL (4,"==> Section table: ", b+pointer, 0,8, (char *(*)(u_long))dvbstrTableID ); } indent (-1); } print_databytes (5, "Data-Bytes:", b,len); indent (-1); } if (h.afc == 0x00) { // -- ISO/IEC reserved... print_databytes (5, "Data-Bytes:", b,len); } }
void section_PRIVATE_PremiereDE_CPT (u_char *b, int len) { u_int table_id; u_int section_syntax_indicator; u_int section_length; u_int time_MJD, time_UTC; u_int i, content_list_length; out_nl (3,"User_Defined-decoding...."); table_id = outBit_S2Tx_NL (3,"Table_ID: ", b, 0, 8, "Premiere Content Presentation Table"); if (table_id != 0xa1) { out_nl (3,"wrong Table ID"); return; } section_syntax_indicator = outBit_Sx_NL (3,"Section_syntax_indicator: ", b, 8, 1); // == 1 outBit_Sx_NL (3,"private_indicator: ", b, 9, 1); outBit_Sx_NL (6,"reserved: ", b,10, 2); section_length = outBit_Sx_NL (5,"private_section_length: ", b,12,12); outBit_Sx_NL (3,"table_id_extension: ", b, 24,16); outBit_Sx_NL (6,"reserved: ", b, 40, 2); outBit_Sx_NL (3,"Version_number: ", b, 42, 5); outBit_S2x_NL(3,"Current_next_indicator: ", b, 47, 1, (char *(*)(u_long))dvbstrCurrentNextIndicator ); outBit_Sx_NL (3,"Section_number: ", b, 48, 8); outBit_Sx_NL (3,"Last_section_number: ", b, 56, 8); b += 8; section_length -= 5; // // -- Premiere Content Presentation Table CIT // -- provided by Peter.Pavlov (Premiere.de) // outBit_Sx_NL (4,"Transport_stream_ID: ",b, 0, 16); outBit_Sx_NL (4,"Original_network_ID: ",b, 16, 16); outBit_Sx_NL (4,"virtual_channel_id: ",b, 32, 32); outBit_Sx_NL (4,"virtual_channel_name_length: ",b, 64, 8); b+=8; print_text_468A (4, "virtual_channel_name: ", b+1, *b); section_length -= 9+*b; b += *b+1; outBit_Sx_NL (4,"reserved: ",b, 0, 4); outBit_Sx_NL (4,"virtual_channel_info_length: ",b, 4, 12); b+=2; section_length -= 2; while (section_length > 4) { time_MJD = getBits (b, 0, 0, 16); time_UTC = getBits (b, 0, 16, 24); out (4,"start_time: "); print_time40 (4, time_MJD, time_UTC); out_NL (4); out_nl (4,"duration: %02x:%02x:%02x", *(b+5), *(b+6), *(b+7)); b+=8; outBit_Sx_NL (4,"virtual_event_name_length: ",b, 0, 8); print_text_468A (4, "virtual_event_name: ", b+1, *b); section_length -= *b+9; b += *b+1; outBit_Sx_NL (4,"virtual_event_info_length: ",b, 0, 8); print_text_468A (4, "virtual_event_info: ", b+1, *b); section_length -= *b+1; b += *b+1; outBit_Sx_NL (4,"reserved: ",b, 0, 4); outBit_Sx_NL (4,"content_list_length: ",b, 4, 12); content_list_length = ((b[0]&15)<<8)+b[1]; for(i=0, b+=2; i<content_list_length; i+=4, b+=4) { outBit_Sx_NL (4,"content_id: ",b, 0, 32); } section_length -= content_list_length+2; } outBit_Sx_NL (5,"CRC: ", b, 0, 32); }
void section_PRIVATE_PremiereDE_CIT (u_char *b, int len) { u_int table_id; u_int section_syntax_indicator; u_int section_length; out_nl (3,"User_Defined-decoding...."); table_id = outBit_S2Tx_NL (3,"Table_ID: ", b, 0, 8, "Premiere Content Information Table"); if (table_id != 0xa0) { out_nl (3,"wrong Table ID"); return; } section_syntax_indicator = outBit_Sx_NL (3,"Section_syntax_indicator: ", b, 8, 1); // ==1 outBit_Sx_NL (3,"private_indicator: ", b, 9, 1); outBit_Sx_NL (6,"reserved: ", b,10, 2); section_length = outBit_Sx_NL (5,"private_section_length: ", b,12,12); outBit_Sx_NL (3,"table_id_extension: ", b, 24,16); outBit_Sx_NL (6,"reserved: ", b, 40, 2); outBit_Sx_NL (3,"Version_number: ", b, 42, 5); outBit_S2x_NL(3,"Current_next_indicator: ", b, 47, 1, (char *(*)(u_long))dvbstrCurrentNextIndicator ); outBit_Sx_NL (3,"Section_number: ", b, 48, 8); outBit_Sx_NL (3,"Last_section_number: ", b, 56, 8); b += 8; section_length -= 5; // // -- Premiere Content Information Table CIT // -- provided by Peter.Pavlov (Premiere.de) // out_NL (3); outBit_Sx_NL (3,"Content id: ", b, 0, 32); outBit_Sx_NL (3,"Duration: ", b, 32,24); outBit_Sx_NL (3,"Reserved: ", b, 56, 4); outBit_Sx_NL (5,"descriptor_section_length: ", b, 60,12); b += 9; section_length -=9; while (section_length > 4 ) { int x; x = descriptor (b, DVB_SI); if (section_length < x) break; b += x; section_length -= x; } outBit_Sx_NL (5,"CRC: ", b, 0, 32); }
void section_DSMCC (u_char *b, int len) { /* TR 101 202 */ int len1; u_int table_id; u_int section_length; u_int section_syntax_indicator; u_int private_indicator; u_int sect_nr; u_int last_sect_nr; out_nl (3,"DSM-CC-decoding...."); table_id = outBit_S2x_NL (3,"Table_ID: ", b, 0, 8, (char *(*)(u_long))dvbstrTableID ); if (table_id < 0x3a || table_id > 0x3e) { out_nl (3,"wrong Table ID"); return; } section_syntax_indicator = outBit_Sx_NL (4,"Section_syntax_indicator: ", b, 8, 1); private_indicator = outBit_Sx_NL (4,"private_indicator: ", b, 9, 1); outBit_Sx_NL (6,"reserved_1: ", b,10, 2); section_length = outBit_Sx_NL (5,"dsmcc_section_length: ", b,12,12); outBit_Sx_NL (3,"table_id_extension: ", b,24,16); outBit_Sx_NL (6,"reserved_3: ", b,40, 2); outBit_Sx_NL (3,"Version_number: ", b,42, 5); outBit_S2x_NL(3,"Current_next_indicator: ", b,47, 1, (char *(*)(u_long))dvbstrCurrentNextIndicator ); sect_nr = outBit_Sx_NL (3,"Section_number: ", b,48, 8); last_sect_nr = outBit_Sx_NL (3,"Last_section_number: ", b,56, 8); b += 8; len1 = section_length - 5 - 4; // -4 == CRC/Checksum if (table_id == 0x3A) { llc_snap (3,b); // ISO/IEC 8802-2 } else if (table_id == 0x3B) { dsmcc_UserNetworkMessage (4, b, len1); } else if (table_id == 0x3C) { dsmcc_DownloadDataMessage (4, b, len1); } else if (table_id == 0x3D) { DSMCC_descriptor_list (b,len1); } else if (table_id == 0x3E) { // $$$ Remark: DVB defines 0x3E as datagram!! print_private_data (4, b, len1); } b += len1; outBit_Sx_NL (5, (section_syntax_indicator) ?"CRC: " :"Checksum: ", b,0,32); }
void descriptorMHP_AIT_transport_protocol (u_char *b) { int len; int p_id; // descriptor_tag = b[0]; len = b[1]; p_id = outBit_S2x_NL (4,"protocol_id: ", b, 16, 16, (char *(*)(u_long)) dsmccStrMHP_protocol_id); outBit_Sx_NL (4,"transport_protocol_label: ", b, 32, 8); b += 5; len -= 3; // -- 0x0001 = Transport via OC // -- 0x0002 = Transport via IP // -- 0x0003 = Transport via interaction channel if (p_id == 0x0001 || p_id == 0x0002) { int remote_conn; remote_conn = outBit_Sx_NL (4,"remote_connection: ", b, 0, 1); outBit_Sx_NL (6,"reserved: ", b, 1, 7); b++; len--; if (remote_conn == 0x01) { // $$$ TODO reminder: this code part is used several time outBit_S2x_NL (4,"Original_network_id: ", b, 0, 16, (char *(*)(u_long)) dvbstrOriginalNetwork_ID); outBit_Sx_NL (4,"transport_stream_ID: ", b, 16, 16); outBit_S2Tx_NL(4,"service_ID: ", b, 32, 16, " --> refers to PMT program_number"); b += 6; len -= 6; } if (p_id == 0x0001) { // -- Transport via OC outBit_Sx_NL (4,"component_tag: ", b, 0, 8); b++; len--; } else { // -- Transport via IP outBit_Sx_NL (4,"alignment_indicator: ", b, 0, 1); outBit_Sx_NL (6,"reserved: ", b, 1, 7); b++; len--; while (len > 0) { int len2; out_NL (4); len2 = outBit_Sx_NL (4,"URL_length: ", b, 0, 8); print_text_UTF8 (4, "URL: ", b+1, len2); b += 1+len2; len -= 1+len2; } } } if (p_id == 0x0003) { int len2; out_NL (4); len2 = outBit_Sx_NL (4,"URL_base_length: ", b, 0, 8); print_text_UTF8 (4, "URL_base: ", b+1, len2); b += 1+len2; len -= 1+len2; while (len > 0) { int len2; out_NL (4); len2 = outBit_Sx_NL (4,"URL_extension_length: ", b, 0, 8); print_text_UTF8 (4, "URL_extension: ", b+1, len2); b += 1+len2; len -= 1+len2; } } else { // -- all other print_databytes(4,"selector_bytes:", b, len); } }
void net_IP_data (int v, u_char *b, int len) { int ip_version; int protocol = -1; // print_databytes (v, "IP_datagram_bytes", b, len); out_NL (v); out_nl (v,"IP_datagram_bytes:"); indent (+1); ip_version = outBit_Sx_NL (v, "Version: ", b, 0, 4); if (ip_version == 4) { // -- RFC 791 IPv4 int header_len; int ip; header_len = outBit_Sx_NL (v, "IP header length: ", b, 4, 4); outBit_Sx_NL (v, "Type of service: ", b, 8, 8); outBit_Sx_NL (v, "Total length: ", b, 16, 16); outBit_Sx_NL (v, "Identification: ", b, 32, 16); outBit_Sx_NL (v, "Reserved: ", b, 48, 1); outBit_Sx_NL (v, "DF: ", b, 49, 1); outBit_Sx_NL (v, "MF: ", b, 50, 1); outBit_Sx_NL (v, "Fragment offset: ", b, 51, 13); outBit_Sx_NL (v, "Time to live: ", b, 64, 8); protocol = outBit_S2x_NL(v, "Protocol: ", b, 72, 8, (char *(*)(u_long))netStr_RFC790_protocol_nr ); outBit_Sx_NL (v, "Header checksum: ", b, 80, 16); ip = getBits (b, 0, 96, 32); out (v,"Source address: %08lx [= ", ip); displ_IPv4_addr (v, ip); out_nl (v,"]"); ip = getBits (b, 0, 128, 32); out (v,"Destination address: %08lx [= ", ip); displ_IPv4_addr (v, ip); out_nl (v,"]"); b += (5*4); // 5*4 = header length len -= (5*4); // -- IPv4 Options & Padding // --- n = number of options // --- Total bit length: ( ( 5+n ) * 32 ), 5 is minimum header if (header_len > 5) { // -- TODO Options & Padding print_databytes (v, "Options & Padding ", b, len); b += (header_len-5)*4; len -= (header_len-5)*4; } } else if (ip_version == 6) { // -- RFC 2460 for IPv6 struct IPv6ADDR x; outBit_Sx_NL (v, "Traffic class: ", b, 4, 8); outBit_Sx_NL (v, "Flow label: ", b, 12, 20); outBit_Sx_NL (v, "Payload length: ", b, 32, 16); protocol = outBit_Sx_NL (v, "Next header: ", b, 48, 16); outBit_Sx_NL (v, "Hop limit: ", b, 64, 16); getIPv6Addr (b+8, &x); out (v, "Source address: %08lx%08lx%08lx%08lx [= ", x.ip[0], x.ip[1], x.ip[2], x.ip[3] ); displ_IPv6_addr (4, &x); out_nl (v,"]"); getIPv6Addr (b+24, &x); out (v, "Destination address: %08lx%08lx%08lx%08lx [= ", x.ip[0], x.ip[1], x.ip[2], x.ip[3] ); displ_IPv6_addr (4, &x); out_nl (v,"]"); b += 40; len -= 40; } // -- ICMP, RFC 792 if (protocol == 1) { out_NL (v); out_nl (v,"ICMP_data: "); indent (+1); print_databytes (v, "Data", b, len); // $$$ TODO b += len; len = 0; indent (-1); } // -- TCP, RFC 793 if (protocol == 6) { out_NL (v); out_nl (v,"TCP_data: "); indent (+1); print_databytes (v, "Data", b, len); // $$$ TODO b += len; len = 0; indent (-1); } // -- UDP datagram, RFC 768 if (protocol == 17) { int udp_header_len; out_NL (v); out_nl (v,"UDP_datagram: "); indent (+1); outBit_Sx_NL (v, "Source port: ", b, 0, 16); outBit_Sx_NL (v, "Destination port: ", b, 16, 16); udp_header_len = outBit_Sx_NL (v, "Length: ", b, 32, 16); outBit_Sx_NL (v, "Checksum: ", b, 48, 16); print_databytes (v, "Data", b+8, udp_header_len-8); b += udp_header_len; // -- length is complete header + data len -= udp_header_len; indent (-1); } if (len > 0) { print_databytes (v, "Unknown Data / Padding", b, len); b += len; len -= len; } out_NL (v); indent (-1); }
void decodePS_PES_packet (u_char *b, u_int len, int pid) { /* IS13818-1 2.4.3.6 */ u_long packet_start_code_prefix; // 24 bit u_int stream_id; u_int PES_packet_length; u_int stream_type; // -- Get/check packet header prefix (sync bits) packet_start_code_prefix = getBits (b, 0, 0, 24); if (packet_start_code_prefix != 0x000001) { out_nl (3," !!! Packet_Start_CODE [%06lx] is wrong (= no PES/PS [0x000001])!!!\n", packet_start_code_prefix); print_databytes (4,"Unknown packet data:", b, len); return; } out_nl (3,"Packet_start_code_prefix: 0x%06lx",packet_start_code_prefix); stream_id = b[3]; // -- decode PES packet header if ((stream_id >= 0xC0 && stream_id <= 0xDF) // audio PES || (stream_id >= 0xE0 && stream_id <= 0xEF)) { // video PES PES_packet_length = outBit_Sx_NL (3, "PES_packet_length: ", b, 32, 16); b += 6; len -= 6; if ((PES_packet_length==0) && ((stream_id & 0xF0)==0xE0)) { out_nl (3," ==> unbound video elementary stream... \n"); } if (len > 0) { indent (+1); PES_decode_std (b, len, stream_id); indent (-1); } return; } stream_type = get_StreamFromMem(pid)->stream_type; //fprintf (stdout, "-># decodePS_PES_packet: len=%u; pid=%d stream_type=%u\n", len, pid, stream_type); if (stream_type == 0) { out_nl (3, "!!! Can not find stream type for PID = %d (0x%x) (PMT was not received yet)!!!\n", pid, pid); return; } // -- H.264 NALU if (stream_type == 0x1B) { u_char nal_ref_idc = getBits(b, 0, 25, 2); out_SB_NL(3, "nal_ref_idc: ", nal_ref_idc); stream_id = outBit_S2x_NL(3,"H.264 NALU: ", b, 27, 5, (char *(*)(u_long))dvbstrPESH264_NALU_ID ); //b += 4; //len -= 4; indent (+1); switch(stream_id) { case NAL_IDR: case NAL_NONIDR: H264_decodeSlice(4, b, len); break; case NAL_AUD: H264_decodeAUD(4, b, len); break; case NAL_SPS: H264_decodeSPS(4, b, len); break; case NAL_PPS: H264_decodePPS(4, b, len); break; case NAL_SEI: H264_decodeSEI(4, b, len); break; } print_databytes (5, "Bytes (incl. sync + id):", b, len); indent (-1); return; } // -- PS/PES stream ID stream_id = outBit_S2x_NL(3,"Stream_id: ", b, 24, 8, (char *(*)(u_long))dvbstrPESstream_ID ); // // -- PES Stream ID 0x00 - 0xB8 // -- ISO 13818-2 // if (stream_id <= 0xB8) { // $$$ TODO PES Stream ID 0x00 - 0xB8 // reserved B0 // reserved B1 // sequence_error_code B4 (not for streams) // reserved B6 indent (+1); switch (stream_id) { case 0x00: // picture_start_code 00 MPEG2_decodePictureHeader (4, b, len); break; case 0xB2: // user_data_start_code B2 MPEG2_decodeUserData (4, b, len); break; case 0xB3: // sequence_header_code B3 MPEG2_decodeSequenceHeader (4, b, len); break; case 0xB5: // extension_data B5 MPEG2_decodeExtension (4, b, len); break; case 0xB7: // sequence_end_code B7 MPEG2_decodeSequenceEnd (4, b, len); return; case 0xB8: // group_start_code B8 MPEG2_decodeGroupOfPictures (4, b, len); break; default: // slice_start_code 01 through AF if (stream_id >= 0x01 && stream_id <= 0xAF) { MPEG2_decodeSlice (4, b, len); } else { // unkown if (len > 4) { // sync + stream_id = 4 bytes print_databytes (4,"MPEG2 Data (incl. sync + id):", b, len); } } break; } indent (-1); return; } // // -- PES Stream ID 0xB9 - 0xBB // -- check PS decoding (ProgramStream) // switch (stream_id) { case 0xB9: // MPEG_program_end // stream ID already printed, nothing else to do return; case 0xBA: // MPEG_pack_header_start mpeg_pack_header (3, b, -1); // startcode & ID already printed return; case 0xBB: // MPEG_system_header_start mpeg_system_header (3, b, -1); // startcode & ID already printed return; } // // -- PES decoding ... // -- StreamID 0xBC..0xFF // PES_packet_length = outBit_Sx_NL (3,"PES_packet_length: ", b,32, 16); b += 6; len -= 6; switch (stream_id) { case 0xBC: // program_stream_map PES_decodePSM (b, PES_packet_length); break; case 0xBE: // padding stream! print_databytes (3,"Padding_bytes:", b, PES_packet_length); break; case 0xF2: // DSMCC stream PES_decodeDSMCC (b, PES_packet_length); break; case 0xFF: // program_stream_directory PES_decodePSDIR (b, PES_packet_length); break; case 0xBF: // private_stream_2 (EN301192-1.3.1 S.10) case 0xF0: // ECM case 0xF1: // EMM case 0xF8: // ITU-T Rec. H.222.1 type E print_databytes (3,"PES_packet_data_bytes:", b, PES_packet_length); break; // case 0xFC: // metadata stream (see: H.222.0 AMD1) // $$$ TODO // case 0xBD: // Data Stream, privat_stream_1 (EN301192-1.3.1 S.11) // case 0xC0-0xDF // ISO/IEC 13818-3 or 11172-3 or 13818-7 or 14496-3 audio stream // case 0xE0-0xEF // ITU-T Rec. H.262 | ISO/IEC 13818-2 or 11172-2 or 14496-2 video stream // case 0xF3 // ISO/IEC_13522_stream // case 0xF4 // ITU-T Rec. H.222.1 type A // case 0xF5 // ITU-T Rec. H.222.1 type B // case 0xF6 // ITU-T Rec. H.222.1 type C // case 0xF7 // ITU-T Rec. H.222.1 type D // case 0xF9 // ancillary_stream // case 0xFA // ISO/IEC14496-1_SL-packetized_stream // case 0xFB // ISO/IEC14496-1_FlexMux_stream // case 0xFD // extended_stream_id // case 0xFE // reserved data stream //default: // { // int xlen = PES_packet_length; // if ((PES_packet_length==0) && ((stream_id & 0xF0)==0xE0)) { // out_nl (3," ==> unbound video elementary stream... \n"); // xlen = len; // PES len field == 0, use read packet len // } // if (xlen > 0) { // indent (+1); // PES_decode_std (b, xlen, stream_id); // indent (-1); // } // } // break; } // switch }
void section_MHP_AIT (u_char *b, int len) { /* TS 102 812 */ int len2; u_int table_id; out_nl (3,"AIT-decoding...."); table_id = outBit_S2x_NL (3,"Table_ID: ", b, 0, 8, (char *(*)(u_long))dvbstrTableID ); if (table_id != 0x74) { out_nl (3,"wrong Table ID"); return; } outBit_Sx_NL (4,"Section_syntax_indicator: ", b, 8, 1); outBit_Sx_NL (6,"reserved_1: ", b, 9, 1); outBit_Sx_NL (6,"reserved_2: ", b,10, 2); outBit_Sx_NL (5,"section_length: ", b,12,12); outBit_Sx_NL (3,"test_application_flag: ", b,24, 1); outBit_S2x_NL(3,"application_type: ", b,25, 15, (char *(*)(u_long))dsmccStrMHP_application_type ); outBit_Sx_NL (6,"reserved_3: ", b,40, 2); outBit_Sx_NL (3,"Version_number: ", b,42, 5); outBit_S2x_NL(3,"Current_next_indicator: ", b,47, 1, (char *(*)(u_long))dvbstrCurrentNextIndicator ); outBit_Sx_NL (3,"Section_number: ", b,48, 8); outBit_Sx_NL (3,"Last_section_number: ", b,56, 8); outBit_Sx_NL (6,"reserved_4: ", b,64, 4); len2 = outBit_Sx_NL (3,"common_descriptors_length: ", b,68,12); b += 10; indent (+1); while (len2 > 0) { int x; x = descriptor (b, MHP_AIT); b += x; len2 -= x; } indent (-1); out_NL (4); outBit_Sx_NL (6,"reserved_5: ", b, 0, 4); len2 = outBit_Sx_NL (3,"application_loop_length: ", b, 4,12); b += 2; indent (+1); while (len2 > 0) { int x; int len3; x = mhp_application_identifier (3, b); b += x; len2 -= x; outBit_S2x_NL (3,"application_control_code: ", b, 0, 8, (char *(*)(u_long))dsmccStrMHP_application_control_code); outBit_Sx_NL (6,"reserved: ", b, 8, 4); len3 = outBit_Sx_NL (3,"application_descriptor_loop_length: ", b, 12,12); b += 3; len2 -= 3; while (len3 > 0) { int x; x = descriptor (b, MHP_AIT); b += x; len2 -= x; len3 -= x; } indent (-1); out_NL (4); } indent (-1); outBit_Sx_NL (5,"CRC: ", b,0,32); }
u_long BIOP_Message (int v, u_char *b) { u_char *b_org = b; u_long len; int bo; int n1,n2; u_long kind; out_nl (v, "BIOP::Message"); indent (+1); outBit_S2x_NL(v,"magic: ", b, 0, 32, (char *(*)(u_long)) dsmccStrBIOP_MAGIC); outBit_Sx_NL (v,"biop_version.major: ", b, 32, 8); outBit_Sx_NL (v,"biop_version.minor: ", b, 40, 8); bo = outBit_S2x_NL (v,"byte_order: ", b, 48, 8, (char *(*)(u_long)) dsmccStrBIOP_EndianType ); if (bo != 0x00) { out_nl (v, "==> Error: unsupported byte endian order"); } outBit_Sx_NL (v,"message_type: ", b, 56, 8); //$$$ TODO ?? outBit_Sx_NL (v,"message_size: ", b, 64, 32); b += 12; n1 = outBit_Sx_NL (v,"objectKey_length: ", b, 0, 8); print_databytes (v,"objectKey_data:", b+1, n1); b += 1 + n1; n2 = outBit_Sx_NL (v,"objectKind_length: ", b, 0, 32); b += 4; kind = 0x00; if (n2 != 4) { print_databytes (v,"objectKind_data:", b, n2); } else { // -- ISO 13818-6: length == 4 bytes, use type_id aliases kind = outBit_S2x_NL (v,"objectKind_data: ", b, 0, 32, (char *(*)(u_long)) dsmccStrBIOP_TypeID_Alias ); } b += n2; out_NL (v); // -- select message processing, // -- due to "kind" aka type_id aliases // -- --> 3 character abbrev. terminated with \0 switch (kind) { case 0x64697200: // "dir" (DSM::Directory) len = body_DirectoryMessage (v, b); break; case 0x66696c00: // "fil" (DSM:File) len = body_FileMessage (v, b); break; case 0x73746500: // "ste" (DSM:StreamEvent) len = body_StreamEventMessage (v, b); break; case 0x73726700: // "srg" (DSM:ServiceGateway) len = body_DirectoryMessage (v, b); break; case 0x73747200: // "str" (BIOP::Stream) len = body_StreamMessage (v, b); break; default: // unsported BIOP (????) out_nl (v, "unsopported BIOP (please report!!):"); len = body_basic_Message (v, b); break; } b += len; out_NL (v); indent (-1); return (u_long) (b - b_org); }