int main (int argc, char **argv) { rtsp_client_t *rtsp_client; int ret; rtsp_command_t cmd; rtsp_decode_t *decode; session_desc_t *sdp; media_desc_t *media; sdp_decode_info_t *sdpdecode; rtsp_session_t *session; int dummy; rtsp_set_error_func(local_error_msg); rtsp_set_loglevel(LOG_DEBUG); memset(&cmd, 0, sizeof(rtsp_command_t)); argv++; rtsp_client = rtsp_create_client(*argv, &ret, NULL, 0); if (rtsp_client == NULL) { printf("No client created - error %d\n", ret); return (1); } if (rtsp_send_describe(rtsp_client, &cmd, &decode) != RTSP_RESPONSE_GOOD) { printf("Describe response not good\n"); free_decode_response(decode); free_rtsp_client(rtsp_client); return(1); } sdpdecode = set_sdp_decode_from_memory(decode->body); if (sdpdecode == NULL) { printf("Couldn't get sdp decode\n"); free_decode_response(decode); free_rtsp_client(rtsp_client); return(1); } if (sdp_decode(sdpdecode, &sdp, &dummy) != 0) { printf("Couldn't decode sdp\n"); free_decode_response(decode); free_rtsp_client(rtsp_client); return (1); } free(sdpdecode); if (decode->content_base == NULL) { convert_relative_urls_to_absolute (sdp, *argv); } else { convert_relative_urls_to_absolute(sdp, decode->content_base); } free_decode_response(decode); decode = NULL; #if 1 cmd.transport = "RTP/AVP;unicast;client_port=4588-4589"; #else cmd.transport = "RTP/AVP/TCP;interleaved=0-1"; #endif media = sdp->media; dummy = rtsp_send_setup(rtsp_client, media->control_string, &cmd, &session, &decode, 0); if (dummy != RTSP_RESPONSE_GOOD) { printf("Response to setup is %d\n", dummy); sdp_free_session_desc(sdp); free_decode_response(decode); free_rtsp_client(rtsp_client); return (1); } free_decode_response(decode); cmd.range = "npt=0.0-30.0"; cmd.transport = NULL; if (sdp->control_string != NULL) dummy = rtsp_send_aggregate_play(rtsp_client, sdp->control_string, &cmd, &decode); else dummy = rtsp_send_play(session, &cmd, &decode); if (dummy != RTSP_RESPONSE_GOOD) { printf("response to play is %d\n", dummy); } else { sleep(10); } free_decode_response(decode); cmd.transport = NULL; if (sdp->control_string != NULL) dummy = rtsp_send_aggregate_teardown(rtsp_client, sdp->control_string, &cmd, &decode); else dummy = rtsp_send_teardown(session, NULL, &decode); printf("Teardown response %d\n", dummy); sdp_free_session_desc(sdp); free_decode_response(decode); free_rtsp_client(rtsp_client); return (0); }
/* * play_all_media - get all media to play */ int CPlayerSession::play_all_media (int start_from_begin, double start_time, char *errmsg, uint32_t errlen) { int ret; CPlayerMedia *p; if (m_set_end_time == 0) { range_desc_t *range; if (m_sdp_info && m_sdp_info->session_range.have_range != FALSE) { range = &m_sdp_info->session_range; } else { range = NULL; p = m_my_media; while (range == NULL && p != NULL) { media_desc_t *media; media = p->get_sdp_media_desc(); if (media && media->media_range.have_range) { range = &media->media_range; } p = p->get_next(); } } if (range != NULL) { m_end_time = (uint64_t)(range->range_end * 1000.0); m_set_end_time = 1; } } p = m_my_media; m_session_state = SESSION_BUFFERING; if (m_paused == 1 && start_time == 0.0 && start_from_begin == FALSE) { /* * we were paused. Continue. */ m_play_start_time = m_current_time; start_time = UINT64_TO_DOUBLE(m_current_time); start_time /= 1000.0; player_debug_message("Restarting at " U64 ", %g", m_current_time, start_time); } else { /* * We might have been paused, but we're told to seek */ // Indicate what time we're starting at for sync task. m_play_start_time = (uint64_t)(start_time * 1000.0); } m_paused = 0; send_sync_thread_a_message(MSG_START_SESSION); // If we're doing aggregate rtsp, send the play command... if (session_control_is_aggregate() && m_dont_send_first_rtsp_play == 0) { char buffer[80]; rtsp_command_t cmd; rtsp_decode_t *decode; memset(&cmd, 0, sizeof(rtsp_command_t)); if (m_set_end_time != 0) { uint64_t stime = (uint64_t)(start_time * 1000.0); sprintf(buffer, "npt="U64"."U64"-"U64"."U64, stime / 1000, stime % 1000, m_end_time / 1000, m_end_time % 1000); cmd.range = buffer; } if (rtsp_send_aggregate_play(m_rtsp_client, m_session_control_url, &cmd, &decode) != 0) { if (errmsg != NULL) { snprintf(errmsg, errlen, "RTSP Aggregate Play Error %s-%s", decode->retcode, decode->retresp != NULL ? decode->retresp : ""); } player_debug_message("RTSP aggregate play command failed"); free_decode_response(decode); return (-1); } if (decode->rtp_info == NULL) { player_error_message("No rtp info field"); } else { player_debug_message("rtp info is \'%s\'", decode->rtp_info); } int ret = process_rtsp_rtpinfo(decode->rtp_info, this, NULL); free_decode_response(decode); if (ret < 0) { if (errmsg != NULL) { snprintf(errmsg, errlen, "RTSP aggregate RtpInfo response failure"); } player_debug_message("rtsp aggregate rtpinfo failed"); return (-1); } } m_dont_send_first_rtsp_play = 0; while (p != NULL) { ret = p->do_play(start_time, errmsg, errlen); if (ret != 0) return (ret); p = p->get_next(); } return (0); }