3 * Copyright (c) 2006 Patrick Guimond
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 "libavutil/intreadwrite.h"
23 #include "libavutil/mathematics.h"
24 #include "libavutil/dict.h"
34 #define AIFF_C_VERSION1 0xA2805140
41 static enum AVCodecID
aiff_codec_get_id(int bps
)
44 return AV_CODEC_ID_PCM_S8
;
46 return AV_CODEC_ID_PCM_S16BE
;
48 return AV_CODEC_ID_PCM_S24BE
;
50 return AV_CODEC_ID_PCM_S32BE
;
52 /* bigger than 32 isn't allowed */
53 return AV_CODEC_ID_NONE
;
56 /* returns the size of the found tag */
57 static int get_tag(AVIOContext
*pb
, uint32_t * tag
)
73 /* Metadata string read */
74 static void get_meta(AVFormatContext
*s
, const char *key
, int size
)
76 uint8_t *str
= av_malloc(size
+1);
79 int res
= avio_read(s
->pb
, str
, size
);
86 av_dict_set(&s
->metadata
, key
, str
, AV_DICT_DONT_STRDUP_VAL
);
90 avio_skip(s
->pb
, size
);
93 /* Returns the number of sound data frames or negative on error */
94 static unsigned int get_aiff_header(AVFormatContext
*s
, int size
,
97 AVIOContext
*pb
= s
->pb
;
98 AVCodecContext
*codec
= s
->streams
[0]->codec
;
99 AIFFInputContext
*aiff
= s
->priv_data
;
103 unsigned int num_frames
;
107 codec
->codec_type
= AVMEDIA_TYPE_AUDIO
;
108 codec
->channels
= avio_rb16(pb
);
109 num_frames
= avio_rb32(pb
);
110 codec
->bits_per_coded_sample
= avio_rb16(pb
);
114 sample_rate
= ldexp(val
, exp
- 16383 - 63);
115 codec
->sample_rate
= sample_rate
;
118 /* get codec id for AIFF-C */
119 if (version
== AIFF_C_VERSION1
) {
120 codec
->codec_tag
= avio_rl32(pb
);
121 codec
->codec_id
= ff_codec_get_id(ff_codec_aiff_tags
, codec
->codec_tag
);
125 if (version
!= AIFF_C_VERSION1
|| codec
->codec_id
== AV_CODEC_ID_PCM_S16BE
) {
126 codec
->codec_id
= aiff_codec_get_id(codec
->bits_per_coded_sample
);
127 codec
->bits_per_coded_sample
= av_get_bits_per_sample(codec
->codec_id
);
128 aiff
->block_duration
= 1;
130 switch (codec
->codec_id
) {
131 case AV_CODEC_ID_PCM_F32BE
:
132 case AV_CODEC_ID_PCM_F64BE
:
133 case AV_CODEC_ID_PCM_S16LE
:
134 case AV_CODEC_ID_PCM_ALAW
:
135 case AV_CODEC_ID_PCM_MULAW
:
136 aiff
->block_duration
= 1;
138 case AV_CODEC_ID_ADPCM_IMA_QT
:
139 codec
->block_align
= 34*codec
->channels
;
141 case AV_CODEC_ID_MACE3
:
142 codec
->block_align
= 2*codec
->channels
;
144 case AV_CODEC_ID_ADPCM_G726LE
:
145 codec
->bits_per_coded_sample
= 5;
146 case AV_CODEC_ID_ADPCM_G722
:
147 case AV_CODEC_ID_MACE6
:
148 codec
->block_align
= 1*codec
->channels
;
150 case AV_CODEC_ID_GSM
:
151 codec
->block_align
= 33;
154 aiff
->block_duration
= 1;
157 if (codec
->block_align
> 0)
158 aiff
->block_duration
= av_get_audio_frame_duration(codec
,
162 /* Block align needs to be computed in all cases, as the definition
163 * is specific to applications -> here we use the WAVE format definition */
164 if (!codec
->block_align
)
165 codec
->block_align
= (av_get_bits_per_sample(codec
->codec_id
) * codec
->channels
) >> 3;
167 if (aiff
->block_duration
) {
168 codec
->bit_rate
= codec
->sample_rate
* (codec
->block_align
<< 3) /
169 aiff
->block_duration
;
179 static int aiff_probe(AVProbeData
*p
)
181 /* check file header */
182 if (p
->buf
[0] == 'F' && p
->buf
[1] == 'O' &&
183 p
->buf
[2] == 'R' && p
->buf
[3] == 'M' &&
184 p
->buf
[8] == 'A' && p
->buf
[9] == 'I' &&
185 p
->buf
[10] == 'F' && (p
->buf
[11] == 'F' || p
->buf
[11] == 'C'))
186 return AVPROBE_SCORE_MAX
;
192 static int aiff_read_header(AVFormatContext
*s
)
194 int ret
, size
, filesize
;
195 int64_t offset
= 0, position
;
197 unsigned version
= AIFF_C_VERSION1
;
198 AVIOContext
*pb
= s
->pb
;
200 AIFFInputContext
*aiff
= s
->priv_data
;
201 ID3v2ExtraMeta
*id3v2_extra_meta
= NULL
;
203 /* check FORM header */
204 filesize
= get_tag(pb
, &tag
);
205 if (filesize
< 0 || tag
!= MKTAG('F', 'O', 'R', 'M'))
206 return AVERROR_INVALIDDATA
;
210 if (tag
== MKTAG('A', 'I', 'F', 'F')) /* Got an AIFF file */
212 else if (tag
!= MKTAG('A', 'I', 'F', 'C')) /* An AIFF-C file then */
213 return AVERROR_INVALIDDATA
;
217 st
= avformat_new_stream(s
, NULL
);
219 return AVERROR(ENOMEM
);
221 while (filesize
> 0) {
222 /* parse different chunks */
223 size
= get_tag(pb
, &tag
);
227 filesize
-= size
+ 8;
230 case MKTAG('C', 'O', 'M', 'M'): /* Common chunk */
231 /* Then for the complete header info */
232 st
->nb_frames
= get_aiff_header(s
, size
, version
);
233 if (st
->nb_frames
< 0)
234 return st
->nb_frames
;
235 if (offset
> 0) // COMM is after SSND
238 case MKTAG('I', 'D', '3', ' '):
239 position
= avio_tell(pb
);
240 ff_id3v2_read(s
, ID3v2_DEFAULT_MAGIC
, &id3v2_extra_meta
, size
);
241 if (id3v2_extra_meta
)
242 if ((ret
= ff_id3v2_parse_apic(s
, &id3v2_extra_meta
)) < 0) {
243 ff_id3v2_free_extra_meta(&id3v2_extra_meta
);
246 ff_id3v2_free_extra_meta(&id3v2_extra_meta
);
247 if (position
+ size
> avio_tell(pb
))
248 avio_skip(pb
, position
+ size
- avio_tell(pb
));
250 case MKTAG('F', 'V', 'E', 'R'): /* Version chunk */
251 version
= avio_rb32(pb
);
253 case MKTAG('N', 'A', 'M', 'E'): /* Sample name chunk */
254 get_meta(s
, "title" , size
);
256 case MKTAG('A', 'U', 'T', 'H'): /* Author chunk */
257 get_meta(s
, "author" , size
);
259 case MKTAG('(', 'c', ')', ' '): /* Copyright chunk */
260 get_meta(s
, "copyright", size
);
262 case MKTAG('A', 'N', 'N', 'O'): /* Annotation chunk */
263 get_meta(s
, "comment" , size
);
265 case MKTAG('S', 'S', 'N', 'D'): /* Sampled sound chunk */
266 aiff
->data_end
= avio_tell(pb
) + size
;
267 offset
= avio_rb32(pb
); /* Offset of sound data */
268 avio_rb32(pb
); /* BlockSize... don't care */
269 offset
+= avio_tell(pb
); /* Compute absolute data offset */
270 if (st
->codec
->block_align
&& !pb
->seekable
) /* Assume COMM already parsed */
273 av_log(s
, AV_LOG_ERROR
, "file is not seekable\n");
276 avio_skip(pb
, size
- 8);
278 case MKTAG('w', 'a', 'v', 'e'):
279 if ((uint64_t)size
> (1<<30))
281 if (ff_get_extradata(st
->codec
, pb
, size
) < 0)
282 return AVERROR(ENOMEM
);
283 if (st
->codec
->codec_id
== AV_CODEC_ID_QDM2
&& size
>=12*4 && !st
->codec
->block_align
) {
284 st
->codec
->block_align
= AV_RB32(st
->codec
->extradata
+11*4);
285 aiff
->block_duration
= AV_RB32(st
->codec
->extradata
+9*4);
286 } else if (st
->codec
->codec_id
== AV_CODEC_ID_QCELP
) {
289 rate
= st
->codec
->extradata
[24];
291 case 'H': // RATE_HALF
292 st
->codec
->block_align
= 17;
294 case 'F': // RATE_FULL
296 st
->codec
->block_align
= 35;
298 aiff
->block_duration
= 160;
299 st
->codec
->bit_rate
= st
->codec
->sample_rate
* (st
->codec
->block_align
<< 3) /
300 aiff
->block_duration
;
303 case MKTAG('C','H','A','N'):
304 if(ff_mov_read_chan(s
, pb
, st
, size
) < 0)
305 return AVERROR_INVALIDDATA
;
308 if (size
& 1) /* Always even aligned */
315 if (!st
->codec
->block_align
) {
316 av_log(s
, AV_LOG_ERROR
, "could not find COMM tag or invalid block_align value\n");
320 /* Now positioned, get the sound data start and end */
321 avpriv_set_pts_info(st
, 64, 1, st
->codec
->sample_rate
);
323 st
->duration
= st
->nb_frames
* aiff
->block_duration
;
325 /* Position the stream at the first block */
326 avio_seek(pb
, offset
, SEEK_SET
);
331 #define MAX_SIZE 4096
333 static int aiff_read_packet(AVFormatContext
*s
,
336 AVStream
*st
= s
->streams
[0];
337 AIFFInputContext
*aiff
= s
->priv_data
;
341 /* calculate size of remaining data */
342 max_size
= aiff
->data_end
- avio_tell(s
->pb
);
346 /* Now for that packet */
347 switch (st
->codec
->codec_id
) {
348 case AV_CODEC_ID_ADPCM_IMA_QT
:
349 case AV_CODEC_ID_GSM
:
350 case AV_CODEC_ID_QDM2
:
351 case AV_CODEC_ID_QCELP
:
352 size
= st
->codec
->block_align
;
355 size
= (MAX_SIZE
/ st
->codec
->block_align
) * st
->codec
->block_align
;
357 size
= FFMIN(max_size
, size
);
358 res
= av_get_packet(s
->pb
, pkt
, size
);
362 if (size
>= st
->codec
->block_align
)
363 pkt
->flags
&= ~AV_PKT_FLAG_CORRUPT
;
364 /* Only one stream in an AIFF file */
365 pkt
->stream_index
= 0;
366 pkt
->duration
= (res
/ st
->codec
->block_align
) * aiff
->block_duration
;
370 AVInputFormat ff_aiff_demuxer
= {
372 .long_name
= NULL_IF_CONFIG_SMALL("Audio IFF"),
373 .priv_data_size
= sizeof(AIFFInputContext
),
374 .read_probe
= aiff_probe
,
375 .read_header
= aiff_read_header
,
376 .read_packet
= aiff_read_packet
,
377 .read_seek
= ff_pcm_read_seek
,
378 .codec_tag
= (const AVCodecTag
* const []){ ff_codec_aiff_tags
, 0 },