annotate rtp.c @ 6455:3f50c7effad1 libavformat

rtsp: 10l, try to update the correct rtp stream This fixes a bug from rev 22917. Now RTSP streams where the individual RTCP sender reports aren't sent at the same time actually are synced properly.
author mstorsjo
date Fri, 03 Sep 2010 07:10:21 +0000
parents 536e5527c1e0
children f06908662125
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2 * RTP input/output format
4251
77e0c7511d41 cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 3498
diff changeset
3 * Copyright (c) 2002 Fabrice Bellard
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 885
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20 */
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3196
diff changeset
21
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
22 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23
4291
f49e5d92ab26 Merge rtp_internal.h in rtp.h, and remove rtp_internal.h
lucabe
parents: 4251
diff changeset
24 #include "rtp.h"
1419
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
25
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26 //#define DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
28 /* from http://www.iana.org/assignments/rtp-parameters last updated 05 January 2005 */
3196
f1c709e64ed5 Add a comment about missing entries
lucabe
parents: 3195
diff changeset
29 /* payload types >= 96 are dynamic;
f1c709e64ed5 Add a comment about missing entries
lucabe
parents: 3195
diff changeset
30 * payload types between 72 and 76 are reserved for RTCP conflict avoidance;
f1c709e64ed5 Add a comment about missing entries
lucabe
parents: 3195
diff changeset
31 * all the other payload types not present in the table are unassigned or
f1c709e64ed5 Add a comment about missing entries
lucabe
parents: 3195
diff changeset
32 * reserved
f1c709e64ed5 Add a comment about missing entries
lucabe
parents: 3195
diff changeset
33 */
2901
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
34 static const struct
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
35 {
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
36 int pt;
3195
a859757a057b Use the correct size for the enc_name field (removing the arbitrary "50" size)
lucabe
parents: 3194
diff changeset
37 const char enc_name[6];
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
38 enum AVMediaType codec_type;
2901
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
39 enum CodecID codec_id;
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
40 int clock_rate;
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
41 int audio_channels;
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
42 } AVRtpPayloadTypes[]=
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
43 {
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
44 {0, "PCMU", AVMEDIA_TYPE_AUDIO, CODEC_ID_PCM_MULAW, 8000, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
45 {3, "GSM", AVMEDIA_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
46 {4, "G723", AVMEDIA_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
47 {5, "DVI4", AVMEDIA_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
48 {6, "DVI4", AVMEDIA_TYPE_AUDIO, CODEC_ID_NONE, 16000, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
49 {7, "LPC", AVMEDIA_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
50 {8, "PCMA", AVMEDIA_TYPE_AUDIO, CODEC_ID_PCM_ALAW, 8000, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
51 {9, "G722", AVMEDIA_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
52 {10, "L16", AVMEDIA_TYPE_AUDIO, CODEC_ID_PCM_S16BE, 44100, 2},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
53 {11, "L16", AVMEDIA_TYPE_AUDIO, CODEC_ID_PCM_S16BE, 44100, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
54 {12, "QCELP", AVMEDIA_TYPE_AUDIO, CODEC_ID_QCELP, 8000, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
55 {13, "CN", AVMEDIA_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
56 {14, "MPA", AVMEDIA_TYPE_AUDIO, CODEC_ID_MP2, -1, -1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
57 {14, "MPA", AVMEDIA_TYPE_AUDIO, CODEC_ID_MP3, -1, -1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
58 {15, "G728", AVMEDIA_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
59 {16, "DVI4", AVMEDIA_TYPE_AUDIO, CODEC_ID_NONE, 11025, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
60 {17, "DVI4", AVMEDIA_TYPE_AUDIO, CODEC_ID_NONE, 22050, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
61 {18, "G729", AVMEDIA_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
62 {25, "CelB", AVMEDIA_TYPE_VIDEO, CODEC_ID_NONE, 90000, -1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
63 {26, "JPEG", AVMEDIA_TYPE_VIDEO, CODEC_ID_MJPEG, 90000, -1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
64 {28, "nv", AVMEDIA_TYPE_VIDEO, CODEC_ID_NONE, 90000, -1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
65 {31, "H261", AVMEDIA_TYPE_VIDEO, CODEC_ID_H261, 90000, -1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
66 {32, "MPV", AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG1VIDEO, 90000, -1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
67 {32, "MPV", AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG2VIDEO, 90000, -1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
68 {33, "MP2T", AVMEDIA_TYPE_DATA, CODEC_ID_MPEG2TS, 90000, -1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
69 {34, "H263", AVMEDIA_TYPE_VIDEO, CODEC_ID_H263, 90000, -1},
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
70 {-1, "", AVMEDIA_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
71 };
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
72
4519
f4b9967e0131 Remame rtp_get_codec_info() to ff_rtp_get_codec_info(), as it is not
lucabe
parents: 4502
diff changeset
73 int ff_rtp_get_codec_info(AVCodecContext *codec, int payload_type)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
74 {
2759
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
75 int i = 0;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
76
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
77 for (i = 0; AVRtpPayloadTypes[i].pt >= 0; i++)
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
78 if (AVRtpPayloadTypes[i].pt == payload_type) {
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
79 if (AVRtpPayloadTypes[i].codec_id != CODEC_ID_NONE) {
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
80 codec->codec_type = AVRtpPayloadTypes[i].codec_type;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
81 codec->codec_id = AVRtpPayloadTypes[i].codec_id;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
82 if (AVRtpPayloadTypes[i].audio_channels > 0)
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
83 codec->channels = AVRtpPayloadTypes[i].audio_channels;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
84 if (AVRtpPayloadTypes[i].clock_rate > 0)
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
85 codec->sample_rate = AVRtpPayloadTypes[i].clock_rate;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
86 return 0;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
87 }
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
88 }
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
89 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91
4502
daca5391106a Rename rtp_get_payload_type() to ff_rtp_get_payload_type(), as it is not
lucabe
parents: 4291
diff changeset
92 int ff_rtp_get_payload_type(AVCodecContext *codec)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 {
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
94 int i, payload_type;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 /* compute the payload type */
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
97 for (payload_type = -1, i = 0; AVRtpPayloadTypes[i].pt >= 0; ++i)
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
98 if (AVRtpPayloadTypes[i].codec_id == codec->codec_id) {
4813
ec96a30c7141 Do not return payload type 34 for H.263 (it is deprecated)
lucabe
parents: 4519
diff changeset
99 if (codec->codec_id == CODEC_ID_H263)
ec96a30c7141 Do not return payload type 34 for H.263 (it is deprecated)
lucabe
parents: 4519
diff changeset
100 continue;
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
101 if (codec->codec_id == CODEC_ID_PCM_S16BE)
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
102 if (codec->channels != AVRtpPayloadTypes[i].audio_channels)
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
103 continue;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
104 payload_type = AVRtpPayloadTypes[i].pt;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106 return payload_type;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108
2759
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
109 const char *ff_rtp_enc_name(int payload_type)
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
110 {
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
111 int i;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
112
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
113 for (i = 0; AVRtpPayloadTypes[i].pt >= 0; i++)
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
114 if (AVRtpPayloadTypes[i].pt == payload_type) {
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
115 return AVRtpPayloadTypes[i].enc_name;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
116 }
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
117
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
118 return "";
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
119 }
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
120
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5521
diff changeset
121 enum CodecID ff_rtp_codec_id(const char *buf, enum AVMediaType codec_type)
2759
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
122 {
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
123 int i;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
124
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
125 for (i = 0; AVRtpPayloadTypes[i].pt >= 0; i++)
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
126 if (!strcmp(buf, AVRtpPayloadTypes[i].enc_name) && (codec_type == AVRtpPayloadTypes[i].codec_type)){
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
127 return AVRtpPayloadTypes[i].codec_id;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
128 }
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
129
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
130 return CODEC_ID_NONE;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
131 }