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/dict.h"
24 #include "libavutil/mem.h"
32 #include "replaygain.h"
35 #define AIFF_C_VERSION1 0xA2805140
37 typedef struct AIFFInputContext
{
42 static enum AVCodecID
aiff_codec_get_id(int bps
)
45 return AV_CODEC_ID_PCM_S8
;
47 return AV_CODEC_ID_PCM_S16BE
;
49 return AV_CODEC_ID_PCM_S24BE
;
51 return AV_CODEC_ID_PCM_S32BE
;
53 /* bigger than 32 isn't allowed */
54 return AV_CODEC_ID_NONE
;
57 /* returns the size of the found tag */
58 static int64_t get_tag(AVIOContext
*pb
, uint32_t * tag
)
63 return AVERROR_INVALIDDATA
;
71 /* Metadata string read */
72 static void get_meta(AVFormatContext
*s
, const char *key
, int64_t size
)
77 str
= av_malloc(size
+1);
80 int res
= avio_read(s
->pb
, str
, size
);
87 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 int get_aiff_header(AVFormatContext
*s
, int64_t size
,
97 AVIOContext
*pb
= s
->pb
;
98 AVCodecParameters
*par
= s
->streams
[0]->codecpar
;
99 AIFFInputContext
*aiff
= s
->priv_data
;
103 unsigned int num_frames
;
108 par
->codec_type
= AVMEDIA_TYPE_AUDIO
;
109 channels
= avio_rb16(pb
);
110 if (par
->ch_layout
.nb_channels
&& par
->ch_layout
.nb_channels
!= channels
)
111 return AVERROR_INVALIDDATA
;
112 par
->ch_layout
.nb_channels
= channels
;
113 num_frames
= avio_rb32(pb
);
114 par
->bits_per_coded_sample
= avio_rb16(pb
);
116 exp
= avio_rb16(pb
) - 16383 - 63;
118 if (exp
<-63 || exp
>63) {
119 av_log(s
, AV_LOG_ERROR
, "exp %d is out of range\n", exp
);
120 return AVERROR_INVALIDDATA
;
123 sample_rate
= val
<< exp
;
125 sample_rate
= (val
+ (1ULL<<(-exp
-1))) >> -exp
;
126 if (sample_rate
<= 0)
127 return AVERROR_INVALIDDATA
;
129 par
->sample_rate
= sample_rate
;
131 return AVERROR_INVALIDDATA
;
134 /* get codec id for AIFF-C */
137 } else if (version
== AIFF_C_VERSION1
) {
138 par
->codec_tag
= avio_rl32(pb
);
139 par
->codec_id
= ff_codec_get_id(ff_codec_aiff_tags
, par
->codec_tag
);
140 if (par
->codec_id
== AV_CODEC_ID_NONE
)
141 avpriv_request_sample(s
, "unknown or unsupported codec tag: %s",
142 av_fourcc2str(par
->codec_tag
));
146 if (version
!= AIFF_C_VERSION1
|| par
->codec_id
== AV_CODEC_ID_PCM_S16BE
) {
147 par
->codec_id
= aiff_codec_get_id(par
->bits_per_coded_sample
);
148 par
->bits_per_coded_sample
= av_get_bits_per_sample(par
->codec_id
);
149 aiff
->block_duration
= 1;
151 switch (par
->codec_id
) {
152 case AV_CODEC_ID_PCM_F32BE
:
153 case AV_CODEC_ID_PCM_F64BE
:
154 case AV_CODEC_ID_PCM_S16LE
:
155 case AV_CODEC_ID_PCM_ALAW
:
156 case AV_CODEC_ID_PCM_MULAW
:
157 aiff
->block_duration
= 1;
159 case AV_CODEC_ID_ADPCM_IMA_QT
:
160 par
->block_align
= 34 * channels
;
162 case AV_CODEC_ID_MACE3
:
163 par
->block_align
= 2 * channels
;
165 case AV_CODEC_ID_ADPCM_G726LE
:
166 par
->bits_per_coded_sample
= 5;
167 case AV_CODEC_ID_ADPCM_IMA_WS
:
168 case AV_CODEC_ID_ADPCM_G722
:
169 case AV_CODEC_ID_MACE6
:
170 case AV_CODEC_ID_CBD2_DPCM
:
171 case AV_CODEC_ID_SDX2_DPCM
:
172 par
->block_align
= 1 * channels
;
174 case AV_CODEC_ID_GSM
:
175 par
->block_align
= 33;
177 case AV_CODEC_ID_G728
:
178 par
->block_align
= 5;
180 case AV_CODEC_ID_ADPCM_N64
:
181 par
->block_align
= 9;
184 aiff
->block_duration
= 1;
187 if (par
->block_align
> 0)
188 aiff
->block_duration
= av_get_audio_frame_duration2(par
,
192 /* Block align needs to be computed in all cases, as the definition
193 * is specific to applications -> here we use the WAVE format definition */
194 if (!par
->block_align
)
195 par
->block_align
= (av_get_bits_per_sample(par
->codec_id
) * channels
) >> 3;
197 if (aiff
->block_duration
) {
198 par
->bit_rate
= av_rescale(par
->sample_rate
, par
->block_align
* 8LL,
199 aiff
->block_duration
);
200 if (par
->bit_rate
< 0)
211 static int aiff_probe(const AVProbeData
*p
)
213 /* check file header */
214 if (AV_RL32(p
->buf
) == MKTAG('F', 'O', 'R', 'M') &&
215 AV_RB32(p
->buf
+ 4) >= 4 &&
216 p
->buf
[8] == 'A' && p
->buf
[9] == 'I' &&
217 p
->buf
[10] == 'F' && (p
->buf
[11] == 'F' || p
->buf
[11] == 'C'))
218 return AVPROBE_SCORE_MAX
;
224 static int aiff_read_header(AVFormatContext
*s
)
227 int64_t filesize
, size
;
228 int64_t offset
= 0, position
;
230 unsigned version
= AIFF_C_VERSION1
;
231 AVIOContext
*pb
= s
->pb
;
233 AIFFInputContext
*aiff
= s
->priv_data
;
234 ID3v2ExtraMeta
*id3v2_extra_meta
;
236 /* check FORM header */
237 filesize
= get_tag(pb
, &tag
);
238 if (filesize
< 4 || tag
!= MKTAG('F', 'O', 'R', 'M'))
239 return AVERROR_INVALIDDATA
;
243 if (tag
== MKTAG('A', 'I', 'F', 'F')) /* Got an AIFF file */
245 else if (tag
!= MKTAG('A', 'I', 'F', 'C')) /* An AIFF-C file then */
246 return AVERROR_INVALIDDATA
;
250 st
= avformat_new_stream(s
, NULL
);
252 return AVERROR(ENOMEM
);
254 while (filesize
> 0) {
255 /* parse different chunks */
256 size
= get_tag(pb
, &tag
);
258 if (size
== AVERROR_EOF
&& offset
> 0 && st
->codecpar
->block_align
) {
259 av_log(s
, AV_LOG_WARNING
, "header parser hit EOF\n");
265 filesize
-= size
+ 8;
268 case MKTAG('C', 'O', 'M', 'M'): /* Common chunk */
269 /* Then for the complete header info */
270 st
->nb_frames
= get_aiff_header(s
, size
, version
);
271 if (st
->nb_frames
< 0)
272 return st
->nb_frames
;
273 if (offset
> 0) // COMM is after SSND
276 case MKTAG('I', 'D', '3', ' '):
277 position
= avio_tell(pb
);
278 ff_id3v2_read(s
, ID3v2_DEFAULT_MAGIC
, &id3v2_extra_meta
, size
);
279 if (id3v2_extra_meta
)
280 if ((ret
= ff_id3v2_parse_apic(s
, id3v2_extra_meta
)) < 0 ||
281 (ret
= ff_id3v2_parse_chapters(s
, id3v2_extra_meta
)) < 0) {
282 ff_id3v2_free_extra_meta(&id3v2_extra_meta
);
285 ff_id3v2_free_extra_meta(&id3v2_extra_meta
);
286 if (position
+ size
> avio_tell(pb
))
287 avio_skip(pb
, position
+ size
- avio_tell(pb
));
289 case MKTAG('F', 'V', 'E', 'R'): /* Version chunk */
290 version
= avio_rb32(pb
);
292 case MKTAG('N', 'A', 'M', 'E'): /* Sample name chunk */
293 get_meta(s
, "title" , size
);
295 case MKTAG('A', 'U', 'T', 'H'): /* Author chunk */
296 get_meta(s
, "author" , size
);
298 case MKTAG('(', 'c', ')', ' '): /* Copyright chunk */
299 get_meta(s
, "copyright", size
);
301 case MKTAG('A', 'N', 'N', 'O'): /* Annotation chunk */
302 get_meta(s
, "comment" , size
);
304 case MKTAG('S', 'S', 'N', 'D'): /* Sampled sound chunk */
306 return AVERROR_INVALIDDATA
;
307 aiff
->data_end
= avio_tell(pb
) + size
;
308 offset
= avio_rb32(pb
); /* Offset of sound data */
309 avio_rb32(pb
); /* BlockSize... don't care */
310 offset
+= avio_tell(pb
); /* Compute absolute data offset */
311 if (st
->codecpar
->block_align
&& !(pb
->seekable
& AVIO_SEEKABLE_NORMAL
)) /* Assume COMM already parsed */
313 if (!(pb
->seekable
& AVIO_SEEKABLE_NORMAL
)) {
314 av_log(s
, AV_LOG_ERROR
, "file is not seekable\n");
317 avio_skip(pb
, size
- 8);
319 case MKTAG('w', 'a', 'v', 'e'):
320 if ((uint64_t)size
> (1<<30))
321 return AVERROR_INVALIDDATA
;
322 if ((ret
= ff_get_extradata(s
, st
->codecpar
, pb
, size
)) < 0)
324 if ( (st
->codecpar
->codec_id
== AV_CODEC_ID_QDMC
|| st
->codecpar
->codec_id
== AV_CODEC_ID_QDM2
)
325 && size
>=12*4 && !st
->codecpar
->block_align
) {
326 st
->codecpar
->block_align
= AV_RB32(st
->codecpar
->extradata
+11*4);
327 aiff
->block_duration
= AV_RB32(st
->codecpar
->extradata
+9*4);
328 } else if (st
->codecpar
->codec_id
== AV_CODEC_ID_QCELP
) {
331 rate
= st
->codecpar
->extradata
[24];
333 case 'H': // RATE_HALF
334 st
->codecpar
->block_align
= 17;
336 case 'F': // RATE_FULL
338 st
->codecpar
->block_align
= 35;
340 aiff
->block_duration
= 160;
341 st
->codecpar
->bit_rate
= (int64_t)st
->codecpar
->sample_rate
* (st
->codecpar
->block_align
<< 3) /
342 aiff
->block_duration
;
345 case MKTAG('C','H','A','N'):
346 if ((ret
= ff_mov_read_chan(s
, pb
, st
, size
)) < 0)
349 case MKTAG('A','P','C','M'): /* XA ADPCM compressed sound chunk */
350 st
->codecpar
->codec_id
= AV_CODEC_ID_ADPCM_XA
;
351 aiff
->data_end
= avio_tell(pb
) + size
;
352 offset
= avio_tell(pb
) + 8;
353 /* This field is unknown and its data seems to be irrelevant */
355 st
->codecpar
->block_align
= avio_rb32(pb
);
359 case MKTAG('A','P','P','L'):
361 uint32_t chunk
= avio_rl32(pb
);
364 if (chunk
== MKTAG('s','t','o','c')) {
365 int len
= avio_r8(pb
);
368 if (len
== 11 && size
> 11) {
371 ret
= avio_read(pb
, chunk
, 11);
374 if (!memcmp(chunk
, "VADPCMCODES", sizeof(chunk
))) {
375 if ((ret
= ff_get_extradata(s
, st
->codecpar
, pb
, size
)) < 0)
385 if (offset
> 0 && st
->codecpar
->block_align
) // COMM && SSND
391 /* Skip required padding byte for odd-sized chunks. */
398 ret
= ff_replaygain_export(st
, s
->metadata
);
403 if (!st
->codecpar
->block_align
&& st
->codecpar
->codec_id
== AV_CODEC_ID_QCELP
) {
404 av_log(s
, AV_LOG_WARNING
, "qcelp without wave chunk, assuming full rate\n");
405 st
->codecpar
->block_align
= 35;
406 } else if (st
->codecpar
->block_align
<= 0) {
407 av_log(s
, AV_LOG_ERROR
, "could not find COMM tag or invalid block_align value\n");
408 return AVERROR_INVALIDDATA
;
410 if (aiff
->block_duration
< 0)
411 return AVERROR_INVALIDDATA
;
413 /* Now positioned, get the sound data start and end */
414 avpriv_set_pts_info(st
, 64, 1, st
->codecpar
->sample_rate
);
416 st
->duration
= st
->nb_frames
* aiff
->block_duration
;
418 /* Position the stream at the first block */
419 avio_seek(pb
, offset
, SEEK_SET
);
424 #define MAX_SIZE 4096
426 static int aiff_read_packet(AVFormatContext
*s
,
429 AVStream
*st
= s
->streams
[0];
430 AIFFInputContext
*aiff
= s
->priv_data
;
434 /* calculate size of remaining data */
435 max_size
= aiff
->data_end
- avio_tell(s
->pb
);
439 if (!st
->codecpar
->block_align
) {
440 av_log(s
, AV_LOG_ERROR
, "block_align not set\n");
441 return AVERROR_INVALIDDATA
;
444 /* Now for that packet */
445 switch (st
->codecpar
->codec_id
) {
446 case AV_CODEC_ID_ADPCM_IMA_QT
:
447 case AV_CODEC_ID_GSM
:
448 case AV_CODEC_ID_QDM2
:
449 case AV_CODEC_ID_QCELP
:
450 size
= st
->codecpar
->block_align
;
453 size
= st
->codecpar
->block_align
? (MAX_SIZE
/ st
->codecpar
->block_align
) * st
->codecpar
->block_align
: MAX_SIZE
;
455 return AVERROR_INVALIDDATA
;
457 size
= FFMIN(max_size
, size
);
458 res
= av_get_packet(s
->pb
, pkt
, size
);
462 if (size
>= st
->codecpar
->block_align
)
463 pkt
->flags
&= ~AV_PKT_FLAG_CORRUPT
;
464 /* Only one stream in an AIFF file */
465 pkt
->stream_index
= 0;
466 pkt
->duration
= (res
/ st
->codecpar
->block_align
) * (int64_t) aiff
->block_duration
;
470 const FFInputFormat ff_aiff_demuxer
= {
472 .p
.long_name
= NULL_IF_CONFIG_SMALL("Audio IFF"),
473 .p
.codec_tag
= ff_aiff_codec_tags_list
,
474 .priv_data_size
= sizeof(AIFFInputContext
),
475 .read_probe
= aiff_probe
,
476 .read_header
= aiff_read_header
,
477 .read_packet
= aiff_read_packet
,
478 .read_seek
= ff_pcm_read_seek
,