annotate sdp.c @ 3068:9cc9ff5aff9c libavformat

set bps to uncompressed original sound data for compressed audio according to aiff specs, qt set it to 16 for mace and ima4, fail if block align is not set.
author bcoudurier
date Mon, 25 Feb 2008 12:00:31 +0000
parents 3ecfaa7d0f3b
children f1aecf52bac5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
1 /*
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
2 * copyright (c) 2007 Luca Abeni
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
3 *
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
4 * This file is part of FFmpeg.
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
5 *
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
10 *
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
14 * Lesser General Public License for more details.
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
15 *
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
19 */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
20
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
21 #include "avstring.h"
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
22 #include "avformat.h"
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
23 #include "avc.h"
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
24 #include "base64.h"
2677
005c0fd8d3eb Explicitly include rtp.h (needed for rtp_get_payload_type())
lucabe
parents: 2541
diff changeset
25 #include "rtp.h"
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
26
2316
5a4914f78109 Fix linking when RTP is disabled and libraries are dynamic
lucabe
parents: 2284
diff changeset
27 #ifdef CONFIG_RTP_MUXER
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
28 #define MAX_EXTRADATA_SIZE ((INT_MAX - 10) / 2)
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
29
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
30 struct sdp_session_level {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
31 int sdp_version; /**< protocol version (currently 0) */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
32 int id; /**< session id */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
33 int version; /**< session version */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
34 int start_time; /**< session start time (NTP time, in seconds),
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
35 or 0 in case of permanent session */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
36 int end_time; /**< session end time (NTP time, in seconds),
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
37 or 0 if the session is not bounded */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
38 int ttl; /**< TTL, in case of multicast stream */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
39 const char *user; /**< username of the session's creator */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
40 const char *src_addr; /**< IP address of the machine from which the session was created */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
41 const char *dst_addr; /**< destination IP address (can be multicast) */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
42 const char *name; /**< session name (can be an empty string) */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
43 };
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
44
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
45 static void dest_write(char *buff, int size, const char *dest_addr, int ttl)
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
46 {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
47 if (dest_addr) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
48 if (ttl > 0) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
49 av_strlcatf(buff, size, "c=IN IP4 %s/%d\r\n", dest_addr, ttl);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
50 } else {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
51 av_strlcatf(buff, size, "c=IN IP4 %s\r\n", dest_addr);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
52 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
53 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
54 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
55
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
56 static void sdp_write_header(char *buff, int size, struct sdp_session_level *s)
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
57 {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
58 av_strlcatf(buff, size, "v=%d\r\n"
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
59 "o=- %d %d IN IPV4 %s\r\n"
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
60 "t=%d %d\r\n"
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
61 "s=%s\r\n"
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
62 "a=tool:libavformat\r\n",
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
63 s->sdp_version,
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
64 s->id, s->version, s->src_addr,
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
65 s->start_time, s->end_time,
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
66 s->name[0] ? s->name : "No Name");
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
67 dest_write(buff, size, s->dst_addr, s->ttl);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
68 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
69
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
70 static int get_address(char *dest_addr, int size, int *ttl, const char *url)
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
71 {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
72 int port;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
73 const char *p;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
74
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
75 url_split(NULL, 0, NULL, 0, dest_addr, size, &port, NULL, 0, url);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
76
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
77 *ttl = 0;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
78 p = strchr(url, '?');
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
79 if (p) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
80 char buff[64];
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
81 int is_multicast = find_info_tag(buff, sizeof(buff), "multicast", p);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
82
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
83 if (is_multicast) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
84 if (find_info_tag(buff, sizeof(buff), "ttl", p)) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
85 *ttl = strtol(buff, NULL, 10);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
86 } else {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
87 *ttl = 5;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
88 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
89 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
90 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
91
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
92 return port;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
93 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
94
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
95 #define MAX_PSET_SIZE 1024
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
96 static char *extradata2psets(AVCodecContext *c)
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
97 {
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
98 char *psets, *p;
3051
3ecfaa7d0f3b Missing const, fix warnings:
reimar
parents: 2961
diff changeset
99 const uint8_t *r;
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
100 const char *pset_string = "; sprop-parameter-sets=";
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
101
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
102 if (c->extradata_size > MAX_EXTRADATA_SIZE) {
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
103 av_log(c, AV_LOG_ERROR, "Too many extra data!\n");
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
104
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
105 return NULL;
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
106 }
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
107
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
108 psets = av_mallocz(MAX_PSET_SIZE);
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
109 if (psets == NULL) {
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
110 av_log(c, AV_LOG_ERROR, "Cannot allocate memory for the parameter sets\n");
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
111 return NULL;
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
112 }
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
113 memcpy(psets, pset_string, strlen(pset_string));
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
114 p = psets + strlen(pset_string);
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
115 r = ff_avc_find_startcode(c->extradata, c->extradata + c->extradata_size);
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
116 while (r < c->extradata + c->extradata_size) {
3051
3ecfaa7d0f3b Missing const, fix warnings:
reimar
parents: 2961
diff changeset
117 const uint8_t *r1;
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
118
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
119 while (!*(r++));
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
120 r1 = ff_avc_find_startcode(r, c->extradata + c->extradata_size);
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
121 if (p != (psets + strlen(pset_string))) {
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
122 *p = ',';
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
123 p++;
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
124 }
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
125 if (av_base64_encode(p, MAX_PSET_SIZE - (p - psets), r, r1 - r) == NULL) {
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
126 av_log(c, AV_LOG_ERROR, "Cannot BASE64 encode %d %d!\n", MAX_PSET_SIZE - (p - psets), r1 - r);
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
127 av_free(psets);
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
128
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
129 return NULL;
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
130 }
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
131 p += strlen(p);
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
132 r = r1;
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
133 }
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
134
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
135 return psets;
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
136 }
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
137
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
138 static void digit_to_char(char *dst, uint8_t src)
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
139 {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
140 if (src < 10) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
141 *dst = '0' + src;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
142 } else {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
143 *dst = 'A' + src - 10;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
144 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
145 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
146
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
147 static char *data_to_hex(char *buff, const uint8_t *src, int s)
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
148 {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
149 int i;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
150
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
151 for(i = 0; i < s; i++) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
152 digit_to_char(buff + 2 * i, src[i] >> 4);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
153 digit_to_char(buff + 2 * i + 1, src[i] & 0xF);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
154 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
155
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
156 return buff;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
157 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
158
2916
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
159 static char *extradata2config(AVCodecContext *c)
2521
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
160 {
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
161 char *config;
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
162
2916
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
163 if (c->extradata_size > MAX_EXTRADATA_SIZE) {
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
164 av_log(c, AV_LOG_ERROR, "Too many extra data!\n");
2521
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
165
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
166 return NULL;
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
167 }
2916
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
168 config = av_malloc(10 + c->extradata_size * 2);
2521
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
169 if (config == NULL) {
2916
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
170 av_log(c, AV_LOG_ERROR, "Cannot allocate memory for the config info\n");
2521
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
171 return NULL;
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
172 }
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
173 memcpy(config, "; config=", 9);
2916
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
174 data_to_hex(config + 9, c->extradata, c->extradata_size);
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
175 config[9 + c->extradata_size * 2] = 0;
2521
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
176
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
177 return config;
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
178 }
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
179
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
180 static char *sdp_media_attributes(char *buff, int size, AVCodecContext *c, int payload_type)
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
181 {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
182 char *config = NULL;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
183
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
184 switch (c->codec_id) {
2958
b489d30f8685 Add minimal support for H.264 video in the SDP generator
lucabe
parents: 2916
diff changeset
185 case CODEC_ID_H264:
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
186 if (c->extradata_size) {
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
187 config = extradata2psets(c);
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
188 }
2958
b489d30f8685 Add minimal support for H.264 video in the SDP generator
lucabe
parents: 2916
diff changeset
189 av_strlcatf(buff, size, "a=rtpmap:%d H264/90000\r\n"
b489d30f8685 Add minimal support for H.264 video in the SDP generator
lucabe
parents: 2916
diff changeset
190 "a=fmtp:%d packetization-mode=1%s\r\n",
b489d30f8685 Add minimal support for H.264 video in the SDP generator
lucabe
parents: 2916
diff changeset
191 payload_type,
b489d30f8685 Add minimal support for H.264 video in the SDP generator
lucabe
parents: 2916
diff changeset
192 payload_type, config ? config : "");
b489d30f8685 Add minimal support for H.264 video in the SDP generator
lucabe
parents: 2916
diff changeset
193 break;
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
194 case CODEC_ID_MPEG4:
2541
90609bab3de3 Test extradata_size instead of the CODEC_FLAG_GLOBAL_HEADER flag to check if
lucabe
parents: 2521
diff changeset
195 if (c->extradata_size) {
2916
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
196 config = extradata2config(c);
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
197 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
198 av_strlcatf(buff, size, "a=rtpmap:%d MP4V-ES/90000\r\n"
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
199 "a=fmtp:%d profile-level-id=1%s\r\n",
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
200 payload_type,
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
201 payload_type, config ? config : "");
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
202 break;
2521
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
203 case CODEC_ID_AAC:
2541
90609bab3de3 Test extradata_size instead of the CODEC_FLAG_GLOBAL_HEADER flag to check if
lucabe
parents: 2521
diff changeset
204 if (c->extradata_size) {
2916
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
205 config = extradata2config(c);
2521
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
206 } else {
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
207 /* FIXME: maybe we can forge config information based on the
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
208 * codec parameters...
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
209 */
2916
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
210 av_log(c, AV_LOG_ERROR, "AAC with no global headers is currently not supported\n");
2521
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
211 return NULL;
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
212 }
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
213 if (config == NULL) {
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
214 return NULL;
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
215 }
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
216 av_strlcatf(buff, size, "a=rtpmap:%d MPEG4-GENERIC/%d/%d\r\n"
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
217 "a=fmtp:%d profile-level-id=1;"
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
218 "mode=AAC-hbr;sizelength=13;indexlength=3;"
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
219 "indexdeltalength=3%s\r\n",
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
220 payload_type, c->sample_rate, c->channels,
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
221 payload_type, config);
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
222 break;
2729
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
223 case CODEC_ID_PCM_S16BE:
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
224 if (payload_type >= 96)
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
225 av_strlcatf(buff, size, "a=rtpmap:%d L16/%d/%d\r\n",
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
226 payload_type,
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
227 c->sample_rate, c->channels);
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
228 break;
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
229 case CODEC_ID_PCM_MULAW:
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
230 if (payload_type >= 96)
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
231 av_strlcatf(buff, size, "a=rtpmap:%d PCMU/%d/%d\r\n",
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
232 payload_type,
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
233 c->sample_rate, c->channels);
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
234 break;
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
235 case CODEC_ID_PCM_ALAW:
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
236 if (payload_type >= 96)
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
237 av_strlcatf(buff, size, "a=rtpmap:%d PCMA/%d/%d\r\n",
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
238 payload_type,
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
239 c->sample_rate, c->channels);
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
240 break;
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
241 default:
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
242 /* Nothing special to do, here... */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
243 break;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
244 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
245
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
246 av_free(config);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
247
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
248 return buff;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
249 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
250
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
251 static void sdp_write_media(char *buff, int size, AVCodecContext *c, const char *dest_addr, int port, int ttl)
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
252 {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
253 const char *type;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
254 int payload_type;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
255
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
256 payload_type = rtp_get_payload_type(c);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
257 if (payload_type < 0) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
258 payload_type = 96; /* FIXME: how to assign a private pt? rtp.c is broken too */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
259 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
260
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
261 switch (c->codec_type) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
262 case CODEC_TYPE_VIDEO : type = "video" ; break;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
263 case CODEC_TYPE_AUDIO : type = "audio" ; break;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
264 case CODEC_TYPE_SUBTITLE: type = "text" ; break;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
265 default : type = "application"; break;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
266 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
267
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
268 av_strlcatf(buff, size, "m=%s %d RTP/AVP %d\r\n", type, port, payload_type);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
269 dest_write(buff, size, dest_addr, ttl);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
270
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
271 sdp_media_attributes(buff, size, c, payload_type);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
272 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
273
2317
2adc9f64ecfb Change avf_sdp_create() to get a pre-allocated buffer as input, and to
lucabe
parents: 2316
diff changeset
274 int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size)
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
275 {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
276 struct sdp_session_level s;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
277 int i, j, port, ttl;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
278 char dst[32];
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
279
2422
f3a8f7d55bd1 Fill the buffer with 0 before writing an SDP in it
lucabe
parents: 2317
diff changeset
280 memset(buff, 0, size);
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
281 memset(&s, 0, sizeof(struct sdp_session_level));
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
282 s.user = "-";
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
283 s.src_addr = "127.0.0.1"; /* FIXME: Properly set this */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
284 s.name = ac[0]->title;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
285
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
286 port = 0;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
287 ttl = 0;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
288 if (n_files == 1) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
289 port = get_address(dst, sizeof(dst), &ttl, ac[0]->filename);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
290 if (port > 0) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
291 s.dst_addr = dst;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
292 s.ttl = ttl;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
293 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
294 }
2317
2adc9f64ecfb Change avf_sdp_create() to get a pre-allocated buffer as input, and to
lucabe
parents: 2316
diff changeset
295 sdp_write_header(buff, size, &s);
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
296
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
297 dst[0] = 0;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
298 for (i = 0; i < n_files; i++) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
299 if (n_files != 1) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
300 port = get_address(dst, sizeof(dst), &ttl, ac[i]->filename);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
301 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
302 for (j = 0; j < ac[i]->nb_streams; j++) {
2317
2adc9f64ecfb Change avf_sdp_create() to get a pre-allocated buffer as input, and to
lucabe
parents: 2316
diff changeset
303 sdp_write_media(buff, size,
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
304 ac[i]->streams[j]->codec, dst[0] ? dst : NULL,
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
305 (port > 0) ? port + j * 2 : 0, ttl);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
306 if (port <= 0) {
2317
2adc9f64ecfb Change avf_sdp_create() to get a pre-allocated buffer as input, and to
lucabe
parents: 2316
diff changeset
307 av_strlcatf(buff, size,
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
308 "a=control:streamid=%d\r\n", i + j);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
309 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
310 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
311 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
312
2317
2adc9f64ecfb Change avf_sdp_create() to get a pre-allocated buffer as input, and to
lucabe
parents: 2316
diff changeset
313 return 0;
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
314 }
2316
5a4914f78109 Fix linking when RTP is disabled and libraries are dynamic
lucabe
parents: 2284
diff changeset
315 #else
2317
2adc9f64ecfb Change avf_sdp_create() to get a pre-allocated buffer as input, and to
lucabe
parents: 2316
diff changeset
316 int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size)
2316
5a4914f78109 Fix linking when RTP is disabled and libraries are dynamic
lucabe
parents: 2284
diff changeset
317 {
2317
2adc9f64ecfb Change avf_sdp_create() to get a pre-allocated buffer as input, and to
lucabe
parents: 2316
diff changeset
318 return AVERROR(ENOSYS);
2316
5a4914f78109 Fix linking when RTP is disabled and libraries are dynamic
lucabe
parents: 2284
diff changeset
319 }
5a4914f78109 Fix linking when RTP is disabled and libraries are dynamic
lucabe
parents: 2284
diff changeset
320 #endif