+ src[0] = '\0';
+
+ httpd_MsgAdd( answer, "Transport",
+ "RTP/AVP/UDP;unicast%s%s;"
+ "client_port=%u-%u;server_port=%u-%u;"
+ "ssrc=%08X;mode=play",
+ src[0] ? ";source=" : "", src,
+ loport, loport + 1, sport, sport + 1, ssrc );
+
+ answer->i_status = 200;
+ }
+ break;
+ }
+ break;
+
+ case HTTPD_MSG_PLAY:
+ {
+ rtsp_session_t *ses;
+ answer->i_status = 200;
+
+ psz_session = httpd_MsgGet( query, "Session" );
+ int64_t start = -1, end = -1;
+ const char *range = httpd_MsgGet (query, "Range");
+ if (range != NULL)
+ {
+ if (strncmp (range, "npt=", 4))
+ {
+ answer->i_status = 501;
+ break;
+ }
+
+ start = ParseNPT (range + 4);
+ range = strchr(range, '-');
+ if (range != NULL && *(range + 1))
+ end = ParseNPT (range + 1);
+
+ if (end >= 0 && end < start)
+ {
+ answer->i_status = 457;
+ break;
+ }
+
+ if (vod)
+ {
+ if (vod_check_range(rtsp->vod_media, psz_session,
+ start, end) != VLC_SUCCESS)
+ {
+ answer->i_status = 457;
+ break;
+ }
+ }
+ /* We accept start times of 0 even for broadcast streams
+ * that already started */
+ else if (start > 0 || end >= 0)
+ {
+ answer->i_status = 456;
+ break;
+ }
+ }
+ vlc_mutex_lock( &rtsp->lock );
+ ses = RtspClientGet( rtsp, psz_session );
+ if( ses != NULL )
+ {
+ char info[ses->trackc * ( strlen( control ) + TRACK_PATH_SIZE
+ + sizeof("url=;seq=65535;rtptime=4294967295, ")
+ - 1 ) + 1];
+ size_t infolen = 0;
+ RtspClientAlive(ses);
+
+ sout_stream_id_t *sout_id = NULL;
+ if (vod)
+ {
+ /* We don't keep a reference to the sout_stream_t,
+ * so we check if a sout_id is available instead. */
+ for (int i = 0; i < ses->trackc; i++)