void measure (int (*func)(struct state *state), char *func_name, struct state *state) { struct timeval tv_start, tv_stop, tv_diff; state->io_size = 0; long int count; gettimeofday (&tv_start, NULL); count = func (state); gettimeofday (&tv_stop, NULL); tv_difference (&tv_stop, &tv_start, &tv_diff); fprintf (stdout, "%s: count=%ld, size=%ld, time=%ld:%ld\n", func_name, count, state->io_size, tv_diff.tv_sec, tv_diff.tv_usec); }
/* encode and send a rtp frame */ int rtp_send_frame(struct rtp_socket *rs, struct gsm_data_frame *frame) { struct rtp_sub_socket *rss = &rs->rtp; struct msgb *msg; struct rtp_hdr *rtph; int payload_type; int payload_len; int duration; /* in samples */ if (rs->tx_action != RTP_SEND_DOWNSTREAM) { /* initialize sequences */ rs->tx_action = RTP_SEND_DOWNSTREAM; rs->transmit.ssrc = rand(); rs->transmit.sequence = random(); rs->transmit.timestamp = random(); } switch (frame->msg_type) { case GSM_TCHF_FRAME: payload_type = RTP_PT_GSM_FULL; payload_len = 33; duration = 160; break; case GSM_TCHF_FRAME_EFR: payload_type = RTP_PT_GSM_EFR; payload_len = 31; duration = 160; break; default: DEBUGPC(DMUX, "unsupported message type %d\n", frame->msg_type); return -EINVAL; } { struct timeval tv, tv_diff; long int usec_diff, frame_diff; gettimeofday(&tv, NULL); tv_difference(&tv_diff, &rs->transmit.last_tv, &tv); rs->transmit.last_tv = tv; usec_diff = tv_diff.tv_sec * 1000000 + tv_diff.tv_usec; frame_diff = (usec_diff / 20000); if (abs(frame_diff) > 1) { long int frame_diff_excess = frame_diff - 1; LOGP(DMUX, LOGL_NOTICE, "Correcting frame difference of %ld frames\n", frame_diff_excess); rs->transmit.sequence += frame_diff_excess; rs->transmit.timestamp += frame_diff_excess * duration; } } msg = msgb_alloc(sizeof(struct rtp_hdr) + payload_len, "RTP-GSM-FULL"); if (!msg) return -ENOMEM; rtph = (struct rtp_hdr *)msg->data; rtph->version = RTP_VERSION; rtph->padding = 0; rtph->extension = 0; rtph->csrc_count = 0; rtph->marker = 0; rtph->payload_type = payload_type; rtph->sequence = htons(rs->transmit.sequence++); rtph->timestamp = htonl(rs->transmit.timestamp); rs->transmit.timestamp += duration; rtph->ssrc = htonl(rs->transmit.ssrc); memcpy(msg->data + sizeof(struct rtp_hdr), frame->data, payload_len); msgb_put(msg, sizeof(struct rtp_hdr) + payload_len); msgb_enqueue(&rss->tx_queue, msg); rss->bfd.when |= BSC_FD_WRITE; return 0; }