⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pes_dsmcc.c

📁 dvbsnoop is a DVB/MPEG stream analyzer program. The program can be used to sniff, monitor, debug, d
💻 C
字号:
/*$Id: pes_dsmcc.c,v 1.10 2004/02/20 22:18:41 rasc Exp $ DVBSNOOP a dvb sniffer  and mpeg2 stream analyzer tool http://dvbsnoop.sourceforge.net/ (c) 2001-2004   Rainer.Scherg@gmx.de (rasc) -- PES  DSM-CC   ITU H.222.0  Annex B$Log: pes_dsmcc.c,v $Revision 1.10  2004/02/20 22:18:41  rascDII complete (hopefully)BIOP::ModuleInfo  (damned, who is spreading infos over several standards???)maybe someone give me a hint on the selector_byte info!!!some minor changes...Revision 1.9  2004/01/17 23:06:10  rascminor stuff, some restructs in outputRevision 1.8  2004/01/11 21:01:32  rascPES stream directory, PES restructuredRevision 1.7  2004/01/02 22:25:39  rascDSM-CC  MODULEs descriptors completeRevision 1.6  2004/01/02 16:40:38  rascDSM-CC  INT/UNT descriptors completeminor changes and fixesRevision 1.5  2004/01/01 20:09:29  rascDSM-CC INT/UNT descriptorsPES-sync changed, TS sync changed,descriptor scopeother changesRevision 1.4  2003/12/27 22:02:44  rascdsmcc INT UNT descriptors startedRevision 1.3  2003/12/27 18:17:18  rascdsmcc PES dsmcc_program_stream_descriptorlistRevision 1.2  2003/12/27 14:35:01  rascdvb-t descriptorsDSM-CC: SSU Linkage/DataBroadcast descriptorsRevision 1.1  2003/12/17 23:15:04  rascPES DSM-CC  ack and control commands  according ITU H.222.0 Annex B*/#include "dvbsnoop.h"#include "descriptors/descriptor.h"#include "strings/dsmcc_str.h"#include "misc/hexprint.h"#include "misc/output.h"#include "pes_misc.h"#include "pes_dsmcc.h"static  void dsmcc_control (u_char *b, int len);static  void dsmcc_ack (u_char *b, int len);static  int  dsmcc_timecode (u_char *b);static  void dsmcc_program_stream_descriptorlist_loop (u_char *b, int len);/*   -- DSM-CC Command stream in a PES Packet!   -- buffer starts with command_id*/void  PES_decodeDSMCC (u_char *b, int len){ /* ITU H.222.0 Annex B */   int   commandID;	// same as 'dsmcc_discriminator'   // -- already processed:   // --- packet_start_code_prefix 	24 bslbf   // --- stream_id 			8 uimsbf   // --- packet_length			24 uimsbf	commandID = outBit_S2x_NL (4,"Command_ID/dsmcc_discriminator: ",	b,0,8,			(char *(*)(u_long)) dsmccStr_Command_ID);	b++;	len--;	switch (commandID) {		case 0x01: dsmcc_control (b,len); break;		case 0x02: dsmcc_ack (b,len); break;		case 0x80: dsmcc_program_stream_descriptorlist_loop (b,len); break;		default:			out_nl (4," Unknown DSM-CC commandID/dsmcc_discriminator");			indent (+1);			printhex_buf (4, b, len);					indent (-1);			break;		         	}}static void dsmcc_control (u_char *b, int len){  int   select_flag;  int   retrieval_flag;  int   storage_flag;   out_nl (3,"DSM-CC CONTROL: ");   select_flag 		= outBit_Sx_NL (4,"select_flag: ",		b,0,1);   retrieval_flag 	= outBit_Sx_NL (4,"retrieval_flag: ",		b,1,1);   storage_flag 	= outBit_Sx_NL (4,"storage_flag: ",		b,2,1);   outBit_Sx_NL (6,"reserved: ",		b,3,12);   outBit_Sx_NL (4,"marker_bit: ",		b,15,1);   b += 2;//   len -= 2;   if (select_flag) {	u_long bitstreamID_31_17;	u_long bitstreamID_16_2;	u_long bitstreamID_1_0;	out_nl (4,"SELECT:");	indent (+1);   		bitstreamID_31_17 = outBit_Sx_NL (5,"bitstream_id[31..17]: ",	b,0,15);   				    outBit_Sx_NL (5,"marker_bit: ",		b,15,1);   		bitstreamID_16_2  = outBit_Sx_NL (5,"bitstream_id[16..2]:  ",	b,16,15);   				    outBit_Sx_NL (5,"marker_bit: ",		b,31,1);   		bitstreamID_1_0   = outBit_Sx_NL (5,"bitstream_id[1..0]:   ",	b,32,2);   		out_SL_NL (4," ==> bitstream_id:   ",			(bitstreamID_31_17<<17) + (bitstreamID_16_2<<2) + bitstreamID_1_0);		outBit_S2x_NL (4,"select_mode: ",	b,34,5,				(char *(*)(u_long))dsmccStr_SelectMode_ID );		outBit_Sx_NL (4,"marker_bit: ",		b,39,1);	indent (-1);	b += 5;//	len -= 5;   }   if (retrieval_flag) {	int  jump_flag;	int  play_flag;	out_nl (4,"RETRIEVE:");	indent (+1);	   	jump_flag	= outBit_Sx_NL (4,"jump_flag: ",	b,0,1);   		play_flag	= outBit_Sx_NL (4,"play_flag: ",	b,1,1);   		outBit_Sx_NL (4,"pause_mode: ",		b,2,1);   		outBit_Sx_NL (4,"resume_mode: ",	b,3,1);   		outBit_Sx_NL (4,"stop_mode: ",		b,4,1);   		outBit_Sx_NL (6,"reserved: ",		b,5,10);		outBit_Sx_NL (4,"marker_bit: ",		b,15,1);		b += 2;		len -= 2;		if (jump_flag) {		   int xlen = 0; 		   out_nl (4,"JUMP:");		   indent (+1);   			outBit_Sx_NL  (6,"reserved: ",		b,0,7);			outBit_S2x_NL (4,"direction_indicator: ",	b,7,1,				(char *(*)(u_long)) dsmccStr_DirectionIndicator );			indent (+1);				xlen = dsmcc_timecode (b+1);			b += xlen+1;//			len -= (xlen+1);		   indent (-1);		}		if (play_flag) {		   int xlen; 		   out_nl (4,"PLAY:");		   indent (+1);   		   	outBit_Sx_NL  (4,"speed_mode: ",			b,0,1);   		   	outBit_S2x_NL (4,"direction_indicator: ",	b,1,1,				(char *(*)(u_long)) dsmccStr_DirectionIndicator );   		   	outBit_Sx_NL (6,"reserved: ",			b,2,6);		   	indent (+1);		   		xlen = dsmcc_timecode (b+1);		   	b += xlen+1;//			len -= (xlen+1);		   indent (-1);		}	indent (-1);   }   if (storage_flag) {	int  record_flag;	out_nl (4,"STORAGE:");	indent (+1);		              outBit_Sx_NL (6,"reserved: ",	b,0,6);		record_flag = outBit_Sx_NL (4,"record_flag: ",	b,6,1);		              outBit_Sx_NL (4,"stop_mode: ",	b,7,1);		b++;//		len--;		if (record_flag) {			int  xlen;			out_nl (4,"RECORD:");			indent (+1);			   	xlen = dsmcc_timecode (b);			   	b += xlen;//				len -= xlen;			indent (-1);		}	indent (-1);   }} /* ITU H.222.0 Annex B */static void dsmcc_ack (u_char *b, int len){   int  select_ack;   int  retrieval_ack;   int  storage_ack;   int  error_ack;   int  cmd_status;   out_nl (3,"DSM-CC  Acknowledge: ");   select_ack 		= outBit_Sx_NL (4,"select_ack: ",	b,0,1);   retrieval_ack 	= outBit_Sx_NL (4,"retrieval_ack: ",	b,1,1);   storage_ack 		= outBit_Sx_NL (4,"storage_ack: ",	b,2,1);   error_ack 		= outBit_Sx_NL (4,"error_ack: ",	b,3,1);		          outBit_Sx_NL (6,"reserved: ",		b,4,10);			  outBit_Sx_NL (4,"marker_bit: ",	b,14,1);   cmd_status 		= outBit_Sx_NL (4,"cmd_status: ",	b,15,1);   if (cmd_status && (retrieval_ack || storage_ack) ) {	dsmcc_timecode (b+2);   }} /* ITU H.222.0 Annex B */static int  dsmcc_timecode (u_char *b){	int len = 0;	int infinite_time_flag;	outBit_Sx_NL (6,"reserved: ",		b,0,7);	infinite_time_flag = outBit_Sx_NL (4,"infinite_time_flag: ",	b,7,1);	b++;	len = 1;	if (infinite_time_flag == 0) {		outBit_Sx_NL (6,"reserved: ",	b,0,4);		print_xTS_field (4,"Time period", b, 4);		len += 5;	}	return len;}static void  dsmcc_program_stream_descriptorlist_loop (u_char *b, int len){  int first = 1;  // dsmcc_discriminator is already displayed for the first pass of the loop  while (len > 0) {	  int len2;	  if (! first) {		outBit_S2x_NL (4,"dsmcc_discriminator: ",	b,0,8,			(char *(*)(u_long)) dsmccStr_Command_ID);		b++;		len--;  	  }	  len2 = descriptor (b, DSMCC_STREAM);	  b += len2;	  len -= len2;	  first = 0;  }}  /* $$$ TODO some mode && cmd_status could be more verbose */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -