annotate rtp.c @ 3754:8d267b43eaba libavformat

Move malloc() down until after all initializations, so that the resource is only allocated if initialization worked. This means that on failure, we don't have to deallocate it.
author rbultje
date Sat, 23 Aug 2008 18:46:30 +0000
parents 30682688ca93
children 77e0c7511d41
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 2002 Fabrice Bellard.
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
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3196
diff changeset
22 #include "libavcodec/bitstream.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25 #include <unistd.h>
1754
1f7a6dc01100 move networking #includes into separate file
mru
parents: 1673
diff changeset
26 #include "network.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27
1419
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
28 #include "rtp_internal.h"
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
29
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
30 //#define DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
31
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
32 /* 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
33 /* payload types >= 96 are dynamic;
f1c709e64ed5 Add a comment about missing entries
lucabe
parents: 3195
diff changeset
34 * payload types between 72 and 76 are reserved for RTCP conflict avoidance;
f1c709e64ed5 Add a comment about missing entries
lucabe
parents: 3195
diff changeset
35 * 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
36 * reserved
f1c709e64ed5 Add a comment about missing entries
lucabe
parents: 3195
diff changeset
37 */
2901
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
38 static const struct
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
39 {
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
40 int pt;
3195
a859757a057b Use the correct size for the enc_name field (removing the arbitrary "50" size)
lucabe
parents: 3194
diff changeset
41 const char enc_name[6];
2901
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
42 enum CodecType codec_type;
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
43 enum CodecID codec_id;
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
44 int clock_rate;
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
45 int audio_channels;
0d0ffa1a0478 Make AVRtpPayloadTypes static and constant
lucabe
parents: 2892
diff changeset
46 } AVRtpPayloadTypes[]=
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
47 {
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
48 {0, "PCMU", CODEC_TYPE_AUDIO, CODEC_ID_PCM_MULAW, 8000, 1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
49 {3, "GSM", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
50 {4, "G723", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
51 {5, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
52 {6, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 16000, 1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
53 {7, "LPC", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
54 {8, "PCMA", CODEC_TYPE_AUDIO, CODEC_ID_PCM_ALAW, 8000, 1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
55 {9, "G722", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
56 {10, "L16", CODEC_TYPE_AUDIO, CODEC_ID_PCM_S16BE, 44100, 2},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
57 {11, "L16", CODEC_TYPE_AUDIO, CODEC_ID_PCM_S16BE, 44100, 1},
1259
874dcd428a17 Added codec id for QCELP.
banan
parents: 1169
diff changeset
58 {12, "QCELP", CODEC_TYPE_AUDIO, CODEC_ID_QCELP, 8000, 1},
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
59 {13, "CN", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
3498
30682688ca93 Do not set sample_rate = 90000 for mp2 and mp3 audio over RTP
lucabe
parents: 3286
diff changeset
60 {14, "MPA", CODEC_TYPE_AUDIO, CODEC_ID_MP2, -1, -1},
30682688ca93 Do not set sample_rate = 90000 for mp2 and mp3 audio over RTP
lucabe
parents: 3286
diff changeset
61 {14, "MPA", CODEC_TYPE_AUDIO, CODEC_ID_MP3, -1, -1},
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
62 {15, "G728", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
63 {16, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 11025, 1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
64 {17, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 22050, 1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
65 {18, "G729", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
66 {25, "CelB", CODEC_TYPE_VIDEO, CODEC_ID_NONE, 90000, -1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
67 {26, "JPEG", CODEC_TYPE_VIDEO, CODEC_ID_MJPEG, 90000, -1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
68 {28, "nv", CODEC_TYPE_VIDEO, CODEC_ID_NONE, 90000, -1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
69 {31, "H261", CODEC_TYPE_VIDEO, CODEC_ID_H261, 90000, -1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
70 {32, "MPV", CODEC_TYPE_VIDEO, CODEC_ID_MPEG1VIDEO, 90000, -1},
2760
034925441d67 Add MPEG2 support to the RTP muxer
lucabe
parents: 2759
diff changeset
71 {32, "MPV", CODEC_TYPE_VIDEO, CODEC_ID_MPEG2VIDEO, 90000, -1},
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
72 {33, "MP2T", CODEC_TYPE_DATA, CODEC_ID_MPEG2TS, 90000, -1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
73 {34, "H263", CODEC_TYPE_VIDEO, CODEC_ID_H263, 90000, -1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
74 {-1, "", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
75 };
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77 int rtp_get_codec_info(AVCodecContext *codec, int payload_type)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
78 {
2759
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
79 int i = 0;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
80
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
81 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
82 if (AVRtpPayloadTypes[i].pt == payload_type) {
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
83 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
84 codec->codec_type = AVRtpPayloadTypes[i].codec_type;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
85 codec->codec_id = AVRtpPayloadTypes[i].codec_id;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
86 if (AVRtpPayloadTypes[i].audio_channels > 0)
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
87 codec->channels = AVRtpPayloadTypes[i].audio_channels;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
88 if (AVRtpPayloadTypes[i].clock_rate > 0)
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
89 codec->sample_rate = AVRtpPayloadTypes[i].clock_rate;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
90 return 0;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
91 }
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
92 }
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
93 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
94 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 int rtp_get_payload_type(AVCodecContext *codec)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97 {
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
98 int i, payload_type;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 /* compute the payload type */
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
101 for (payload_type = -1, i = 0; AVRtpPayloadTypes[i].pt >= 0; ++i)
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
102 if (AVRtpPayloadTypes[i].codec_id == codec->codec_id) {
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
103 if (codec->codec_id == CODEC_ID_PCM_S16BE)
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
104 if (codec->channels != AVRtpPayloadTypes[i].audio_channels)
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
105 continue;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 743
diff changeset
106 payload_type = AVRtpPayloadTypes[i].pt;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108 return payload_type;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
109 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110
2759
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
111 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
112 {
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
113 int i;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
114
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
115 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
116 if (AVRtpPayloadTypes[i].pt == payload_type) {
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
117 return AVRtpPayloadTypes[i].enc_name;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
118 }
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 return "";
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
121 }
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 enum CodecID ff_rtp_codec_id(const char *buf, enum CodecType codec_type)
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 int i;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
126
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
127 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
128 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
129 return AVRtpPayloadTypes[i].codec_id;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
130 }
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
131
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
132 return CODEC_ID_NONE;
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2706
diff changeset
133 }