static void init_video_streams(video_stream_tester_t *vst1, video_stream_tester_t *vst2, bool_t avpf, bool_t one_way, OrtpNetworkSimulatorParams *params, int payload_type) { PayloadType *pt; create_video_stream(vst1, payload_type); create_video_stream(vst2, payload_type); /* Enable/disable avpf. */ pt = rtp_profile_get_payload(&rtp_profile, payload_type); CU_ASSERT_PTR_NOT_NULL_FATAL(pt); if (avpf == TRUE) { payload_type_set_flag(pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED); } else { payload_type_unset_flag(pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED); } /* Configure network simulator. */ if ((params != NULL) && (params->enabled == TRUE)) { rtp_session_enable_network_simulation(vst1->vs->ms.sessions.rtp_session, params); rtp_session_enable_network_simulation(vst2->vs->ms.sessions.rtp_session, params); } if (one_way == TRUE) { video_stream_set_direction(vst1->vs, VideoStreamRecvOnly); } CU_ASSERT_EQUAL(video_stream_start(vst1->vs, &rtp_profile, vst2->local_ip, vst2->local_rtp, vst2->local_ip, vst2->local_rtcp, payload_type, 50, vst1->cam), 0); CU_ASSERT_EQUAL(video_stream_start(vst2->vs, &rtp_profile, vst1->local_ip, vst1->local_rtp, vst1->local_ip, vst1->local_rtcp, payload_type, 50, vst2->cam), 0); }
static void init_text_streams(text_stream_tester_t *tst1, text_stream_tester_t *tst2, bool_t avpf, bool_t one_way, OrtpNetworkSimulatorParams *params, int payload_type) { create_text_stream(tst1, payload_type); create_text_stream(tst2, payload_type); /* Configure network simulator. */ if ((params != NULL) && (params->enabled == TRUE)) { rtp_session_enable_network_simulation(tst1->ts->ms.sessions.rtp_session, params); rtp_session_enable_network_simulation(tst2->ts->ms.sessions.rtp_session, params); } text_stream_start(tst1->ts, &rtp_profile, tst2->local_ip, tst2->local_rtp, tst2->local_ip, tst2->local_rtcp, payload_type); text_stream_start(tst2->ts, &rtp_profile, tst1->local_ip, tst1->local_rtp, tst1->local_ip, tst1->local_rtcp, payload_type); }
static float adaptive_audio_stream(int codec_payload, int initial_bitrate,int target_bw, int max_recv_rtcp_packet) { stream_manager_t * marielle = stream_manager_new(); stream_manager_t * margaux = stream_manager_new(); int pause_time=0; OrtpNetworkSimulatorParams params={0}; params.enabled=TRUE; params.loss_rate=0; params.max_bandwidth=target_bw; params.max_buffer_size=initial_bitrate; float bw_usage_ratio; float marielle_send_bw; media_stream_enable_adaptive_bitrate_control(&marielle->stream->ms,TRUE); stream_manager_start(marielle,codec_payload, margaux->local_rtp,initial_bitrate,HELLO_16K_1S_FILE,NULL); ms_filter_call_method(marielle->stream->soundread,MS_FILE_PLAYER_LOOP,&pause_time); stream_manager_start(margaux,codec_payload, marielle->local_rtp,-1,NULL,RECORDED_16K_1S_FILE); rtp_session_enable_network_simulation(margaux->stream->ms.sessions.rtp_session,¶ms); wait_for_until(&marielle->stream->ms,&margaux->stream->ms,&marielle->stats.number_of_EndOfFile,10,2500*max_recv_rtcp_packet); marielle_send_bw=media_stream_get_up_bw(&marielle->stream->ms); bw_usage_ratio=marielle_send_bw/params.max_bandwidth; ms_message("marielle sent bw=[%f], target was [%f] bw_usage_ratio [%f]",marielle_send_bw,params.max_bandwidth,bw_usage_ratio); stream_manager_delete(marielle); stream_manager_delete(margaux); unlink(RECORDED_16K_1S_FILE); return bw_usage_ratio; }
static void video_stream_first_iframe_lost_vp8(void) { video_stream_tester_t* marielle=video_stream_tester_new(); video_stream_tester_t* margaux=video_stream_tester_new(); OrtpNetworkSimulatorParams params = { 0 }; bool_t supported = ms_filter_codec_supported("vp8"); if (supported) { int dummy=0; /* Make sure first Iframe is lost. */ params.enabled = TRUE; params.loss_rate = 100.; init_video_streams(marielle, margaux, FALSE, FALSE, ¶ms, VP8_PAYLOAD_TYPE); wait_for_until(&marielle->vs->ms, &margaux->vs->ms,&dummy,1,1000); /* Use 10% packet lost to be sure to have decoding errors. */ params.enabled=TRUE; params.loss_rate = 10.; rtp_session_enable_network_simulation(marielle->vs->ms.sessions.rtp_session, ¶ms); rtp_session_enable_network_simulation(margaux->vs->ms.sessions.rtp_session, ¶ms); wait_for_until(&marielle->vs->ms, &margaux->vs->ms,&dummy,1,2000); CU_ASSERT_TRUE(wait_for_until_with_parse_events(&marielle->vs->ms, &margaux->vs->ms, &marielle->stats.number_of_decoder_decoding_error, 1, 1000, event_queue_cb, &marielle->stats, event_queue_cb, &margaux->stats)); CU_ASSERT_TRUE(wait_for_until_with_parse_events(&marielle->vs->ms, &margaux->vs->ms, &margaux->stats.number_of_decoder_decoding_error, 1, 1000, event_queue_cb, &marielle->stats, event_queue_cb, &margaux->stats)); /* Remove the lost to be sure the forced iframe is going through. */ params.enabled=TRUE; params.loss_rate = 0.; rtp_session_enable_network_simulation(marielle->vs->ms.sessions.rtp_session, ¶ms); rtp_session_enable_network_simulation(margaux->vs->ms.sessions.rtp_session, ¶ms); wait_for_until(&marielle->vs->ms, &margaux->vs->ms,&dummy,1,2000); video_stream_send_vfu(marielle->vs); video_stream_send_vfu(margaux->vs); CU_ASSERT_TRUE(wait_for_until_with_parse_events(&marielle->vs->ms, &margaux->vs->ms, &marielle->stats.number_of_decoder_first_image_decoded, 1, 5000, event_queue_cb, &marielle->stats, event_queue_cb, &margaux->stats)); CU_ASSERT_TRUE(wait_for_until_with_parse_events(&marielle->vs->ms, &margaux->vs->ms, &margaux->stats.number_of_decoder_first_image_decoded, 1, 5000, event_queue_cb, &marielle->stats, event_queue_cb, &margaux->stats)); uninit_video_streams(marielle, margaux); } else { ms_error("VP8 codec is not supported!"); } video_stream_tester_destroy(marielle); video_stream_tester_destroy(margaux); }
static void start_adaptive_stream(StreamType type, stream_manager_t ** pmarielle, stream_manager_t ** pmargaux, int payload, int initial_bitrate, int target_bw, float loss_rate, int latency, float dup_ratio) { OrtpNetworkSimulatorParams params={0}; params.enabled=TRUE; params.loss_rate=loss_rate; params.max_bandwidth=target_bw; params.latency=latency; int pause_time=0; MediaStream *marielle_ms,*margaux_ms; #if VIDEO_ENABLED MSWebCam * marielle_webcam=ms_web_cam_manager_get_default_cam (ms_web_cam_manager_get()); #endif stream_manager_t *marielle=*pmarielle=stream_manager_new(type); stream_manager_t *margaux=*pmargaux=stream_manager_new(type); if (type == AudioStreamType){ marielle_ms=&marielle->audio_stream->ms; margaux_ms=&margaux->audio_stream->ms; }else{ marielle_ms=&marielle->video_stream->ms; margaux_ms=&margaux->video_stream->ms; } /* Disable avpf. */ PayloadType* pt = rtp_profile_get_payload(&rtp_profile, VP8_PAYLOAD_TYPE); CU_ASSERT_PTR_NOT_NULL_FATAL(pt); payload_type_unset_flag(pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED); media_stream_enable_adaptive_bitrate_control(marielle_ms,TRUE); rtp_session_set_duplication_ratio(marielle_ms->sessions.rtp_session, dup_ratio); if (marielle->type == AudioStreamType){ audio_manager_start(marielle,payload,margaux->local_rtp,initial_bitrate,HELLO_16K_1S_FILE,NULL); ms_filter_call_method(marielle->audio_stream->soundread,MS_FILE_PLAYER_LOOP,&pause_time); audio_manager_start(margaux,payload,marielle->local_rtp,0,NULL,RECORDED_16K_1S_FILE); }else{ #if VIDEO_ENABLED video_manager_start(marielle,payload,margaux->local_rtp,0,marielle_webcam); video_stream_set_direction(margaux->video_stream,VideoStreamRecvOnly); video_manager_start(margaux,payload,marielle->local_rtp,0,NULL); #else ms_fatal("Unsupported stream type [%s]",ms_stream_type_to_string(marielle->type)); #endif } rtp_session_enable_network_simulation(margaux_ms->sessions.rtp_session,¶ms); }
static void audio_stream_dtmf(int codec_payload, int initial_bitrate,int target_bw, int max_recv_rtcp_packet) { stream_manager_t * marielle = stream_manager_new(); stream_manager_t * margaux = stream_manager_new(); int pause_time=0; OrtpNetworkSimulatorParams params={0}; params.enabled=TRUE; params.loss_rate=0; params.max_bandwidth=target_bw; params.max_buffer_size=initial_bitrate; float recv_send_bw_ratio; int rtcp_interval = 1000; float marielle_send_bw; media_stream_enable_adaptive_bitrate_control(&marielle->stream->ms,TRUE); stream_manager_start(marielle,codec_payload, margaux->local_rtp,initial_bitrate,HELLO_16K_1S_FILE,NULL); ms_filter_call_method(marielle->stream->soundread,MS_FILE_PLAYER_LOOP,&pause_time); unlink("blibi.wav"); stream_manager_start(margaux,codec_payload, marielle->local_rtp,-1,NULL,"blibi.wav"); rtp_session_enable_network_simulation(margaux->stream->ms.session,¶ms); rtp_session_set_rtcp_report_interval(margaux->stream->ms.session, rtcp_interval); wait_for_until(&marielle->stream->ms,&margaux->stream->ms,&marielle->stats.number_of_EndOfFile,10,rtcp_interval*max_recv_rtcp_packet); marielle_send_bw=media_stream_get_up_bw(&marielle->stream->ms); recv_send_bw_ratio=params.max_bandwidth/marielle_send_bw; ms_message("marielle sent bw= [%f] , target was [%f] recv/send [%f]",marielle_send_bw,params.max_bandwidth,recv_send_bw_ratio); CU_ASSERT_TRUE(recv_send_bw_ratio>0.9); stream_manager_delete(marielle); stream_manager_delete(margaux); }
void start_adaptive_stream(MSFormatType type, stream_manager_t ** pmarielle, stream_manager_t ** pmargaux, int payload, int initial_bitrate, int max_bw, float loss_rate, int latency, float dup_ratio) { int pause_time=0; PayloadType* pt; MediaStream *marielle_ms,*margaux_ms; OrtpNetworkSimulatorParams params={0}; #if VIDEO_ENABLED MSWebCam * marielle_webcam=ms_web_cam_manager_get_default_cam (ms_web_cam_manager_get()); #endif stream_manager_t *marielle=*pmarielle=stream_manager_new(type); stream_manager_t *margaux=*pmargaux=stream_manager_new(type); char* file = ms_strdup_printf("%s/%s", mediastreamer2_tester_get_file_root(), HELLO_16K_1S_FILE); char* recorded_file = ms_strdup_printf("%s/%s", mediastreamer2_tester_get_writable_dir(), RECORDED_16K_1S_FILE); marielle->user_data = recorded_file; params.enabled=TRUE; params.loss_rate=loss_rate; params.max_bandwidth=max_bw; params.latency=latency; if (type == MSAudio){ marielle_ms=&marielle->audio_stream->ms; margaux_ms=&margaux->audio_stream->ms; }else{ marielle_ms=&marielle->video_stream->ms; margaux_ms=&margaux->video_stream->ms; } /* Disable avpf. */ pt = rtp_profile_get_payload(&rtp_profile, VP8_PAYLOAD_TYPE); CU_ASSERT_PTR_NOT_NULL_FATAL(pt); payload_type_unset_flag(pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED); media_stream_enable_adaptive_bitrate_control(marielle_ms,TRUE); media_stream_set_adaptive_bitrate_algorithm(marielle_ms, MSQosAnalyzerAlgorithmStateful); rtp_session_set_duplication_ratio(marielle_ms->sessions.rtp_session, dup_ratio); if (marielle->type == MSAudio){ audio_manager_start(marielle,payload,margaux->local_rtp,initial_bitrate,file,NULL); ms_filter_call_method(marielle->audio_stream->soundread,MS_FILE_PLAYER_LOOP,&pause_time); audio_manager_start(margaux,payload,marielle->local_rtp,0,NULL,recorded_file); }else{ #if VIDEO_ENABLED video_manager_start(marielle,payload,margaux->local_rtp,0,marielle_webcam); video_stream_set_direction(margaux->video_stream,VideoStreamRecvOnly); video_manager_start(margaux,payload,marielle->local_rtp,0,NULL); #else ms_fatal("Unsupported stream type [%s]",ms_format_type_to_string(marielle->type)); #endif } ms_qos_analyzer_set_on_action_suggested(ms_bitrate_controller_get_qos_analyzer(marielle_ms->rc), qos_analyzer_on_action_suggested, *pmarielle); rtp_session_enable_network_simulation(margaux_ms->sessions.rtp_session,¶ms); ms_free(recorded_file); ms_free(file); }