2 * Core Audio Format demuxer
3 * Copyright (c) 2007 Justin Ruggles
4 * Copyright (c) 2009 Peter Ross
6 * This file is part of Libav.
8 * Libav is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * Libav is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with Libav; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * Core Audio Format demuxer
32 #include "libavutil/intreadwrite.h"
33 #include "libavutil/intfloat.h"
34 #include "libavutil/dict.h"
38 int bytes_per_packet
; ///< bytes in a packet, or 0 if variable
39 int frames_per_packet
; ///< frames in a packet, or 0 if variable
40 int64_t num_bytes
; ///< total number of bytes in stream
42 int64_t packet_cnt
; ///< packet counter
43 int64_t frame_cnt
; ///< frame counter
45 int64_t data_start
; ///< data start position, in bytes
46 int64_t data_size
; ///< raw data size, in bytes
49 static int probe(AVProbeData
*p
)
51 if (AV_RB32(p
->buf
) == MKBETAG('c','a','f','f') && AV_RB16(&p
->buf
[4]) == 1)
52 return AVPROBE_SCORE_MAX
;
56 /** Read audio description chunk */
57 static int read_desc_chunk(AVFormatContext
*s
)
59 AVIOContext
*pb
= s
->pb
;
60 CaffContext
*caf
= s
->priv_data
;
64 /* new audio stream */
65 st
= avformat_new_stream(s
, NULL
);
67 return AVERROR(ENOMEM
);
69 /* parse format description */
70 st
->codec
->codec_type
= AVMEDIA_TYPE_AUDIO
;
71 st
->codec
->sample_rate
= av_int2double(avio_rb64(pb
));
72 st
->codec
->codec_tag
= avio_rb32(pb
);
73 flags
= avio_rb32(pb
);
74 caf
->bytes_per_packet
= avio_rb32(pb
);
75 st
->codec
->block_align
= caf
->bytes_per_packet
;
76 caf
->frames_per_packet
= avio_rb32(pb
);
77 st
->codec
->channels
= avio_rb32(pb
);
78 st
->codec
->bits_per_coded_sample
= avio_rb32(pb
);
80 /* calculate bit rate for constant size packets */
81 if (caf
->frames_per_packet
> 0 && caf
->bytes_per_packet
> 0) {
82 st
->codec
->bit_rate
= (uint64_t)st
->codec
->sample_rate
* (uint64_t)caf
->bytes_per_packet
* 8
83 / (uint64_t)caf
->frames_per_packet
;
85 st
->codec
->bit_rate
= 0;
89 if (st
->codec
->codec_tag
== MKBETAG('l','p','c','m'))
90 st
->codec
->codec_id
= ff_mov_get_lpcm_codec_id(st
->codec
->bits_per_coded_sample
, (flags
^ 0x2) | 0x4);
92 st
->codec
->codec_id
= ff_codec_get_id(ff_codec_caf_tags
, st
->codec
->codec_tag
);
96 /** Read magic cookie chunk */
97 static int read_kuki_chunk(AVFormatContext
*s
, int64_t size
)
99 AVIOContext
*pb
= s
->pb
;
100 AVStream
*st
= s
->streams
[0];
102 if (size
< 0 || size
> INT_MAX
- FF_INPUT_BUFFER_PADDING_SIZE
)
105 if (st
->codec
->codec_id
== AV_CODEC_ID_AAC
) {
106 /* The magic cookie format for AAC is an mp4 esds atom.
107 The lavc AAC decoder requires the data from the codec specific
108 description as extradata input. */
112 strt
= avio_tell(pb
);
113 ff_mov_read_esds(s
, pb
, atom
);
114 skip
= size
- (avio_tell(pb
) - strt
);
115 if (skip
< 0 || !st
->codec
->extradata
||
116 st
->codec
->codec_id
!= AV_CODEC_ID_AAC
) {
117 av_log(s
, AV_LOG_ERROR
, "invalid AAC magic cookie\n");
118 return AVERROR_INVALIDDATA
;
121 } else if (st
->codec
->codec_id
== AV_CODEC_ID_ALAC
) {
122 #define ALAC_PREAMBLE 12
123 #define ALAC_HEADER 36
124 #define ALAC_NEW_KUKI 24
125 uint8_t preamble
[12];
126 if (size
< ALAC_NEW_KUKI
) {
127 av_log(s
, AV_LOG_ERROR
, "invalid ALAC magic cookie\n");
129 return AVERROR_INVALIDDATA
;
131 avio_read(pb
, preamble
, ALAC_PREAMBLE
);
133 st
->codec
->extradata
= av_mallocz(ALAC_HEADER
+ FF_INPUT_BUFFER_PADDING_SIZE
);
134 if (!st
->codec
->extradata
)
135 return AVERROR(ENOMEM
);
137 /* For the old style cookie, we skip 12 bytes, then read 36 bytes.
138 * The new style cookie only contains the last 24 bytes of what was
139 * 36 bytes in the old style cookie, so we fabricate the first 12 bytes
140 * in that case to maintain compatibility. */
141 if (!memcmp(&preamble
[4], "frmaalac", 8)) {
142 if (size
< ALAC_PREAMBLE
+ ALAC_HEADER
) {
143 av_log(s
, AV_LOG_ERROR
, "invalid ALAC magic cookie\n");
144 av_freep(&st
->codec
->extradata
);
145 return AVERROR_INVALIDDATA
;
147 avio_read(pb
, st
->codec
->extradata
, ALAC_HEADER
);
148 avio_skip(pb
, size
- ALAC_PREAMBLE
- ALAC_HEADER
);
150 AV_WB32(st
->codec
->extradata
, 36);
151 memcpy(&st
->codec
->extradata
[4], "alac", 4);
152 AV_WB32(&st
->codec
->extradata
[8], 0);
153 memcpy(&st
->codec
->extradata
[12], preamble
, 12);
154 avio_read(pb
, &st
->codec
->extradata
[24], ALAC_NEW_KUKI
- 12);
155 avio_skip(pb
, size
- ALAC_NEW_KUKI
);
157 st
->codec
->extradata_size
= ALAC_HEADER
;
159 st
->codec
->extradata
= av_mallocz(size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
160 if (!st
->codec
->extradata
)
161 return AVERROR(ENOMEM
);
162 avio_read(pb
, st
->codec
->extradata
, size
);
163 st
->codec
->extradata_size
= size
;
169 /** Read packet table chunk */
170 static int read_pakt_chunk(AVFormatContext
*s
, int64_t size
)
172 AVIOContext
*pb
= s
->pb
;
173 AVStream
*st
= s
->streams
[0];
174 CaffContext
*caf
= s
->priv_data
;
175 int64_t pos
= 0, ccount
, num_packets
;
178 ccount
= avio_tell(pb
);
180 num_packets
= avio_rb64(pb
);
181 if (num_packets
< 0 || INT32_MAX
/ sizeof(AVIndexEntry
) < num_packets
)
182 return AVERROR_INVALIDDATA
;
184 st
->nb_frames
= avio_rb64(pb
); /* valid frames */
185 st
->nb_frames
+= avio_rb32(pb
); /* priming frames */
186 st
->nb_frames
+= avio_rb32(pb
); /* remainder frames */
189 for (i
= 0; i
< num_packets
; i
++) {
190 av_add_index_entry(s
->streams
[0], pos
, st
->duration
, 0, 0, AVINDEX_KEYFRAME
);
191 pos
+= caf
->bytes_per_packet
? caf
->bytes_per_packet
: ff_mp4_read_descr_len(pb
);
192 st
->duration
+= caf
->frames_per_packet
? caf
->frames_per_packet
: ff_mp4_read_descr_len(pb
);
195 if (avio_tell(pb
) - ccount
> size
) {
196 av_log(s
, AV_LOG_ERROR
, "error reading packet table\n");
197 return AVERROR_INVALIDDATA
;
199 avio_skip(pb
, ccount
+ size
- avio_tell(pb
));
201 caf
->num_bytes
= pos
;
205 /** Read information chunk */
206 static void read_info_chunk(AVFormatContext
*s
, int64_t size
)
208 AVIOContext
*pb
= s
->pb
;
210 unsigned int nb_entries
= avio_rb32(pb
);
211 for (i
= 0; i
< nb_entries
; i
++) {
214 avio_get_str(pb
, INT_MAX
, key
, sizeof(key
));
215 avio_get_str(pb
, INT_MAX
, value
, sizeof(value
));
216 av_dict_set(&s
->metadata
, key
, value
, 0);
220 static int read_header(AVFormatContext
*s
)
222 AVIOContext
*pb
= s
->pb
;
223 CaffContext
*caf
= s
->priv_data
;
229 avio_skip(pb
, 8); /* magic, version, file flags */
231 /* audio description chunk */
232 if (avio_rb32(pb
) != MKBETAG('d','e','s','c')) {
233 av_log(s
, AV_LOG_ERROR
, "desc chunk not present\n");
234 return AVERROR_INVALIDDATA
;
236 size
= avio_rb64(pb
);
238 return AVERROR_INVALIDDATA
;
240 ret
= read_desc_chunk(s
);
245 /* parse each chunk */
247 while (!pb
->eof_reached
) {
249 /* stop at data chunk if seeking is not supported or
250 data chunk size is unknown */
251 if (found_data
&& (caf
->data_size
< 0 || !pb
->seekable
))
255 size
= avio_rb64(pb
);
260 case MKBETAG('d','a','t','a'):
261 avio_skip(pb
, 4); /* edit count */
262 caf
->data_start
= avio_tell(pb
);
263 caf
->data_size
= size
< 0 ? -1 : size
- 4;
264 if (caf
->data_size
> 0 && pb
->seekable
)
265 avio_skip(pb
, caf
->data_size
);
269 case MKBETAG('c','h','a','n'):
270 if ((ret
= ff_mov_read_chan(s
, s
->pb
, st
, size
)) < 0)
274 /* magic cookie chunk */
275 case MKBETAG('k','u','k','i'):
276 if (read_kuki_chunk(s
, size
))
277 return AVERROR_INVALIDDATA
;
280 /* packet table chunk */
281 case MKBETAG('p','a','k','t'):
282 if (read_pakt_chunk(s
, size
))
283 return AVERROR_INVALIDDATA
;
286 case MKBETAG('i','n','f','o'):
287 read_info_chunk(s
, size
);
291 #define _(x) ((x) >= ' ' ? (x) : ' ')
292 av_log(s
, AV_LOG_WARNING
, "skipping CAF chunk: %08X (%c%c%c%c)\n",
293 tag
, _(tag
>>24), _((tag
>>16)&0xFF), _((tag
>>8)&0xFF), _(tag
&0xFF));
295 case MKBETAG('f','r','e','e'):
297 return AVERROR_INVALIDDATA
;
304 return AVERROR_INVALIDDATA
;
306 if (caf
->bytes_per_packet
> 0 && caf
->frames_per_packet
> 0) {
307 if (caf
->data_size
> 0)
308 st
->nb_frames
= (caf
->data_size
/ caf
->bytes_per_packet
) * caf
->frames_per_packet
;
309 } else if (st
->nb_index_entries
) {
310 st
->codec
->bit_rate
= st
->codec
->sample_rate
* caf
->data_size
* 8 /
313 av_log(s
, AV_LOG_ERROR
, "Missing packet table. It is required when "
314 "block size or frame size are variable.\n");
315 return AVERROR_INVALIDDATA
;
318 avpriv_set_pts_info(st
, 64, 1, st
->codec
->sample_rate
);
321 /* position the stream at the start of data */
322 if (caf
->data_size
>= 0)
323 avio_seek(pb
, caf
->data_start
, SEEK_SET
);
328 #define CAF_MAX_PKT_SIZE 4096
330 static int read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
332 AVIOContext
*pb
= s
->pb
;
333 AVStream
*st
= s
->streams
[0];
334 CaffContext
*caf
= s
->priv_data
;
335 int res
, pkt_size
= 0, pkt_frames
= 0;
336 int64_t left
= CAF_MAX_PKT_SIZE
;
341 /* don't read past end of data chunk */
342 if (caf
->data_size
> 0) {
343 left
= (caf
->data_start
+ caf
->data_size
) - avio_tell(pb
);
348 pkt_frames
= caf
->frames_per_packet
;
349 pkt_size
= caf
->bytes_per_packet
;
351 if (pkt_size
> 0 && pkt_frames
== 1) {
352 pkt_size
= (CAF_MAX_PKT_SIZE
/ pkt_size
) * pkt_size
;
353 pkt_size
= FFMIN(pkt_size
, left
);
354 pkt_frames
= pkt_size
/ caf
->bytes_per_packet
;
355 } else if (st
->nb_index_entries
) {
356 if (caf
->packet_cnt
< st
->nb_index_entries
- 1) {
357 pkt_size
= st
->index_entries
[caf
->packet_cnt
+ 1].pos
- st
->index_entries
[caf
->packet_cnt
].pos
;
358 pkt_frames
= st
->index_entries
[caf
->packet_cnt
+ 1].timestamp
- st
->index_entries
[caf
->packet_cnt
].timestamp
;
359 } else if (caf
->packet_cnt
== st
->nb_index_entries
- 1) {
360 pkt_size
= caf
->num_bytes
- st
->index_entries
[caf
->packet_cnt
].pos
;
361 pkt_frames
= st
->duration
- st
->index_entries
[caf
->packet_cnt
].timestamp
;
367 if (pkt_size
== 0 || pkt_frames
== 0 || pkt_size
> left
)
370 res
= av_get_packet(pb
, pkt
, pkt_size
);
375 pkt
->stream_index
= 0;
376 pkt
->dts
= pkt
->pts
= caf
->frame_cnt
;
379 caf
->frame_cnt
+= pkt_frames
;
384 static int read_seek(AVFormatContext
*s
, int stream_index
,
385 int64_t timestamp
, int flags
)
387 AVStream
*st
= s
->streams
[0];
388 CaffContext
*caf
= s
->priv_data
;
389 int64_t pos
, packet_cnt
, frame_cnt
;
391 timestamp
= FFMAX(timestamp
, 0);
393 if (caf
->frames_per_packet
> 0 && caf
->bytes_per_packet
> 0) {
394 /* calculate new byte position based on target frame position */
395 pos
= caf
->bytes_per_packet
* timestamp
/ caf
->frames_per_packet
;
396 if (caf
->data_size
> 0)
397 pos
= FFMIN(pos
, caf
->data_size
);
398 packet_cnt
= pos
/ caf
->bytes_per_packet
;
399 frame_cnt
= caf
->frames_per_packet
* packet_cnt
;
400 } else if (st
->nb_index_entries
) {
401 packet_cnt
= av_index_search_timestamp(st
, timestamp
, flags
);
402 frame_cnt
= st
->index_entries
[packet_cnt
].timestamp
;
403 pos
= st
->index_entries
[packet_cnt
].pos
;
408 if (avio_seek(s
->pb
, pos
+ caf
->data_start
, SEEK_SET
) < 0)
411 caf
->packet_cnt
= packet_cnt
;
412 caf
->frame_cnt
= frame_cnt
;
417 AVInputFormat ff_caf_demuxer
= {
419 .long_name
= NULL_IF_CONFIG_SMALL("Apple CAF (Core Audio Format)"),
420 .priv_data_size
= sizeof(CaffContext
),
422 .read_header
= read_header
,
423 .read_packet
= read_packet
,
424 .read_seek
= read_seek
,
425 .codec_tag
= (const AVCodecTag
* const []){ ff_codec_caf_tags
, 0 },