summaryrefslogtreecommitdiff
path: root/libavformat/adtsenc.c
diff options
context:
space:
mode:
authorAlex Converse <alex.converse@gmail.com>2010-07-01 14:49:32 +0000
committerAlex Converse <alex.converse@gmail.com>2010-07-01 14:49:32 +0000
commit5935f9d6bd5902131d964a677516cf149bb08b48 (patch)
tree62a0b2e8b9919b148c14fdb9098d8f4f2d56c551 /libavformat/adtsenc.c
parent8a472821a4713dbfd150460fc203190e7c055141 (diff)
Allow remuxing of explicitly signalled AAC files into ADTS.
The ADTS output files are not explicitly signaled because the format does not support explicit signalling. Originally committed as revision 23935 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/adtsenc.c')
-rw-r--r--libavformat/adtsenc.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/libavformat/adtsenc.c b/libavformat/adtsenc.c
index ecc8dc40de..bab9c145c2 100644
--- a/libavformat/adtsenc.c
+++ b/libavformat/adtsenc.c
@@ -23,6 +23,7 @@
#include "libavcodec/get_bits.h"
#include "libavcodec/put_bits.h"
#include "libavcodec/avcodec.h"
+#include "libavcodec/mpeg4audio.h"
#include "avformat.h"
#include "adts.h"
@@ -30,11 +31,17 @@ int ff_adts_decode_extradata(AVFormatContext *s, ADTSContext *adts, uint8_t *buf
{
GetBitContext gb;
PutBitContext pb;
+ MPEG4AudioConfig m4ac;
+ int off;
init_get_bits(&gb, buf, size * 8);
- adts->objecttype = get_bits(&gb, 5) - 1;
- adts->sample_rate_index = get_bits(&gb, 4);
- adts->channel_conf = get_bits(&gb, 4);
+ off = ff_mpeg4audio_get_config(&m4ac, buf, size);
+ if (off < 0)
+ return off;
+ skip_bits_long(&gb, off);
+ adts->objecttype = m4ac.object_type - 1;
+ adts->sample_rate_index = m4ac.sampling_index;
+ adts->channel_conf = m4ac.chan_config;
if (adts->objecttype > 3U) {
av_log(s, AV_LOG_ERROR, "MPEG-4 AOT %d is not allowed in ADTS\n", adts->objecttype+1);
@@ -52,10 +59,6 @@ int ff_adts_decode_extradata(AVFormatContext *s, ADTSContext *adts, uint8_t *buf
av_log(s, AV_LOG_ERROR, "Scalable configurations are not allowed in ADTS\n");
return -1;
}
- if (get_bits(&gb, 1)) {
- av_log_missing_feature(s, "Signaled SBR or PS", 0);
- return -1;
- }
if (!adts->channel_conf) {
init_put_bits(&pb, adts->pce_data, MAX_PCE_SIZE);