コード例 #1
0
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;
}
コード例 #2
0
ファイル: dsmcc.c プロジェクト: OpenDMM/tuxbox-apps
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);
}