static int get_dev_status(struct device *dev, struct devfreq_dev_status *status) { struct spdm_data *data = 0; int ret; if (!dev || !status) return -EINVAL; data = dev_get_drvdata(dev); if (!data) return -EINVAL; /* determine if we want to go up or down based on the notification */ if (data->action == SPDM_UP) status->busy_time = 255; else status->busy_time = 0; status->total_time = 255; ret = get_cur_bw(dev, &status->current_frequency); if (ret) return ret; return 0; }
/* the algo. to adapt tha transmission bandwidth */ void adapt_bw(double lossrate){ FILE *fp; fp = fopen("adapt_bw.log", "a+"); if (lossrate > upper) { if ((cur_bw * D) > min_bw) { packet_size = packet_size * D; cur_bw = get_cur_bw(packet_size); fprintf(stderr, "case1 - pkt lossrate : %lf > upper : %lf, decrease cur_bw to = %lf\n", lossrate, upper, cur_bw); fprintf(fp, "\t%lf\t%lf\n", now, cur_bw); printf("case2 - pkt lossrate : %lf > upper : %lf, decrease cur_bw to = %lf\n", lossrate, upper, cur_bw); } else { packet_size = minbw_pktsize; cur_bw = get_cur_bw(packet_size); fprintf(stderr, "case2 - pkt lossrate : %lf > upper : %lf, decrease cur_bw to = %lf\n", lossrate, upper, cur_bw); fprintf(fp, "\t%lf\t%lf\n", now, cur_bw); printf("case2 - pkt lossrate : %lf > upper : %lf, decrease cur_bw to = %lf\n", lossrate, upper, cur_bw); } } else if (lossrate < lower) { if (cur_bw + I < max_bw) { packet_size = packet_size + minbw_pktsize; cur_bw = get_cur_bw(packet_size); fprintf(stderr, "case3 - pkt lossrate : %lf < lower : %lf, increase cur_bw to = %lf\n", lossrate, lower, cur_bw); fprintf(fp, "\t%lf\t%lf\n", now, cur_bw); printf("case3 - pkt lossrate : %lf < lower : %lf, increase cur_bw to = %lf\n", lossrate, lower, cur_bw); } else { packet_size = minbw_pktsize * 20; cur_bw = get_cur_bw(packet_size); fprintf(stderr, "case4 - pkt lossrate : %lf < lower : %lf, increase cur_bw to = %lf\n", lossrate, lower, cur_bw); fprintf(fp, "\t%lf\t%lf\n", now, cur_bw); printf("case4 - pkt lossrate : %lf < lower : %lf, increase cur_bw to = %lf\n", lossrate, lower, cur_bw); } } else { fprintf(stderr, "case5 - pkt lossrate : %lf, cur_bw is %lf\n", lossrate, cur_bw); fprintf(fp, "\t%lf\t%lf\n", now, cur_bw); printf("case5 - pkt lossrate : %lf, cur_bw is %lf\n", lossrate, cur_bw); } fclose(fp); }
void adapt_bw(double lossrate){ int j; match_ssrc(ssrc, lossrate); j = adapt(); if (j == 1) { if ((cur_bw * D) > min_bw) { packet_size = packet_size * D; cur_bw = get_cur_bw(packet_size); fprintf(stderr, "case1 - pkt lossrate : %lf > upper : %lf, decrease cur_bw to = %lf\n", lossrate, upper, cur_bw); printf("case2 - pkt lossrate : %lf > upper : %lf, decrease cur_bw to = %lf\n", lossrate, upper, cur_bw); } else { packet_size = minbw_pktsize; cur_bw = get_cur_bw(packet_size); fprintf(stderr, "case2 - pkt lossrate : %lf > upper : %lf, decrease cur_bw to = %lf\n", lossrate, upper, cur_bw); printf("case2 - pkt lossrate : %lf > upper : %lf, decrease cur_bw to = %lf\n", lossrate, upper, cur_bw); } } else if (j == 2) { if (cur_bw + I < max_bw) { packet_size = packet_size + minbw_pktsize; cur_bw = get_cur_bw(packet_size); fprintf(stderr, "case3 - pkt lossrate : %lf < lower : %lf, increase cur_bw to = %lf\n", lossrate, lower, cur_bw); printf("case3 - pkt lossrate : %lf < lower : %lf, increase cur_bw to = %lf\n", lossrate, lower, cur_bw); } else { packet_size = minbw_pktsize * 20; cur_bw = get_cur_bw(packet_size); fprintf(stderr, "case4 - pkt lossrate : %lf < lower : %lf, increase cur_bw to = %lf\n", lossrate, lower, cur_bw); printf("case4 - pkt lossrate : %lf < lower : %lf, increase cur_bw to = %lf\n", lossrate, lower, cur_bw); } } else { fprintf(stderr, "case5 - pkt lossrate : %lf, cur_bw is %lf\n", lossrate, cur_bw); printf("case5 - pkt lossrate : %lf, cur_bw is %lf\n", lossrate, cur_bw); } }
int main(int argc, char **argv){ /* setting commad line information */ local_ip = argv[1]; local_port = atoi(argv[2]); cname = argv[3]; proto = udp; /* create a rtp session, we will assign unique value to identify */ err = rtp_create(&sid); if (err) { err_handle(err); } sdp_parse(sid, argv); if (rtp_start_time > 0) { usleep( ((int) rtp_start_time * 1000000) ); } if ((i = initial_session(argc, argv, sid))) { printf("WARNING : initial_session warning = %d\n", i); } else { printf("initial_session is ok\n"); } if (is_audio) { delay = (ms_pkt / 1000.); } else { delay = (1. / framerate); // unit: ms/sec. we assume that 300 samples/frame, } /* bytes of each packet = ((bits/sample) / 8 ) * (clock rate) * ( each delay of packet in sec ) */ packet_size = (int) ( bits_per_sample * sampling_rate * delay / 8.); /* original_bw = min_bw = 50, so we use the same pkt size */ minbw_pktsize = packet_size; printf("bits_per_sample = %lf, (bits_per_sample/8.) = %lf\n", bits_per_sample, (bits_per_sample/8.)); printf("sampling_rate = %lf\n", sampling_rate); printf("delay = %lf\n", delay); printf("packet_size = %d\n", packet_size); fflush(stdout); /* the bandwidth wa are using, 30 = frames/sec */ cur_bw = get_cur_bw(packet_size); err = rtp_get_sour_rtpsocket(sid, &rtp_sockt); if (err) { err_handle(err); } err = rtp_get_sour_rtcpsocket(sid, &rtcp_sockt); if (err) { err_handle(err); } if (rtp_sockt > nfds || rtcp_sockt > nfds) { if (rtp_sockt > rtcp_sockt) nfds = rtp_sockt; else nfds = rtcp_sockt; } FD_ZERO(&afds); FD_ZERO(&rfds); FD_SET(rtp_sockt, &afds); FD_SET(rtcp_sockt, &afds); gettimeofday(&start_tv, NULL); starttime = (start_tv.tv_sec + start_tv.tv_usec / 1000000.); nexttime = starttime; rtp_interval = rtp_stop_time - rtp_start_time; printf("rtp_interval = %f\n", rtp_interval); fflush(stdout); while (rtp_interval >= 0) { memcpy(&rfds, &afds, sizeof(rfds)); if (RTP_MAX_PKT_SIZE < packet_size){ fprintf(stderr, "RTP_MAX_PKT_SIZE < reads\n"); continue; } addtimestamp = ((int) packet_size * (bits_per_sample / 8.) ); err = rtp_send(sid, marker, addtimestamp, codec_num, (int8 *)sendbuf, packet_size); if (err) { err_handle(err); } marker = 0; /* not the first packet of talkspurt */ rtp_interval -= delay; nexttime += delay; gettimeofday(&now_tv, NULL); now = (now_tv.tv_sec + now_tv.tv_usec / 1000000.); err = get_rtcp_timeout(sid, &timeout_tv); if (err) { err_handle(err); } while (now < nexttime) { /* send next packet until now >= nexttime */ //printf("now = %lf\n", now); //printf("nexttime = %lf\n", nexttime); if (time_expire(&timeout_tv, &now_tv)) { err = rtp_check_on_expire(); if (err) { err_handle(err); } err = get_rtcp_timeout(sid, &timeout_tv); if (err) { err_handle(err); } printf("timeval_to_double(timeout_tv) = %lf\n", timeval_to_double(timeout_tv)); } /* BECAREFUL, if we disable RTCP, the timeval we get will be 0 */ if (timeval_to_double(timeout_tv) == 0 || nexttime < timeval_to_double(timeout_tv)) { nexttime_tv = double_to_timeval(nexttime - now); } else { nexttime_tv = double_to_timeval(timeval_to_double(timeout_tv) - now); } if (select(nfds + 1, &rfds, (fd_set *)0, (fd_set *)0, &nexttime_tv) < 0) { if (errno == EINTR) continue; else { printf("nexttime_tv.tv_sec = %ld\n", nexttime_tv.tv_sec); printf("nexttime_tv.tv_usec = %ld\n", nexttime_tv.tv_usec); printf("select error: %d\n", errno); //exit(1); } } if (FD_ISSET(rtp_sockt, &rfds)) { err = on_receive(sid, rtp_sockt, recvbuf, &recbuflen); if (err) { err_handle(err); } } else if (FD_ISSET(rtcp_sockt, &rfds)) { err = on_receive(sid, rtcp_sockt, recvbuf, &recbuflen); if (err) { err_handle(err); } adapt_bw(get_recent_recv_loosrate(sid, &ssrc)); } gettimeofday(&now_tv, NULL); now = (now_tv.tv_sec + now_tv.tv_usec / 1000000.); } // while(now < nexttime) } // while (interval) err = rtp_close_connection(sid, reason); if (err) { err_handle(err); } err = rtp_delete(sid); if (err) { err_handle(err); } return 0; }
int main(int argc, char **argv){ /* create a rtp session, we will assign unique value to identify */ err = rtp_create(&sid); if (err) { err_handle(err); } sdp_parse(sid, argv); /* parse the sdp file */ /* The application will sleep "rtp_start_time" time if "rtp_start_time" > 0 when the application is start. * * NOTE! This is not the same with Start Time in NCTUns * EX: if the Start Time in NCTUn is 5, and rtp_start_time is 3, * then the real time to startup the applicaion is 8. */ if (rtp_start_time > 0) { usleep( ((int) rtp_start_time * 1000000) ); } initial_session(argc, argv, sid); /* set local receive addr, CNAME, and startup the connectoin */ if (!trans_mode) { /* throughput is static */ if (is_audio) /* media type is audio */ delay = (ms_pkt / 1000.); else delay = (1. / framerate); /* bytes of each packet = ((bits/sample) / 8 ) * (clock rate) * ( each delay of packet in sec ) */ packet_size = (int) ( (bits_per_sample / 8.) * sampling_rate * delay); if (RTP_MAX_PKT_SIZE < packet_size) { fprintf(stderr, "The packet size is bigger than RTP_MAX_PKT_SIZE\n"); exit(1); } } /* original_bw = min_bw = 50, so we use the same pkt size */ minbw_pktsize = packet_size; printf("bits_per_sample = %lf, (bits_per_sample/8.) = %lf\n", bits_per_sample, (bits_per_sample/8.)); printf("sampling_rate = %lf\n", sampling_rate); printf("delay = %lf\n", delay); printf("packet_size = %d\n", packet_size); /* the bandwidth wa are using, 30 = frames/sec */ cur_bw = get_cur_bw(packet_size); err = rtp_get_sour_rtpsocket(sid, &rtp_sockt); if (err) { err_handle(err); } err = rtp_get_sour_rtcpsocket(sid, &rtcp_sockt); if (err) { err_handle(err); } if (rtp_sockt > nfds || rtcp_sockt > nfds) { if (rtp_sockt > rtcp_sockt) nfds = rtp_sockt; else nfds = rtcp_sockt; } FD_ZERO(&afds); FD_ZERO(&rfds); FD_SET(rtp_sockt, &afds); FD_SET(rtcp_sockt, &afds); gettimeofday(&start_tv, NULL); starttime = (start_tv.tv_sec + start_tv.tv_usec / 1000000.); nexttime = starttime; rtp_interval = rtp_stop_time - rtp_start_time; printf("rtp_interval = %f\n", rtp_interval); fflush(stdout); while (rtp_interval >= 0) { memcpy(&rfds, &afds, sizeof(rfds)); if (RTP_MAX_PKT_SIZE < packet_size){ fprintf(stderr, "RTP_MAX_PKT_SIZE < reads\n"); continue; } addtimestamp = ((int) packet_size * (bits_per_sample / 8.) ); err = rtp_send(sid, marker, addtimestamp, codec_num, (int8 *)sendbuf, packet_size); if (err) { err_handle(err); } marker = 0; /* not the first packet of talkspurt */ rtp_interval -= delay; nexttime += delay; gettimeofday(&now_tv, NULL); now = (now_tv.tv_sec + now_tv.tv_usec / 1000000.); err = get_rtcp_timeout(sid, &timeout_tv); if (err) { err_handle(err); } while (now < nexttime) { /* send next packet until now >= nexttime */ //printf("now = %lf\n", now); //printf("nexttime = %lf\n", nexttime); if (time_expire(&timeout_tv, &now_tv)) { err = rtp_check_on_expire(); if (err) { err_handle(err); } err = get_rtcp_timeout(sid, &timeout_tv); if (err) { err_handle(err); } printf("timeval_to_double(timeout_tv) = %lf\n", timeval_to_double(timeout_tv)); } /* BECAREFUL, if we disable RTCP, the timeval we get will be 0 */ if (timeval_to_double(timeout_tv) == 0 || nexttime < timeval_to_double(timeout_tv)) { nexttime_tv = double_to_timeval(nexttime - now); } else { nexttime_tv = double_to_timeval(timeval_to_double(timeout_tv) - now); } if (select(nfds + 1, &rfds, (fd_set *)0, (fd_set *)0, &nexttime_tv) < 0) { if (errno == EINTR) continue; else { printf("nexttime_tv.tv_sec = %ld\n", nexttime_tv.tv_sec); printf("nexttime_tv.tv_usec = %ld\n", nexttime_tv.tv_usec); printf("select error: %d\n", errno); //exit(1); } } if (FD_ISSET(rtp_sockt, &rfds)) { err = on_receive(sid, rtp_sockt, recvbuf, &recbuflen); if (err) { err_handle(err); } } else if (FD_ISSET(rtcp_sockt, &rfds)) { err = on_receive(sid, rtcp_sockt, recvbuf, &recbuflen); if (err) { err_handle(err); } adapt_bw(get_recent_recv_loosrate(sid, &ssrc)); } gettimeofday(&now_tv, NULL); now = (now_tv.tv_sec + now_tv.tv_usec / 1000000.); } // while(now < nexttime) } // while (interval) err = rtp_close_connection(sid, reason); if (err) { err_handle(err); } err = rtp_delete(sid); if (err) { err_handle(err); } return 0; }