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); }
CPlayerSession::~CPlayerSession () { int hadthread = 0; #ifndef NEED_SDL_VIDEO_IN_MAIN_THREAD if (m_sync_thread) { send_sync_thread_a_message(MSG_STOP_THREAD); SDL_WaitThread(m_sync_thread, NULL); m_sync_thread = NULL; hadthread = 1; } #else send_sync_thread_a_message(MSG_STOP_THREAD); hadthread = 1; #endif if (m_streaming_media_set_up != 0 && session_control_is_aggregate()) { rtsp_command_t cmd; rtsp_decode_t *decode; memset(&cmd, 0, sizeof(rtsp_command_t)); rtsp_send_aggregate_teardown(m_rtsp_client, m_session_control_url, &cmd, &decode); free_decode_response(decode); } if (m_rtsp_client) { free_rtsp_client(m_rtsp_client); m_rtsp_client = NULL; } while (m_my_media != NULL) { CPlayerMedia *p; p = m_my_media; m_my_media = p->get_next(); delete p; } if (m_sdp_info) { sdp_free_session_desc(m_sdp_info); m_sdp_info = NULL; } if (m_sync_sem) { SDL_DestroySemaphore(m_sync_sem); m_sync_sem = NULL; } int quit_sdl = 1; if (m_video_sync != NULL) { // we need to know if we should quit SDL or not. If the control // code has grabbed the persistence, we don't want to quit if (m_video_sync->grabbed_video_persistence() != 0) { quit_sdl = 0; } delete m_video_sync; m_video_sync = NULL; } if (m_audio_sync != NULL) { delete m_audio_sync; m_audio_sync = NULL; } if (m_session_name) { free((void *)m_session_name); m_session_name = NULL; } if (m_content_base) { free((void *) m_content_base); m_content_base = NULL; } for (int ix = 0; ix < SESSION_DESC_COUNT; ix++) { if (m_session_desc[ix] != NULL) free((void *)m_session_desc[ix]); m_session_desc[ix] = NULL; } if (m_media_close_callback != NULL) { m_media_close_callback(m_media_close_callback_data); } while (m_unused_ports != NULL) { CIpPort *first; first = m_unused_ports; m_unused_ports = first->get_next(); delete first; } if (hadthread != 0 && quit_sdl != 0) { SDL_Quit(); } }