|
|
|
@@ -868,6 +868,30 @@ static void rtsp_close_streams(RTSPState *rt) |
|
|
|
av_free(rt->rtsp_streams); |
|
|
|
} |
|
|
|
|
|
|
|
static int |
|
|
|
rtsp_open_transport_ctx(AVFormatContext *s, RTSPStream *rtsp_st) |
|
|
|
{ |
|
|
|
AVStream *st = NULL; |
|
|
|
|
|
|
|
/* open the RTP context */ |
|
|
|
if (rtsp_st->stream_index >= 0) |
|
|
|
st = s->streams[rtsp_st->stream_index]; |
|
|
|
if (!st) |
|
|
|
s->ctx_flags |= AVFMTCTX_NOHEADER; |
|
|
|
rtsp_st->rtp_ctx = rtp_parse_open(s, st, rtsp_st->rtp_handle, rtsp_st->sdp_payload_type, &rtsp_st->rtp_payload_data); |
|
|
|
|
|
|
|
if (!rtsp_st->rtp_ctx) { |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
} else { |
|
|
|
if(rtsp_st->dynamic_handler) { |
|
|
|
rtsp_st->rtp_ctx->dynamic_protocol_context= rtsp_st->dynamic_protocol_context; |
|
|
|
rtsp_st->rtp_ctx->parse_packet= rtsp_st->dynamic_handler->parse_packet; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @returns 0 on success, <0 on error, 1 if protocol is unavailable. |
|
|
|
*/ |
|
|
|
@@ -878,7 +902,6 @@ make_setup_request (AVFormatContext *s, const char *host, int port, |
|
|
|
RTSPState *rt = s->priv_data; |
|
|
|
int j, i, err; |
|
|
|
RTSPStream *rtsp_st; |
|
|
|
AVStream *st; |
|
|
|
RTSPHeader reply1, *reply = &reply1; |
|
|
|
char cmd[2048]; |
|
|
|
const char *trans_pref; |
|
|
|
@@ -1016,23 +1039,9 @@ make_setup_request (AVFormatContext *s, const char *host, int port, |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
/* open the RTP context */ |
|
|
|
st = NULL; |
|
|
|
if (rtsp_st->stream_index >= 0) |
|
|
|
st = s->streams[rtsp_st->stream_index]; |
|
|
|
if (!st) |
|
|
|
s->ctx_flags |= AVFMTCTX_NOHEADER; |
|
|
|
rtsp_st->rtp_ctx = rtp_parse_open(s, st, rtsp_st->rtp_handle, rtsp_st->sdp_payload_type, &rtsp_st->rtp_payload_data); |
|
|
|
|
|
|
|
if (!rtsp_st->rtp_ctx) { |
|
|
|
err = AVERROR(ENOMEM); |
|
|
|
if ((err = rtsp_open_transport_ctx(s, rtsp_st))) |
|
|
|
goto fail; |
|
|
|
} else { |
|
|
|
if(rtsp_st->dynamic_handler) { |
|
|
|
rtsp_st->rtp_ctx->dynamic_protocol_context= rtsp_st->dynamic_protocol_context; |
|
|
|
rtsp_st->rtp_ctx->parse_packet= rtsp_st->dynamic_handler->parse_packet; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (rt->server_type == RTSP_SERVER_RDT) |
|
|
|
@@ -1509,7 +1518,6 @@ static int sdp_read_header(AVFormatContext *s, |
|
|
|
int size, i, err; |
|
|
|
char *content; |
|
|
|
char url[1024]; |
|
|
|
AVStream *st; |
|
|
|
|
|
|
|
/* read the whole sdp file */ |
|
|
|
/* XXX: better loading */ |
|
|
|
@@ -1537,22 +1545,8 @@ static int sdp_read_header(AVFormatContext *s, |
|
|
|
err = AVERROR_INVALIDDATA; |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
/* open the RTP context */ |
|
|
|
st = NULL; |
|
|
|
if (rtsp_st->stream_index >= 0) |
|
|
|
st = s->streams[rtsp_st->stream_index]; |
|
|
|
if (!st) |
|
|
|
s->ctx_flags |= AVFMTCTX_NOHEADER; |
|
|
|
rtsp_st->rtp_ctx = rtp_parse_open(s, st, rtsp_st->rtp_handle, rtsp_st->sdp_payload_type, &rtsp_st->rtp_payload_data); |
|
|
|
if (!rtsp_st->rtp_ctx) { |
|
|
|
err = AVERROR(ENOMEM); |
|
|
|
if ((err = rtsp_open_transport_ctx(s, rtsp_st))) |
|
|
|
goto fail; |
|
|
|
} else { |
|
|
|
if(rtsp_st->dynamic_handler) { |
|
|
|
rtsp_st->rtp_ctx->dynamic_protocol_context= rtsp_st->dynamic_protocol_context; |
|
|
|
rtsp_st->rtp_ctx->parse_packet= rtsp_st->dynamic_handler->parse_packet; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return 0; |
|
|
|
fail: |
|
|
|
|