/* * rtp_peridic - called from receive task; generates RTCP when needed; also * checks for end of stream - if so, it kicks the decoder task, to finish off */ void CPlayerMedia::rtp_periodic (void) { if (m_rtp_session_from_outside == false) { rtp_send_ctrl(m_rtp_session, m_rtp_byte_stream != NULL ? m_rtp_byte_stream->get_last_rtp_timestamp() : 0, NULL); rtp_update(m_rtp_session); } if (m_rtp_byte_stream != NULL) { m_rtp_byte_stream->rtp_periodic(); if (m_rtp_byte_stream->eof()) { bytestream_primed(); } } }
int main (int argc, char *argv[]) { struct rtp *session; int rx_port, tx_port, fd; uint32_t read_size, packet_size, number_of_packet; uint8_t buff[BUFFSIZE]; off_t cur_pos; char *ip_addr; char filename[1024]; int c; struct hostent *h; struct utsname myname; #ifdef HAVE_SRTP #else void *srtp_data; #endif unsigned int extra_len; int do_auth = 1, do_encrypt = 1; ssize_t readit; ssize_t sendit; int do_rtcp = false; // Setting of default session if(uname(&myname) < 0){ fprintf(stderr,"uname\n"); exit(1); } if((h = gethostbyname(myname.nodename)) == NULL) { herror("gethostbyname"); exit(1); } ip_addr = strdup(inet_ntoa(*((struct in_addr *)h->h_addr))); rx_port = 15002; tx_port = 15000; // Option opterr = 0; while((c = getopt(argc, argv, "acdehi:r:t:f:")) != -1){ switch (c) { case 'a': do_auth = 0; break; case 'c': do_rtcp = 1; break; case 'd': dump_pak = true; break; case 'e': do_encrypt = 0; break; case 'h': printf("Usage: ./test_rtp_client -i <IP_Addr> -r <rx_port> -t <tx_port> -f <filename>\n"); printf("Default values are as follows...\n"); printf("ip_addr = %s\n", ip_addr); printf("rx_port = %d\n", rx_port); printf("tx_port = %d\n", tx_port); printf("Filename = %s\n", filename); exit(-1); case 'i': strcpy(ip_addr, optarg); break; case 'r': rx_port = atoi(optarg); break; case 't': tx_port = atoi(optarg); break; case 'f': strcpy(filename,optarg); break; case '?': printf("usage: ./test_rtp_client -i <IP_Addr> -r <rx_port> -t <tx_port> -f <filename>\n"); exit(1); } } if (optind < argc) { for(; optind < argc; optind++) { printf("error->%s(#%d): put -[i|r|t|f] \n", argv[optind],optind-1); } exit(1); } // display session information printf("\n-Session Information-\n"); printf(" ip_addr = %s\n", ip_addr); printf(" rx_port = %d\n", rx_port); printf(" tx_port = %d\n", tx_port); printf(" filename = %s\n", filename); printf("Press Return key..."); // getchar(); // Open Original File to compare with received file if((fd = open(filename, O_RDONLY)) == -1){ perror(filename); exit(1); } rtp_stream_params_t rsp; rtp_default_params(&rsp); rsp.rtp_addr = ip_addr; rsp.rtp_rx_port = rx_port; rsp.rtp_tx_port = tx_port; rsp.rtp_ttl = TTL; rsp.rtcp_bandwidth = RTCP_BW; rsp.rtp_callback = c_rtp_callback; rsp.transmit_initial_rtcp = 1; if ( (session = rtp_init_stream(&rsp) ) == NULL){ exit(-1); } rtp_set_my_ssrc(session,OUR_SSRC); #ifdef HAVE_SRTP /////////// start will //set NULL security services //uint32_t ssrc = 0xdeadbeef; /* ssrc value hardcoded for now */ srtp_policy_t policy; char key[64]; char keystr[128]; uint ix; #if 1 strcpy(keystr, "c1eec3717da76195bb878578790af71c4ee9f859e197a414a78d5abc7451"); hex_string_to_octet_string(key, keystr, 60); #else memset(key, 0, sizeof(key)); #endif for (ix = 0; ix < 30; ix++) { printf("%02x ", key[ix]); } printf("\n"); #if 0 // NULL cipher policy.key = (uint8_t *) key; policy.ssrc.type = ssrc_any_outbound; //ssrc_specific; policy.ssrc.value = 0x96;//OUR_SSRC; policy.rtp.cipher_type = NULL_CIPHER; policy.rtp.cipher_key_len = 0; policy.rtp.auth_type = NULL_AUTH; policy.rtp.auth_key_len = 0; policy.rtp.auth_tag_len = 0; policy.rtp.sec_serv = sec_serv_none; policy.rtcp.cipher_type = NULL_CIPHER; policy.rtcp.cipher_key_len = 0; policy.rtcp.auth_type = NULL_AUTH; policy.rtcp.auth_key_len = 0; policy.rtcp.auth_tag_len = 0; policy.rtcp.sec_serv = sec_serv_none; policy.next = NULL; #else //confidentiality only, no auth crypto_policy_set_aes_cm_128_null_auth(&policy.rtp); crypto_policy_set_rtcp_default(&policy.rtcp); policy.ssrc.type = ssrc_any_outbound; policy.key = (uint8_t *) key; policy.next = NULL; policy.rtp.sec_serv = sec_serv_conf;//sec_servs; policy.rtcp.sec_serv = sec_serv_none; /* we don't do RTCP anyway */ #endif err_status_t status; printf("ABOUT TO SRTP_INIT\n"); status = srtp_init(); if (status) { printf("error: srtp initialization failed with error code %d\n", status); exit(1); } printf("ABOUT TO SRTP_CREAT\n"); srtp_ctx_t *srtp_ctx = NULL; status = srtp_create(&srtp_ctx, &policy); if (status) { printf("error: srtp_create() failed with code %d\n", status); exit(1); } printf("DONE WITH SRTP_CREATE\n"); extra_len = 0; #else extra_len = 0; srtp_data = NULL; #endif rtp_encryption_params_t params; params.rtp_encrypt = ENCRYPT_FUNCTION; params.rtcp_encrypt = RTCP_ENCRYPT_FUNCTION; params.rtp_decrypt = DECRYPT_FUNCTION; params.rtcp_decrypt = RTCP_DECRYPT_FUNCTION; params.userdata = srtp_data; params.rtp_auth_alloc_extra = params.rtcp_auth_alloc_extra = 0; rtp_set_encryption_params(session, ¶ms); if (do_rtcp) { rtcp_file = fopen("server.rtcp", FOPEN_WRITE_BINARY); } cur_pos = 0; packet_size = 64; number_of_packet = 0; while(1) { // change BUFFSIZE to be an incrementing value from 64 to 1450 if(packet_size > 1450) packet_size = 725; readit = read(fd, buff, packet_size); if (readit < 0) { perror("file read"); exit(1); } read_size = readit; //int buflen = readit; if (read_size == 0) break; //printf("about to protect\n"); #if 0 sendit = rtp_send_data(session, cur_pos, 97,//pt 0,//m 0,//cc NULL, //csrc[], buff,//data read_size,//data_len NULL,//*extn 0, 0); #else { struct iovec iov[2]; iov[0].iov_len = read_size % 48; if (iov[0].iov_len == 0) iov[0].iov_len = 1; iov[0].iov_base = buff; iov[1].iov_len = read_size - iov[0].iov_len; iov[1].iov_base = buff + iov[0].iov_len; sendit = rtp_send_data_iov(session, cur_pos, 97, 0, 0, NULL, iov, read_size > iov[0].iov_len ? 2 : 1, NULL, 0, 0, 0); } #endif if (sendit < 0) { printf("rtp_send_data error\n"); exit(1); } if (do_rtcp) rtp_send_ctrl(session, cur_pos, NULL); printf("set timestamp = "U64", size %u\n", cur_pos, read_size); cur_pos += read_size; packet_size++; number_of_packet++; //rtp_periodic(); //rtp_send_ctrl(session,cur_pos,NULL); rtp_update(session); // Some sort of sleep here... usleep(2 * 1000); } printf("I've sent %d RTP packets!\n\n", number_of_packet); close(fd); if (rtcp_file != NULL) fclose(rtcp_file); rtp_done(session); return 0; }
void * os_sound_start_thread (void *_ca) { int i; call_t *ca = (call_t *) _ca; struct timeval timeout; uint32_t rtp_ts, round; uint8_t mulaw_buffer[MULAW_BYTES * 16]; int mulaw_buffer_pos; #ifdef USE_PCM char data_out[MULAW_BYTES * 2 * 16]; #endif fprintf (stderr, "Sending and listening to "); fprintf (stderr, "%s port %d (local SSRC = 0x%08x)\n", rtp_get_addr (ca->rtp_session), rtp_get_rx_port (ca->rtp_session), rtp_my_ssrc (ca->rtp_session)); round = 0; mulaw_buffer_pos = 0; while (ca->enable_audio != -1) { struct timeval t_beg; struct timeval t_end; struct timeval interval; gettimeofday (&t_beg, NULL); round++; /* original line rtp_ts = round * MULAW_MS; */ rtp_ts = round * MULAW_BYTES; if (ca->local_sendrecv != _RECVONLY) { if (mulaw_buffer_pos < MULAW_BYTES * 4) { /* Send control packets */ rtp_send_ctrl (ca->rtp_session, rtp_ts, NULL); /* Send data packets */ #ifdef USE_PCM i = read (ca->fd, data_out, MULAW_BYTES * 4); if (ca->local_sendrecv == _SENDRECV || ca->local_sendrecv == _RECVONLY) { } else { if (i < MULAW_BYTES * 4) { memset (data_out, 0, MULAW_BYTES * 4); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO2, NULL, "restarting: %i\n", i)); close (ca->fd); /* send a wav file! */ ca->fd = open (ca->wav_file, O_RDONLY); if (ca->fd < 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO2, NULL, "Could not open wav file: %s\n", ca->wav_file)); ca->fd = -1; break; } i = read (ca->fd, data_out, MULAW_BYTES * 4); } } if (ca->payload == 8) /* A-Law */ alaw_enc (data_out, mulaw_buffer + mulaw_buffer_pos, i); if (ca->payload == 0) /* Mu-Law */ mulaw_enc (data_out, mulaw_buffer + mulaw_buffer_pos, i); i = i / 2; mulaw_buffer_pos = mulaw_buffer_pos + i; #else memset (mulaw_buffer + mulaw_buffer_pos, 0, MULAW_BYTES * 2); i = read (ca->fd, mulaw_buffer + mulaw_buffer_pos, MULAW_BYTES * 2); /* ?? */ mulaw_buffer_pos = mulaw_buffer_pos + i; #endif } i = 0; if (mulaw_buffer_pos >= MULAW_BYTES) { i = rtp_send_data (ca->rtp_session, rtp_ts, ca->payload, 0, 0, 0, (char *) mulaw_buffer, MULAW_BYTES, 0, 0, 0); memmove (mulaw_buffer, mulaw_buffer + MULAW_BYTES, MULAW_BYTES * 15); mulaw_buffer_pos = mulaw_buffer_pos - MULAW_BYTES; } } else { /* Send control packets */ rtp_send_ctrl (ca->rtp_session, rtp_ts, NULL); } /* Receive control and data packets */ timeout.tv_sec = 0; timeout.tv_usec = 0; i = rtp_recv (ca->rtp_session, &timeout, rtp_ts); /* State maintenance */ rtp_update (ca->rtp_session); gettimeofday (&t_end, NULL); /* make a diff between t_beg and t_end */ interval.tv_sec = t_end.tv_sec - t_beg.tv_sec; interval.tv_usec = t_end.tv_usec - t_beg.tv_usec; if (interval.tv_usec < 0) { interval.tv_usec += 1000000L; --interval.tv_sec; } interval.tv_usec = (MULAW_MS * 1000 - interval.tv_usec); if (interval.tv_usec < 0) { interval.tv_usec += 1000000L; --interval.tv_sec; } if (interval.tv_sec < 0) { interval.tv_sec = 0; interval.tv_usec = 0; } select (0, NULL, NULL, NULL, &interval); } return NULL; }