void RP_SDPFromFile(RTPClient *rtp, char *file_name, RTPStream *stream) { FILE *_sdp; char *sdp_buf; u32 sdp_size; sdp_buf = NULL; if (file_name && strstr(file_name, "file://")) file_name += strlen("file://"); if (!file_name || !(_sdp = gf_fopen(file_name, "rt")) ) { gf_service_connect_ack(rtp->service, NULL, GF_URL_ERROR); return; } gf_fseek(_sdp, 0, SEEK_END); sdp_size = (u32) gf_ftell(_sdp); gf_fseek(_sdp, 0, SEEK_SET); sdp_buf = (char*)gf_malloc(sdp_size); if (1 > fread(sdp_buf, 1, sdp_size, _sdp)) { gf_service_connect_ack(rtp->service, NULL, GF_URL_ERROR); } else { RP_LoadSDP(rtp, sdp_buf, sdp_size, stream); } gf_fclose(_sdp); gf_free(sdp_buf); }
/*process describe reply*/ void RP_ProcessDescribe(RTPSession *sess, RTSPCommand *com, M4Err e) { RTPStream *ch; ChannelDescribe *ch_desc; ch = NULL; ch_desc = com->user_data; if (e) goto exit; switch (sess->rtsp_rsp->ResponseCode) { //TODO handle all 3xx codes (redirections) case NC_RTSP_Multiple_Choice: e = ch_desc ? M4ChannelNotFound : M4URLNotFound; goto exit; case NC_RTSP_Not_Found: e = M4URLNotFound; goto exit; case NC_RTSP_OK: break; default: //we should have a basic error code mapping here e = M4ServiceError; goto exit; } ch = NULL; if (ch_desc) { ch = RP_FindChannel(sess->owner, ch_desc->channel, ch_desc->ES_ID, ch_desc->esd_url, 0); } else { NM_OnMessage(sess->owner->service, M4OK, "Connected"); } /*error on loading SDP is done internally*/ RP_LoadSDP(sess->owner, sess->rtsp_rsp->body, sess->rtsp_rsp->Content_Length, ch); if (!ch_desc) goto exit; if (!ch) { e = M4ChannelNotFound; goto exit; } e = RP_SetupChannel(ch, ch_desc); exit: if (e) { if (!ch_desc) { NM_OnConnect(sess->owner->service, NULL, e); } else if (ch) { RP_ConfirmChannelConnect(ch, e); } else { NM_OnConnect(sess->owner->service, ch_desc->channel, e); } } if (ch_desc) free(ch_desc); com->user_data = NULL; }
void RP_SDPFromData(RTPClient *rtp, char *s_url, RTPStream *stream) { char *url; char buf[2000]; u32 size; url = strstr(s_url, ","); if (!url) { gf_service_connect_ack(rtp->service, NULL, GF_URL_ERROR); return; } url += 1; if (strstr(url, ";base64")) { //decode size = gf_base64_decode(url, (u32) strlen(url), buf, 2000); buf[size] = 0; url = buf; } RP_LoadSDP(rtp, url, (u32) strlen(url), stream); }
void RP_SDPFromData(RTPClient *rtp, char *s_url, RTPStream *stream) { char *url; char buf[2000]; u32 size; url = strstr(s_url, ","); if (!url) { NM_OnConnect(rtp->service, NULL, M4InvalidURL); return; } url += 1; if (strstr(url, ";base64")) { //decode size = Base64_dec(url, strlen(url), buf, 2000); buf[size] = 0; url = buf; } RP_LoadSDP(rtp, url, strlen(url), stream); }
void RP_SDPFromFile(RTPClient *rtp, char *file_name, RTPStream *stream) { FILE *_sdp; char *sdp_buf; u32 sdp_size; sdp_buf = NULL; if (file_name && strstr(file_name, "file://")) file_name += strlen("file://"); if (!file_name || !(_sdp = fopen(file_name, "rt")) ) { NM_OnConnect(rtp->service, NULL, M4InvalidURL); return; } fseek(_sdp, 0, SEEK_END); sdp_size = ftell(_sdp); fseek(_sdp, 0, SEEK_SET); sdp_buf = malloc(sdp_size); fread(sdp_buf, sdp_size, 1, _sdp); RP_LoadSDP(rtp, sdp_buf, sdp_size, stream); fclose(_sdp); free(sdp_buf); }