From 4901263abde3d8a1e7774c02f798811122f73cb3 Mon Sep 17 00:00:00 2001 From: Luca Abeni Date: Wed, 5 Sep 2007 06:30:59 +0000 Subject: [PATCH] AAC support in the SDP generator Originally committed as revision 10398 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/sdp.c | 55 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/libavformat/sdp.c b/libavformat/sdp.c index 98dcb07299..8a723fcbaa 100644 --- a/libavformat/sdp.c +++ b/libavformat/sdp.c @@ -110,6 +110,27 @@ static char *data_to_hex(char *buff, const uint8_t *src, int s) return buff; } +static char *extradata2config(const uint8_t *extradata, int extradata_size) +{ + char *config; + + if (extradata_size > MAX_EXTRADATA_SIZE) { + av_log(NULL, AV_LOG_ERROR, "Too many extra data!\n"); + + return NULL; + } + config = av_malloc(10 + extradata_size * 2); + if (config == NULL) { + av_log(NULL, AV_LOG_ERROR, "Cannot allocate memory for the config info\n"); + return NULL; + } + memcpy(config, "; config=", 9); + data_to_hex(config + 9, extradata, extradata_size); + config[9 + extradata_size * 2] = 0; + + return config; +} + static char *sdp_media_attributes(char *buff, int size, AVCodecContext *c, int payload_type) { char *config = NULL; @@ -117,25 +138,33 @@ static char *sdp_media_attributes(char *buff, int size, AVCodecContext *c, int p switch (c->codec_id) { case CODEC_ID_MPEG4: if (c->flags & CODEC_FLAG_GLOBAL_HEADER) { - if (c->extradata_size > MAX_EXTRADATA_SIZE) { - av_log(NULL, AV_LOG_ERROR, "Too many extra data!\n"); - - return NULL; - } - config = av_malloc(10 + c->extradata_size * 2); - if (config == NULL) { - av_log(NULL, AV_LOG_ERROR, "Cannot allocate memory for the config info\n"); - return NULL; - } - memcpy(config, "; config=", 9); - data_to_hex(config + 9, c->extradata, c->extradata_size); - config[9 + c->extradata_size * 2] = 0; + config = extradata2config(c->extradata, c->extradata_size); } av_strlcatf(buff, size, "a=rtpmap:%d MP4V-ES/90000\r\n" "a=fmtp:%d profile-level-id=1%s\r\n", payload_type, payload_type, config ? config : ""); break; + case CODEC_ID_AAC: + if (c->flags & CODEC_FLAG_GLOBAL_HEADER) { + config = extradata2config(c->extradata, c->extradata_size); + } else { + /* FIXME: maybe we can forge config information based on the + * codec parameters... + */ + av_log(NULL, AV_LOG_ERROR, "AAC with no global headers is currently not supported\n"); + return NULL; + } + if (config == NULL) { + return NULL; + } + av_strlcatf(buff, size, "a=rtpmap:%d MPEG4-GENERIC/%d/%d\r\n" + "a=fmtp:%d profile-level-id=1;" + "mode=AAC-hbr;sizelength=13;indexlength=3;" + "indexdeltalength=3%s\r\n", + payload_type, c->sample_rate, c->channels, + payload_type, config); + break; default: /* Nothing special to do, here... */ break;