Example #1
0
/*
 * 0x83: Logical Channel Descriptor
 * e-book_ed_2.02 corr-acro.doc
 */
void descriptor_PRIVATE_EictaORG_LogicalChannelDescriptor (u_char *b)
{
	unsigned int len = b[1];
	unsigned int i;

	out_nl(4, "--> eicta.org Logical Channel Descriptor");

	b += 2;

	indent(+1);

	for (i = 0; i < len; i += 4) {
		unsigned int service_id = (b[i] << 8) | b[i + 1];
		unsigned int visible_service_flag = (b[i + 2] >> 7) & 1;
		unsigned int reserved = (b[i + 2] >> 2) & 0x1f;
		unsigned int logical_channel_number = ((b[i + 2] << 8) | b[i + 3]) & 0x3ff;

		out_NL(5);
		out_SW_NL(5, "service_id: ", service_id);
		out_SB_NL(5, "visible_service_flag: ", visible_service_flag);
		out_SB_NL(5, "reserved: ", reserved);
		out_SW_NL(5, "logical_channel_number: ", logical_channel_number);
	}

	indent(-1);
	out_NL(4);
}
void descriptor_PRIVATE_PremiereDE_ContentOrder (u_char *b)
{
 int  tag, len;

  tag		 = b[0];
  len       	 = b[1];
 
  out_nl (4,"--> Premiere Content Order descriptor ");

  b+=2;
  out_SB_NL (5,"Order_number_length: ", *b);
  print_text_468A (4, "Order_number: ", b+1, *b);
 
  b += *b + 1;
  out_SB_NL (5,"Order_price_length: ", *b);
  print_text_468A (4, "Order_price: ", b+1, *b);
 
  b += *b + 1;
  out_SB_NL (5,"Order_phone_number_length: ", *b);
  print_text_468A (4, "Order_phone_number: ", b+1, *b);
 
  b += *b + 1;
  out_SB_NL (5,"SMS_order_information_length: ", *b);
  print_text_468A (4, "SMS_order_information: ", b+1, *b);
 
  b += *b + 1;
  out_SB_NL (5,"URL_order_information_length: ", *b);
  print_text_468A (4, "URL_order_information: ", b+1, *b);

}
Example #3
0
void  guess_table (u_char *buf, int len, u_int pid)

{

  TABLE_ID_FUNC *t = table_id_func;
  u_int		table_id;



  /* -- scan id table for decode function */

  table_id =  (u_int) buf[0];
  while (t->func) {
    if (t->from <= table_id && t->to >= table_id)
       break;
    t++;
  }



  out_nl (2,"Guess table from table id...");

  if (t->func == NULL) {
   	out_SB_NL (2,"Unknown, reserved or not (yet) implemented - TableID: ",table_id);
	out_nl    (2,"--> %s",dvbstrTableID (table_id));
	printhex_buf (5,buf,len);
	return;
  }


  (*(t->func))(buf,len);		/* exec decode function */
  return;
}
/*
   0xA0  Logic Channel Descriptor
   NorDig-Unified ver 2.0, 01.07.2008
*/
void descriptor_PRIVATE_NordigORG_ContentProtectionDescriptor (u_char *b)
{
	unsigned int tag = b[0];
	unsigned int len = b[1];
	unsigned int protectionLevel = b[2];

	out_nl(4, "--> NorDig Content Protection Descriptor ");

	b += 2;

	indent(+1);
	out_NL(4);
	out_SB_NL(2, "value: ", protectionLevel);

	switch(protectionLevel)
	{
		default:
		case 0x00:
			out_nl(4, "Outputs shall not be protected.");
			break;
		case 0x01:
			out_nl(4, "Content protection not required.");
			break;
		case 0x02:
			out_nl(4, "Content protection mandatory for video resolution > 576 lines.");
			break;
		case 0x03:
			out_nl(4, "Content protection mandatory regardless of video format and resolution.");
			break;
	}
	indent(-1);
	out_NL(4);
}
Example #5
0
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!

}
Example #6
0
void section_DIT (u_char *b, int len)
{

 typedef struct  _DIT {
    u_int      table_id;
    u_int      section_syntax_indicator;		
    u_int      reserved_1;
    u_int      reserved_2;
    u_int      section_length;
    u_int      transition_flag;
    u_int      reserved_3;

 } DIT;



 DIT        d;

 
 d.table_id 			 = b[0];
 d.section_syntax_indicator	 = getBits (b, 0, 8, 1);
 d.reserved_1 			 = getBits (b, 0, 9, 1);
 d.reserved_2 			 = getBits (b, 0, 10, 2);
 d.section_length		 = getBits (b, 0, 12, 12);
 d.transition_flag		 = getBits (b, 0, 24, 1);
 d.reserved_3 			 = getBits (b, 0, 25, 7);


 out_nl (3,"DIT-decoding....");
 out_S2B_NL (3,"Table_ID: ",d.table_id, dvbstrTableID (d.table_id));
 if (d.table_id != 0x7E) {
   out_nl (3,"wrong Table ID");
   return;
 }

 out_SB_NL (3,"section_syntax_indicator: ",d.section_syntax_indicator);
 out_SB_NL (6,"reserved_1: ",d.reserved_1);
 out_SB_NL (6,"reserved_2: ",d.reserved_2);
 out_SW_NL (5,"Section_length: ",d.section_length);

 out_S2B_NL (3,"transition_flag: ",d.transition_flag,
        (d.transition_flag) ? "due to change of the originating source"
                            : "due to change selection only"); 
 out_SB_NL (6,"reserved_3: ",d.reserved_3);

}
void descriptor_PRIVATE_PremiereDE_ParentalInformation (u_char *b)
{
  int  tag, len;
 
  tag		 = b[0];
  len       	 = b[1];
 
  out_nl (4,"--> Premiere Parental Information descriptor ");

  b += 2;
  out_SB_NL (5,"rating: ", *b);
  out_nl    (4,"Controll_time_t1: %02x:%02x:%02x", b[1], b[2], b[3]);
  out_nl    (4,"Controll_time_t2: %02x:%02x:%02x", b[4], b[5], b[6]);
 
  b += 7;
  out_SB_NL (5,"Parental_information_length: ", *b);
  print_text_468A (4, "Parental_information: ", b+1, *b);
 
}
Example #8
0
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);

}
Example #9
0
/*
 * 0x84: Preferred Name List Descriptor
 * e-book_ed_2.02 corr-acro.doc
 */
void descriptor_PRIVATE_EictaORG_PreferredNameListDescriptor (u_char *b)
{
	unsigned int len = b[1];
	unsigned int i, j;

	out_nl(4, "--> eicta.org Preferred Name List Descriptor");

	b += 2;

	indent(+1);

	for (i = 0; i < len; i += 4) {
		unsigned int ISO_639_language_code = (b[i] << 16) | (b[i + 1] << 8) | b[i + 2];
		unsigned int name_count = b[i + 3];

		out_NL(4);
		out_SL_NL(4, "ISO_639_language_code: ", ISO_639_language_code);
		out_SB_NL(4, "name_count: ", name_count);

		indent(+1);

		for (j = 0; j < name_count; j++) {
			unsigned int name_id = b[i + 4];
			unsigned int name_length = b[i + 5];
			const char *name = &b[i + 6];

			out_NL(4);
			out_SB_NL(4, "name_id: ", name_id);
			out_SB_NL(4, "name_length: ", name_length);

			if (name_length > 0)
				out_nl(4, "name: %.s", name_length, name);

			i += name_length + 2;
		}

		indent(-1);
	}

	indent(-1);
	out_NL(4);
}
Example #10
0
/*
 * 0x86: Eacem Stream Identifier Descriptor
 * e-book_ed_2.02 corr-acro.doc
 */
void descriptor_PRIVATE_EictaORG_EacemStreamIdentifierDescriptor (u_char *b)
{
	out_nl(4, "--> eicta.org Eacem Stream Identifier Descriptor");

	indent(+1);

	out_SB_NL(4, "version_byte: ", b[2]);

	indent(-1);
	out_NL(4);
}
Example #11
0
/*
 * 0x85: Preferred Name Identifier Descriptor
 * e-book_ed_2.02 corr-acro.doc
 */
void descriptor_PRIVATE_EictaORG_PreferredNameIdentifierDescriptor (u_char *b)
{
	out_nl(4, "--> eicta.org Preferred Name Identifier Descriptor");

	indent(+1);

	out_SB_NL(4, "name_id: ", b[2]);

	indent(-1);
	out_NL(4);
}
Example #12
0
void H264_decodeAUD(int v, u_char *b, int len) {

  H264_AUD aud = {0,};

  uint8_t nal_unit_type = b[3]&0x1F;

  bitdata data = {0,};
  data.data = (byte*)(b+4);
  data.data_len = remove_0x03(b+4, len-4);
  data.cur_bit = -1;

  read_bits(&data, 3, &aud.primary_pic_type);

  out_SB_NL(v, "primary_pic_type: ", aud.primary_pic_type);
}
Example #13
0
void H264_decodePPS(int v, u_char *b, int len) {

  H264_PPS pps = {0,};

  uint8_t nal_unit_type = b[3]&0x1F;

  bitdata data = {0,};
  data.data = (byte*)(b+4);
  data.data_len = remove_0x03(b+4, len-4);
  data.cur_bit = -1;

  read_exp_golomb(&data, &pps.pic_parameter_set_id);
  read_exp_golomb(&data, &pps.seq_parameter_set_id);
  read_bit(&data, &pps.entropy_coding_mode_flag);
  read_bit(&data, &pps.pic_order_present_flag);
  
  read_exp_golomb(&data, &pps.num_slice_groups_minus1);
  if (pps.num_slice_groups_minus1 > 0) {

    read_exp_golomb(&data, &pps.slice_group_map_type);
    switch (pps.slice_group_map_type) {
      case 0: {
        uint32_t i;
        for (i = 0; i <= pps.num_slice_groups_minus1; ++i) {
          uint32_t run_length_minus1;
          read_exp_golomb(&data, &run_length_minus1);
        }
      } break;
      case 2: {
        uint32_t i;
        for (i = 0; i < pps.num_slice_groups_minus1; ++i) {
          uint32_t top_left, bottom_right;
          read_exp_golomb(&data, &top_left);
          read_exp_golomb(&data, &bottom_right);
        }
      } break;
      case 3:
      case 4:
      case 5: {
        read_bit(&data, &pps.slice_group_change_direction_flag);
        read_exp_golomb(&data, &pps.slice_group_change_rate_minus1);
      } break;
      case 6: {
        uint32_t i, size = (uint32_t)ceil(log2(pps.num_slice_groups_minus1+1));
        read_exp_golomb(&data, &pps.pic_size_in_map_units_minus1);
        for (i = 0; i <= pps.pic_size_in_map_units_minus1; ++i) {
          uint32_t slice_group_id;
          read_bits(&data, size, &slice_group_id);
        }
      } break;
    } // switch (pps.slice_group_map_type)

  } // if (pps.num_slice_groups_minus1 > 0)

  read_exp_golomb(&data, &pps.num_ref_idx_l0_active_minus1);
  read_exp_golomb(&data, &pps.num_ref_idx_l1_active_minus1);
  read_bit(&data, &pps.weighted_pred_flag);
  read_bits(&data, 2, &pps.weighted_bipred_idc);
  read_signed_exp_golomb(&data, &pps.pic_init_qp_minus26);
  read_signed_exp_golomb(&data, &pps.pic_init_qs_minus26);
  read_signed_exp_golomb(&data, &pps.chroma_qp_index_offset);
  read_bit(&data, &pps.deblocking_filter_control_present_flag);
  read_bit(&data, &pps.constrained_intra_pred_flag);
  read_bit(&data, &pps.redundant_pic_cnt_present_flag);

  decoder.pps = pps;

  out_SB_NL(v, "pic_parameter_set_id: ", pps.pic_parameter_set_id);
  out_SB_NL(v, "seq_parameter_set_id: ", pps.seq_parameter_set_id);
  out_SB_NL(v, "entropy_coding_mode_flag: ", pps.entropy_coding_mode_flag);
  out_SB_NL(v, "pic_order_present_flag: ", pps.pic_order_present_flag);

  out_SB_NL(v, "num_slice_groups_minus1: ", pps.num_slice_groups_minus1);
  if (pps.num_slice_groups_minus1 > 0) {
    out_SB_NL(v, "slice_group_map_type: ", pps.slice_group_map_type);
    switch (pps.slice_group_map_type) {
      case 3:
      case 4:
      case 5:
        out_SB_NL(v, "slice_group_change_direction_flag: ", pps.slice_group_change_direction_flag);
        out_SB_NL(v, "slice_group_change_rate_minus1: ", pps.slice_group_change_rate_minus1);
        break;
      case 6:
        out_SB_NL(v, "pic_size_in_map_units_minus1: ", pps.pic_size_in_map_units_minus1);
        break;
    }
  }

  out_SB_NL(v, "num_ref_idx_l0_active_minus1: ", pps.num_ref_idx_l0_active_minus1);
  out_SB_NL(v, "num_ref_idx_l1_active_minus1: ", pps.num_ref_idx_l1_active_minus1);
  out_SB_NL(v, "weighted_pred_flag: ", pps.weighted_pred_flag);
  out_SB_NL(v, "weighted_bipred_idc: ", pps.weighted_bipred_idc);
  out_SLL_NL(v, "pic_init_qp_minus26: ", pps.pic_init_qp_minus26);
  out_SLL_NL(v, "pic_init_qs_minus26: ", pps.pic_init_qs_minus26);
  out_SLL_NL(v, "chroma_qp_index_offset: ", pps.chroma_qp_index_offset);
  out_SB_NL(v, "deblocking_filter_control_present_flag: ", pps.deblocking_filter_control_present_flag);
  out_SB_NL(v, "constrained_intra_pred_flag: ", pps.constrained_intra_pred_flag);
  out_SB_NL(v, "redundant_pic_cnt_present_flag: ", pps.redundant_pic_cnt_present_flag);
}
Example #14
0
void H264_decodeSPS(int v, u_char *b, int len) {

  H264_SPS sps = {0,};
  sps.chroma_format_idc = 1; // default

  uint8_t nal_unit_type = b[3]&0x1F;
  
  bitdata data = {0,};
  data.data = (byte*)(b+4);
  data.data_len = remove_0x03(b+4, len-4);
  data.cur_bit = -1;

  read_bits_into_byte(&data, 8, &sps.profile_idc);
  read_bit(&data, &sps.constraint_set0_flag);
  read_bit(&data, &sps.constraint_set1_flag);
  read_bit(&data, &sps.constraint_set2_flag);
  read_bit(&data, &sps.constraint_set3_flag);
  read_bits_into_byte(&data, 4, &sps.reserved_zero_4bits);
  read_bits_into_byte(&data, 8, &sps.level_idc);
  read_exp_golomb(&data, &sps.seq_parameter_set_id); 

  if (sps.profile_idc == 100 || sps.profile_idc == 110
      || sps.profile_idc == 122 || sps.profile_idc == 144) {
    
    read_exp_golomb(&data, &sps.chroma_format_idc);
    if (sps.chroma_format_idc == 3) {
      read_bit(&data, &sps.separate_colour_plane_flag);
    }
    
    read_exp_golomb(&data, &sps.bit_depth_luma_minus8);
    read_exp_golomb(&data, &sps.bit_depth_chroma_minus8);
    read_bit(&data, &sps.qpprime_y_zero_transform_bypass_flag);
    read_bit(&data, &sps.seq_scaling_matrix_present_flag);
    
    if (sps.seq_scaling_matrix_present_flag) {
      uint32_t i;
      for (i = 0; i < ((sps.chroma_format_idc != 3) ? 8 : 12); ++i) {
        uint8_t seq_scaling_list_present_flag;
        read_bit(&data, &seq_scaling_list_present_flag);
        if(seq_scaling_list_present_flag) {
          uint32_t j, last_scale = 8, next_scale = 8;
          for(j = 0; j < ((i < 6) ? 16 : 64); ++j) {
            if(next_scale != 0) {
               int32_t delta_scale;
               read_signed_exp_golomb(&data, &delta_scale);
               next_scale = (last_scale + delta_scale + 256) % 256;
            }
            last_scale = (next_scale == 0) ? last_scale : next_scale;
          }
        }
      }
    } // if (sps.seq_scaling_matrix_present_flag)

  }

  read_exp_golomb(&data, &sps.log2_max_frame_num_minus4);
  
  read_exp_golomb(&data, &sps.pic_order_cnt_type);
  if (sps.pic_order_cnt_type == 0) {
    read_exp_golomb(&data, &sps.log2_max_pic_order_cnt_lsb_minus4);
  } else if (sps.pic_order_cnt_type == 1) {
    uint32_t i;
    read_bit(&data, &sps.delta_pic_order_always_zero_flag);
    read_exp_golomb(&data, &sps.offset_for_non_ref_pic);
    read_exp_golomb(&data, &sps.offset_for_top_to_bottom_field);
    read_exp_golomb(&data, &sps.num_ref_frames_in_pic_order_cnt_cycle);
    for (i = 0; i < sps.num_ref_frames_in_pic_order_cnt_cycle; ++i) {
      uint32_t offset_for_ref_frame;
      read_exp_golomb(&data, &offset_for_ref_frame);
    }
  } // if (sps.pic_order_cnt_type == 1)

  read_exp_golomb(&data, &sps.num_ref_frames);
  read_bit(&data, &sps.gaps_in_frame_num_value_allowed_flag);
  read_exp_golomb(&data, &sps.pic_width_in_mbs_minus1);
  read_exp_golomb(&data, &sps.pic_height_in_map_units_minus1);
  read_bit(&data, &sps.frame_mbs_only_flag);

  decoder.sps = sps;

  out_S2B_NL(v, "profile_idc: ", sps.profile_idc, dvbstrH264_Profile_IDC(sps.profile_idc));
  out_SB_NL(v, "constraint_set0_flag: ", sps.constraint_set0_flag);
  out_SB_NL(v, "constraint_set1_flag: ", sps.constraint_set1_flag);
  out_SB_NL(v, "constraint_set2_flag: ", sps.constraint_set2_flag);
  out_SB_NL(v, "constraint_set3_flag: ", sps.constraint_set3_flag);
  out_SB_NL(v, "reserved_zero_4bits: ", sps.reserved_zero_4bits);
  out_SB_NL(v, "level_idc: ", sps.level_idc);
  out_SB_NL(v, "seq_parameter_set_id: ", sps.seq_parameter_set_id);
  
  if (sps.profile_idc == 100 || sps.profile_idc == 110
      || sps.profile_idc == 122 || sps.profile_idc == 144) {

    out_SB_NL(v, "chroma_format_idc: ", sps.chroma_format_idc);
    if (sps.chroma_format_idc == 3) {
      out_SB_NL(v, "separate_colour_plane_flag: ", sps.separate_colour_plane_flag);
    }
    out_SB_NL(v, "bit_depth_luma_minus8: ", sps.bit_depth_luma_minus8);
    out_SB_NL(v, "bit_depth_chroma_minus8: ", sps.bit_depth_chroma_minus8);
    out_SB_NL(v, "qpprime_y_zero_transform_bypass_flag: ", sps.qpprime_y_zero_transform_bypass_flag);
    out_SB_NL(v, "seq_scaling_matrix_present_flag: ", sps.seq_scaling_matrix_present_flag);
  }

  out_SB_NL(v, "log2_max_frame_num_minus4: ", sps.log2_max_frame_num_minus4);
  out_SB_NL(v, "pic_order_cnt_type: ", sps.pic_order_cnt_type);
  if (sps.pic_order_cnt_type == 0) {
    out_SB_NL(v, "log2_max_pic_order_cnt_lsb_minus4: ", sps.log2_max_pic_order_cnt_lsb_minus4);
  } else if (sps.pic_order_cnt_type == 1) {
    out_SB_NL(v, "delta_pic_order_always_zero_flag: ", sps.delta_pic_order_always_zero_flag);
    out_SB_NL(v, "offset_for_non_ref_pic: ", sps.offset_for_non_ref_pic);
    out_SB_NL(v, "offset_for_top_to_bottom_field: ", sps.offset_for_top_to_bottom_field);
    out_SB_NL(v, "num_ref_frames_in_pic_order_cnt_cycle: ", sps.num_ref_frames_in_pic_order_cnt_cycle);
  }

  out_SB_NL(v, "num_ref_frames: ", sps.num_ref_frames);
  out_SB_NL(v, "gaps_in_frame_num_value_allowed_flag: ", sps.gaps_in_frame_num_value_allowed_flag);

  out_nl (v , "pic_width_in_mbs_minus1: %d (0x%02x) [= %d]"
            , sps.pic_width_in_mbs_minus1
            , sps.pic_width_in_mbs_minus1
            , 16 * (sps.pic_width_in_mbs_minus1 + 1));

  out_nl (v , "pic_height_in_map_units_minus1: %d (0x%02x) [= %d]"
            , sps.pic_height_in_map_units_minus1
            , sps.pic_height_in_map_units_minus1
            , (2 - sps.frame_mbs_only_flag) * (sps.pic_height_in_map_units_minus1 + 1) * 16);

  out_SB_NL(v, "frame_mbs_only_flag: ", sps.frame_mbs_only_flag);
}
Example #15
0
void section_DSMCC_DATAGRAM (u_char *b, int len)
{
 /* EN 301 192 7.x */
// $$$ TODO this differs from ISO/IEC 13818-6:1998 AMD_1_2000_Cor_1_2002

 typedef struct  _DATAGRAM {
    u_int      table_id;
    u_int      section_syntax_indicator;		
    u_int      private_indicator;
    u_int      reserved_1;
    u_int      section_length;

    u_int      MAC_addr6;
    u_int      MAC_addr5;
    u_int      reserved_2;
    u_int      payload_scrambling_control;
    u_int      address_scrambling_control;
    u_int      LLC_SNAP_flag;
    
    u_int      current_next_indicator;
    u_int      section_number;
    u_int      last_section_number;

    u_int      MAC_addr4;
    u_int      MAC_addr3;	// MAC-Bits:  MSB first order
    u_int      MAC_addr2;
    u_int      MAC_addr1;

    // conditional
    // LLC SNAP   according ISO 8802-2

    // N ip datagram bytes
    u_int      ip_datagram_data_bytes;

    // conditional
    u_int      stuffing_bytes;

    // conditional
    unsigned long crc_checksum;
 } DATAGRAM;



 DATAGRAM   d;
 int        len1;


 d.table_id 			 = b[0];
 d.section_syntax_indicator	 = getBits (b, 0, 8, 1);
 d.private_indicator		 = getBits (b, 0, 9, 1);   // $$$ TODO error indicator
 d.reserved_1 			 = getBits (b, 0, 10, 2);
 d.section_length		 = getBits (b, 0, 12, 12);

 d.MAC_addr6			 = getBits (b, 0, 24, 8);
 d.MAC_addr5			 = getBits (b, 0, 32, 8);
 d.reserved_2			 = getBits (b, 0, 40, 2);
 d.payload_scrambling_control	 = getBits (b, 0, 42, 2);
 d.address_scrambling_control	 = getBits (b, 0, 44, 2);
 d.LLC_SNAP_flag		 = getBits (b, 0, 46, 1);

 d.current_next_indicator	 = getBits (b, 0, 47, 1);
 d.section_number 		 = getBits (b, 0, 48, 8);
 d.last_section_number 		 = getBits (b, 0, 56, 8);

 d.MAC_addr4			 = getBits (b, 0, 64, 8);
 d.MAC_addr3			 = getBits (b, 0, 72, 8);
 d.MAC_addr2			 = getBits (b, 0, 80, 8);
 d.MAC_addr1			 = getBits (b, 0, 88, 8);
    	// MAC-Bits:  MSB first ! 
	
 b += 12;
 len1 = d.section_length - 9;


 out_nl (3,"DSM-CC DATAGRAM-decoding....");
 out_S2B_NL (3,"Table_ID: ",d.table_id, dvbstrTableID (d.table_id));
 if (d.table_id != 0x3e) {
   out_nl (3,"wrong Table ID");
   return;
 }


 out_SB_NL (3,"section_syntax_indicator: ",d.section_syntax_indicator);
 out_SB_NL (3,"private_indicator: ",d.private_indicator);
 out_SB_NL (6,"reserved_1: ",d.reserved_1);
 out_SW_NL (5,"Section_length: ",d.section_length);

 out_SB_NL (5,"MACaddrbyte/DevicdID 6: ",d.MAC_addr6);
 out_SB_NL (5,"MACaddrbyte/DeviceID 5: ",d.MAC_addr5);
 out_SB_NL (6,"reserved_2: ",d.reserved_2);

 out_S2B_NL (3,"payload_scrambling_control: ",d.payload_scrambling_control,
		 dsmccStrPayload_scrambling_control(d.payload_scrambling_control));
 out_S2B_NL (3,"address_scrambling_control: ",d.address_scrambling_control,
		 dsmccStrAddress_scrambling_control(d.address_scrambling_control));

 out_SB_NL (3,"LLC_SNAP_flag: ",d.LLC_SNAP_flag);

 out_S2B_NL(3,"current_next_indicator: ",d.current_next_indicator, dvbstrCurrentNextIndicator(d.current_next_indicator));
 out_SB_NL (3,"Section_number: ",d.section_number);
 out_SB_NL (3,"Last_Section_number: ",d.last_section_number);

 out_SB_NL (5,"MACaddrbyte/DeviceID 4: ",d.MAC_addr4);
 out_SB_NL (5,"MACaddrbyte/DeviceID 3: ",d.MAC_addr3);
 out_SB_NL (5,"MACaddrbyte/DeviceID 2: ",d.MAC_addr2);
 out_SB    (5,"MACaddrbyte/DeviceID 1: ",d.MAC_addr1);
 out_nl    (3," => MAC-Address/DeviceID: %02x:%02x:%02x:%02x:%02x:%02x",
		 d.MAC_addr1,d.MAC_addr2,d.MAC_addr3,
		 d.MAC_addr4,d.MAC_addr5,d.MAC_addr6);


 if (d.LLC_SNAP_flag == 0x01) {
	 /*  ISO/IEC 8802-2   */
	 int k;
	 k = llc_snap (4, b);
 } else {
 	 net_IP_data (4, b, len1-4);
 }

 b += (len1 - 4);
 outBit_Sx_NL (5, (d.section_syntax_indicator)
		   ?"CRC: " :"Checksum: ",	b,0,32);
}
Example #16
0
void section_NIT (u_char *b, int len)
{
 /* EN 300 468  5.2  */

 typedef struct  _NIT {
    u_int      table_id;
    u_int      section_syntax_indicator;		
    u_int      reserved_1;
    u_int      reserved_2;
    u_int      section_length;
    u_int      network_id;
    u_int      reserved_3;
    u_int      version_number;
    u_int      current_next_indicator;
    u_int      section_number;
    u_int      last_section_number;
    u_int      reserved_4;
    u_int      network_descriptor_length;

    //  N ... descriptor

    u_int      reserved_5;
    u_int      transport_stream_loop_length;

    //  N1 ... transport stream loop

    u_long     CRC;
 } NIT;


 typedef struct  _NIT_TSL {
    u_int      transport_stream_id;
    u_int      original_network_id;
    u_int      reserved_1;
    u_int      transport_descriptor_length;

    //  N2 ... descriptor

 } NIT_TSL;


 NIT        n;
 NIT_TSL    nt;
 int        l1,l2;


 n.table_id 			 = b[0];
 n.section_syntax_indicator	 = getBits (b, 0,  8, 1);
 n.reserved_1 			 = getBits (b, 0,  9, 1);
 n.reserved_2 			 = getBits (b, 0, 10, 2);
 n.section_length		 = getBits (b, 0, 12, 12);
 n.network_id			 = getBits (b, 0, 24, 16);
 n.reserved_3 			 = getBits (b, 0, 40, 2);
 n.version_number 		 = getBits (b, 0, 42, 5);
 n.current_next_indicator	 = getBits (b, 0, 47, 1);
 n.section_number 		 = getBits (b, 0, 48, 8);
 n.last_section_number 		 = getBits (b, 0, 56, 8);
 n.reserved_4 			 = getBits (b, 0, 64, 4);
 n.network_descriptor_length	 = getBits (b, 0, 68, 12);



 out_nl (3,"NIT-decoding....");
 out_S2B_NL (3,"Table_ID: ",n.table_id, dvbstrTableID (n.table_id));
 if (n.table_id != 0x40 && n.table_id != 0x41) {
   out_nl (3,"wrong Table ID");
   return;
 }


 out_SB_NL (3,"section_syntax_indicator: ",n.section_syntax_indicator);
 out_SB_NL (6,"reserved_1: ",n.reserved_1);
 out_SB_NL (6,"reserved_2: ",n.reserved_2);
 out_SW_NL (5,"Section_length: ",n.section_length);

 out_S2W_NL (3,"Network_ID: ",n.network_id,
	dvbstrNetworkIdent_ID(n.network_id)); 
 out_SB_NL (6,"reserved_3: ",n.reserved_3);
 out_SB_NL (3,"Version_number: ",n.version_number);
 
 out_S2B_NL(3,"current_next_indicator: ",n.current_next_indicator, dvbstrCurrentNextIndicator(n.current_next_indicator));
 out_SB_NL (3,"Section_number: ",n.section_number);
 out_SB_NL (3,"Last_Section_number: ",n.last_section_number);
 out_SB_NL (6,"reserved_4: ",n.reserved_4);

 out_SW_NL (5,"Network_descriptor_length: ",n.network_descriptor_length);


 // get network descriptors

 l1 = n.network_descriptor_length;
 b += 10;

 indent (+1);
 while ( l1 > 0 ) {
   int x;

   x = descriptor (b, DVB_SI); 
   l1 -= x;
   b += x;
 }
 indent (-1);
 out_NL (3);



 // get transport stream loop / descriptors...

 n.reserved_5 			 = getBits (b, 0, 0, 4);
 n.transport_stream_loop_length	 = getBits (b, 0, 4, 12);

 out_NL (3);
 out_SB_NL (6,"reserved_5: ",n.reserved_5);
 out_SW_NL (5,"Transport_stream_loop_length: ",n.transport_stream_loop_length);
 

 l1 = n.transport_stream_loop_length;
 b += 2;

 indent (+1);
 while ( l1 > 0 ) {
    nt.transport_stream_id	= getBits (b, 0,  0, 16);
    nt.original_network_id	= getBits (b, 0, 16, 16);
    nt.reserved_1		= getBits (b, 0, 32, 4);
    nt.transport_descriptor_length	= getBits (b, 0, 36, 12);


    out_NL (3);
    out_SW_NL  (3,"Transport_stream_ID: ",nt.transport_stream_id);
    out_S2W_NL (3,"Original_network_ID: ",nt.original_network_id,
        dvbstrOriginalNetwork_ID(nt.original_network_id));
    out_SB_NL  (6,"reserved_1: ",nt.reserved_1);
    out_SW_NL  (5,"Transport_descriptor_length: ",
        nt.transport_descriptor_length);


    // descriptor(s) 

    b  += 6;
    l1 -= 6;
    l2  = nt.transport_descriptor_length;

    indent (+1);
    while (l2 > 0) {
      int x;

      x = descriptor (b, DVB_SI);
      b  += x;
      l2 -= x;
      l1 -= x;
    }
    indent (-1);
    out_NL (3);

 }
 indent(-1);


 n.CRC 			 = getBits (b, 0, 0, 32);
 out_SL_NL (5,"CRC: ",n.CRC);

}
Example #17
0
void section_PAT (u_char *b, int len)
{
 /* IS13818-1  S. 62 */

 typedef struct  _PAT {
    u_int      table_id;
    u_int      section_syntax_indicator;		
    u_int      reserved_1;
    u_int      section_length;
    u_int      transport_stream_id;
    u_int      reserved_2;
    u_int      version_number;
    u_int      current_next_indicator;
    u_int      section_number;
    u_int      last_section_number;

    // N pat_list

    u_long     CRC;
 } PAT;

 typedef struct _PAT_LIST {
    u_int      program_number;
    u_int      reserved;
    u_int      network_pmt_PID;
 } PAT_LIST;



 PAT p;
 PAT_LIST pl;
 int n;


 
 p.table_id 			 = b[0];
 p.section_syntax_indicator	 = getBits (b, 0, 8, 1);
 p.reserved_1 			 = getBits (b, 0, 10, 2);
 p.section_length		 = getBits (b, 0, 12, 12);
 p.transport_stream_id		 = getBits (b, 0, 24, 16);
 p.reserved_2 			 = getBits (b, 0, 40, 2);
 p.version_number 		 = getBits (b, 0, 42, 5);
 p.current_next_indicator	 = getBits (b, 0, 47, 1);
 p.section_number 		 = getBits (b, 0, 48, 8);
 p.last_section_number 		 = getBits (b, 0, 56, 8);



 out_nl (3,"PAT-decoding....");
 out_S2B_NL (3,"Table_ID: ",p.table_id, dvbstrTableID (p.table_id));
 if (p.table_id != 0x00) {
   out_nl (3,"wrong Table ID");
   return;
 }

 out_SB_NL (3,"section_syntax_indicator: ",p.section_syntax_indicator);
 out_SB_NL (6,"(fixed): ",0);
 out_SB_NL (6,"reserved_1: ",p.reserved_1);
 out_SW_NL (5,"Section_length: ",p.section_length);


 out_SW_NL (3,"Transport_Stream_ID: ",p.transport_stream_id);
 out_SB_NL (6,"reserved_2: ",p.reserved_2);
 out_SB_NL (3,"Version_number: ",p.version_number);
 out_S2B_NL(3,"current_next_indicator: ",p.current_next_indicator, dvbstrCurrentNextIndicator(p.current_next_indicator));
 out_SB_NL (3,"Section_number: ",p.section_number);
 out_SB_NL (3,"Last_Section_number: ",p.last_section_number);



 // PID list...
 // n = section_length - CRC  - front bytes
 // n = len / anzahl bytes pro pid angabe.
 // Buffer to start of List

 n  = p.section_length - 5 - 4;

 b = b + 8;
 indent (+1);
 for (; n>=4; n=n-4) {
	pl.program_number	 = getBits (b, 0, 0, 16);
	pl.reserved		 = getBits (b, 0, 16, 3);
	pl.network_pmt_PID	 = getBits (b, 0, 19, 13);
	b += 4;

	store_PidToMem (pl.network_pmt_PID);

 	out_NL (3);
	out_SW_NL (3,"Program_number: ",pl.program_number);
	out_SB_NL (6,"reserved: ",pl.reserved);
	out_SW_NL (3,(pl.program_number) ?"Program_map_PID: " :"Network_PID: ",
	             pl.network_pmt_PID);

 }
 indent (-1);
 out_NL (3);

 p.CRC = getBits (b,0,0,32);
 out_SL_NL (5,"CRC: ",p.CRC);

}
Example #18
0
void section_SDT (u_char *b, int len)
{

 typedef struct  _SDT {
    u_int      table_id;
    u_int      section_syntax_indicator;		
    u_int      reserved_1;
    u_int      reserved_2;
    u_int      section_length;
    u_int      transport_stream_id;
    u_int      reserved_3;
    u_int      version_number;
    u_int      current_next_indicator;
    u_int      section_number;
    u_int      last_section_number;
    u_int      original_network_id;
    u_int      reserved_4;

    // N...  SDT_LIST

    u_long     CRC;
 } SDT;

 typedef struct _SDT_LIST {
    u_int      service_id; 
    u_int      reserved_1;
    u_int      EIT_schedule_flag; 
    u_int      EIT_present_following_flag; 
    u_int      running_status; 
    u_int      free_CA_mode; 
    u_int      descriptors_loop_length; 

    // N2 ... descriptors

 } SDT_LIST;



 SDT      s;
 SDT_LIST s2;
 int      len1,len2;


 
 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);
 s.transport_stream_id		 = getBits (b, 0, 24, 16);
 s.reserved_3 			 = getBits (b, 0, 40, 2);
 s.version_number 		 = getBits (b, 0, 42, 5);
 s.current_next_indicator	 = getBits (b, 0, 47, 1);
 s.section_number 		 = getBits (b, 0, 48, 8);
 s.last_section_number 		 = getBits (b, 0, 56, 8);
 s.original_network_id		 = getBits (b, 0, 64, 16);
 s.reserved_4 			 = getBits (b, 0, 80, 8);



 out_nl (3,"SDT-decoding....");
 out_S2B_NL (3,"Table_ID: ",s.table_id, dvbstrTableID (s.table_id));
 if (s.table_id != 0x42 && s.table_id != 0x46) {
   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);

 out_SW_NL (3,"Transport_Stream_ID: ",s.transport_stream_id);
 out_SB_NL (6,"reserved_3: ",s.reserved_3);

 out_SB_NL (3,"Version_number: ",s.version_number);
 out_S2B_NL(3,"current_next_indicator: ",s.current_next_indicator, dvbstrCurrentNextIndicator(s.current_next_indicator));
 out_SB_NL (3,"Section_number: ",s.section_number);
 out_SB_NL (3,"Last_Section_number: ",s.last_section_number);

 out_S2W_NL (3,"Original_network_ID:  ",s.original_network_id,
      dvbstrOriginalNetwork_ID(s.original_network_id)); 
 out_SB_NL (6,"reserved_4: ",s.reserved_4);


 //  len = len - header - CRC
 len1 = s.section_length - 11 - 4;
 b   += 11;

 out_NL (3);
 indent (+1);
 while (len1 > 0 ) {

   s2.service_id		= getBits (b, 0,  0, 16);
   s2.reserved_1		= getBits (b, 0, 16, 6);
   s2.EIT_schedule_flag		= getBits (b, 0, 22, 1);
   s2.EIT_present_following_flag= getBits (b, 0, 23, 1);
   s2.running_status		= getBits (b, 0, 24, 3);
   s2.free_CA_mode		= getBits (b, 0, 27, 1);
   s2.descriptors_loop_length	= getBits (b, 0, 28, 12);

   out_NL (3);

   out_S2W_NL (3,"Service_id: ",s2.service_id,
	  " --> refers to PMT program_number"); 
   out_SB_NL  (6,"reserved_1: ",s2.reserved_1);
   out_SB_NL  (3,"EIT_schedule_flag: ",s2.EIT_schedule_flag);
   out_SB_NL  (3,"EIT_present_following_flag: ",s2.EIT_present_following_flag);
   out_S2B_NL (3,"Running_status: ",s2.running_status,
	dvbstrRunningStatus_FLAG(s2.running_status));
   out_S2B_NL (3,"Free_CA_mode: ",s2.free_CA_mode,
	(s2.free_CA_mode) ?"streams [partially] CA controlled" :"unscrambled");
   out_SW_NL  (5,"Descriptors_loop_length: ",s2.descriptors_loop_length);

   b    += 5;
   len1 -= 5;
   len2  = s2.descriptors_loop_length;

   indent (+1);
   while (len2 > 0) {
     int x;
     
     x = descriptor (b, DVB_SI);
     len2 -= x;
     b    += x;
     len1 -= x;
   }
   indent (-1);
   out_NL (3);

 }
 indent (-1);


 s.CRC = getBits (b,0,0,32);
 out_SL_NL (5,"CRC: ",s.CRC);

}
Example #19
0
void section_SIT (u_char *b, int len)
{

 typedef struct  _SIT {
    u_int      table_id;
    u_int      section_syntax_indicator;		
    u_int      reserved_1;
    u_int      reserved_2;
    u_int      section_length;
    u_int      reserved_3;
    u_int      reserved_4;
    u_int      version_number;
    u_int      current_next_indicator;
    u_int      section_number;
    u_int      last_section_number;
    u_int      reserved_5;
    u_int      transmission_info_loop_length;

    // N  descriptor
    // N1 SIT_LIST2

    unsigned long crc;
 } SIT;


 typedef struct _SIT_LIST2 {
    u_int      service_id;
    u_int      reserved_1; 
    u_int      running_status;
    u_int      service_loop_length;

    // N2 descriptor

 } SIT_LIST2;



 SIT        s;
 SIT_LIST2  s2;
 int        len1,len2;


 
 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);
 s.reserved_3 			 = getBits (b, 0, 24, 16);
 s.reserved_4 			 = getBits (b, 0, 40,  2);
 s.version_number 		 = getBits (b, 0, 42, 5);
 s.current_next_indicator	 = getBits (b, 0, 47, 1);
 s.section_number 		 = getBits (b, 0, 48, 8);
 s.last_section_number 		 = getBits (b, 0, 56, 8);
 s.reserved_5	 		 = getBits (b, 0, 64, 4);
 s.transmission_info_loop_length = getBits (b, 0, 68, 12);


 
 out_nl (3,"SIT-decoding....");
 out_S2B_NL (3,"Table_ID: ",s.table_id, dvbstrTableID (s.table_id));
 if (s.table_id != 0x7F) {
   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);

 out_SW_NL (6,"reserved_3: ",s.reserved_3);
 out_SB_NL (6,"reserved_4: ",s.reserved_4);

 out_SB_NL (3,"Version_number: ",s.version_number);
 out_S2B_NL(3,"current_next_indicator: ",s.current_next_indicator, dvbstrCurrentNextIndicator(s.current_next_indicator));
 out_SB_NL (3,"Section_number: ",s.section_number);
 out_SB_NL (3,"Last_Section_number: ",s.last_section_number);

 out_SB_NL (6,"reserved_5: ",s.reserved_5);
 out_SW_NL (5,"Transmission_info_loop_length: ",s.transmission_info_loop_length);


 // - header data after length value
 len1 = s.section_length - 7;
 b   += 10;

 len2 = s.transmission_info_loop_length;
 indent (+1);
 while (len2 > 0) {
   int x;

   x = descriptor (b, DVB_SI);
   len2 -= x;
   b += x;
   len1 -= x;
 }
 indent (-1);

 
 out_NL (3);
 indent (+1);
 while (len1 > 4) {

   s2.service_id		 = getBits (b, 0,  0, 16);
   s2.reserved_1		 = getBits (b, 0, 16,  1);
   s2.running_status		 = getBits (b, 0, 17,  3);
   s2.service_loop_length	 = getBits (b, 0, 20, 12);

   b    += 4;
   len1 -= 4;


   out_NL (3);
   out_S2W_NL (3,"Service_ID: ",s2.service_id, 
          " --> refers to PMT program_number");
   out_SB_NL  (6,"reserved_1: ",s2.reserved_1);
   out_S2B_NL (3,"Running_status: ",s2.running_status,
          dvbstrRunningStatus_FLAG (s2.running_status));

   out_SW_NL  (5,"Service_loop_length: ",s2.service_loop_length);


   len2 = s2.service_loop_length;

   indent (+1);
   while (len2 > 0) {
      int x;

      x = descriptor (b, DVB_SI);
      len2 -= x;
      b += x;
      len1 -= x;
   }
   indent (-1);
   out_NL (3);

 } // while len1
 indent (-1);


 s.crc		 		 = getBits (b, 0, 0, 32);
 out_SL_NL (5,"CRC: ",s.crc);

}
Example #20
0
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


}
Example #21
0
void section_RST (u_char *b, int len)
{

 typedef struct  _RST {
    u_int      table_id;
    u_int      section_syntax_indicator;		
    u_int      reserved_1;
    u_int      reserved_2;
    u_int      section_length;

    // N1 RST_LIST2

 } RST;


 typedef struct _RST_LIST2 {
    u_int      transport_stream_id;
    u_int      original_network_id; 
    u_int      service_id; 
    u_int      event_id; 
    u_int      reserved_1;
    u_int      running_status;
 } RST_LIST2;



 RST        r;
 RST_LIST2  r2;
 int        len1;


 
 r.table_id 			 = b[0];
 r.section_syntax_indicator	 = getBits (b, 0, 8, 1);
 r.reserved_1 			 = getBits (b, 0, 9, 1);
 r.reserved_2 			 = getBits (b, 0, 10, 2);
 r.section_length		 = getBits (b, 0, 12, 12);


 out_nl (3,"RST-decoding....");
 out_S2B_NL (3,"Table_ID: ",r.table_id, dvbstrTableID (r.table_id));
 if (r.table_id != 0x71) {
   out_nl (3,"wrong Table ID");
   return;
 }


 out_SB_NL (3,"section_syntax_indicator: ",r.section_syntax_indicator);
 out_SB_NL (6,"reserved_1: ",r.reserved_1);
 out_SB_NL (6,"reserved_2: ",r.reserved_2);
 out_SW_NL (5,"Section_length: ",r.section_length);


 len1 = r.section_length - 3;
 b   += 3;

 indent (+1);
 while (len1 > 0) {

   r2.transport_stream_id	 = getBits (b, 0,  0,  16);
   r2.original_network_id	 = getBits (b, 0, 16,  16);
   r2.service_id		 = getBits (b, 0, 32,  16);
   r2.event_id			 = getBits (b, 0, 48,  16);
   r2.reserved_1		 = getBits (b, 0, 64,   5);
   r2.running_status		 = getBits (b, 0, 69,   3);

   b    += 9;
   len1 -= 9;

   out_NL (3);
   out_SW_NL  (3,"Transport_stream_ID: ",r2.transport_stream_id);
   out_S2W_NL (3,"Original_network_ID: ",r2.original_network_id,
        dvbstrOriginalNetwork_ID(r2.original_network_id));
   out_S2W_NL (3,"Service_ID: ",r2.service_id,
	 " --> refers to PMT program_number"); 
   out_SW_NL  (3,"Event_ID: ",r2.event_id);
   out_SB_NL  (6,"reserved_1: ",r2.reserved_1);
   out_S2B_NL (3,"Running_status: ",r2.running_status,
	dvbstrRunningStatus_FLAG (r2.running_status));

 } // while len1
 indent (-1);


}
Example #22
0
void section_CAT (u_char *b, int len)
{
 /* IS13818-1  S. 63 */
 /* see also: ETS 468, ETR 289 */

 typedef struct  _CAT {
    u_int      table_id;
    u_int      section_syntax_indicator;		
    u_int      reserved_1;
    u_int      section_length;
    u_int      reserved_2;
    u_int      version_number;
    u_int      current_next_indicator;
    u_int      section_number;
    u_int      last_section_number;

    // private section

    unsigned long CRC;
 } CAT;

 CAT  c;
 int  len1;

 
 c.table_id 			 = b[0];
 c.section_syntax_indicator	 = getBits (b, 0, 8, 1);
 c.reserved_1 			 = getBits (b, 0, 10, 2);
 c.section_length		 = getBits (b, 0, 12, 12);
 c.reserved_2 			 = getBits (b, 0, 24, 18);
 c.version_number 		 = getBits (b, 0, 42, 5);
 c.current_next_indicator	 = getBits (b, 0, 47, 1);
 c.section_number 		 = getBits (b, 0, 48, 8);
 c.last_section_number 		 = getBits (b, 0, 56, 8);



 out_nl (3,"CAT-decoding....");
 out_S2B_NL (3,"Table_ID: ",c.table_id, dvbstrTableID (c.table_id));
 if (c.table_id != 0x01) {
    out_nl (3,"wrong Table ID");
    return;
 }


 out_SB_NL (3,"section_syntax_indicator: ",c.section_syntax_indicator); 
 out_SB_NL (6,"(fixed): ",0);
 out_SB_NL (6,"reserved_1: ",c.reserved_1);
 out_SW_NL (5,"Section_length: ",c.section_length);
 out_SB_NL (6,"reserved_2: ",c.reserved_2);
 out_SB_NL (3,"Version_number: ",c.version_number);
 out_S2B_NL(3,"current_next_indicator: ",c.current_next_indicator, dvbstrCurrentNextIndicator(c.current_next_indicator));
 out_SB_NL (3,"Section_number: ",c.section_number);
 out_SB_NL (3,"Last_Section_number: ",c.last_section_number);

 // buffer + header, len = len - header - CRC
 // Descriptor ISO 13818 - 2.6.1


 // - header - CRC
 len1 = c.section_length - 5;
 b  += 8;


 indent (1);
 while (len1 > 4) {
   int i;

   i     =  descriptor (b, MPEG);
   len1 -= i;
   b    += i;
   
 }
 indent (-1);
 out_NL (3);


 c.CRC 		 = getBits (b, 0, 0, 32);
 out_SL_NL (5,"CRC: ",c.CRC);

}
Example #23
0
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;
}
Example #24
0
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);
}
Example #25
0
void section_PMT (u_char *b, int len)
{
 /* IS13818-1  S. 65 */

 typedef struct  _PMT {
    u_int      table_id;
    u_int      section_syntax_indicator;		
    u_int      b_null;		
    u_int      reserved_1;
    int        section_length;
    u_int      program_number;
    u_int      reserved_2;
    u_int      version_number;
    u_int      current_next_indicator;
    u_int      section_number;
    u_int      last_section_number;
    u_int      reserved_3;
    u_int      pcr_pid;
    u_int      reserved_4;
    int        program_info_length;

    // N  descriptor
    // N1 PMT_LIST2

    unsigned long crc;
 } PMT;


 typedef struct _PMT_LIST2 {
    u_int      stream_type;
    u_int      reserved_1; 
    u_int      elementary_PID;
    u_int      reserved_2;
    int        ES_info_length;

    // N2 descriptor

 } PMT_LIST2;



 PMT        p;
 PMT_LIST2  p2;
 int        len1,len2;


 
 p.table_id 			 = b[0];
 p.section_syntax_indicator	 = getBits (b, 0, 8, 1);
 p.b_null			 = getBits (b, 0, 9, 1);
 p.reserved_1 			 = getBits (b, 0, 10, 2);
 p.section_length		 = getBits (b, 0, 12, 12);
 p.program_number		 = getBits (b, 0, 24, 16);
 p.reserved_2 			 = getBits (b, 0, 40, 2);
 p.version_number 		 = getBits (b, 0, 42, 5);
 p.current_next_indicator	 = getBits (b, 0, 47, 1);
 p.section_number 		 = getBits (b, 0, 48, 8);
 p.last_section_number 		 = getBits (b, 0, 56, 8);
 p.reserved_3	 		 = getBits (b, 0, 64, 3);
 p.pcr_pid	 		 = getBits (b, 0, 67, 13);
 p.reserved_4	 		 = getBits (b, 0, 80, 4);
 p.program_info_length 		 = getBits (b, 0, 84, 12);


 out_nl (3,"PMT-decoding....");
 out_S2B_NL (3,"Table_ID: ",p.table_id, dvbstrTableID (p.table_id));
 if (p.table_id != 0x02) {
   out_nl (3,"wrong Table ID");
   return;
 }



 out_SB_NL (3,"section_syntax_indicator: ",p.section_syntax_indicator);
 out_SB_NL (6,"(fixed '0'): ",p.b_null);
 out_SB_NL (6,"reserved_1: ",p.reserved_1);
 out_SW_NL (5,"Section_length: ",p.section_length);
 out_SW_NL (3,"Program_number: ",p.program_number);

 out_SB_NL (6,"reserved_2: ",p.reserved_2);
 out_SB_NL (3,"Version_number: ",p.version_number);
 
 out_S2B_NL(3,"current_next_indicator: ",p.current_next_indicator, dvbstrCurrentNextIndicator(p.current_next_indicator));
 out_SB_NL (3,"Section_number: ",p.section_number);
 out_SB_NL (3,"Last_Section_number: ",p.last_section_number);

 out_SB_NL (6,"reserved_3: ",p.reserved_3);
 out_SW_NL (3,"PCR PID: ",p.pcr_pid);
 // store_PidToMem (p.pcr_pid);    $$$ TODO PCR is no section...

 out_SB_NL (6,"reserved_4: ",p.reserved_4);
 out_SW_NL (5,"Program_info_length: ",p.program_info_length);


 len1 = p.section_length - 9;
 b   += 9 + 3;

 len2 = p.program_info_length;
 indent (+1);
 while (len2 > 0) {
   int x;

   x = descriptor (b, DVB_SI);
   len2 -= x;
   b += x;
   len1 -= x;
 }
 lenCheckErrOut(3,len2);
 indent (-1);
 out_NL (3);


 out_nl (3,"Stream_type loop: ");
 indent (+1);
 while (len1 > 4) {

   p2.stream_type		 = getBits (b, 0,  0,  8);
   p2.reserved_1		 = getBits (b, 0,  8,  3);
   p2.elementary_PID		 = getBits (b, 0, 11, 13);
   p2.reserved_2		 = getBits (b, 0, 24,  4);
   p2.ES_info_length		 = getBits (b, 0, 28, 12);

   if (*dvbstrStream_TYPE_SHORT (p2.stream_type) == 'S') {	// SECTION?
   	store_PidToMem (p2.elementary_PID);			// $$$ TODO maybe PES-Spider too?
   }

   out_NL (3);
   out_S2B_NL (3,"Stream_type: ",p2.stream_type,
	dvbstrStream_TYPE (p2.stream_type));
   out_SB_NL (6,"reserved_1: ",p2.reserved_1);
   out_SW_NL (3,"Elementary_PID: ",p2.elementary_PID);
   out_SB_NL (6,"reserved_2: ",p2.reserved_2);
   out_SW_NL (5,"ES_info_length: ",p2.ES_info_length);


   b    += 5;
   len1 -= 5;
   len2 = p2.ES_info_length;

   indent (+1);
   while (len2 > 0) {
      int x;

      x = descriptor (b, DVB_SI);
      len2 -= x;
      len1 -= x;
      b += x;
   }
   indent (-1);

   // -- this is due to some braindead providers
   lenCheckErrOut(3,len2);

   out_NL (3);


 } // while len1
 indent (-1);


 p.crc		 		 = getBits (b, 0, 0, 32);
 out_SL_NL (5,"CRC: ",p.crc);

}