int dsmcc_DownloadDataMessage (int v, u_char *b, u_int len) { int x; int len_org = len; DSMCC_MSG_HD dmh; x = dsmcc_MessageHeader (v, b, len, &dmh); b += x; len -= x; outBit_Sx_NL (v,"moduleId: ", b, 0, 16); outBit_Sx_NL (v,"moduleVersion: ", b, 16, 8); outBit_Sx_NL (v,"reserved: ", b, 24, 8); outBit_Sx_NL (v,"blockNumber: ", b, 32, 16); b += 6; len -= 6; print_databytes (v, "Block Data: ", b, len); // $$$ TODO: Save Blockdata if option set to file // a good Test transponder is ASTRA's MHP carousel // Beware of multiple BIOPs in a Module! (read below!) return len_org; }
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; }
static u_long body_StreamMessage (int v, u_char *b) { u_char *b_org = b; u_int nx,n2,n6; n2 = outBit_Sx_NL (v,"objectInfo_length: ", b, 0, 16); b += 2; nx = BIOP_DSM_Stream_Info_T (v, b); // $$$ Warning: Standards documents may describe wrong length calculation! print_databytes (v,"ObjectInfo_byte:", b+nx, n2-nx); b += n2; nx = do_ServiceContentList (v, b); b += nx; outBit_Sx_NL (v,"messageBody_length: ", b, 0, 32); n6 = outBit_Sx_NL (v,"tap_count: ", b, 32, 8); b += 5; indent (+1); for (; n6 > 0; n6--) { int ny; ny = BIOP_TAP (v, "", b); b += ny; } indent (-1); return (u_long) (b - b_org); }
void PES_decodeDATA_private_stream_1 (u_char *b, int len) { u_int data_identifier; // -- Data Buffer starts at PES_DATA_BYTES... data_identifier = getBits (b, 0, 0, 8); // -- Async Data Streaming will be done as private_stream_2 (pes_std) if (data_identifier >= 0x10 && data_identifier <= 0x1F) { // Teletext EBU data (see EN 300 472) PES_decodeDATA_EBU_etc (b, len); } else if (data_identifier == 0x20) { // DVB subtitling (see EN 300 743) // $$$ TODO -- PES_decodeDATA_dvb_subtitles (b, len); print_databytes (4,"TODO dvb subtitles:", b, len); } else { // default sync. data streams (see EN 301 192) PES_decodeDATA_SYNC (b, len); } }
int dsmcc_DownloadCancel (int v, u_char *b, u_int len) { int len_org = len; int len2; // already read dsmcc_MessageHeader (v, b, len, &dmh); outBit_Sx_NL (v,"downloadId: ", b, 0, 32); outBit_Sx_NL (v,"moduleId: ", b, 32, 16); outBit_Sx_NL (v,"blockNumber: ", b, 48, 16); outBit_Sx_NL (v,"downloadCancelReason: ", b, 64, 8); outBit_Sx_NL (v,"reserved: ", b, 72, 8); len2 = outBit_Sx_NL (v,"privateDataLength: ", b, 80, 16); b += 12; len -= 12; print_databytes (v, "private data: ", b, len); return len_org; }
int BIOP_ModuleInfo (int v, u_char *b, u_int len_org) { int len = len_org; int n1, i; // -- due to some misbehavior of some service providers // -- we do a simple plausi check for tap_counts_min_bytes > len i = getBits (b, 0, 96, 8); // tap_counts i = i * 7; if (i > len_org) { // this is no ModuleInfo print_databytes (v,"Data Bytes (non-standard):", b, len_org); return len_org; } out_nl (v, "BIOP::ModuleInfo:"); indent (+1); outBit_S2Tx_NL (v,"ModuleTimeOut: ", b, 0, 32, "(ms)"); outBit_S2Tx_NL (v,"BlockTimeOut: ", b, 32, 32, "(ms)"); outBit_S2Tx_NL (v,"MinBlockTime: ", b, 64, 32, "(ms)"); n1 = outBit_Sx_NL (v,"taps_count: ", b, 96, 8); b += 13, len -= 13; indent (+1); while (n1-- > 0) { int n2; // BIOP_OBJECT_USE n2 = BIOP_TAP (v, "DSM", b); b += n2; len -= n2; } indent (-1); out_NL (v); n1 = outBit_Sx_NL (v,"userInfoLength: ", b, 0, 8); // print_databytes (v,"UserInfoData:", b, n1); dsmcc_CarouselDescriptor_Loop ("userInfo", b+1, n1); b += 1+n1; len -= 1+n1; indent (-1); return len_org; }
void descriptor_PRIVATE_default (u_char *b) { int len; // tag = b[0]; len = b[1]; print_databytes (4,"Descriptor-data:", b+2, len); }
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); }
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 descriptor_any (u_char *b) { int len; // tag = b[0]; len = b[1]; print_databytes (4,"Descriptor-data:", b+2, len); }
static u_long body_basic_Message (int v, u_char *b) { u_char *b_org = b; u_int nx,n2,n3; n2 = outBit_Sx_NL (v,"objectInfo_length: ", b, 0, 16); print_databytes (v,"ObjectInfo_byte:", b+2, n2); b += 2 + n2; nx = do_ServiceContentList (v, b); b += nx; n3 = outBit_Sx_NL (v,"messageBody_length: ", b, 0, 32); print_databytes (v,"MessageBody:", b+4, n3); b += 4 + n3; return (u_long) (b - b_org); }
void section_TESTDATA (u_char *b, int len) { out_nl (3,"TESTDATA-decoding...."); outBit_Sx_NL (3,"Table_ID: ", b, 0, 6); outBit_Sx_NL (3,"priority_level: ", b, 6, 2); outBit_Sx_NL (3,"section_syntax_indicator: ", b, 8, 1); // $$$ TODO ... print_databytes(5,"Data:",b,len); }
void section_EMM_ECM (u_char *b, int len) { /* */ typedef struct _EMM_ECM { u_int table_id; u_int section_syntax_indicator; u_int reserved_1; u_int reserved_2; u_int section_length; } EMM_ECM; EMM_ECM e; //int n; e.table_id = b[0]; e.section_syntax_indicator = getBits (b, 0, 8, 1); e.reserved_1 = getBits (b, 0, 9, 1); e.reserved_2 = getBits (b, 0, 10, 2); e.section_length = getBits (b, 0, 12, 12); out_nl (3,"CAMT-decoding...."); out_S2B_NL (3,"Table_ID: ",e.table_id, dvbstrTableID (e.table_id)); out_SB_NL (3,"section_syntax_indicator: ",e.section_syntax_indicator); out_SB_NL (6,"reserved_1: ",e.reserved_1); out_SB_NL (6,"reserved_2: ",e.reserved_2); out_SW_NL (5,"Section_length: ",e.section_length); print_databytes(3,"CA_message_section_data:",b+3,e.section_length); // !!! decoding the complete ECM/EMM stream may be illegal // so we don't do this! // secrets are secrets even if they are openly transmitted! // you are not allowed to enhance this section! }
static void out_SkipBuffer (int v, int len) { int lmax; int l; lmax = (sizeof(SkipBuffer)/sizeof(u_char)); l = (len > lmax) ? lmax : len; print_databytes (v,"Skipped bytes:", SkipBuffer, l); if (l == lmax) { out_nl (v,"..."); out_NL (v); } }
static u_long body_FileMessage (int v, u_char *b) { u_char *b_org = b; u_long nx,n2,n5; n2 = outBit_Sx_NL (v,"objectInfo_length: ", b, 0, 16); b += 2; if (n2) { // has to be >= 8 outBit64_Sx_NL (v,"DSM::File::ContentSize: ", b, 0, 64); b += 8; n2 -= 8; if (n2 > 0) { out_nl (v, "Descriptor_loop:"); indent (+1); while (n2 > 0) { int x; x = descriptor (b, DSMCC_CAROUSEL); b += x; n2 -= x; out_NL (v); } } // if n2 > 0 indent (-1); } // if 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,"content_length: ", b, 32, 32); print_databytes(v,"content__byte:", b+8, n5); b += 8 + n5; return (u_long) (b - b_org); }
void mpeg_pack_header (int v, u_char *b, int len) { /* z.B. H.222 ISO 13818-1 Table 2-33 */ /* ISO 11172-1 pack header */ int v1 = v+1; int pack_stuffing_len; if (len == 0) return; out_nl (v,"Pack_header: "); indent (+1); if (len > 0) { // -- within PES packet, not PS! outBit_Sx_NL (v1,"pack_start_code: ", b, 0, 32); } outBit_Sx_NL (v1,"fixed '01': ", b, 32, 2); print_xTS_field (v1, "system_clock_reference_base", b, 34) ; // len 36b outBit_Sx_NL (v1,"system_clock_reference_extension: ",b, 70, 9); outBit_Sx_NL (v1,"marker_bit: ", b, 79, 1); outBit_Sx (v1,"program_mux_rate: ", b, 80,22); out_nl (v1," [= x 50 bytes/sec]"); outBit_Sx_NL (v1,"marker_bit: ", b, 102, 1); outBit_Sx_NL (v1,"marker_bit: ", b, 103, 1); outBit_Sx_NL (v1,"reserved: ", b, 104, 5); pack_stuffing_len = outBit_Sx_NL (v1,"pack_stuffing_len: ", b, 109, 3); print_databytes (6,"stuffing bytes 0xFF:", b+14, pack_stuffing_len); b += 14 + pack_stuffing_len; if (len >= 0) len -= 14 + pack_stuffing_len; if (len > 0) mpeg_system_header (v1, b, len); // only if len > 0 (PES packet) indent (-1); }
static u_long body_StreamEventMessage (int v, u_char *b) { u_char *b_org = b; u_int nx,ny,n2,n8,n4; n2 = outBit_Sx_NL (v,"objectInfo_length: ", b, 0, 16); b += 2; nx = BIOP_DSM_Stream_Info_T (v, b); ny = BIOP_DSM_Event_EventList_T (v, b+nx); print_databytes (v,"ObjectInfo_byte:", b+nx, n2-nx-ny); b += n2; nx = do_ServiceContentList (v, b); b += nx; outBit_Sx_NL (v,"messageBody_length: ", b, 0, 32); n8 = outBit_Sx_NL (v,"tap_count: ", b, 32, 8); b += 5; indent (+1); for (; n8 > 0; n8--) { int nz; nz = BIOP_TAP (v, "", b); b += nz; } indent (-1); n4 = outBit_Sx_NL (v,"eventIds_count: ", b, 0, 8); b += 1; indent (+1); for (; n4 > 0; n4--) { outBit_Sx_NL (v,"eventId: ", b, 0, 16); b += 2; } indent (-1); return (u_long) (b - b_org); }
void section_ST (u_char *b, int len) { typedef struct _ST { u_int table_id; u_int section_syntax_indicator; u_int reserved_1; u_int reserved_2; u_int section_length; // N databytes } ST; ST s; s.table_id = b[0]; s.section_syntax_indicator = getBits (b, 0, 8, 1); s.reserved_1 = getBits (b, 0, 9, 1); s.reserved_2 = getBits (b, 0, 10, 2); s.section_length = getBits (b, 0, 12, 12); out_nl (3,"ST-decoding...."); out_S2B_NL (3,"Table_ID: ",s.table_id, dvbstrTableID (s.table_id)); if (s.table_id != 0x72) { out_nl (3,"wrong Table ID"); return; } out_SB_NL (3,"section_syntax_indicator: ",s.section_syntax_indicator); out_SB_NL (6,"reserved_1: ",s.reserved_1); out_SB_NL (6,"reserved_2: ",s.reserved_2); out_SW_NL (5,"Section_length: ",s.section_length); b += 3; print_databytes (3,"Section data:", b, s.section_length); }
int IOP_IOR (int v, u_char *b) { u_char *b_start = b; int i,x; u_long n1; out_nl (v, "IOP::IOR:"); indent (+1); n1 = outBit_Sx_NL (v,"type_id_length: ", b, 0, 32); print_text_UTF8 (v, "type_id: ", b+4, n1); b += 4+n1; // alignment gap (CDR alignment rule), should be 0xFF x = n1 % 4; if (x) { print_databytes (v,"alignment_gap:", b, 4-x); b += 4-x; } n1 = outBit_Sx_NL (v,"taggedProfiles_count: ", b, 0, 32); b += 4; for (i=0; i < n1; i++) { u_long n2; // IOP_taggedProfile n2 = IOP_taggedProfile (v, b); b += n2; } indent (-1); return b - b_start; }
void descriptorMHP_AIT_application_icons (u_char *b) { int len; int len2; // descriptor_tag = b[0]; len = b[1]; len2 = outBit_Sx_NL (4,"icon_locator_length: ", b+2, 0, 8); print_text_UTF8 (4, "icon_locator: ", b+3, len2); b += 3 + len2; len -= 1 + len2; outBit_Sx_NL (4,"icon_flags: ", b, 0, 16); // $$$ TODO table b += 2; len -= 2; print_databytes(4,"reserved_future_use:", b, len); }
void decodeTS_NullPacket (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; // Null Packet may contain any data print_databytes (5, "Data-Bytes:", b,len); }
static int monochrome_data_field (int v, u_char *b, int len) { int v1 = v+1; int n; out_nl (v,"Monochrome 4:2:2 sample data:"); indent (+1); outBit_Sx_NL (v1,"first_segment_flag: ",b, 0, 1); outBit_Sx_NL (v1,"last_segment_flag: ", b, 1, 1); outBit_Sx_NL (v1,"field_parity: ", b, 2, 1); outBit_Sx_NL (v1,"line_offset: ", b, 3, 5); outBit_Sx_NL (v1,"first_pixel_position: ",b, 8, 16); n = outBit_Sx_NL (v1,"n_pixel: ", b, 24, 8); print_databytes (v1,"Y_values:", b+3, n); indent (-1); return 3+n; }
static u_long do_ServiceContentList (int v, u_char *b) { u_char *b_org = b; int n3; n3 = outBit_Sx_NL (v,"serviceContentList_count: ", b, 0, 8); b += 1; indent (+1); for (; n3 > 0; n3--) { int n4; outBit_Sx_NL (v,"context_id: ", b, 0, 32); n4 = outBit_Sx_NL (v,"context_data_length: ", b, 32, 16); print_databytes (v,"context_data:", b+6, n4); b += 6 + n4; } indent (-1); return (u_long) (b - b_org); }
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); }
int dsmcc_DownloadInfoIndication (int v, u_char *b, u_int len) { int len_org = len; int n_modules; int len2; int i, x; // already read dsmcc_MessageHeader (v, b, len, &dmh); outBit_Sx_NL (v,"downloadId: ", b , 0, 32); outBit_Sx_NL (v,"blockSize: ", b+ 4, 0, 16); outBit_Sx_NL (v,"windowSize: ", b+ 6, 0, 8); outBit_Sx_NL (v,"ackPeriod: ", b+ 7, 0, 8); outBit_Sx_NL (v,"tCDownloadWindow: ", b+ 8, 0, 32); outBit_Sx_NL (v,"tCDownloadScenario: ", b+12, 0, 32); b += 16; len -= 16; x = dsmcc_CompatibilityDescriptor (b); b += x; len -= x; n_modules = outBit_Sx_NL (v,"numberOfModules: ", b, 0, 16); b += 2; len -= 2; for (i=0; i < n_modules; i++) { u_int mId; out_NL (v); out_nl (v, "Module (%d):",i); indent (+1); mId = outBit_Sx (v,"moduleId: ", b, 0, 16); out_nl (4, "%s", (mId < 0xFFF0) ? "" : " [= DAVIC application]"); outBit_Sx_NL (v,"moduleSize: " , b, 16, 32); outBit_Sx_NL (v,"moduleVersion: ", b, 48, 8); len2 = outBit_Sx_NL (v,"moduleInfoLength: ", b, 56, 8); b += 8; len -= 8; // moduleInfoByte: these fields shall convey a list of descriptors // which each define one or more attributes of the described module, // except when the moduleId is within the range of 0xFFF0-0xFFFF. In // this case, the moduleInfoByte structure contains the ModuleInfo // structure as defined by DAVIC with the privateDataByte field of that // structure as a loop of descriptors. // ISO 13818-6:2000 11.3.3.2 if (mId < 0xFFF0) { BIOP_ModuleInfo (v, b, len2); } else { print_databytes (v, "moduleInfoBytes: ", b, len2); // $$$ TODO Davic } b += len2; len -= len2; indent (-1); } out_NL (v); indent (-1); len2 = outBit_Sx_NL (v,"privateDataLength: ", b, 0, 16); print_databytes (v, "privat Data: ", b+2, len2); // $$$ TODO ??? // b += 2 + len2; // len -= 2 + len2; return len_org; }
void PES_decodeDATA_SYNC (u_char *b, int len) { typedef struct _PES_DATA { u_int data_identifier; u_int sub_stream_id; u_int PTS_extension_flag; u_int output_data_rate_flag; u_int reserved; u_int PES_data_packet_header_length; // N ... optional data } PES_DATA; PES_DATA p; int len2; out_nl (4,"Data (synchronous/synchronized):"); indent (+1); p.data_identifier = getBits (b, 0, 0, 8); p.sub_stream_id = getBits (b, 0, 8, 8); p.PTS_extension_flag = getBits (b, 0, 16, 1); p.output_data_rate_flag = getBits (b, 0, 17, 1); p.reserved = getBits (b, 0, 18, 2); p.PES_data_packet_header_length = getBits (b, 0, 20, 4); b += 3; len -= 3; len2 = p.PES_data_packet_header_length; out_S2B_NL (4,"data_identifier: ", p.data_identifier, dvbstrPESDataIdentifier (p.data_identifier) ); out_SB_NL (4,"sub_stream_id: ", p.sub_stream_id); out_SB_NL (4,"PTS_extension_flag: ", p.PTS_extension_flag); out_SB_NL (4,"output_data_rate_flag: ", p.output_data_rate_flag); out_SB_NL (6,"reserved_1: ", p.reserved); out_SB_NL (4,"PES_data_packet_header_length: ", p.PES_data_packet_header_length); if (p.PTS_extension_flag == 0x01) { out_nl (4,"PTS_extension:"); indent (+1); out_SB_NL (6,"reserved: ", getBits (b, 0, 0, 7) ); out_SW_NL (4,"PTS_extension: ", getBits (b, 0, 7, 9) ); /* $$$ TODO PCR extension output in clear text, see ISO 13818-1*/ b += 2; len -= 2; len2 -= 2; indent (-1); } if (p.output_data_rate_flag == 0x01) { out_nl (4,"output_data_rate:"); indent (+1); out_SB_NL (6,"reserved: ", getBits (b, 0, 0, 4) ); out_SL_NL (4,"output_data_rate: ", getBits (b, 0, 4, 28) ); b += 4; len -= 4; len2 -= 4; indent (-1); } print_databytes (4,"PES_data_private_byte:", b, len2); b += len2; len -= len2; print_databytes (4,"PES_data_byte:", b, len); b += len; len -= len; 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 }
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); }
int dsmcc_GroupInfoIndication (int v, u_char *b, u_int len_org) { int len = len_org; int n_groups; int i; int len2; // -- due to some misbehavior of some service providers // -- we do a simple plausi check for group_counts_min_bytes > len i = getBits (b, 0, 0, 16); // group_counts i = i * 8 + 2; if (i > len_org) { // this is no GroupInfo print_databytes (v,"Data Bytes (non-standard):", b, len_org); return len_org; } out_nl (v,"GroupInfoIndication:"); indent (+1); n_groups = outBit_Sx_NL (v,"NumberOfGroups: ", b, 0, 16); b += 2; len -= 2; for (i=0; i < n_groups; i++) { out_NL (v); if (len <= 0) { out_nl (v, "... => strange len <= 0 and still group count > 0 (abort)"); break; } out_nl (v, "Group (%d):",i); indent (+1); outBit_Sx_NL (v,"GroupId: ", b, 0, 32); outBit_Sx_NL (v,"GroupSize: ", b, 32, 32); b += 8; len -= 8; // GroupCompatibility() len2 = dsmcc_CompatibilityDescriptor (b); b += len2; len -= len2; len2 = outBit_Sx_NL (v,"GroupInfoLength: ", b, 0, 16); // print_databytes (v, "GroupInfoBytes: ", b+2, len2); // $$$ TODO dsmcc_CarouselDescriptor_Loop ("GroupInfo", b+2, len2); b += 2+len2; len -= 2+len2; len2 = outBit_Sx_NL (v,"PrivateDataLength: ", b, 0, 16); print_private_data (v, b+2, len2); // $$$ What to do here? b += 2+len2; len -= 2+len2; indent (-1); } indent (-1); out_NL (v); return len_org; }