changeset 2759:b252e318023a libavformat

Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP code (this is needed for supporting MPEG2 video in the RTP muxer)
author lucabe
date Fri, 16 Nov 2007 07:59:41 +0000
parents ea55b48f3fbd
children 034925441d67
files rtp.c rtp_internal.h rtsp.c
diffstat 3 files changed, 44 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/rtp.c	Fri Nov 16 00:18:48 2007 +0000
+++ b/rtp.c	Fri Nov 16 07:59:41 2007 +0000
@@ -198,15 +198,20 @@
 
 int rtp_get_codec_info(AVCodecContext *codec, int payload_type)
 {
-    if (AVRtpPayloadTypes[payload_type].codec_id != CODEC_ID_NONE) {
-        codec->codec_type = AVRtpPayloadTypes[payload_type].codec_type;
-        codec->codec_id = AVRtpPayloadTypes[payload_type].codec_id;
-        if (AVRtpPayloadTypes[payload_type].audio_channels > 0)
-            codec->channels = AVRtpPayloadTypes[payload_type].audio_channels;
-        if (AVRtpPayloadTypes[payload_type].clock_rate > 0)
-            codec->sample_rate = AVRtpPayloadTypes[payload_type].clock_rate;
-        return 0;
-    }
+    int i = 0;
+
+    for (i = 0; AVRtpPayloadTypes[i].pt >= 0; i++)
+        if (AVRtpPayloadTypes[i].pt == payload_type) {
+            if (AVRtpPayloadTypes[i].codec_id != CODEC_ID_NONE) {
+                codec->codec_type = AVRtpPayloadTypes[i].codec_type;
+                codec->codec_id = AVRtpPayloadTypes[i].codec_id;
+                if (AVRtpPayloadTypes[i].audio_channels > 0)
+                    codec->channels = AVRtpPayloadTypes[i].audio_channels;
+                if (AVRtpPayloadTypes[i].clock_rate > 0)
+                    codec->sample_rate = AVRtpPayloadTypes[i].clock_rate;
+                return 0;
+            }
+        }
     return -1;
 }
 
@@ -225,6 +230,30 @@
     return payload_type;
 }
 
+const char *ff_rtp_enc_name(int payload_type)
+{
+    int i;
+
+    for (i = 0; AVRtpPayloadTypes[i].pt >= 0; i++)
+        if (AVRtpPayloadTypes[i].pt == payload_type) {
+            return AVRtpPayloadTypes[i].enc_name;
+        }
+
+    return "";
+}
+
+enum CodecID ff_rtp_codec_id(const char *buf, enum CodecType codec_type)
+{
+    int i;
+
+    for (i = 0; AVRtpPayloadTypes[i].pt >= 0; i++)
+        if (!strcmp(buf, AVRtpPayloadTypes[i].enc_name) && (codec_type == AVRtpPayloadTypes[i].codec_type)){
+            return AVRtpPayloadTypes[i].codec_id;
+        }
+
+    return CODEC_ID_NONE;
+}
+
 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len)
 {
     if (buf[1] != 200)
@@ -448,7 +477,7 @@
     s->st = st;
     s->rtp_payload_data = rtp_payload_data;
     rtp_init_statistics(&s->statistics, 0); // do we know the initial sequence from sdp?
-    if (!strcmp(AVRtpPayloadTypes[payload_type].enc_name, "MP2T")) {
+    if (!strcmp(ff_rtp_enc_name(payload_type), "MP2T")) {
         s->ts = mpegts_parse_open(s->ic);
         if (s->ts == NULL) {
             av_free(s);
@@ -712,7 +741,7 @@
 void rtp_parse_close(RTPDemuxContext *s)
 {
     // TODO: fold this into the protocol specific data fields.
-    if (!strcmp(AVRtpPayloadTypes[s->payload_type].enc_name, "MP2T")) {
+    if (!strcmp(ff_rtp_enc_name(s->payload_type), "MP2T")) {
         mpegts_parse_close(s->ts);
     }
     av_free(s);
--- a/rtp_internal.h	Fri Nov 16 00:18:48 2007 +0000
+++ b/rtp_internal.h	Fri Nov 16 07:59:41 2007 +0000
@@ -113,6 +113,8 @@
 int rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size); ///< from rtsp.c, but used by rtp dynamic protocol handlers.
 
 void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m);
+const char *ff_rtp_enc_name(int payload_type);
+enum CodecID ff_rtp_codec_id(const char *buf, enum CodecType codec_type);
 
 void av_register_rtp_dynamic_payload_handlers(void);
 
--- a/rtsp.c	Fri Nov 16 00:18:48 2007 +0000
+++ b/rtsp.c	Fri Nov 16 07:59:41 2007 +0000
@@ -167,11 +167,7 @@
     } else {
         /* We are in a standard case ( from http://www.iana.org/assignments/rtp-parameters) */
         /* search into AVRtpPayloadTypes[] */
-        for (i = 0; AVRtpPayloadTypes[i].pt >= 0; ++i)
-            if (!strcmp(buf, AVRtpPayloadTypes[i].enc_name) && (codec->codec_type == AVRtpPayloadTypes[i].codec_type)){
-                codec->codec_id = AVRtpPayloadTypes[i].codec_id;
-                break;
-            }
+        codec->codec_id = ff_rtp_codec_id(buf, codec->codec_type);
     }
 
     c = avcodec_find_decoder(codec->codec_id);
@@ -443,7 +439,7 @@
         get_word(buf1, sizeof(buf1), &p); /* format list */
         rtsp_st->sdp_payload_type = atoi(buf1);
 
-        if (!strcmp(AVRtpPayloadTypes[rtsp_st->sdp_payload_type].enc_name, "MP2T")) {
+        if (!strcmp(ff_rtp_enc_name(rtsp_st->sdp_payload_type), "MP2T")) {
             /* no corresponding stream */
         } else {
             st = av_new_stream(s, 0);