3 * Copyright (c) 2011 Kieran Kunhya <kieran@kunhya.com>
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavcodec/get_bits.h"
23 #include "libavcodec/put_bits.h"
24 #include "libavcodec/avcodec.h"
25 #include "libavcodec/mpeg4audio.h"
26 #include "libavutil/opt.h"
30 #define MAX_EXTRADATA_SIZE 1024
39 uint8_t buffer
[0x1fff + MAX_EXTRADATA_SIZE
+ 1024];
42 static const AVOption options
[] = {
43 {"smc-interval", "StreamMuxConfig interval.",
44 offsetof(LATMContext
, mod
), AV_OPT_TYPE_INT
, {.i64
= 0x0014}, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM
},
48 static const AVClass latm_muxer_class
= {
49 .class_name
= "LATM/LOAS muxer",
50 .item_name
= av_default_item_name
,
52 .version
= LIBAVUTIL_VERSION_INT
,
55 static int latm_decode_extradata(LATMContext
*ctx
, uint8_t *buf
, int size
)
57 MPEG4AudioConfig m4ac
;
59 if (size
> MAX_EXTRADATA_SIZE
) {
60 av_log(ctx
, AV_LOG_ERROR
, "Extradata is larger than currently supported.\n");
61 return AVERROR_INVALIDDATA
;
63 ctx
->off
= avpriv_mpeg4audio_get_config(&m4ac
, buf
, size
* 8, 1);
67 if (ctx
->object_type
== AOT_ALS
&& (ctx
->off
& 7)) {
68 // as long as avpriv_mpeg4audio_get_config works correctly this is impossible
69 av_log(ctx
, AV_LOG_ERROR
, "BUG: ALS offset is not byte-aligned\n");
70 return AVERROR_INVALIDDATA
;
72 /* FIXME: are any formats not allowed in LATM? */
74 if (m4ac
.object_type
> AOT_SBR
&& m4ac
.object_type
!= AOT_ALS
) {
75 av_log(ctx
, AV_LOG_ERROR
, "Muxing MPEG-4 AOT %d in LATM is not supported\n", m4ac
.object_type
);
76 return AVERROR_INVALIDDATA
;
78 ctx
->channel_conf
= m4ac
.chan_config
;
79 ctx
->object_type
= m4ac
.object_type
;
84 static int latm_write_header(AVFormatContext
*s
)
86 LATMContext
*ctx
= s
->priv_data
;
87 AVCodecContext
*avctx
= s
->streams
[0]->codec
;
89 if (avctx
->codec_id
== AV_CODEC_ID_AAC_LATM
)
92 if (avctx
->extradata_size
> 0 &&
93 latm_decode_extradata(ctx
, avctx
->extradata
, avctx
->extradata_size
) < 0)
94 return AVERROR_INVALIDDATA
;
99 static void latm_write_frame_header(AVFormatContext
*s
, PutBitContext
*bs
)
101 LATMContext
*ctx
= s
->priv_data
;
102 AVCodecContext
*avctx
= s
->streams
[0]->codec
;
105 /* AudioMuxElement */
106 put_bits(bs
, 1, !!ctx
->counter
);
109 /* StreamMuxConfig */
110 put_bits(bs
, 1, 0); /* audioMuxVersion */
111 put_bits(bs
, 1, 1); /* allStreamsSameTimeFraming */
112 put_bits(bs
, 6, 0); /* numSubFrames */
113 put_bits(bs
, 4, 0); /* numProgram */
114 put_bits(bs
, 3, 0); /* numLayer */
116 /* AudioSpecificConfig */
117 if (ctx
->object_type
== AOT_ALS
) {
118 header_size
= avctx
->extradata_size
-(ctx
->off
>> 3);
119 avpriv_copy_bits(bs
, &avctx
->extradata
[ctx
->off
>> 3], header_size
);
121 // + 3 assumes not scalable and dependsOnCoreCoder == 0,
122 // see decode_ga_specific_config in libavcodec/aacdec.c
123 avpriv_copy_bits(bs
, avctx
->extradata
, ctx
->off
+ 3);
125 if (!ctx
->channel_conf
) {
127 init_get_bits8(&gb
, avctx
->extradata
, avctx
->extradata_size
);
128 skip_bits_long(&gb
, ctx
->off
+ 3);
129 avpriv_copy_pce_data(bs
, &gb
);
133 put_bits(bs
, 3, 0); /* frameLengthType */
134 put_bits(bs
, 8, 0xff); /* latmBufferFullness */
136 put_bits(bs
, 1, 0); /* otherDataPresent */
137 put_bits(bs
, 1, 0); /* crcCheckPresent */
141 ctx
->counter
%= ctx
->mod
;
144 static int latm_write_packet(AVFormatContext
*s
, AVPacket
*pkt
)
146 LATMContext
*ctx
= s
->priv_data
;
147 AVIOContext
*pb
= s
->pb
;
150 uint8_t loas_header
[] = "\x56\xe0\x00";
152 if (s
->streams
[0]->codec
->codec_id
== AV_CODEC_ID_AAC_LATM
)
153 return ff_raw_write_packet(s
, pkt
);
155 if (pkt
->size
> 2 && pkt
->data
[0] == 0xff && (pkt
->data
[1] >> 4) == 0xf) {
156 av_log(s
, AV_LOG_ERROR
, "ADTS header detected - ADTS will not be incorrectly muxed into LATM\n");
157 return AVERROR_INVALIDDATA
;
160 if (!s
->streams
[0]->codec
->extradata
) {
161 if(pkt
->size
> 2 && pkt
->data
[0] == 0x56 && (pkt
->data
[1] >> 4) == 0xe &&
162 (AV_RB16(pkt
->data
+ 1) & 0x1FFF) + 3 == pkt
->size
)
163 return ff_raw_write_packet(s
, pkt
);
165 return AVERROR_INVALIDDATA
;
168 if (pkt
->size
> 0x1fff)
171 init_put_bits(&bs
, ctx
->buffer
, pkt
->size
+1024+MAX_EXTRADATA_SIZE
);
173 latm_write_frame_header(s
, &bs
);
175 /* PayloadLengthInfo() */
176 for (i
= 0; i
<= pkt
->size
-255; i
+=255)
177 put_bits(&bs
, 8, 255);
179 put_bits(&bs
, 8, pkt
->size
-i
);
181 /* The LATM payload is written unaligned */
184 if (pkt
->size
&& (pkt
->data
[0] & 0xe1) == 0x81) {
185 // Convert byte-aligned DSE to non-aligned.
186 // Due to the input format encoding we know that
187 // it is naturally byte-aligned in the input stream,
188 // so there are no padding bits to account for.
189 // To avoid having to add padding bits and rearrange
190 // the whole stream we just remove the byte-align flag.
191 // This allows us to remux our FATE AAC samples into latm
192 // files that are still playable with minimal effort.
193 put_bits(&bs
, 8, pkt
->data
[0] & 0xfe);
194 avpriv_copy_bits(&bs
, pkt
->data
+ 1, 8*pkt
->size
- 8);
196 avpriv_copy_bits(&bs
, pkt
->data
, 8*pkt
->size
);
198 avpriv_align_put_bits(&bs
);
201 len
= put_bits_count(&bs
) >> 3;
206 loas_header
[1] |= (len
>> 8) & 0x1f;
207 loas_header
[2] |= len
& 0xff;
209 avio_write(pb
, loas_header
, 3);
210 avio_write(pb
, ctx
->buffer
, len
);
215 av_log(s
, AV_LOG_ERROR
, "LATM packet size larger than maximum size 0x1fff\n");
216 return AVERROR_INVALIDDATA
;
219 AVOutputFormat ff_latm_muxer
= {
221 .long_name
= NULL_IF_CONFIG_SMALL("LOAS/LATM"),
222 .mime_type
= "audio/MP4A-LATM",
223 .extensions
= "latm,loas",
224 .priv_data_size
= sizeof(LATMContext
),
225 .audio_codec
= AV_CODEC_ID_AAC
,
226 .video_codec
= AV_CODEC_ID_NONE
,
227 .write_header
= latm_write_header
,
228 .write_packet
= latm_write_packet
,
229 .priv_class
= &latm_muxer_class
,
230 .flags
= AVFMT_NOTIMESTAMPS
,