On Wed, 4 Jul 2012, Jordi Ortiz wrote:
+static int rtsp_read_setup(AVFormatContext *s, char* host, char *controlurl)
+{
+ RTSPState *rt = s->priv_data;
+ RTSPMessageHeader request = { 0 };
+ int ret = 0;
+ char url[1024];
+ RTSPStream *rtsp_st;
+ char responseheaders[1024];
+ int localport = -1;
+ int transportidx = 0;
+
+ ret = rtsp_read_request(s, &request, "SETUP");
+ if (ret)
+ return ret;
+ rt->seq++;
+ if (!request.nb_transports) {
+ av_log(s, AV_LOG_ERROR, "No transport defined in SETUP\n");
+ return AVERROR_INVALIDDATA;
+ }
+ for (transportidx = 0; transportidx < request.nb_transports;
+ transportidx++) {
+ if (!request.transports[transportidx].mode_record
+ || (request.transports[transportidx].lower_transport
+ != RTSP_LOWER_TRANSPORT_UDP &&
+ request.transports[transportidx].lower_transport
+ != RTSP_LOWER_TRANSPORT_TCP)) {
+ av_log(s, AV_LOG_ERROR, "mode=record/receive not set or transport"
+ " protocol not supported (yet)\n");
+ return AVERROR_INVALIDDATA;
+ }
+ }
+ if (request.nb_transports > 1)
+ av_log(s, AV_LOG_WARNING, "More than one transport not supported, "
+ "using first of all\n");
+ if (strcmp(rt->rtsp_streams[0]->control_url,
+ controlurl)) {
+ av_log(s, AV_LOG_ERROR, "Unable to find requested track\n");
+ return AVERROR_STREAM_NOT_FOUND;
+ }
+ rtsp_st = rt->rtsp_streams[0];
Here you seem to have misunderstood the things we discussed before.
Even if we only support request.nb_transports == 1, as in, one transport
header line per SETUP request, we still support more than one stream. Here
you suddenly seem to assume that since we're dealing with
request.transports[0], we also blindly assume rt->rtsp_streams[0]. That's
not right, you should keep the loop that finds which stream this is about,
as you had before.
// Martin
_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel