diff rtsp.c @ 1431:2d8a17631520 libavformat

fix more dynamic protocol stuff, needed by the forthcoming h264 streaming patch. (Minor additions to give more information to the dynamic protocol handlers, and a slight rearrangement of code.) Patch by Ryan Martell %rdm4 A martellventures P com% Original thread: Date: Oct 29, 2006 2:30 AM Subject: Re: [Ffmpeg-devel] RTP patches & RFC
author gpoirier
date Sun, 29 Oct 2006 10:58:51 +0000
parents 00d9393a126f
children c0235bab9e92
line wrap: on
line diff
--- a/rtsp.c	Sat Oct 28 18:39:16 2006 +0000
+++ b/rtsp.c	Sun Oct 29 10:58:51 2006 +0000
@@ -200,6 +200,8 @@
                     i = atoi(buf);
                     if (i > 0)
                         codec->channels = i;
+                    // TODO: there is a bug here; if it is a mono stream, and less than 22000Hz, faad upconverts to stereo and twice the
+                    //  frequency.  No problem, but the sample rate is being set here by the sdp line.  Upcoming patch forthcoming. (rdm)
                 }
                 av_log(codec, AV_LOG_DEBUG, " audio samplerate set to : %i\n", codec->sample_rate);
                 av_log(codec, AV_LOG_DEBUG, " audio channels set to : %i\n", codec->channels);
@@ -287,6 +289,25 @@
     {NULL, -1, -1},
 };
 
+/** parse the attribute line from the fmtp a line of an sdp resonse.  This is broken out as a function
+* because it is used in rtp_h264.c, which is forthcoming.
+*/
+int rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size)
+{
+    skip_spaces(p);
+    if(**p)
+    {
+        get_word_sep(attr, attr_size, "=", p);
+        if (**p == '=')
+            (*p)++;
+        get_word_sep(value, value_size, ";", p);
+        if (**p == ';')
+            (*p)++;
+        return 1;
+    }
+    return 0;
+}
+
 /* parse a SDP line and save stream attributes */
 static void sdp_parse_fmtp(AVStream *st, const char *p)
 {
@@ -298,6 +319,7 @@
     AVCodecContext *codec = st->codec;
     rtp_payload_data_t *rtp_payload_data = &rtsp_st->rtp_payload_data;
 
+    // TODO (Replace with rtsp_next_attr_and_value)
     /* loop on each attribute */
     for(;;) {
         skip_spaces(&p);
@@ -471,6 +493,19 @@
                     }
                 }
             }
+        } else if(strstart(p, "framesize:", &p)) {
+            // let dynamic protocol handlers have a stab at the line.
+            get_word(buf1, sizeof(buf1), &p);
+            payload_type = atoi(buf1);
+            for(i = 0; i < s->nb_streams;i++) {
+                st = s->streams[i];
+                rtsp_st = st->priv_data;
+                if (rtsp_st->sdp_payload_type == payload_type) {
+                    if(rtsp_st->dynamic_handler && rtsp_st->dynamic_handler->parse_sdp_a_line) {
+                        rtsp_st->dynamic_handler->parse_sdp_a_line(st, rtsp_st->dynamic_protocol_context, buf);
+                    }
+                }
+            }
         }
         break;
     }