sdp.c
Go to the documentation of this file.
1 /*
2  * copyright (c) 2007 Luca Abeni
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include <string.h>
22 #include "libavutil/avstring.h"
23 #include "libavutil/base64.h"
24 #include "libavutil/dict.h"
25 #include "libavutil/parseutils.h"
26 #include "libavutil/opt.h"
27 #include "libavcodec/xiph.h"
28 #include "libavcodec/mpeg4audio.h"
29 #include "avformat.h"
30 #include "internal.h"
31 #include "avc.h"
32 #include "rtp.h"
33 #if CONFIG_NETWORK
34 #include "network.h"
35 #endif
36 
37 #if CONFIG_RTP_MUXER
38 #define MAX_EXTRADATA_SIZE ((INT_MAX - 10) / 2)
39 
40 struct sdp_session_level {
41  int sdp_version; /**< protocol version (currently 0) */
42  int id; /**< session ID */
43  int version; /**< session version */
44  int start_time; /**< session start time (NTP time, in seconds),
45  or 0 in case of permanent session */
46  int end_time; /**< session end time (NTP time, in seconds),
47  or 0 if the session is not bounded */
48  int ttl; /**< TTL, in case of multicast stream */
49  const char *user; /**< username of the session's creator */
50  const char *src_addr; /**< IP address of the machine from which the session was created */
51  const char *src_type; /**< address type of src_addr */
52  const char *dst_addr; /**< destination IP address (can be multicast) */
53  const char *dst_type; /**< destination IP address type */
54  const char *name; /**< session name (can be an empty string) */
55 };
56 
57 static void sdp_write_address(char *buff, int size, const char *dest_addr,
58  const char *dest_type, int ttl)
59 {
60  if (dest_addr) {
61  if (!dest_type)
62  dest_type = "IP4";
63  if (ttl > 0 && !strcmp(dest_type, "IP4")) {
64  /* The TTL should only be specified for IPv4 multicast addresses,
65  * not for IPv6. */
66  av_strlcatf(buff, size, "c=IN %s %s/%d\r\n", dest_type, dest_addr, ttl);
67  } else {
68  av_strlcatf(buff, size, "c=IN %s %s\r\n", dest_type, dest_addr);
69  }
70  }
71 }
72 
73 static void sdp_write_header(char *buff, int size, struct sdp_session_level *s)
74 {
75  av_strlcatf(buff, size, "v=%d\r\n"
76  "o=- %d %d IN %s %s\r\n"
77  "s=%s\r\n",
78  s->sdp_version,
79  s->id, s->version, s->src_type, s->src_addr,
80  s->name);
81  sdp_write_address(buff, size, s->dst_addr, s->dst_type, s->ttl);
82  av_strlcatf(buff, size, "t=%d %d\r\n"
83  "a=tool:libavformat " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\r\n",
84  s->start_time, s->end_time);
85 }
86 
87 #if CONFIG_NETWORK
88 static int resolve_destination(char *dest_addr, int size, char *type,
89  int type_size)
90 {
91  struct addrinfo hints = { 0 }, *ai;
92  int is_multicast;
93 
94  av_strlcpy(type, "IP4", type_size);
95  if (!dest_addr[0])
96  return 0;
97 
98  /* Resolve the destination, since it must be written
99  * as a numeric IP address in the SDP. */
100 
101  if (getaddrinfo(dest_addr, NULL, &hints, &ai))
102  return 0;
103  getnameinfo(ai->ai_addr, ai->ai_addrlen, dest_addr, size,
104  NULL, 0, NI_NUMERICHOST);
105 #ifdef AF_INET6
106  if (ai->ai_family == AF_INET6)
107  av_strlcpy(type, "IP6", type_size);
108 #endif
109  is_multicast = ff_is_multicast_address(ai->ai_addr);
110  freeaddrinfo(ai);
111  return is_multicast;
112 }
113 #else
114 static int resolve_destination(char *dest_addr, int size, char *type,
115  int type_size)
116 {
117  return 0;
118 }
119 #endif
120 
121 static int sdp_get_address(char *dest_addr, int size, int *ttl, const char *url)
122 {
123  int port;
124  const char *p;
125  char proto[32];
126 
127  av_url_split(proto, sizeof(proto), NULL, 0, dest_addr, size, &port, NULL, 0, url);
128 
129  *ttl = 0;
130 
131  if (strcmp(proto, "rtp") && strcmp(proto, "srtp")) {
132  /* The url isn't for the actual rtp sessions,
133  * don't parse out anything else than the destination.
134  */
135  return 0;
136  }
137 
138  p = strchr(url, '?');
139  if (p) {
140  char buff[64];
141 
142  if (av_find_info_tag(buff, sizeof(buff), "ttl", p)) {
143  *ttl = strtol(buff, NULL, 10);
144  } else {
145  *ttl = 5;
146  }
147  }
148 
149  return port;
150 }
151 
152 #define MAX_PSET_SIZE 1024
153 static char *extradata2psets(AVCodecContext *c)
154 {
155  char *psets, *p;
156  const uint8_t *r;
157  static const char pset_string[] = "; sprop-parameter-sets=";
158  static const char profile_string[] = "; profile-level-id=";
159  uint8_t *orig_extradata = NULL;
160  int orig_extradata_size = 0;
161  const uint8_t *sps = NULL, *sps_end;
162 
164  av_log(c, AV_LOG_ERROR, "Too much extradata!\n");
165 
166  return NULL;
167  }
168  if (c->extradata[0] == 1) {
169  uint8_t *dummy_p;
170  int dummy_int;
171  AVBitStreamFilterContext *bsfc= av_bitstream_filter_init("h264_mp4toannexb");
172 
173  if (!bsfc) {
174  av_log(c, AV_LOG_ERROR, "Cannot open the h264_mp4toannexb BSF!\n");
175 
176  return NULL;
177  }
178 
179  orig_extradata_size = c->extradata_size;
180  orig_extradata = av_mallocz(orig_extradata_size +
182  if (!orig_extradata) {
184  return NULL;
185  }
186  memcpy(orig_extradata, c->extradata, orig_extradata_size);
187  av_bitstream_filter_filter(bsfc, c, NULL, &dummy_p, &dummy_int, NULL, 0, 0);
189  }
190 
191  psets = av_mallocz(MAX_PSET_SIZE);
192  if (psets == NULL) {
193  av_log(c, AV_LOG_ERROR, "Cannot allocate memory for the parameter sets.\n");
194  av_free(orig_extradata);
195  return NULL;
196  }
197  memcpy(psets, pset_string, strlen(pset_string));
198  p = psets + strlen(pset_string);
200  while (r < c->extradata + c->extradata_size) {
201  const uint8_t *r1;
202  uint8_t nal_type;
203 
204  while (!*(r++));
205  nal_type = *r & 0x1f;
207  if (nal_type != 7 && nal_type != 8) { /* Only output SPS and PPS */
208  r = r1;
209  continue;
210  }
211  if (p != (psets + strlen(pset_string))) {
212  *p = ',';
213  p++;
214  }
215  if (!sps) {
216  sps = r;
217  sps_end = r1;
218  }
219  if (av_base64_encode(p, MAX_PSET_SIZE - (p - psets), r, r1 - r) == NULL) {
220  av_log(c, AV_LOG_ERROR, "Cannot Base64-encode %td %td!\n", MAX_PSET_SIZE - (p - psets), r1 - r);
221  av_free(psets);
222 
223  return NULL;
224  }
225  p += strlen(p);
226  r = r1;
227  }
228  if (sps && sps_end - sps >= 4) {
229  memcpy(p, profile_string, strlen(profile_string));
230  p += strlen(p);
231  ff_data_to_hex(p, sps + 1, 3, 0);
232  p[6] = '\0';
233  }
234  if (orig_extradata) {
235  av_free(c->extradata);
236  c->extradata = orig_extradata;
237  c->extradata_size = orig_extradata_size;
238  }
239 
240  return psets;
241 }
242 
243 static char *extradata2config(AVCodecContext *c)
244 {
245  char *config;
246 
248  av_log(c, AV_LOG_ERROR, "Too much extradata!\n");
249 
250  return NULL;
251  }
252  config = av_malloc(10 + c->extradata_size * 2);
253  if (config == NULL) {
254  av_log(c, AV_LOG_ERROR, "Cannot allocate memory for the config info.\n");
255  return NULL;
256  }
257  memcpy(config, "; config=", 9);
258  ff_data_to_hex(config + 9, c->extradata, c->extradata_size, 0);
259  config[9 + c->extradata_size * 2] = 0;
260 
261  return config;
262 }
263 
264 static char *xiph_extradata2config(AVCodecContext *c)
265 {
266  char *config, *encoded_config;
267  uint8_t *header_start[3];
268  int headers_len, header_len[3], config_len;
269  int first_header_size;
270 
271  switch (c->codec_id) {
272  case AV_CODEC_ID_THEORA:
273  first_header_size = 42;
274  break;
275  case AV_CODEC_ID_VORBIS:
276  first_header_size = 30;
277  break;
278  default:
279  av_log(c, AV_LOG_ERROR, "Unsupported Xiph codec ID\n");
280  return NULL;
281  }
282 
284  first_header_size, header_start,
285  header_len) < 0) {
286  av_log(c, AV_LOG_ERROR, "Extradata corrupt.\n");
287  return NULL;
288  }
289 
290  headers_len = header_len[0] + header_len[2];
291  config_len = 4 + // count
292  3 + // ident
293  2 + // packet size
294  1 + // header count
295  2 + // header size
296  headers_len; // and the rest
297 
298  config = av_malloc(config_len);
299  if (!config)
300  goto xiph_fail;
301 
302  encoded_config = av_malloc(AV_BASE64_SIZE(config_len));
303  if (!encoded_config) {
304  av_free(config);
305  goto xiph_fail;
306  }
307 
308  config[0] = config[1] = config[2] = 0;
309  config[3] = 1;
310  config[4] = (RTP_XIPH_IDENT >> 16) & 0xff;
311  config[5] = (RTP_XIPH_IDENT >> 8) & 0xff;
312  config[6] = (RTP_XIPH_IDENT ) & 0xff;
313  config[7] = (headers_len >> 8) & 0xff;
314  config[8] = headers_len & 0xff;
315  config[9] = 2;
316  config[10] = header_len[0];
317  config[11] = 0; // size of comment header; nonexistent
318  memcpy(config + 12, header_start[0], header_len[0]);
319  memcpy(config + 12 + header_len[0], header_start[2], header_len[2]);
320 
321  av_base64_encode(encoded_config, AV_BASE64_SIZE(config_len),
322  config, config_len);
323  av_free(config);
324 
325  return encoded_config;
326 
327 xiph_fail:
328  av_log(c, AV_LOG_ERROR,
329  "Not enough memory for configuration string\n");
330  return NULL;
331 }
332 
333 static int latm_context2profilelevel(AVCodecContext *c)
334 {
335  /* MP4A-LATM
336  * The RTP payload format specification is described in RFC 3016
337  * The encoding specifications are provided in ISO/IEC 14496-3 */
338 
339  int profile_level = 0x2B;
340 
341  /* TODO: AAC Profile only supports AAC LC Object Type.
342  * Different Object Types should implement different Profile Levels */
343 
344  if (c->sample_rate <= 24000) {
345  if (c->channels <= 2)
346  profile_level = 0x28; // AAC Profile, Level 1
347  } else if (c->sample_rate <= 48000) {
348  if (c->channels <= 2) {
349  profile_level = 0x29; // AAC Profile, Level 2
350  } else if (c->channels <= 5) {
351  profile_level = 0x2A; // AAC Profile, Level 4
352  }
353  } else if (c->sample_rate <= 96000) {
354  if (c->channels <= 5) {
355  profile_level = 0x2B; // AAC Profile, Level 5
356  }
357  }
358 
359  return profile_level;
360 }
361 
362 static char *latm_context2config(AVCodecContext *c)
363 {
364  /* MP4A-LATM
365  * The RTP payload format specification is described in RFC 3016
366  * The encoding specifications are provided in ISO/IEC 14496-3 */
367 
368  uint8_t config_byte[6];
369  int rate_index;
370  char *config;
371 
372  for (rate_index = 0; rate_index < 16; rate_index++)
373  if (avpriv_mpeg4audio_sample_rates[rate_index] == c->sample_rate)
374  break;
375  if (rate_index == 16) {
376  av_log(c, AV_LOG_ERROR, "Unsupported sample rate\n");
377  return NULL;
378  }
379 
380  config_byte[0] = 0x40;
381  config_byte[1] = 0;
382  config_byte[2] = 0x20 | rate_index;
383  config_byte[3] = c->channels << 4;
384  config_byte[4] = 0x3f;
385  config_byte[5] = 0xc0;
386 
387  config = av_malloc(6*2+1);
388  if (!config) {
389  av_log(c, AV_LOG_ERROR, "Cannot allocate memory for the config info.\n");
390  return NULL;
391  }
392  ff_data_to_hex(config, config_byte, 6, 1);
393  config[12] = 0;
394 
395  return config;
396 }
397 
398 static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c, int payload_type, AVFormatContext *fmt)
399 {
400  char *config = NULL;
401 
402  switch (c->codec_id) {
403  case AV_CODEC_ID_H264: {
404  int mode = 1;
405  if (fmt && fmt->oformat->priv_class &&
406  av_opt_flag_is_set(fmt->priv_data, "rtpflags", "h264_mode0"))
407  mode = 0;
408  if (c->extradata_size) {
409  config = extradata2psets(c);
410  }
411  av_strlcatf(buff, size, "a=rtpmap:%d H264/90000\r\n"
412  "a=fmtp:%d packetization-mode=%d%s\r\n",
413  payload_type,
414  payload_type, mode, config ? config : "");
415  break;
416  }
417  case AV_CODEC_ID_H263:
418  case AV_CODEC_ID_H263P:
419  /* a=framesize is required by 3GPP TS 26.234 (PSS). It
420  * actually specifies the maximum video size, but we only know
421  * the current size. This is required for playback on Android
422  * stagefright and on Samsung bada. */
423  if (!fmt || !fmt->oformat->priv_class ||
424  !av_opt_flag_is_set(fmt->priv_data, "rtpflags", "rfc2190") ||
426  av_strlcatf(buff, size, "a=rtpmap:%d H263-2000/90000\r\n"
427  "a=framesize:%d %d-%d\r\n",
428  payload_type,
429  payload_type, c->width, c->height);
430  break;
431  case AV_CODEC_ID_MPEG4:
432  if (c->extradata_size) {
433  config = extradata2config(c);
434  }
435  av_strlcatf(buff, size, "a=rtpmap:%d MP4V-ES/90000\r\n"
436  "a=fmtp:%d profile-level-id=1%s\r\n",
437  payload_type,
438  payload_type, config ? config : "");
439  break;
440  case AV_CODEC_ID_AAC:
441  if (fmt && fmt->oformat && fmt->oformat->priv_class &&
442  av_opt_flag_is_set(fmt->priv_data, "rtpflags", "latm")) {
443  config = latm_context2config(c);
444  if (!config)
445  return NULL;
446  av_strlcatf(buff, size, "a=rtpmap:%d MP4A-LATM/%d/%d\r\n"
447  "a=fmtp:%d profile-level-id=%d;cpresent=0;config=%s\r\n",
448  payload_type, c->sample_rate, c->channels,
449  payload_type, latm_context2profilelevel(c), config);
450  } else {
451  if (c->extradata_size) {
452  config = extradata2config(c);
453  } else {
454  /* FIXME: maybe we can forge config information based on the
455  * codec parameters...
456  */
457  av_log(c, AV_LOG_ERROR, "AAC with no global headers is currently not supported.\n");
458  return NULL;
459  }
460  if (config == NULL) {
461  return NULL;
462  }
463  av_strlcatf(buff, size, "a=rtpmap:%d MPEG4-GENERIC/%d/%d\r\n"
464  "a=fmtp:%d profile-level-id=1;"
465  "mode=AAC-hbr;sizelength=13;indexlength=3;"
466  "indexdeltalength=3%s\r\n",
467  payload_type, c->sample_rate, c->channels,
468  payload_type, config);
469  }
470  break;
472  if (payload_type >= RTP_PT_PRIVATE)
473  av_strlcatf(buff, size, "a=rtpmap:%d L16/%d/%d\r\n",
474  payload_type,
475  c->sample_rate, c->channels);
476  break;
478  if (payload_type >= RTP_PT_PRIVATE)
479  av_strlcatf(buff, size, "a=rtpmap:%d PCMU/%d/%d\r\n",
480  payload_type,
481  c->sample_rate, c->channels);
482  break;
484  if (payload_type >= RTP_PT_PRIVATE)
485  av_strlcatf(buff, size, "a=rtpmap:%d PCMA/%d/%d\r\n",
486  payload_type,
487  c->sample_rate, c->channels);
488  break;
489  case AV_CODEC_ID_AMR_NB:
490  av_strlcatf(buff, size, "a=rtpmap:%d AMR/%d/%d\r\n"
491  "a=fmtp:%d octet-align=1\r\n",
492  payload_type, c->sample_rate, c->channels,
493  payload_type);
494  break;
495  case AV_CODEC_ID_AMR_WB:
496  av_strlcatf(buff, size, "a=rtpmap:%d AMR-WB/%d/%d\r\n"
497  "a=fmtp:%d octet-align=1\r\n",
498  payload_type, c->sample_rate, c->channels,
499  payload_type);
500  break;
501  case AV_CODEC_ID_VORBIS:
502  if (c->extradata_size)
503  config = xiph_extradata2config(c);
504  else
505  av_log(c, AV_LOG_ERROR, "Vorbis configuration info missing\n");
506  if (!config)
507  return NULL;
508 
509  av_strlcatf(buff, size, "a=rtpmap:%d vorbis/%d/%d\r\n"
510  "a=fmtp:%d configuration=%s\r\n",
511  payload_type, c->sample_rate, c->channels,
512  payload_type, config);
513  break;
514  case AV_CODEC_ID_THEORA: {
515  const char *pix_fmt;
516  if (c->extradata_size)
517  config = xiph_extradata2config(c);
518  else
519  av_log(c, AV_LOG_ERROR, "Theora configuation info missing\n");
520  if (!config)
521  return NULL;
522 
523  switch (c->pix_fmt) {
524  case AV_PIX_FMT_YUV420P:
525  pix_fmt = "YCbCr-4:2:0";
526  break;
527  case AV_PIX_FMT_YUV422P:
528  pix_fmt = "YCbCr-4:2:2";
529  break;
530  case AV_PIX_FMT_YUV444P:
531  pix_fmt = "YCbCr-4:4:4";
532  break;
533  default:
534  av_log(c, AV_LOG_ERROR, "Unsupported pixel format.\n");
535  return NULL;
536  }
537 
538  av_strlcatf(buff, size, "a=rtpmap:%d theora/90000\r\n"
539  "a=fmtp:%d delivery-method=inline; "
540  "width=%d; height=%d; sampling=%s; "
541  "configuration=%s\r\n",
542  payload_type, payload_type,
543  c->width, c->height, pix_fmt, config);
544  break;
545  }
546  case AV_CODEC_ID_VP8:
547  av_strlcatf(buff, size, "a=rtpmap:%d VP8/90000\r\n",
548  payload_type);
549  break;
550  case AV_CODEC_ID_MJPEG:
551  if (payload_type >= RTP_PT_PRIVATE)
552  av_strlcatf(buff, size, "a=rtpmap:%d JPEG/90000\r\n",
553  payload_type);
554  break;
556  if (payload_type >= RTP_PT_PRIVATE)
557  av_strlcatf(buff, size, "a=rtpmap:%d G722/%d/%d\r\n",
558  payload_type,
559  8000, c->channels);
560  break;
561  case AV_CODEC_ID_ADPCM_G726: {
562  if (payload_type >= RTP_PT_PRIVATE)
563  av_strlcatf(buff, size, "a=rtpmap:%d G726-%d/%d\r\n",
564  payload_type,
566  c->sample_rate);
567  break;
568  }
569  case AV_CODEC_ID_ILBC:
570  av_strlcatf(buff, size, "a=rtpmap:%d iLBC/%d\r\n"
571  "a=fmtp:%d mode=%d\r\n",
572  payload_type, c->sample_rate,
573  payload_type, c->block_align == 38 ? 20 : 30);
574  break;
575  case AV_CODEC_ID_SPEEX:
576  av_strlcatf(buff, size, "a=rtpmap:%d speex/%d\r\n",
577  payload_type, c->sample_rate);
578  if (c->codec) {
579  const char *mode;
580  uint64_t vad_option;
581 
582  if (c->flags & CODEC_FLAG_QSCALE)
583  mode = "on";
584  else if (!av_opt_get_int(c, "vad", AV_OPT_FLAG_ENCODING_PARAM, &vad_option) && vad_option)
585  mode = "vad";
586  else
587  mode = "off";
588 
589  av_strlcatf(buff, size, "a=fmtp:%d vbr=%s\r\n",
590  payload_type, mode);
591  }
592  break;
593  case AV_CODEC_ID_OPUS:
594  av_strlcatf(buff, size, "a=rtpmap:%d opus/48000\r\n",
595  payload_type);
596  break;
597  default:
598  /* Nothing special to do here... */
599  break;
600  }
601 
602  av_free(config);
603 
604  return buff;
605 }
606 
607 void ff_sdp_write_media(char *buff, int size, AVStream *st, int idx,
608  const char *dest_addr, const char *dest_type,
609  int port, int ttl, AVFormatContext *fmt)
610 {
611  AVCodecContext *c = st->codec;
612  const char *type;
613  int payload_type;
614 
615  payload_type = ff_rtp_get_payload_type(fmt, c, idx);
616 
617  switch (c->codec_type) {
618  case AVMEDIA_TYPE_VIDEO : type = "video" ; break;
619  case AVMEDIA_TYPE_AUDIO : type = "audio" ; break;
620  case AVMEDIA_TYPE_SUBTITLE: type = "text" ; break;
621  default : type = "application"; break;
622  }
623 
624  av_strlcatf(buff, size, "m=%s %d RTP/AVP %d\r\n", type, port, payload_type);
625  sdp_write_address(buff, size, dest_addr, dest_type, ttl);
626  if (c->bit_rate) {
627  av_strlcatf(buff, size, "b=AS:%d\r\n", c->bit_rate / 1000);
628  }
629 
630  sdp_write_media_attributes(buff, size, c, payload_type, fmt);
631 }
632 
633 int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size)
634 {
635  AVDictionaryEntry *title = av_dict_get(ac[0]->metadata, "title", NULL, 0);
636  struct sdp_session_level s = { 0 };
637  int i, j, port, ttl, is_multicast, index = 0;
638  char dst[32], dst_type[5];
639 
640  memset(buf, 0, size);
641  s.user = "-";
642  s.src_addr = "127.0.0.1"; /* FIXME: Properly set this */
643  s.src_type = "IP4";
644  s.name = title ? title->value : "No Name";
645 
646  port = 0;
647  ttl = 0;
648  if (n_files == 1) {
649  port = sdp_get_address(dst, sizeof(dst), &ttl, ac[0]->filename);
650  is_multicast = resolve_destination(dst, sizeof(dst), dst_type,
651  sizeof(dst_type));
652  if (!is_multicast)
653  ttl = 0;
654  if (dst[0]) {
655  s.dst_addr = dst;
656  s.dst_type = dst_type;
657  s.ttl = ttl;
658  if (!strcmp(dst_type, "IP6")) {
659  s.src_addr = "::1";
660  s.src_type = "IP6";
661  }
662  }
663  }
664  sdp_write_header(buf, size, &s);
665 
666  dst[0] = 0;
667  for (i = 0; i < n_files; i++) {
668  if (n_files != 1) {
669  port = sdp_get_address(dst, sizeof(dst), &ttl, ac[i]->filename);
670  is_multicast = resolve_destination(dst, sizeof(dst), dst_type,
671  sizeof(dst_type));
672  if (!is_multicast)
673  ttl = 0;
674  }
675  for (j = 0; j < ac[i]->nb_streams; j++) {
676  ff_sdp_write_media(buf, size, ac[i]->streams[j], index++,
677  dst[0] ? dst : NULL, dst_type,
678  (port > 0) ? port + j * 2 : 0,
679  ttl, ac[i]);
680  if (port <= 0) {
681  av_strlcatf(buf, size,
682  "a=control:streamid=%d\r\n", i + j);
683  }
684  if (ac[i]->pb && ac[i]->pb->av_class) {
685  uint8_t *crypto_suite = NULL, *crypto_params = NULL;
686  av_opt_get(ac[i]->pb, "srtp_out_suite", AV_OPT_SEARCH_CHILDREN,
687  &crypto_suite);
688  av_opt_get(ac[i]->pb, "srtp_out_params", AV_OPT_SEARCH_CHILDREN,
689  &crypto_params);
690  if (crypto_suite && crypto_suite[0])
691  av_strlcatf(buf, size,
692  "a=crypto:1 %s inline:%s\r\n",
693  crypto_suite, crypto_params);
694  av_free(crypto_suite);
695  av_free(crypto_params);
696  }
697  }
698  }
699 
700  return 0;
701 }
702 #else
703 int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size)
704 {
705  return AVERROR(ENOSYS);
706 }
707 
708 void ff_sdp_write_media(char *buff, int size, AVStream *st, int idx,
709  const char *dest_addr, const char *dest_type,
710  int port, int ttl, AVFormatContext *fmt)
711 {
712 }
713 #endif
const char * name
Definition: avisynth_c.h:675
void av_url_split(char *proto, int proto_size, char *authorization, int authorization_size, char *hostname, int hostname_size, int *port_ptr, char *path, int path_size, const char *url)
Split a URL string into components.
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
const struct AVCodec * codec
const char * s
Definition: avisynth_c.h:668
const uint8_t * ff_avc_find_startcode(const uint8_t *p, const uint8_t *end)
Definition: avc.c:64
enum AVCodecID id
Definition: mxfenc.c:89
const char * fmt
Definition: avisynth_c.h:669
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:73
title('Sinusoid at 1/4 the Spampling Rate')
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int version
Definition: avisynth_c.h:666
#define freeaddrinfo
Definition: network.h:195
AVDictionaryEntry * av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:39
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs...
Format I/O context.
Definition: avformat.h:944
#define RTP_PT_PRIVATE
Definition: rtp.h:76
Public dictionary API.
static int64_t start_time
Definition: ffplay.c:293
uint8_t
mode
Definition: f_perms.c:27
AVOptions.
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
end end ac
enum AVPixelFormat pix_fmt
Definition: v4l.c:63
int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size)
Generate an SDP for an RTP session.
Definition: sdp.c:703
int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
Attempt to find a specific tag in a URL.
Definition: parseutils.c:647
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
Definition: opt.h:281
struct AVOutputFormat * oformat
Definition: avformat.h:958
int ff_rtp_get_payload_type(AVFormatContext *fmt, AVCodecContext *codec, int idx)
Return the payload type for a given stream used in the given format context.
Definition: rtp.c:89
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
const char * r
Definition: vf_curves.c:94
void av_bitstream_filter_close(AVBitStreamFilterContext *bsf)
int flags
CODEC_FLAG_*.
#define CODEC_FLAG_QSCALE
Use fixed qscale.
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
char * av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size)
Encode data to base64 and null-terminate.
int ff_is_multicast_address(struct sockaddr *addr)
Definition: network.c:202
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
Definition: avstring.c:82
int size
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:72
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
unsigned int nb_streams
A list of all streams in the file.
Definition: avformat.h:991
#define NI_NUMERICHOST
Definition: network.h:172
int bit_rate
the average bitrate
#define AV_BASE64_SIZE(x)
Calculate the output size needed to base64-encode x bytes to a null-terminated string.
Definition: base64.h:61
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition: opt.h:538
int width
picture width / height.
AVBitStreamFilterContext * av_bitstream_filter_init(const char *name)
const AVClass * priv_class
AVClass for the private context.
Definition: avformat.h:406
Stream structure.
Definition: avformat.h:643
int av_opt_get_int(void *obj, const char *name, int search_flags, int64_t *out_val)
Definition: opt.c:687
NULL
Definition: eval.c:55
int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size, int keyframe)
enum AVMediaType codec_type
enum AVCodecID codec_id
int sample_rate
samples per second
main external API structure.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
#define MAX_EXTRADATA_SIZE
Definition: latmenc.c:30
void * buf
Definition: avisynth_c.h:594
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
#define AV_STRINGIFY(s)
static int config(struct vf_instance *vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt)
Definition: vf_dint.c:45
int index
Definition: gxfenc.c:89
synthesis window for stochastic i
const AVClass * av_class
A class for logging and AVOptions.
Definition: avformat.h:949
int avpriv_split_xiph_headers(uint8_t *extradata, int extradata_size, int first_header_size, uint8_t *header_start[3], int header_len[3])
Split a single extradata buffer into the three headers that most Xiph codecs use. ...
Definition: xiph.c:24
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
Definition: avstring.c:100
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
misc parsing utilities
#define type
#define LIBAVFORMAT_VERSION
#define RTP_XIPH_IDENT
Definition: rtp.h:88
const int avpriv_mpeg4audio_sample_rates[16]
Definition: mpeg4audio.c:57
#define getaddrinfo
Definition: network.h:194
Main libavformat public API header.
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:68
static double c[64]
#define getnameinfo
Definition: network.h:196
int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
Definition: opt.c:566
char * value
Definition: dict.h:82
int channels
number of audio channels
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
void * priv_data
Format private data.
Definition: avformat.h:964
int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name)
Check whether a particular flag is set in a flags field.
Definition: opt.c:789
void ff_sdp_write_media(char *buff, int size, AVStream *st, int idx, const char *dest_addr, const char *dest_type, int port, int ttl, AVFormatContext *fmt)
Append the media-specific SDP fragment for the media stream c to the buffer buff. ...
Definition: sdp.c:708
char * ff_data_to_hex(char *buf, const uint8_t *src, int size, int lowercase)