Ejemplo n.º 1
0
void process_current_packet (cc708_service_decoder *decoders)
{
  int seq = (decoders[0].parent->m_current_packet[0] & 0xC0) >> 6; // Two most significants bits
  int len = decoders[0].parent->m_current_packet[0] & 0x3F; // 6 least significants bits
  if (decoders[0].parent->m_current_packet_length == 0)
    return;

  if (len==0) // This is well defined in EIA-708; no magic.
    len=128;
  else
    len=len*2;
  // Note that len here is the length including the header
  if (decoders[0].parent->m_current_packet_length != len) // Is this possible?
  {
    cc708_reset(decoders);
    return;
  }
  int last_seq = decoders[0].parent->m_last_seq;
  if ((last_seq != -1) && ((last_seq+1)%4 != seq))
  {
    cc708_reset(decoders);
    return;
  }
  decoders[0].parent->m_last_seq = seq;

  unsigned char *pos = decoders[0].parent->m_current_packet + 1;

  while (pos < decoders[0].parent->m_current_packet + len)
  {
    int service_number=(pos[0] & 0xE0)>>5; // 3 more significant bits
    int block_length = (pos[0] & 0x1F); // 5 less significant bits

    if (service_number==7) // There is an extended header
    {
      pos++;
      service_number=(pos[0] & 0x3F); // 6 more significant bits
      if (service_number<7)
      {
      }
      pos = decoders[0].parent->m_current_packet + len;
      break;
    }

    pos++; // Move to service data
    if (service_number==0 && block_length!=0) // Illegal, but specs say what to do...
    {
      pos = decoders[0].parent->m_current_packet + len; // Move to end
      break;
    }

    if (service_number>0 && decoders[service_number].inited)
      process_service_block (&decoders[service_number], pos, block_length);

    pos+=block_length; // Skip data
  }

  clear_packet(&decoders[0]);

  if (pos != decoders[0].parent->m_current_packet + len) // For some reason we didn't parse the whole packet
  {
    cc708_reset(decoders);
  }

  if (len<128 && *pos) // Null header is mandatory if there is room
  {
    ;//ccx_common_logging.debug_ftn(CCX_DMT_708, "Warning: Null header expected but not found.\n");
  }
}
Ejemplo n.º 2
0
Archivo: 708.cpp Proyecto: MrMdR/julapy
void process_current_packet (void)
{
#ifdef DEBUG_708_PACKETS
    printf ("Processing EIA-708 packet, length=%d\n",current_packet_length);
#endif
    if (current_packet_length==0)
        return;
    int seq=(current_packet[0] & 0xC0) >> 6; // Two most significants bits
    int len=current_packet[0] & 0x3F; // 6 least significants bits
    if (len==0) // This is well defined in EIA-708; no magic.
        len=128; 
    else
        len=len*2;
    // Note that len here is the length including the header
#ifdef DEBUG_708_PACKETS            
    printf ("Sequence: %d, packet length: %d\n",seq,len);
#endif
    if (current_packet_length!=len) // Is this possible?
    {
        printf ("Packet length mismatch (%s%d), first two data bytes %02X %02X, current picture:%s\n", 
        current_packet_length-len>0?"+":"", current_packet_length-len, 
        current_packet[0], current_packet[1], pict_types[current_picture_coding_type]);
        cc708_reset();
        return;
    }
    if (last_seq!=-1 && (last_seq+1)%4!=seq)
    {
        printf ("Unexpected sequence number, it was [%d] but should have been [%d]\n",
            seq,(last_seq+1)%4);
        cc708_reset();
        return;
    }
    last_seq=seq;
   
    unsigned char *pos=current_packet+1;    

    while (pos<current_packet+len)
    {
        int service_number=(pos[0] & 0xE0)>>5; // 3 more significant bits
        int block_length = (pos[0] & 0x1F); // 5 less significant bits
#ifdef DEBUG_708_PACKETS        
       printf ("Standard header: Service number: [%d] Block length: [%d]\n",service_number,
            block_length); 
#endif
        if (service_number==7) // There is an extended header
        {
            pos++; 
            service_number=(pos[0] & 0x3F); // 6 more significant bits
            // printf ("Extended header: Service number: [%d]\n",service_number);
            if (service_number<7) 
            {
                printf ("Illegal service number in extended header: [%d]\n",service_number);
            }
        }            
        /*
        if (service_number==0 && block_length==0) // Null header already?
        {
            if (pos!=(current_packet+len-1)) // i.e. last byte in packet
            {
                // Not sure if this is correct
                printf ("Null header before it was expected.\n");            
            // break;
            }
        } */
        pos++; // Move to service data
        if (service_number==1) // Primary language        
            process_service_block (&decoders[0], pos, block_length);
        if (service_number==2) // Secondary language
            process_service_block (&decoders[1], pos, block_length);
        
        pos+=block_length; // Skip data    
    }

    clear_packet();

    if (pos!=current_packet+len) // For some reason we didn't parse the whole packet
    {
        printf ("There was a problem with this packet, reseting\n");
        cc708_reset();
    }

    if (len<128 && *pos) // Null header is mandatory if there is room
    {
        printf ("Warning: Null header expected but not found.\n");
    }    
}