|  | @@ -1349,6 +1349,54 @@ static int rtsp_setup_input_streams(AVFormatContext *s) | 
														
													
														
															
																|  |  | return 0; |  |  | return 0; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | static int rtsp_setup_output_streams(AVFormatContext *s) | 
														
													
														
															
																|  |  |  |  |  | { | 
														
													
														
															
																|  |  |  |  |  | RTSPState *rt = s->priv_data; | 
														
													
														
															
																|  |  |  |  |  | RTSPMessageHeader reply1, *reply = &reply1; | 
														
													
														
															
																|  |  |  |  |  | char cmd[1024]; | 
														
													
														
															
																|  |  |  |  |  | int i; | 
														
													
														
															
																|  |  |  |  |  | char *sdp; | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | /* Announce the stream */ | 
														
													
														
															
																|  |  |  |  |  | snprintf(cmd, sizeof(cmd), | 
														
													
														
															
																|  |  |  |  |  | "ANNOUNCE %s RTSP/1.0\r\n" | 
														
													
														
															
																|  |  |  |  |  | "Content-Type: application/sdp\r\n", | 
														
													
														
															
																|  |  |  |  |  | s->filename); | 
														
													
														
															
																|  |  |  |  |  | sdp = av_mallocz(8192); | 
														
													
														
															
																|  |  |  |  |  | if (sdp == NULL) | 
														
													
														
															
																|  |  |  |  |  | return AVERROR(ENOMEM); | 
														
													
														
															
																|  |  |  |  |  | if (avf_sdp_create(&s, 1, sdp, 8192)) { | 
														
													
														
															
																|  |  |  |  |  | av_free(sdp); | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | av_log(s, AV_LOG_INFO, "SDP:\n%s\n", sdp); | 
														
													
														
															
																|  |  |  |  |  | rtsp_send_cmd_with_content(s, cmd, reply, NULL, sdp, strlen(sdp)); | 
														
													
														
															
																|  |  |  |  |  | av_free(sdp); | 
														
													
														
															
																|  |  |  |  |  | if (reply->status_code != RTSP_STATUS_OK) | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | /* Set up the RTSPStreams for each AVStream */ | 
														
													
														
															
																|  |  |  |  |  | for (i = 0; i < s->nb_streams; i++) { | 
														
													
														
															
																|  |  |  |  |  | RTSPStream *rtsp_st; | 
														
													
														
															
																|  |  |  |  |  | AVStream *st = s->streams[i]; | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | rtsp_st = av_mallocz(sizeof(RTSPStream)); | 
														
													
														
															
																|  |  |  |  |  | if (!rtsp_st) | 
														
													
														
															
																|  |  |  |  |  | return AVERROR(ENOMEM); | 
														
													
														
															
																|  |  |  |  |  | dynarray_add(&rt->rtsp_streams, &rt->nb_rtsp_streams, rtsp_st); | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | st->priv_data = rtsp_st; | 
														
													
														
															
																|  |  |  |  |  | rtsp_st->stream_index = i; | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | av_strlcpy(rtsp_st->control_url, s->filename, sizeof(rtsp_st->control_url)); | 
														
													
														
															
																|  |  |  |  |  | /* Note, this must match the relative uri set in the sdp content */ | 
														
													
														
															
																|  |  |  |  |  | av_strlcatf(rtsp_st->control_url, sizeof(rtsp_st->control_url), | 
														
													
														
															
																|  |  |  |  |  | "/streamid=%d", i); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | return 0; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  | static int rtsp_connect(AVFormatContext *s) |  |  | static int rtsp_connect(AVFormatContext *s) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | RTSPState *rt = s->priv_data; |  |  | RTSPState *rt = s->priv_data; | 
														
													
												
													
														
															
																|  | @@ -1406,6 +1454,17 @@ redirect: | 
														
													
														
															
																|  |  | if (!lower_transport_mask) |  |  | if (!lower_transport_mask) | 
														
													
														
															
																|  |  | lower_transport_mask = (1 << RTSP_LOWER_TRANSPORT_NB) - 1; |  |  | lower_transport_mask = (1 << RTSP_LOWER_TRANSPORT_NB) - 1; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | if (s->oformat) { | 
														
													
														
															
																|  |  |  |  |  | /* Only UDP output is supported at the moment. */ | 
														
													
														
															
																|  |  |  |  |  | lower_transport_mask &= 1 << RTSP_LOWER_TRANSPORT_UDP; | 
														
													
														
															
																|  |  |  |  |  | if (!lower_transport_mask) { | 
														
													
														
															
																|  |  |  |  |  | av_log(s, AV_LOG_ERROR, "Unsupported lower transport method, " | 
														
													
														
															
																|  |  |  |  |  | "only UDP is supported for output.\n"); | 
														
													
														
															
																|  |  |  |  |  | err = AVERROR(EINVAL); | 
														
													
														
															
																|  |  |  |  |  | goto fail; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  | /* open the tcp connexion */ |  |  | /* open the tcp connexion */ | 
														
													
														
															
																|  |  | snprintf(tcpname, sizeof(tcpname), "tcp://%s:%d", host, port); |  |  | snprintf(tcpname, sizeof(tcpname), "tcp://%s:%d", host, port); | 
														
													
														
															
																|  |  | if (url_open(&rtsp_hd, tcpname, URL_RDWR) < 0) { |  |  | if (url_open(&rtsp_hd, tcpname, URL_RDWR) < 0) { | 
														
													
												
													
														
															
																|  | @@ -1455,7 +1514,10 @@ redirect: | 
														
													
														
															
																|  |  | break; |  |  | break; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | if (s->iformat) | 
														
													
														
															
																|  |  | err = rtsp_setup_input_streams(s); |  |  | err = rtsp_setup_input_streams(s); | 
														
													
														
															
																|  |  |  |  |  | else | 
														
													
														
															
																|  |  |  |  |  | err = rtsp_setup_output_streams(s); | 
														
													
														
															
																|  |  | if (err) |  |  | if (err) | 
														
													
														
															
																|  |  | goto fail; |  |  | goto fail; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | 
 |