aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/sdp.c
diff options
context:
space:
mode:
authorLuca Abeni <lucabe72@email.it>2007-09-05 06:30:59 +0000
committerLuca Abeni <lucabe72@email.it>2007-09-05 06:30:59 +0000
commit4901263abde3d8a1e7774c02f798811122f73cb3 (patch)
treead17d20b1d51d28b5bcfc967feec164faf12bc71 /libavformat/sdp.c
parentc92a30bb061036def498e48e11d454a61e0f3b1f (diff)
downloadffmpeg-4901263abde3d8a1e7774c02f798811122f73cb3.tar.gz
AAC support in the SDP generator
Originally committed as revision 10398 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/sdp.c')
-rw-r--r--libavformat/sdp.c55
1 files 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;