annotate sdp.c @ 6119:16ca32d9c5f0 libavformat

Use a bitstream filter for converting the extradata syntax when generating an SDP. This allows to generate correct SDPs for H.264 video in "MP4 syntax".
author lucabe
date Fri, 11 Jun 2010 08:01:45 +0000
parents b740f4918397
children 4fc5e0e4e1cd
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
5500
fc0a32a383d3 Check the URL used for the SDP destination.
lucabe
parents: 5476
diff changeset
21 #include <string.h>
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3276
diff changeset
22 #include "libavutil/avstring.h"
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3276
diff changeset
23 #include "libavutil/base64.h"
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
24 #include "avformat.h"
3788
ca6df1ecb412 Export data_to_hex() as private API in lavf, rename to ff_data_to_hex() and
rbultje
parents: 3605
diff changeset
25 #include "internal.h"
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
26 #include "avc.h"
2677
005c0fd8d3eb Explicitly include rtp.h (needed for rtp_get_payload_type())
lucabe
parents: 2541
diff changeset
27 #include "rtp.h"
5525
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
28 #if CONFIG_NETWORK
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
29 #include "network.h"
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
30 #endif
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
31
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 4049
diff changeset
32 #if CONFIG_RTP_MUXER
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
33 #define MAX_EXTRADATA_SIZE ((INT_MAX - 10) / 2)
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
34
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
35 struct sdp_session_level {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
36 int sdp_version; /**< protocol version (currently 0) */
4421
a6849222fccc cosmetics: comment grammar/spelling fixes
diego
parents: 4360
diff changeset
37 int id; /**< session ID */
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
38 int version; /**< session version */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
39 int start_time; /**< session start time (NTP time, in seconds),
4421
a6849222fccc cosmetics: comment grammar/spelling fixes
diego
parents: 4360
diff changeset
40 or 0 in case of permanent session */
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
41 int end_time; /**< session end time (NTP time, in seconds),
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
42 or 0 if the session is not bounded */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
43 int ttl; /**< TTL, in case of multicast stream */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
44 const char *user; /**< username of the session's creator */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
45 const char *src_addr; /**< IP address of the machine from which the session was created */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
46 const char *dst_addr; /**< destination IP address (can be multicast) */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
47 const char *name; /**< session name (can be an empty string) */
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
48 };
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
49
4049
116a6910592c Rename functions in sdp.c for consistency's sake.
stefano
parents: 3788
diff changeset
50 static void sdp_write_address(char *buff, int size, const char *dest_addr, int ttl)
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
51 {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
52 if (dest_addr) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
53 if (ttl > 0) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
54 av_strlcatf(buff, size, "c=IN IP4 %s/%d\r\n", dest_addr, ttl);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
55 } else {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
56 av_strlcatf(buff, size, "c=IN IP4 %s\r\n", dest_addr);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
57 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
58 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
59 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
60
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
61 static void sdp_write_header(char *buff, int size, struct sdp_session_level *s)
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
62 {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
63 av_strlcatf(buff, size, "v=%d\r\n"
3605
e8d0c5f2ee60 Fix a typo in sdp_write_header(): change "IPV4", which is not a valid
stefano
parents: 3548
diff changeset
64 "o=- %d %d IN IP4 %s\r\n"
5291
c17cb5ef9c61 Emit the SDP lines in the correct order
lucabe
parents: 4836
diff changeset
65 "s=%s\r\n",
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
66 s->sdp_version,
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
67 s->id, s->version, s->src_addr,
4360
f0facf61e48d use new metadata API in rtp muxer
aurel
parents: 4206
diff changeset
68 s->name);
4049
116a6910592c Rename functions in sdp.c for consistency's sake.
stefano
parents: 3788
diff changeset
69 sdp_write_address(buff, size, s->dst_addr, s->ttl);
5291
c17cb5ef9c61 Emit the SDP lines in the correct order
lucabe
parents: 4836
diff changeset
70 av_strlcatf(buff, size, "t=%d %d\r\n"
c17cb5ef9c61 Emit the SDP lines in the correct order
lucabe
parents: 4836
diff changeset
71 "a=tool:libavformat " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\r\n",
c17cb5ef9c61 Emit the SDP lines in the correct order
lucabe
parents: 4836
diff changeset
72 s->start_time, s->end_time);
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
73 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
74
5525
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
75 #if CONFIG_NETWORK
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
76 static void resolve_destination(char *dest_addr, int size)
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
77 {
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
78 struct addrinfo hints, *ai, *cur;
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
79
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
80 if (!dest_addr[0])
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
81 return;
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
82
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
83 /* Resolve the destination, since it must be written
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
84 * as a numeric IP address in the SDP. */
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
85
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
86 memset(&hints, 0, sizeof(hints));
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
87 /* We only support IPv4 addresses in the SDP at the moment. */
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
88 hints.ai_family = AF_INET;
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
89 if (getaddrinfo(dest_addr, NULL, &hints, &ai))
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
90 return;
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
91 for (cur = ai; cur; cur = cur->ai_next) {
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
92 if (cur->ai_family == AF_INET) {
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
93 getnameinfo(cur->ai_addr, cur->ai_addrlen, dest_addr, size,
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
94 NULL, 0, NI_NUMERICHOST);
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
95 break;
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
96 }
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
97 }
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
98 freeaddrinfo(ai);
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
99 }
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
100 #else
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
101 static void resolve_destination(char *dest_addr, int size)
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
102 {
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
103 }
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
104 #endif
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
105
4049
116a6910592c Rename functions in sdp.c for consistency's sake.
stefano
parents: 3788
diff changeset
106 static int sdp_get_address(char *dest_addr, int size, int *ttl, const char *url)
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
107 {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
108 int port;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
109 const char *p;
5500
fc0a32a383d3 Check the URL used for the SDP destination.
lucabe
parents: 5476
diff changeset
110 char proto[32];
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
111
5775
7a123cc24a81 Rename url_split to ff_url_split
mstorsjo
parents: 5525
diff changeset
112 ff_url_split(proto, sizeof(proto), NULL, 0, dest_addr, size, &port, NULL, 0, url);
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
113
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
114 *ttl = 0;
5500
fc0a32a383d3 Check the URL used for the SDP destination.
lucabe
parents: 5476
diff changeset
115
fc0a32a383d3 Check the URL used for the SDP destination.
lucabe
parents: 5476
diff changeset
116 if (strcmp(proto, "rtp")) {
fc0a32a383d3 Check the URL used for the SDP destination.
lucabe
parents: 5476
diff changeset
117 /* The url isn't for the actual rtp sessions,
fc0a32a383d3 Check the URL used for the SDP destination.
lucabe
parents: 5476
diff changeset
118 * don't parse out anything else than the destination.
fc0a32a383d3 Check the URL used for the SDP destination.
lucabe
parents: 5476
diff changeset
119 */
fc0a32a383d3 Check the URL used for the SDP destination.
lucabe
parents: 5476
diff changeset
120 return 0;
fc0a32a383d3 Check the URL used for the SDP destination.
lucabe
parents: 5476
diff changeset
121 }
fc0a32a383d3 Check the URL used for the SDP destination.
lucabe
parents: 5476
diff changeset
122
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
123 p = strchr(url, '?');
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
124 if (p) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
125 char buff[64];
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
126 int is_multicast = find_info_tag(buff, sizeof(buff), "multicast", p);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
127
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
128 if (is_multicast) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
129 if (find_info_tag(buff, sizeof(buff), "ttl", p)) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
130 *ttl = strtol(buff, NULL, 10);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
131 } else {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
132 *ttl = 5;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
133 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
134 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
135 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
136
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
137 return port;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
138 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
139
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
140 #define MAX_PSET_SIZE 1024
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
141 static char *extradata2psets(AVCodecContext *c)
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
142 {
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
143 char *psets, *p;
3051
3ecfaa7d0f3b Missing const, fix warnings:
reimar
parents: 2961
diff changeset
144 const uint8_t *r;
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
145 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
146
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
147 if (c->extradata_size > MAX_EXTRADATA_SIZE) {
4421
a6849222fccc cosmetics: comment grammar/spelling fixes
diego
parents: 4360
diff changeset
148 av_log(c, AV_LOG_ERROR, "Too much extradata!\n");
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
149
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
150 return NULL;
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
151 }
6119
16ca32d9c5f0 Use a bitstream filter for converting the extradata syntax when generating an SDP.
lucabe
parents: 6009
diff changeset
152 if (c->extradata[0] == 1) {
16ca32d9c5f0 Use a bitstream filter for converting the extradata syntax when generating an SDP.
lucabe
parents: 6009
diff changeset
153 uint8_t *dummy_p;
16ca32d9c5f0 Use a bitstream filter for converting the extradata syntax when generating an SDP.
lucabe
parents: 6009
diff changeset
154 int dummy_int;
16ca32d9c5f0 Use a bitstream filter for converting the extradata syntax when generating an SDP.
lucabe
parents: 6009
diff changeset
155 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init("h264_mp4toannexb");
16ca32d9c5f0 Use a bitstream filter for converting the extradata syntax when generating an SDP.
lucabe
parents: 6009
diff changeset
156
16ca32d9c5f0 Use a bitstream filter for converting the extradata syntax when generating an SDP.
lucabe
parents: 6009
diff changeset
157 if (!bsfc) {
16ca32d9c5f0 Use a bitstream filter for converting the extradata syntax when generating an SDP.
lucabe
parents: 6009
diff changeset
158 av_log(c, AV_LOG_ERROR, "Cannot open the h264_mp4toannexb BSF!\n");
16ca32d9c5f0 Use a bitstream filter for converting the extradata syntax when generating an SDP.
lucabe
parents: 6009
diff changeset
159
16ca32d9c5f0 Use a bitstream filter for converting the extradata syntax when generating an SDP.
lucabe
parents: 6009
diff changeset
160 return NULL;
16ca32d9c5f0 Use a bitstream filter for converting the extradata syntax when generating an SDP.
lucabe
parents: 6009
diff changeset
161 }
16ca32d9c5f0 Use a bitstream filter for converting the extradata syntax when generating an SDP.
lucabe
parents: 6009
diff changeset
162 av_bitstream_filter_filter(bsfc, c, NULL, &dummy_p, &dummy_int, NULL, 0, 0);
16ca32d9c5f0 Use a bitstream filter for converting the extradata syntax when generating an SDP.
lucabe
parents: 6009
diff changeset
163 av_bitstream_filter_close(bsfc);
16ca32d9c5f0 Use a bitstream filter for converting the extradata syntax when generating an SDP.
lucabe
parents: 6009
diff changeset
164 }
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
165
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
166 psets = av_mallocz(MAX_PSET_SIZE);
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
167 if (psets == NULL) {
4421
a6849222fccc cosmetics: comment grammar/spelling fixes
diego
parents: 4360
diff changeset
168 av_log(c, AV_LOG_ERROR, "Cannot allocate memory for the parameter sets.\n");
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
169 return NULL;
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
170 }
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
171 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
172 p = psets + strlen(pset_string);
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
173 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
174 while (r < c->extradata + c->extradata_size) {
3051
3ecfaa7d0f3b Missing const, fix warnings:
reimar
parents: 2961
diff changeset
175 const uint8_t *r1;
4812
f7bc722a3a36 Only insert the SPS and PPS NALs in sprop-parameter-sets
lucabe
parents: 4502
diff changeset
176 uint8_t nal_type;
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
177
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
178 while (!*(r++));
4812
f7bc722a3a36 Only insert the SPS and PPS NALs in sprop-parameter-sets
lucabe
parents: 4502
diff changeset
179 nal_type = *r & 0x1f;
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
180 r1 = ff_avc_find_startcode(r, c->extradata + c->extradata_size);
4812
f7bc722a3a36 Only insert the SPS and PPS NALs in sprop-parameter-sets
lucabe
parents: 4502
diff changeset
181 if (nal_type != 7 && nal_type != 8) { /* Only output SPS and PPS */
f7bc722a3a36 Only insert the SPS and PPS NALs in sprop-parameter-sets
lucabe
parents: 4502
diff changeset
182 r = r1;
f7bc722a3a36 Only insert the SPS and PPS NALs in sprop-parameter-sets
lucabe
parents: 4502
diff changeset
183 continue;
f7bc722a3a36 Only insert the SPS and PPS NALs in sprop-parameter-sets
lucabe
parents: 4502
diff changeset
184 }
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
185 if (p != (psets + strlen(pset_string))) {
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
186 *p = ',';
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
187 p++;
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
188 }
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
189 if (av_base64_encode(p, MAX_PSET_SIZE - (p - psets), r, r1 - r) == NULL) {
4421
a6849222fccc cosmetics: comment grammar/spelling fixes
diego
parents: 4360
diff changeset
190 av_log(c, AV_LOG_ERROR, "Cannot Base64-encode %td %td!\n", MAX_PSET_SIZE - (p - psets), r1 - r);
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
191 av_free(psets);
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
192
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
193 return NULL;
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
194 }
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
195 p += strlen(p);
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
196 r = r1;
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
197 }
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
198
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
199 return psets;
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
200 }
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
201
2916
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
202 static char *extradata2config(AVCodecContext *c)
2521
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
203 {
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
204 char *config;
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
205
2916
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
206 if (c->extradata_size > MAX_EXTRADATA_SIZE) {
4421
a6849222fccc cosmetics: comment grammar/spelling fixes
diego
parents: 4360
diff changeset
207 av_log(c, AV_LOG_ERROR, "Too much extradata!\n");
2521
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
208
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
209 return NULL;
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
210 }
2916
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
211 config = av_malloc(10 + c->extradata_size * 2);
2521
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
212 if (config == NULL) {
4421
a6849222fccc cosmetics: comment grammar/spelling fixes
diego
parents: 4360
diff changeset
213 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
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 memcpy(config, "; config=", 9);
5883
fd37c39041cd Add a lowercase parameter to ff_data_to_hex
mstorsjo
parents: 5775
diff changeset
217 ff_data_to_hex(config + 9, c->extradata, c->extradata_size, 0);
2916
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
218 config[9 + c->extradata_size * 2] = 0;
2521
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
219
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
220 return config;
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
221 }
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
222
4049
116a6910592c Rename functions in sdp.c for consistency's sake.
stefano
parents: 3788
diff changeset
223 static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c, int payload_type)
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
224 {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
225 char *config = NULL;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
226
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
227 switch (c->codec_id) {
2958
b489d30f8685 Add minimal support for H.264 video in the SDP generator
lucabe
parents: 2916
diff changeset
228 case CODEC_ID_H264:
2961
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
229 if (c->extradata_size) {
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
230 config = extradata2psets(c);
b9a3b81c5eb8 Support out-of-band parameter sets in SDP for H.264 video
lucabe
parents: 2958
diff changeset
231 }
2958
b489d30f8685 Add minimal support for H.264 video in the SDP generator
lucabe
parents: 2916
diff changeset
232 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
233 "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
234 payload_type,
b489d30f8685 Add minimal support for H.264 video in the SDP generator
lucabe
parents: 2916
diff changeset
235 payload_type, config ? config : "");
b489d30f8685 Add minimal support for H.264 video in the SDP generator
lucabe
parents: 2916
diff changeset
236 break;
4814
730b214077ca Add support for H.263 video in the RTP muxer
lucabe
parents: 4812
diff changeset
237 case CODEC_ID_H263:
730b214077ca Add support for H.263 video in the RTP muxer
lucabe
parents: 4812
diff changeset
238 case CODEC_ID_H263P:
730b214077ca Add support for H.263 video in the RTP muxer
lucabe
parents: 4812
diff changeset
239 av_strlcatf(buff, size, "a=rtpmap:%d H263-2000/90000\r\n", payload_type);
730b214077ca Add support for H.263 video in the RTP muxer
lucabe
parents: 4812
diff changeset
240 break;
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
241 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
242 if (c->extradata_size) {
2916
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
243 config = extradata2config(c);
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
244 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
245 av_strlcatf(buff, size, "a=rtpmap:%d MP4V-ES/90000\r\n"
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
246 "a=fmtp:%d profile-level-id=1%s\r\n",
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
247 payload_type,
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
248 payload_type, config ? config : "");
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
249 break;
2521
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
250 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
251 if (c->extradata_size) {
2916
c2588e541432 Pass a proper context to av_log()
lucabe
parents: 2729
diff changeset
252 config = extradata2config(c);
2521
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
253 } else {
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
254 /* FIXME: maybe we can forge config information based on the
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
255 * codec parameters...
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
256 */
4421
a6849222fccc cosmetics: comment grammar/spelling fixes
diego
parents: 4360
diff changeset
257 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
258 return NULL;
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
259 }
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
260 if (config == NULL) {
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
261 return NULL;
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
262 }
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
263 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
264 "a=fmtp:%d profile-level-id=1;"
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
265 "mode=AAC-hbr;sizelength=13;indexlength=3;"
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
266 "indexdeltalength=3%s\r\n",
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
267 payload_type, c->sample_rate, c->channels,
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
268 payload_type, config);
776b5c2a1bf1 AAC support in the SDP generator
lucabe
parents: 2422
diff changeset
269 break;
2729
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
270 case CODEC_ID_PCM_S16BE:
5474
ff40a9607f5b Use RTP_PT_PRIVATE in sdp.c instead of hardcoding 96.
lucabe
parents: 5291
diff changeset
271 if (payload_type >= RTP_PT_PRIVATE)
2729
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
272 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
273 payload_type,
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
274 c->sample_rate, c->channels);
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
275 break;
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
276 case CODEC_ID_PCM_MULAW:
5474
ff40a9607f5b Use RTP_PT_PRIVATE in sdp.c instead of hardcoding 96.
lucabe
parents: 5291
diff changeset
277 if (payload_type >= RTP_PT_PRIVATE)
2729
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
278 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
279 payload_type,
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
280 c->sample_rate, c->channels);
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
281 break;
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
282 case CODEC_ID_PCM_ALAW:
5474
ff40a9607f5b Use RTP_PT_PRIVATE in sdp.c instead of hardcoding 96.
lucabe
parents: 5291
diff changeset
283 if (payload_type >= RTP_PT_PRIVATE)
2729
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
284 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
285 payload_type,
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
286 c->sample_rate, c->channels);
e808770ba0c6 Add support for some more audio formats
lucabe
parents: 2677
diff changeset
287 break;
4836
bf87d9ffb3ae Add support for AMR audio in the RTP muxer
lucabe
parents: 4814
diff changeset
288 case CODEC_ID_AMR_NB:
bf87d9ffb3ae Add support for AMR audio in the RTP muxer
lucabe
parents: 4814
diff changeset
289 av_strlcatf(buff, size, "a=rtpmap:%d AMR/%d/%d\r\n"
bf87d9ffb3ae Add support for AMR audio in the RTP muxer
lucabe
parents: 4814
diff changeset
290 "a=fmtp:%d octet-align=1\r\n",
bf87d9ffb3ae Add support for AMR audio in the RTP muxer
lucabe
parents: 4814
diff changeset
291 payload_type, c->sample_rate, c->channels,
bf87d9ffb3ae Add support for AMR audio in the RTP muxer
lucabe
parents: 4814
diff changeset
292 payload_type);
bf87d9ffb3ae Add support for AMR audio in the RTP muxer
lucabe
parents: 4814
diff changeset
293 break;
bf87d9ffb3ae Add support for AMR audio in the RTP muxer
lucabe
parents: 4814
diff changeset
294 case CODEC_ID_AMR_WB:
bf87d9ffb3ae Add support for AMR audio in the RTP muxer
lucabe
parents: 4814
diff changeset
295 av_strlcatf(buff, size, "a=rtpmap:%d AMR-WB/%d/%d\r\n"
bf87d9ffb3ae Add support for AMR audio in the RTP muxer
lucabe
parents: 4814
diff changeset
296 "a=fmtp:%d octet-align=1\r\n",
bf87d9ffb3ae Add support for AMR audio in the RTP muxer
lucabe
parents: 4814
diff changeset
297 payload_type, c->sample_rate, c->channels,
bf87d9ffb3ae Add support for AMR audio in the RTP muxer
lucabe
parents: 4814
diff changeset
298 payload_type);
bf87d9ffb3ae Add support for AMR audio in the RTP muxer
lucabe
parents: 4814
diff changeset
299 break;
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
300 default:
4421
a6849222fccc cosmetics: comment grammar/spelling fixes
diego
parents: 4360
diff changeset
301 /* Nothing special to do here... */
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
302 break;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
303 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
304
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
305 av_free(config);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
306
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
307 return buff;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
308 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
309
6009
b740f4918397 Make ff_sdp_write_media a lavf-internal function
mstorsjo
parents: 5910
diff changeset
310 void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *dest_addr, int port, int ttl)
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
311 {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
312 const char *type;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
313 int payload_type;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
314
4502
daca5391106a Rename rtp_get_payload_type() to ff_rtp_get_payload_type(), as it is not
lucabe
parents: 4421
diff changeset
315 payload_type = ff_rtp_get_payload_type(c);
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
316 if (payload_type < 0) {
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5883
diff changeset
317 payload_type = RTP_PT_PRIVATE + (c->codec_type == AVMEDIA_TYPE_AUDIO);
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
318 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
319
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
320 switch (c->codec_type) {
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5883
diff changeset
321 case AVMEDIA_TYPE_VIDEO : type = "video" ; break;
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5883
diff changeset
322 case AVMEDIA_TYPE_AUDIO : type = "audio" ; break;
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5883
diff changeset
323 case AVMEDIA_TYPE_SUBTITLE: type = "text" ; break;
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
324 default : type = "application"; break;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
325 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
326
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
327 av_strlcatf(buff, size, "m=%s %d RTP/AVP %d\r\n", type, port, payload_type);
4049
116a6910592c Rename functions in sdp.c for consistency's sake.
stefano
parents: 3788
diff changeset
328 sdp_write_address(buff, size, dest_addr, ttl);
3113
f1aecf52bac5 Add some information about the stream bitrate, if available
lucabe
parents: 3051
diff changeset
329 if (c->bit_rate) {
f1aecf52bac5 Add some information about the stream bitrate, if available
lucabe
parents: 3051
diff changeset
330 av_strlcatf(buff, size, "b=AS:%d\r\n", c->bit_rate / 1000);
f1aecf52bac5 Add some information about the stream bitrate, if available
lucabe
parents: 3051
diff changeset
331 }
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
332
4049
116a6910592c Rename functions in sdp.c for consistency's sake.
stefano
parents: 3788
diff changeset
333 sdp_write_media_attributes(buff, size, c, payload_type);
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
334 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
335
2317
2adc9f64ecfb Change avf_sdp_create() to get a pre-allocated buffer as input, and to
lucabe
parents: 2316
diff changeset
336 int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size)
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
337 {
4360
f0facf61e48d use new metadata API in rtp muxer
aurel
parents: 4206
diff changeset
338 AVMetadataTag *title = av_metadata_get(ac[0]->metadata, "title", NULL, 0);
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
339 struct sdp_session_level s;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
340 int i, j, port, ttl;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
341 char dst[32];
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
342
2422
f3a8f7d55bd1 Fill the buffer with 0 before writing an SDP in it
lucabe
parents: 2317
diff changeset
343 memset(buff, 0, size);
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
344 memset(&s, 0, sizeof(struct sdp_session_level));
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
345 s.user = "-";
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
346 s.src_addr = "127.0.0.1"; /* FIXME: Properly set this */
4360
f0facf61e48d use new metadata API in rtp muxer
aurel
parents: 4206
diff changeset
347 s.name = title ? title->value : "No Name";
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
348
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
349 port = 0;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
350 ttl = 0;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
351 if (n_files == 1) {
4049
116a6910592c Rename functions in sdp.c for consistency's sake.
stefano
parents: 3788
diff changeset
352 port = sdp_get_address(dst, sizeof(dst), &ttl, ac[0]->filename);
5525
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
353 resolve_destination(dst, sizeof(dst));
5501
89259491d541 Always set the destination address even if no port was found.
lucabe
parents: 5500
diff changeset
354 if (dst[0]) {
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
355 s.dst_addr = dst;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
356 s.ttl = ttl;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
357 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
358 }
2317
2adc9f64ecfb Change avf_sdp_create() to get a pre-allocated buffer as input, and to
lucabe
parents: 2316
diff changeset
359 sdp_write_header(buff, size, &s);
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
360
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
361 dst[0] = 0;
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
362 for (i = 0; i < n_files; i++) {
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
363 if (n_files != 1) {
4049
116a6910592c Rename functions in sdp.c for consistency's sake.
stefano
parents: 3788
diff changeset
364 port = sdp_get_address(dst, sizeof(dst), &ttl, ac[i]->filename);
5525
f484a964bed1 Make sure the destination address is written as an IP address in the SDP
lucabe
parents: 5501
diff changeset
365 resolve_destination(dst, sizeof(dst));
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
366 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
367 for (j = 0; j < ac[i]->nb_streams; j++) {
6009
b740f4918397 Make ff_sdp_write_media a lavf-internal function
mstorsjo
parents: 5910
diff changeset
368 ff_sdp_write_media(buff, size,
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
369 ac[i]->streams[j]->codec, dst[0] ? dst : NULL,
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
370 (port > 0) ? port + j * 2 : 0, ttl);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
371 if (port <= 0) {
2317
2adc9f64ecfb Change avf_sdp_create() to get a pre-allocated buffer as input, and to
lucabe
parents: 2316
diff changeset
372 av_strlcatf(buff, size,
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
373 "a=control:streamid=%d\r\n", i + j);
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
374 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
375 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
376 }
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
377
2317
2adc9f64ecfb Change avf_sdp_create() to get a pre-allocated buffer as input, and to
lucabe
parents: 2316
diff changeset
378 return 0;
2284
59d84b0f7d30 Introduce an SDP generator
lucabe
parents:
diff changeset
379 }
2316
5a4914f78109 Fix linking when RTP is disabled and libraries are dynamic
lucabe
parents: 2284
diff changeset
380 #else
2317
2adc9f64ecfb Change avf_sdp_create() to get a pre-allocated buffer as input, and to
lucabe
parents: 2316
diff changeset
381 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
382 {
2317
2adc9f64ecfb Change avf_sdp_create() to get a pre-allocated buffer as input, and to
lucabe
parents: 2316
diff changeset
383 return AVERROR(ENOSYS);
2316
5a4914f78109 Fix linking when RTP is disabled and libraries are dynamic
lucabe
parents: 2284
diff changeset
384 }
6009
b740f4918397 Make ff_sdp_write_media a lavf-internal function
mstorsjo
parents: 5910
diff changeset
385
b740f4918397 Make ff_sdp_write_media a lavf-internal function
mstorsjo
parents: 5910
diff changeset
386 void ff_sdp_write_media(char *buff, int size, AVCodecContext *c,
b740f4918397 Make ff_sdp_write_media a lavf-internal function
mstorsjo
parents: 5910
diff changeset
387 const char *dest_addr, int port, int ttl)
b740f4918397 Make ff_sdp_write_media a lavf-internal function
mstorsjo
parents: 5910
diff changeset
388 {
b740f4918397 Make ff_sdp_write_media a lavf-internal function
mstorsjo
parents: 5910
diff changeset
389 }
2316
5a4914f78109 Fix linking when RTP is disabled and libraries are dynamic
lucabe
parents: 2284
diff changeset
390 #endif