static int resolve_destination(char *dest_addr, int size, char *type,
int type_size)
{
- struct addrinfo hints, *ai;
+ struct addrinfo hints = { 0 }, *ai;
int is_multicast;
av_strlcpy(type, "IP4", type_size);
/* Resolve the destination, since it must be written
* as a numeric IP address in the SDP. */
- memset(&hints, 0, sizeof(hints));
if (getaddrinfo(dest_addr, NULL, &hints, &ai))
return 0;
getnameinfo(ai->ai_addr, ai->ai_addrlen, dest_addr, size,
{
char *psets, *p;
const uint8_t *r;
- const char *pset_string = "; sprop-parameter-sets=";
+ static const char pset_string[] = "; sprop-parameter-sets=";
+ static const char profile_string[] = "; profile-level-id=";
uint8_t *orig_extradata = NULL;
int orig_extradata_size = 0;
+ const uint8_t *sps = NULL, *sps_end;
if (c->extradata_size > MAX_EXTRADATA_SIZE) {
av_log(c, AV_LOG_ERROR, "Too much extradata!\n");
*p = ',';
p++;
}
+ if (!sps) {
+ sps = r;
+ sps_end = r1;
+ }
if (av_base64_encode(p, MAX_PSET_SIZE - (p - psets), r, r1 - r) == NULL) {
av_log(c, AV_LOG_ERROR, "Cannot Base64-encode %td %td!\n", MAX_PSET_SIZE - (p - psets), r1 - r);
av_free(psets);
p += strlen(p);
r = r1;
}
+ if (sps && sps_end - sps >= 4) {
+ memcpy(p, profile_string, strlen(profile_string));
+ p += strlen(p);
+ ff_data_to_hex(p, sps + 1, 3, 0);
+ p[6] = '\0';
+ }
if (orig_extradata) {
av_free(c->extradata);
c->extradata = orig_extradata;
int first_header_size;
switch (c->codec_id) {
- case CODEC_ID_THEORA:
+ case AV_CODEC_ID_THEORA:
first_header_size = 42;
break;
- case CODEC_ID_VORBIS:
+ case AV_CODEC_ID_VORBIS:
first_header_size = 30;
break;
default:
char *config = NULL;
switch (c->codec_id) {
- case CODEC_ID_H264:
+ case AV_CODEC_ID_H264: {
+ int mode = 1;
+ if (fmt && fmt->oformat->priv_class &&
+ av_opt_flag_is_set(fmt->priv_data, "rtpflags", "h264_mode0"))
+ mode = 0;
if (c->extradata_size) {
config = extradata2psets(c);
}
av_strlcatf(buff, size, "a=rtpmap:%d H264/90000\r\n"
- "a=fmtp:%d packetization-mode=1%s\r\n",
+ "a=fmtp:%d packetization-mode=%d%s\r\n",
payload_type,
- payload_type, config ? config : "");
+ payload_type, mode, config ? config : "");
break;
- case CODEC_ID_H263:
- case CODEC_ID_H263P:
+ }
+ case AV_CODEC_ID_H263:
+ case AV_CODEC_ID_H263P:
/* a=framesize is required by 3GPP TS 26.234 (PSS). It
* actually specifies the maximum video size, but we only know
* the current size. This is required for playback on Android
* stagefright and on Samsung bada. */
+ if (!fmt || !fmt->oformat->priv_class ||
+ !av_opt_flag_is_set(fmt->priv_data, "rtpflags", "rfc2190") ||
+ c->codec_id == AV_CODEC_ID_H263P)
av_strlcatf(buff, size, "a=rtpmap:%d H263-2000/90000\r\n"
"a=framesize:%d %d-%d\r\n",
payload_type,
payload_type, c->width, c->height);
break;
- case CODEC_ID_MPEG4:
+ case AV_CODEC_ID_MPEG4:
if (c->extradata_size) {
config = extradata2config(c);
}
payload_type,
payload_type, config ? config : "");
break;
- case CODEC_ID_AAC:
+ case AV_CODEC_ID_AAC:
if (fmt && fmt->oformat->priv_class &&
av_opt_flag_is_set(fmt->priv_data, "rtpflags", "latm")) {
config = latm_context2config(c);
payload_type, config);
}
break;
- case CODEC_ID_PCM_S16BE:
+ case AV_CODEC_ID_PCM_S16BE:
if (payload_type >= RTP_PT_PRIVATE)
av_strlcatf(buff, size, "a=rtpmap:%d L16/%d/%d\r\n",
payload_type,
c->sample_rate, c->channels);
break;
- case CODEC_ID_PCM_MULAW:
+ case AV_CODEC_ID_PCM_MULAW:
if (payload_type >= RTP_PT_PRIVATE)
av_strlcatf(buff, size, "a=rtpmap:%d PCMU/%d/%d\r\n",
payload_type,
c->sample_rate, c->channels);
break;
- case CODEC_ID_PCM_ALAW:
+ case AV_CODEC_ID_PCM_ALAW:
if (payload_type >= RTP_PT_PRIVATE)
av_strlcatf(buff, size, "a=rtpmap:%d PCMA/%d/%d\r\n",
payload_type,
c->sample_rate, c->channels);
break;
- case CODEC_ID_AMR_NB:
+ case AV_CODEC_ID_AMR_NB:
av_strlcatf(buff, size, "a=rtpmap:%d AMR/%d/%d\r\n"
"a=fmtp:%d octet-align=1\r\n",
payload_type, c->sample_rate, c->channels,
payload_type);
break;
- case CODEC_ID_AMR_WB:
+ case AV_CODEC_ID_AMR_WB:
av_strlcatf(buff, size, "a=rtpmap:%d AMR-WB/%d/%d\r\n"
"a=fmtp:%d octet-align=1\r\n",
payload_type, c->sample_rate, c->channels,
payload_type);
break;
- case CODEC_ID_VORBIS:
+ case AV_CODEC_ID_VORBIS:
if (c->extradata_size)
config = xiph_extradata2config(c);
else
payload_type, c->sample_rate, c->channels,
payload_type, config);
break;
- case CODEC_ID_THEORA: {
+ case AV_CODEC_ID_THEORA: {
const char *pix_fmt;
if (c->extradata_size)
config = xiph_extradata2config(c);
c->width, c->height, pix_fmt, config);
break;
}
- case CODEC_ID_VP8:
+ case AV_CODEC_ID_VP8:
av_strlcatf(buff, size, "a=rtpmap:%d VP8/90000\r\n",
payload_type);
break;
- case CODEC_ID_ADPCM_G722:
+ case AV_CODEC_ID_MJPEG:
+ if (payload_type >= RTP_PT_PRIVATE)
+ av_strlcatf(buff, size, "a=rtpmap:%d JPEG/90000\r\n",
+ payload_type);
+ break;
+ case AV_CODEC_ID_ADPCM_G722:
if (payload_type >= RTP_PT_PRIVATE)
av_strlcatf(buff, size, "a=rtpmap:%d G722/%d/%d\r\n",
payload_type,
8000, c->channels);
break;
- case CODEC_ID_ADPCM_G726: {
+ case AV_CODEC_ID_ADPCM_G726: {
if (payload_type >= RTP_PT_PRIVATE)
av_strlcatf(buff, size, "a=rtpmap:%d G726-%d/%d\r\n",
payload_type,
c->sample_rate);
break;
}
+ case AV_CODEC_ID_ILBC:
+ av_strlcatf(buff, size, "a=rtpmap:%d iLBC/%d\r\n"
+ "a=fmtp:%d mode=%d\r\n",
+ payload_type, c->sample_rate,
+ payload_type, c->block_align == 38 ? 20 : 30);
+ break;
+ case AV_CODEC_ID_SPEEX:
+ av_strlcatf(buff, size, "a=rtpmap:%d speex/%d\r\n",
+ payload_type, c->sample_rate);
+ break;
default:
/* Nothing special to do here... */
break;
int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size)
{
AVDictionaryEntry *title = av_dict_get(ac[0]->metadata, "title", NULL, 0);
- struct sdp_session_level s;
+ struct sdp_session_level s = { 0 };
int i, j, port, ttl, is_multicast;
char dst[32], dst_type[5];
memset(buf, 0, size);
- memset(&s, 0, sizeof(struct sdp_session_level));
s.user = "-";
s.src_addr = "127.0.0.1"; /* FIXME: Properly set this */
s.src_type = "IP4";
{
}
#endif
-
-#if FF_API_SDP_CREATE
-int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size)
-{
- return av_sdp_create(ac, n_files, buff, size);
-}
-#endif