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"); } }
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"); } }