static void process_packet_header (isma_enc_rtp_data_t *iptr)
{
    rtp_packet *pak;
    uint32_t frame_len;
    uint32_t prev_frame_len;
    uint32_t IV;
    uint32_t delta_IV;
    uint16_t header_len;
    uint32_t retvalue;

    pak = iptr->m_vft->get_next_pak(iptr->m_ifptr, NULL, 1);
    if (pak == NULL) {
        return;
    }

#ifdef DEBUG_ISMA_AAC
    isma_message(LOG_DEBUG, ismaencrtp,
                 "processing pak seq %d ts %x len %d",
                 pak->rtp_pak_seq, pak->rtp_pak_ts, pak->rtp_data_len);
#endif

    // This pak has not had it's header processed
    // length in bytes
    if (pak->rtp_data_len == 0) {
        iptr->m_vft->free_pak(pak);
        isma_message(LOG_ERR, ismaencrtp, "RTP audio packet with data length of 0");
        return;
    }

    header_len = ntohs(*(unsigned short *)pak->rtp_data);
    //fprintf(stdout, "----->AWV, process_packet_header header len %u\n", header_len);
    if (header_len < iptr->m_min_first_header_bits) {
        // bye bye, frame...
        iptr->m_vft->free_pak(pak);
        isma_message(LOG_ERR, ismaencrtp, "ISMA rtp - header len %d less than min %d",
                     header_len, iptr->m_min_first_header_bits);
        return;
    }

    iptr->m_header_bitstream.init(&pak->rtp_data[sizeof(uint16_t)],
                                  header_len);

    // this is the first frame in a packet so:
    // next should be 4 bytes of IV, what is retvalue if this returns??? awv
    if (iptr->m_header_bitstream.getbits(32, &IV) != 0)
        return;

    // what is retvalue here if this returns??? awv
    if (iptr->m_header_bitstream.getbits(iptr->m_fmtp->size_length, &frame_len) != 0)
        return;

    iptr->m_header_bitstream.getbits(iptr->m_fmtp->index_length, &retvalue);
    get_au_header_bits(iptr);
#ifdef DEBUG_ISMA_AAC
    uint64_t msec = iptr->m_vft->rtp_ts_to_msec(iptr->m_ifptr, pak->rtp_pak_ts,
                    pak->pd.rtp_pd_timestamp,
                    1);
    isma_message(LOG_DEBUG, ismaencrtp,
                 "1st - header len %u frame len %u ts %x U64",
                 header_len, frame_len, pak->rtp_pak_ts, msec);
#endif
    if (frame_len == 0) {
        iptr->m_vft->free_pak(pak);
        return;
    }
    uint8_t *frame_ptr;
    isma_frame_data_t *frame_data;
    uint32_t ts;
    ts = pak->rtp_pak_ts;
    frame_data = get_frame_data(iptr);
    frame_data->pak = pak;
    // frame pointer is after header_len + header_len size.  Header_len
    // is in bits - add 7, divide by 8 to get padding correctly.
    frame_data->frame_ptr = &pak->rtp_data[((header_len + 7) / 8)
                                           + sizeof(uint16_t)];
    prev_frame_len = frame_len;
    frame_data->frame_len = frame_len;
    frame_data->rtp_timestamp = ts;
    frame_data->IV = IV;
    //fprintf(stdout, "===>AWV A1, Len: %u  IV %u\n", frame_len, IV);

    // Check if frame is fragmented
    // frame_len plus the length of the 2 headers
    uint32_t frag_check = frame_len + sizeof(uint16_t);
    frag_check += iptr->m_fmtp->size_length / 8;
    if ((iptr->m_fmtp->size_length % 8) != 0) frag_check++;
    if (frag_check > pak->rtp_data_len) {
#ifdef DEBUG_ISMA_AAC
        isma_message(LOG_DEBUG, ismaencrtp, "Frame is fragmented");
#endif
        frame_data->is_fragment = 1;
        int err = process_fragment(iptr, pak, frame_data);
        if (err == 1)
            isma_message(LOG_ERR, ismaencrtp, "Error in processing the fragment");
        return;
    }
    else {
#ifdef DEBUG_ISMA_AAC
        isma_message(LOG_DEBUG, ismaencrtp, "Frame is not fragmented");
#endif
        frame_data->is_fragment = 0;
        frame_data->frag_data = NULL;
    }
    int error = insert_frame_data(iptr, frame_data);
    frame_ptr = frame_data->frame_ptr + frame_data->frame_len;
    while (iptr->m_header_bitstream.bits_remain() >= iptr->m_min_header_bits) {
        uint32_t stride;
        // if deltaIVLength is not zero, frames subsequent to the first frame
        // will have a deltaIV, otherwise nothing. in either case, need to
        // derive the IV.
        // next should be deltaIV, what is retvalue if this returns??? awv
        if (iptr->m_fmtp->ISMACrypIVDeltaLength == 2 ) {
            if (iptr->m_header_bitstream.getbits(16, &delta_IV) != 0)
                return;
            else {
                IV = IV + prev_frame_len + delta_IV;
            }
        }
        else {
            if (iptr->m_fmtp->ISMACrypIVDeltaLength == 1 ) {
                if (iptr->m_header_bitstream.getbits(8, &delta_IV) != 0)
                    return;
                else {
                    IV = IV + prev_frame_len + delta_IV;
                }
            }
            else {
                IV = IV + prev_frame_len;
            }
        }
        //fprintf(stdout, "=========>AWV, Delta IV %u   Delta IV len %d\n", deltaIV,
        //        iptr->m_fmtp->ISMACrypIVDeltaLength);

        iptr->m_header_bitstream.getbits(iptr->m_fmtp->size_length, &frame_len);
        iptr->m_header_bitstream.getbits(iptr->m_fmtp->index_delta_length, &stride);
        get_au_header_bits(iptr);
        ts += (iptr->m_rtp_ts_add * (1 + stride));
#ifdef DEBUG_ISMA_AAC
        msec = iptr->m_vft->rtp_ts_to_msec(iptr->m_ifptr,
                                           pak->rtp_pak_ts,
                                           pak->pd.rtp_pd_timestamp,
                                           1);
        isma_message(LOG_DEBUG, ismaencrtp,
                     "Stride %d len %d ts %x U64",
                     stride, frame_len, ts, msec);
#endif
        frame_data = get_frame_data(iptr);
        frame_data->pak = pak;
        frame_data->is_fragment = 0;
        frame_data->frag_data = NULL;
        frame_data->frame_ptr = frame_ptr;
        prev_frame_len = frame_len;
        frame_data->frame_len = frame_len;
        frame_ptr += frame_len;
        frame_data->IV = IV;
        frame_data->rtp_timestamp = ts;
        //fprintf(stdout, "===>AWV A2, Len: %u  IV %u\n", frame_len, IV);
        error |= insert_frame_data(iptr, frame_data);
    }
    if (error == 0 && frame_data != NULL) {
        frame_data->last_in_pak = 1;
    }
    else {
        isma_frame_data_t *p, *last = NULL;
        p = iptr->m_frame_data_head;
        while (p != NULL) {
            if (p->pak == pak) last = p;
            p = p->frame_data_next;
        }
        if (last != NULL) {
            last->last_in_pak = 1;
            isma_message(LOG_WARNING, ismaencrtp, "error at end - marked ts %x", last->rtp_timestamp);
        } else {
            // Didn't find pak in list.  Weird
            isma_message(LOG_ERR, ismaencrtp,
                         "Decoded packet with RTP timestamp %x and didn't"
                         "see any good frames", pak->rtp_pak_ts);
            iptr->m_vft->free_pak(pak);
            return;
        }
    }
    if (iptr->m_fmtp->auxiliary_data_size_length > 0) {
        iptr->m_header_bitstream.byte_align();
        uint32_t aux_len;
        iptr->m_header_bitstream.getbits(iptr->m_fmtp->auxiliary_data_size_length, &aux_len);
        aux_len = (aux_len + 7) / 8;
#ifdef DEBUG_ISMA_AAC
        isma_message(LOG_DEBUG, ismaencrtp, "Adding %d bytes for aux data size", aux_len);
#endif
        isma_frame_data_t *p;
        p = iptr->m_frame_data_head;
        while (p != NULL) {
            if (p->pak == pak) {
                p->frame_ptr += aux_len;
            }
            p = p->frame_data_next;
        }
    }
}
Exemplo n.º 2
0
void process_chromosome(FILE *of, char *chrom, int read_size, int Taq) {
    char *fragment = malloc(MAXChromosome * sizeof(char));
    char *cp = chrom, *fp = fragment;

    while(*cp != '\0') {
        //Are we at a TaqI site? Do we even care?
        if(*cp == 'T' && Taq) {
            if(strncmp(cp,"TCGA", 4) == 0) {
                //Add on the last T and a null
                *fp = 'T';
                *(++fp) = '\0';
                process_fragment(of,fragment,read_size);

                fp = fragment; //Move the pointer back to the front of the fragment
                //Start the next fragment
                *fp = 'C';
                fp++;
                *fp = 'G';
                fp++;
                *fp = 'A';
                fp++;

                //Move the chromosome pointer past the cut site and loop
                cp += 4;
                continue;
            } else if(strncmp(cp,"T\nCGA", 5) == 0) {
                //Add on the last T and a null
                *fp = 'T';
                *(++fp) = '\0';
                process_fragment(of,fragment,read_size);

                fp = fragment; //Move the pointer back to the front of the fragment
                //Start the next fragment
                *fp = '\n';
                fp++;
                *fp = 'C';
                fp++;
                *fp = 'G';
                fp++;
                *fp = 'A';
                fp++;

                //Move the chromosome pointer past the cut site and loop
                cp += 5;
                continue;
            } else if(strncmp(cp,"TC\nGA", 5) == 0) {
                //Add on the last T and a null
                *fp = 'T';
                *(++fp) = '\0';
                process_fragment(of,fragment,read_size);

                fp = fragment; //Move the pointer back to the front of the fragment
                //Start the next fragment
                *fp = 'C';
                fp++;
                *fp = '\n';
                fp++;
                *fp = 'G';
                fp++;
                *fp = 'A';
                fp++;

                //Move the chromosome pointer past the cut site and loop
                cp += 5;
                continue;
            } else if(strncmp(cp,"TCG\nA", 5) == 0) {
                //Add on the last T and a null
                *fp = 'T';
                *(++fp) = '\0';
                process_fragment(of,fragment,read_size);

                fp = fragment; //Move the pointer back to the front of the fragment
                //Start the next fragment
                *fp = 'C';
                fp++;
                *fp = 'G';
                fp++;
                *fp = '\n';
                fp++;
                *fp = 'A';
                fp++;

                //Move the chromosome pointer past the cut site and loop
                cp += 5;
                continue;
            }
        } else if(*cp == 'C') { //MspI site
            if(strncmp(cp,"CCGG", 4) == 0) {
                //Add on the last T and a null
                *fp = 'C';
                *(++fp) = '\0';
                process_fragment(of,fragment,read_size);

                fp = fragment; //Move the pointer back to the front of the fragment
                //Start the next fragment
                *fp = 'C';
                fp++;
                *fp = 'G';
                fp++;
                *fp = 'G';
                fp++;

                //Move the chromosome pointer past the cut site and loop
                cp += 4;
                continue;
            } else if(strncmp(cp,"C\nCGG", 5) == 0) {
                //Add on the last T and a null
                *fp = 'C';
                *(++fp) = '\0';
                process_fragment(of,fragment,read_size);

                fp = fragment; //Move the pointer back to the front of the fragment
                //Start the next fragment
                *fp = '\n';
                fp++;
                *fp = 'C';
                fp++;
                *fp = 'G';
                fp++;
                *fp = 'G';
                fp++;

                //Move the chromosome pointer past the cut site and loop
                cp += 5;
                continue;
            } else if(strncmp(cp,"CC\nGG", 5) == 0) {
                //Add on the last T and a null
                *fp = 'C';
                *(++fp) = '\0';
                process_fragment(of,fragment,read_size);

                fp = fragment; //Move the pointer back to the front of the fragment
                //Start the next fragment
                *fp = 'C';
                fp++;
                *fp = '\n';
                fp++;
                *fp = 'G';
                fp++;
                *fp = 'G';
                fp++;

                //Move the chromosome pointer past the cut site and loop
                cp += 5;
                continue;
            } else if(strncmp(cp,"CCG\nG", 5) == 0) {
                //Add on the last T and a null
                *fp = 'C';
                *(++fp) = '\0';
                process_fragment(of,fragment,read_size);

                fp = fragment; //Move the pointer back to the front of the fragment
                //Start the next fragment
                *fp = 'C';
                fp++;
                *fp = 'G';
                fp++;
                *fp = '\n';
                fp++;
                *fp = 'G';
                fp++;

                //Move the chromosome pointer past the cut site and loop
                cp += 5;
                continue;
            }
        }

        //We are not at a cut site
        *fp = *cp;
        fp++;
        cp++;
    }

    //Don't forget the last fragment!
    *fp = '\0';
    process_fragment(of,fragment,read_size);

    return;
}
Exemplo n.º 3
0
static void process_packet_header (isma_rtp_data_t *iptr)
{
  rtp_packet *pak;
  uint32_t frame_len;
  uint16_t header_len;
  uint32_t retvalue;

  pak = iptr->m_vft->get_head_and_check(iptr->m_ifptr, false, 0);
  if (pak == NULL) {
    return;
  }
#ifdef DEBUG_ISMA_AAC
  isma_message(LOG_DEBUG, ismartp, 
	       "processing pak seq %d ts %x len %d", 
	       pak->rtp_pak_seq, pak->rtp_pak_ts, pak->rtp_data_len);
#endif
  // This pak has not had it's header processed
  // length in bytes
  if (pak->rtp_data_len == 0) {
    iptr->m_vft->free_pak(pak);
    isma_message(LOG_ERR, ismartp, "RTP audio packet with data length of 0");
    return;
  }

  header_len = ntohs(*(unsigned short *)pak->rtp_data);
  if (header_len < iptr->m_min_first_header_bits) {
    // bye bye, frame...
    iptr->m_vft->free_pak(pak);
    isma_message(LOG_ERR, ismartp, "ISMA rtp - header len %d less than min %d", 
		 header_len, iptr->m_min_first_header_bits);
    return;
  }

  iptr->m_header_bitstream.init(&pak->rtp_data[sizeof(uint16_t)],
			  header_len);
  if (iptr->m_header_bitstream.getbits(iptr->m_fmtp->size_length, &frame_len) != 0) 
    return;
  iptr->m_header_bitstream.getbits(iptr->m_fmtp->index_length, &retvalue);
  get_au_header_bits(iptr);
#ifdef DEBUG_ISMA_AAC
  uint64_t msec = iptr->m_vft->rtp_ts_to_msec(iptr->m_ifptr, pak->rtp_pak_ts, 
					      pak->pd.rtp_pd_timestamp,
					      1);
  isma_message(LOG_DEBUG, ismartp, 
	       "1st - header len %u frame len %u ts %x "U64, 
	       header_len, frame_len, pak->rtp_pak_ts, msec);
#endif
  if (frame_len == 0) {
    iptr->m_vft->free_pak(pak);
    return;
  }
  uint8_t *frame_ptr;
  isma_frame_data_t *frame_data;
  uint32_t ts;
  ts = pak->rtp_pak_ts;
  frame_data = get_frame_data(iptr);
  frame_data->pak = pak;
  // frame pointer is after header_len + header_len size.  Header_len
  // is in bits - add 7, divide by 8 to get padding correctly.
  frame_data->frame_ptr = &pak->rtp_data[((header_len + 7) / 8) 
				    + sizeof(uint16_t)];
  frame_data->frame_len = frame_len;
  frame_data->rtp_timestamp = ts;

  // Check if frame is fragmented
  // frame_len plus the length of the 2 headers
  uint32_t frag_check = frame_len + sizeof(uint16_t);
  frag_check += iptr->m_fmtp->size_length / 8;
  if ((iptr->m_fmtp->size_length % 8) != 0) frag_check++;
  if (frag_check > pak->rtp_data_len) {
#ifdef DEBUG_ISMA_AAC
    isma_message(LOG_DEBUG, ismartp, "Frame is fragmented");
#endif
    frame_data->is_fragment = 1;
    int err = process_fragment(iptr, pak, frame_data);
    if (err == 1)
      isma_message(LOG_ERR, ismartp, "Error in processing the fragment");
    return; 
  }
  else {
#ifdef DEBUG_ISMA_AAC
    isma_message(LOG_DEBUG, ismartp, "Frame is not fragmented");
#endif
    frame_data->is_fragment = 0;
    frame_data->frag_data = NULL;
  }
  int error = insert_frame_data(iptr, frame_data);
  frame_ptr = frame_data->frame_ptr + frame_data->frame_len;
  while (iptr->m_header_bitstream.bits_remain() >= iptr->m_min_header_bits) {
    uint32_t stride = 0;
    iptr->m_header_bitstream.getbits(iptr->m_fmtp->size_length, &frame_len);
    iptr->m_header_bitstream.getbits(iptr->m_fmtp->index_delta_length, &stride);
    get_au_header_bits(iptr);
    ts += (iptr->m_rtp_ts_add * (1 + stride));
#ifdef DEBUG_ISMA_AAC
    msec = iptr->m_vft->rtp_ts_to_msec(iptr->m_ifptr, 
				       pak->rtp_pak_ts, 
				       pak->pd.rtp_pd_timestamp,
				       1);
    isma_message(LOG_DEBUG, ismartp, 
		 "Stride %d len %d ts %x "U64,
		 stride, frame_len, ts, msec);
#endif
    frame_data = get_frame_data(iptr);
    frame_data->pak = pak;
    frame_data->is_fragment = 0;
    frame_data->frag_data = NULL;
    frame_data->frame_ptr = frame_ptr;
    frame_data->frame_len = frame_len;
    frame_ptr += frame_len;
    frame_data->rtp_timestamp = ts;
    error |= insert_frame_data(iptr, frame_data);
  }
  if (error == 0 && frame_data != NULL) { 
    frame_data->last_in_pak = 1;
  }
  else {
    isma_frame_data_t *p, *last = NULL;
    p = iptr->m_frame_data_head;
    while (p != NULL) {
      if (p->pak == pak) last = p;
      p = p->frame_data_next;
    }
    if (last != NULL) {
      last->last_in_pak = 1;
      isma_message(LOG_WARNING, ismartp, "error at end - marked ts %x", last->rtp_timestamp);
    } else {
      // Didn't find pak in list.  Weird
      isma_message(LOG_ERR, ismartp, 
		   "Decoded packet with RTP timestamp %x and didn't"
		   "see any good frames", pak->rtp_pak_ts);
      iptr->m_vft->free_pak(pak);
      return;
    }
  }
  if (iptr->m_fmtp->auxiliary_data_size_length > 0) {
    iptr->m_header_bitstream.byte_align();
    uint32_t aux_len = 0;
    iptr->m_header_bitstream.getbits(iptr->m_fmtp->auxiliary_data_size_length, &aux_len);
    aux_len = (aux_len + 7) / 8;
#ifdef DEBUG_ISMA_AAC
    isma_message(LOG_DEBUG, ismartp, "Adding %d bytes for aux data size", aux_len);
#endif
    isma_frame_data_t *p;
    p = iptr->m_frame_data_head;
    while (p != NULL) {
      if (p->pak == pak) {
	p->frame_ptr += aux_len;
      }
      p = p->frame_data_next;
    }
  }
}