annotate aiff.c @ 3068:9cc9ff5aff9c libavformat

set bps to uncompressed original sound data for compressed audio according to aiff specs, qt set it to 16 for mace and ima4, fail if block align is not set.
author bcoudurier
date Mon, 25 Feb 2008 12:00:31 +0000
parents 2dc78258f848
children 48a89cfefa99
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
1 /*
1415
3b00fb8ef8e4 replace coder/decoder file description in libavformat by muxer/demuxer
aurel
parents: 1377
diff changeset
2 * AIFF/AIFF-C muxer and demuxer
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
3 * Copyright (c) 2006 Patrick Guimond
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
15 * Lesser General Public License for more details.
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
16 *
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
20 */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
21 #include "avformat.h"
2545
213268d7594e move unrelated functions declarations out of allformats.h
aurel
parents: 2274
diff changeset
22 #include "raw.h"
1172
6a5e58d2114b move common stuff from avienc.c and wav.c to new file riff.c
mru
parents: 1170
diff changeset
23 #include "riff.h"
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
24 #include "intfloat_readwrite.h"
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
25
1677
2a85c82b8538 add codec_id <-> codec_tag tables to AVIn/OutputFormat
michael
parents: 1481
diff changeset
26 static const AVCodecTag codec_aiff_tags[] = {
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
27 { CODEC_ID_PCM_S16BE, MKTAG('N','O','N','E') },
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
28 { CODEC_ID_PCM_S8, MKTAG('N','O','N','E') },
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
29 { CODEC_ID_PCM_S24BE, MKTAG('N','O','N','E') },
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
30 { CODEC_ID_PCM_S32BE, MKTAG('N','O','N','E') },
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
31 { CODEC_ID_PCM_ALAW, MKTAG('a','l','a','w') },
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
32 { CODEC_ID_PCM_ALAW, MKTAG('A','L','A','W') },
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
33 { CODEC_ID_PCM_MULAW, MKTAG('u','l','a','w') },
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
34 { CODEC_ID_PCM_MULAW, MKTAG('U','L','A','W') },
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
35 { CODEC_ID_MACE3, MKTAG('M','A','C','3') },
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
36 { CODEC_ID_MACE6, MKTAG('M','A','C','6') },
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
37 { CODEC_ID_GSM, MKTAG('G','S','M',' ') },
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
38 { CODEC_ID_ADPCM_G726, MKTAG('G','7','2','6') },
2060
1f62f2f021d5 Support for newer MacOSX AIFF
kostya
parents: 2001
diff changeset
39 { CODEC_ID_PCM_S16LE, MKTAG('s','o','w','t') },
3066
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
40 { CODEC_ID_ADPCM_IMA_QT, MKTAG('i','m','a','4') },
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
41 { 0, 0 },
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
42 };
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
43
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
44 #define AIFF 0
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
45 #define AIFF_C_VERSION1 0xA2805140
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
46
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
47 static int aiff_codec_get_id (int bps)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
48 {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
49 if (bps <= 8)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
50 return CODEC_ID_PCM_S8;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
51 if (bps <= 16)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
52 return CODEC_ID_PCM_S16BE;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
53 if (bps <= 24)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
54 return CODEC_ID_PCM_S24BE;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
55 if (bps <= 32)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
56 return CODEC_ID_PCM_S32BE;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
57
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
58 /* bigger than 32 isn't allowed */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
59 return 0;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
60 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
61
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
62 /* returns the size of the found tag */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
63 static int get_tag(ByteIOContext *pb, uint32_t * tag)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
64 {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
65 int size;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
66
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
67 if (url_feof(pb))
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
68 return AVERROR(EIO);
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
69
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
70 *tag = get_le32(pb);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
71 size = get_be32(pb);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
72
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
73 if (size < 0)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
74 size = 0x7fffffff;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
75
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
76 return size;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
77 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
78
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
79 /* Metadata string read */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
80 static void get_meta(ByteIOContext *pb, char * str, int strsize, int size)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
81 {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
82 int res;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
83
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
84 if (size > strsize-1)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
85 res = get_buffer(pb, (uint8_t*)str, strsize-1);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
86 else
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
87 res = get_buffer(pb, (uint8_t*)str, size);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
88
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
89 if (res < 0)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
90 return;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
91
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
92 str[res] = 0;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
93 if (size & 1)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
94 size++;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
95 size -= res;
1792
bcoudurier
parents: 1791
diff changeset
96 if (size)
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
97 url_fskip(pb, size);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
98 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
99
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
100 /* Returns the number of sound data frames or negative on error */
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 1123
diff changeset
101 static unsigned int get_aiff_header(ByteIOContext *pb, AVCodecContext *codec,
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
102 int size, unsigned version)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
103 {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
104 AVExtFloat ext;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
105 double sample_rate;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
106 unsigned int num_frames;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
107
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
108
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
109 if (size & 1)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
110 size++;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
111
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
112 codec->codec_type = CODEC_TYPE_AUDIO;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
113 codec->channels = get_be16(pb);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
114 num_frames = get_be32(pb);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
115 codec->bits_per_sample = get_be16(pb);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
116
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
117 get_buffer(pb, (uint8_t*)&ext, sizeof(ext));/* Sample rate is in */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
118 sample_rate = av_ext2dbl(ext); /* 80 bits BE IEEE extended float */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
119 codec->sample_rate = sample_rate;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
120 size -= 18;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
121
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
122 /* Got an AIFF-C? */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
123 if (version == AIFF_C_VERSION1) {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
124 codec->codec_tag = get_le32(pb);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
125 codec->codec_id = codec_get_id (codec_aiff_tags, codec->codec_tag);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
126
3066
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
127 switch (codec->codec_id) {
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
128 case CODEC_ID_PCM_S16BE:
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
129 codec->codec_id = aiff_codec_get_id (codec->bits_per_sample);
1376
1d7727481acf use av_get_bits_per_sample
bcoudurier
parents: 1375
diff changeset
130 codec->bits_per_sample = av_get_bits_per_sample(codec->codec_id);
3066
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
131 break;
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
132 case CODEC_ID_ADPCM_IMA_QT:
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
133 codec->block_align = 34*codec->channels;
3067
2dc78258f848 fix duration for ima4
bcoudurier
parents: 3066
diff changeset
134 codec->frame_size = 64;
3066
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
135 break;
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
136 default:
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
137 break;
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
138 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
139 size -= 4;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
140 } else {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
141 /* Need the codec type */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
142 codec->codec_id = aiff_codec_get_id (codec->bits_per_sample);
1376
1d7727481acf use av_get_bits_per_sample
bcoudurier
parents: 1375
diff changeset
143 codec->bits_per_sample = av_get_bits_per_sample(codec->codec_id);
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
144 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
145
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
146 if (!codec->codec_id)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
147 return AVERROR_INVALIDDATA;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
148
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
149 /* Block align needs to be computed in all cases, as the definition
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
150 * is specific to applications -> here we use the WAVE format definition */
3066
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
151 if (!codec->block_align)
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
152 codec->block_align = (codec->bits_per_sample * codec->channels) >> 3;
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
153
1377
51f4a1e475f8 fix bit rate
bcoudurier
parents: 1376
diff changeset
154 codec->bit_rate = codec->sample_rate * (codec->block_align << 3);
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
155
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
156 /* Chunk is over */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
157 if (size)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
158 url_fseek(pb, size, SEEK_CUR);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
159
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
160 return num_frames;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
161 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
162
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
163 #ifdef CONFIG_MUXERS
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
164 typedef struct {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
165 offset_t form;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
166 offset_t frames;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
167 offset_t ssnd;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
168 } AIFFOutputContext;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
169
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
170 static int aiff_write_header(AVFormatContext *s)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
171 {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
172 AIFFOutputContext *aiff = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
173 ByteIOContext *pb = s->pb;
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
174 AVCodecContext *enc = s->streams[0]->codec;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
175 AVExtFloat sample_rate;
1790
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
176 int aifc = 0;
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
177
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
178 /* First verify if format is ok */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
179 if (!enc->codec_tag) {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
180 return -1;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
181 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
182
1790
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
183 if (enc->codec_tag != MKTAG('N','O','N','E'))
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
184 aifc = 1;
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
185
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
186 /* FORM AIFF header */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
187 put_tag(pb, "FORM");
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
188 aiff->form = url_ftell(pb);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
189 put_be32(pb, 0); /* file length */
1790
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
190 put_tag(pb, aifc ? "AIFC" : "AIFF");
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
191
3068
9cc9ff5aff9c set bps to uncompressed original sound data for compressed audio
bcoudurier
parents: 3067
diff changeset
192 if (aifc) { // compressed audio
9cc9ff5aff9c set bps to uncompressed original sound data for compressed audio
bcoudurier
parents: 3067
diff changeset
193 enc->bits_per_sample = 16;
9cc9ff5aff9c set bps to uncompressed original sound data for compressed audio
bcoudurier
parents: 3067
diff changeset
194 if (!enc->block_align) {
9cc9ff5aff9c set bps to uncompressed original sound data for compressed audio
bcoudurier
parents: 3067
diff changeset
195 av_log(s, AV_LOG_ERROR, "block align not set\n");
9cc9ff5aff9c set bps to uncompressed original sound data for compressed audio
bcoudurier
parents: 3067
diff changeset
196 return -1;
9cc9ff5aff9c set bps to uncompressed original sound data for compressed audio
bcoudurier
parents: 3067
diff changeset
197 }
1791
0523fb44aa72 indentation
bcoudurier
parents: 1790
diff changeset
198 /* Version chunk */
0523fb44aa72 indentation
bcoudurier
parents: 1790
diff changeset
199 put_tag(pb, "FVER");
0523fb44aa72 indentation
bcoudurier
parents: 1790
diff changeset
200 put_be32(pb, 4);
0523fb44aa72 indentation
bcoudurier
parents: 1790
diff changeset
201 put_be32(pb, 0xA2805140);
1790
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
202 }
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
203
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
204 /* Common chunk */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
205 put_tag(pb, "COMM");
1790
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
206 put_be32(pb, aifc ? 24 : 18); /* size */
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
207 put_be16(pb, enc->channels); /* Number of channels */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
208
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
209 aiff->frames = url_ftell(pb);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
210 put_be32(pb, 0); /* Number of frames */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
211
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
212 if (!enc->bits_per_sample)
1375
c42cb95fa0d4 use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents: 1374
diff changeset
213 enc->bits_per_sample = av_get_bits_per_sample(enc->codec_id);
c42cb95fa0d4 use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents: 1374
diff changeset
214 if (!enc->bits_per_sample) {
c42cb95fa0d4 use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents: 1374
diff changeset
215 av_log(s, AV_LOG_ERROR, "could not compute bits per sample\n");
c42cb95fa0d4 use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents: 1374
diff changeset
216 return -1;
c42cb95fa0d4 use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents: 1374
diff changeset
217 }
c42cb95fa0d4 use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents: 1374
diff changeset
218 if (!enc->block_align)
c42cb95fa0d4 use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents: 1374
diff changeset
219 enc->block_align = (enc->bits_per_sample * enc->channels) >> 3;
c42cb95fa0d4 use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents: 1374
diff changeset
220
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
221 put_be16(pb, enc->bits_per_sample); /* Sample size */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
222
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
223 sample_rate = av_dbl2ext((double)enc->sample_rate);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
224 put_buffer(pb, (uint8_t*)&sample_rate, sizeof(sample_rate));
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
225
1790
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
226 if (aifc) {
1791
0523fb44aa72 indentation
bcoudurier
parents: 1790
diff changeset
227 put_le32(pb, enc->codec_tag);
0523fb44aa72 indentation
bcoudurier
parents: 1790
diff changeset
228 put_be16(pb, 0);
1790
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
229 }
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
230
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
231 /* Sound data chunk */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
232 put_tag(pb, "SSND");
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
233 aiff->ssnd = url_ftell(pb); /* Sound chunk size */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
234 put_be32(pb, 0); /* Sound samples data size */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
235 put_be32(pb, 0); /* Data offset */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
236 put_be32(pb, 0); /* Block-size (block align) */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
237
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
238 av_set_pts_info(s->streams[0], 64, 1, s->streams[0]->codec->sample_rate);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
239
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
240 /* Data is starting here */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
241 put_flush_packet(pb);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
242
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
243 return 0;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
244 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
245
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
246 static int aiff_write_packet(AVFormatContext *s, AVPacket *pkt)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
247 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
248 ByteIOContext *pb = s->pb;
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
249 put_buffer(pb, pkt->data, pkt->size);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
250 return 0;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
251 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
252
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
253 static int aiff_write_trailer(AVFormatContext *s)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
254 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
255 ByteIOContext *pb = s->pb;
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
256 AIFFOutputContext *aiff = s->priv_data;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
257 AVCodecContext *enc = s->streams[0]->codec;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
258
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
259 /* Chunks sizes must be even */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
260 offset_t file_size, end_size;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
261 end_size = file_size = url_ftell(pb);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
262 if (file_size & 1) {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
263 put_byte(pb, 0);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
264 end_size++;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
265 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
266
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
267 if (!url_is_streamed(s->pb)) {
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
268 /* File length */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
269 url_fseek(pb, aiff->form, SEEK_SET);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
270 put_be32(pb, (uint32_t)(file_size - aiff->form - 4));
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
271
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
272 /* Number of sample frames */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
273 url_fseek(pb, aiff->frames, SEEK_SET);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
274 put_be32(pb, ((uint32_t)(file_size-aiff->ssnd-12))/enc->block_align);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
275
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
276 /* Sound Data chunk size */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
277 url_fseek(pb, aiff->ssnd, SEEK_SET);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
278 put_be32(pb, (uint32_t)(file_size - aiff->ssnd - 4));
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
279
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
280 /* return to the end */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
281 url_fseek(pb, end_size, SEEK_SET);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
282
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
283 put_flush_packet(pb);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
284 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
285
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
286 return 0;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
287 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
288 #endif //CONFIG_MUXERS
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
289
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
290 static int aiff_probe(AVProbeData *p)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
291 {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
292 /* check file header */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
293 if (p->buf[0] == 'F' && p->buf[1] == 'O' &&
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
294 p->buf[2] == 'R' && p->buf[3] == 'M' &&
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
295 p->buf[8] == 'A' && p->buf[9] == 'I' &&
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
296 p->buf[10] == 'F' && (p->buf[11] == 'F' || p->buf[11] == 'C'))
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
297 return AVPROBE_SCORE_MAX;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
298 else
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
299 return 0;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
300 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
301
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
302 /* aiff input */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
303 static int aiff_read_header(AVFormatContext *s,
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
304 AVFormatParameters *ap)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
305 {
2206
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
306 int size, filesize;
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
307 offset_t offset = 0;
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
308 uint32_t tag;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
309 unsigned version = AIFF_C_VERSION1;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
310 ByteIOContext *pb = s->pb;
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
311 AVStream * st = s->streams[0];
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
312
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
313 /* check FORM header */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
314 filesize = get_tag(pb, &tag);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
315 if (filesize < 0 || tag != MKTAG('F', 'O', 'R', 'M'))
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
316 return AVERROR_INVALIDDATA;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
317
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
318 /* AIFF data type */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
319 tag = get_le32(pb);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
320 if (tag == MKTAG('A', 'I', 'F', 'F')) /* Got an AIFF file */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
321 version = AIFF;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
322 else if (tag != MKTAG('A', 'I', 'F', 'C')) /* An AIFF-C file then */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
323 return AVERROR_INVALIDDATA;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
324
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
325 filesize -= 4;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
326
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
327 st = av_new_stream(s, 0);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
328 if (!st)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2209
diff changeset
329 return AVERROR(ENOMEM);
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
330
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
331 while (filesize > 0) {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
332 /* parse different chunks */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
333 size = get_tag(pb, &tag);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
334 if (size < 0)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
335 return size;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
336
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
337 filesize -= size + 8;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
338
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
339 switch (tag) {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
340 case MKTAG('C', 'O', 'M', 'M'): /* Common chunk */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
341 /* Then for the complete header info */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
342 st->nb_frames = get_aiff_header (pb, st->codec, size, version);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
343 if (st->nb_frames < 0)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
344 return st->nb_frames;
2206
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
345 if (offset > 0) // COMM is after SSND
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
346 goto got_sound;
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
347 break;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
348
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
349 case MKTAG('F', 'V', 'E', 'R'): /* Version chunk */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
350 version = get_be32(pb);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
351 break;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
352
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
353 case MKTAG('N', 'A', 'M', 'E'): /* Sample name chunk */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
354 get_meta (pb, s->title, sizeof(s->title), size);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
355 break;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
356
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
357 case MKTAG('A', 'U', 'T', 'H'): /* Author chunk */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
358 get_meta (pb, s->author, sizeof(s->author), size);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
359 break;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
360
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
361 case MKTAG('(', 'c', ')', ' '): /* Copyright chunk */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
362 get_meta (pb, s->copyright, sizeof(s->copyright), size);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
363 break;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
364
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
365 case MKTAG('A', 'N', 'N', 'O'): /* Annotation chunk */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
366 get_meta (pb, s->comment, sizeof(s->comment), size);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
367 break;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
368
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
369 case MKTAG('S', 'S', 'N', 'D'): /* Sampled sound chunk */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
370 offset = get_be32(pb); /* Offset of sound data */
2209
83236f48ae6a compute absolute data offset after reading blocksize
bcoudurier
parents: 2208
diff changeset
371 get_be32(pb); /* BlockSize... don't care */
2206
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
372 offset += url_ftell(pb); /* Compute absolute data offset */
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
373 if (st->codec->codec_id) /* Assume COMM already parsed */
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
374 goto got_sound;
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
375 if (url_is_streamed(pb)) {
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
376 av_log(s, AV_LOG_ERROR, "file is not seekable\n");
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
377 return -1;
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
378 }
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
379 url_fskip(pb, size - 8);
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
380 break;
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
381
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
382 default: /* Jump */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
383 if (size & 1) /* Always even aligned */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
384 size++;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
385 url_fskip (pb, size);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
386 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
387 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
388
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
389 /* End of loop and didn't get sound */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
390 return AVERROR_INVALIDDATA;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
391
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
392 got_sound:
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
393 /* Now positioned, get the sound data start and end */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
394 if (st->nb_frames)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
395 s->file_size = st->nb_frames * st->codec->block_align;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
396
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
397 av_set_pts_info(st, 64, 1, st->codec->sample_rate);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
398 st->start_time = 0;
3067
2dc78258f848 fix duration for ima4
bcoudurier
parents: 3066
diff changeset
399 st->duration = st->codec->frame_size ?
2dc78258f848 fix duration for ima4
bcoudurier
parents: 3066
diff changeset
400 st->nb_frames * st->codec->frame_size : st->nb_frames;
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
401
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
402 /* Position the stream at the first block */
2206
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
403 url_fseek(pb, offset, SEEK_SET);
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
404
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
405 return 0;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
406 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
407
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
408 #define MAX_SIZE 4096
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
409
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
410 static int aiff_read_packet(AVFormatContext *s,
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
411 AVPacket *pkt)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
412 {
1087
8ffbf9385972 fix pcm_s24be demuxing, simplify
bcoudurier
parents: 925
diff changeset
413 AVStream *st = s->streams[0];
8ffbf9385972 fix pcm_s24be demuxing, simplify
bcoudurier
parents: 925
diff changeset
414 int res;
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
415
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
416 /* End of stream may be reached */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
417 if (url_feof(s->pb))
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
418 return AVERROR(EIO);
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
419
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
420 /* Now for that packet */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
421 res = av_get_packet(s->pb, pkt, (MAX_SIZE / st->codec->block_align) * st->codec->block_align);
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
422 if (res < 0)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
423 return res;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
424
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
425 /* Only one stream in an AIFF file */
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
426 pkt->stream_index = 0;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
427 return 0;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
428 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
429
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
430 static int aiff_read_close(AVFormatContext *s)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
431 {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
432 return 0;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
433 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
434
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
435 static int aiff_read_seek(AVFormatContext *s,
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
436 int stream_index, int64_t timestamp, int flags)
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
437 {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
438 return pcm_read_seek(s, stream_index, timestamp, flags);
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
439 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
440
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
441 #ifdef CONFIG_AIFF_DEMUXER
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
442 AVInputFormat aiff_demuxer = {
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
443 "aiff",
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
444 "Audio IFF",
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
445 0,
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
446 aiff_probe,
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
447 aiff_read_header,
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
448 aiff_read_packet,
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
449 aiff_read_close,
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
450 aiff_read_seek,
1679
ba58d49d4685 get rid of the [4] limitation of codec tag lists
michael
parents: 1678
diff changeset
451 .codec_tag= (const AVCodecTag*[]){codec_aiff_tags, 0},
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
452 };
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
453 #endif
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
454
1170
de5e5e04a33a CONFIG_AIFF_DEMUXER vs CONFIG_AIFF_MUXER typo
diego
parents: 1169
diff changeset
455 #ifdef CONFIG_AIFF_MUXER
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
456 AVOutputFormat aiff_muxer = {
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
457 "aiff",
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
458 "Audio IFF",
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
459 "audio/aiff",
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
460 "aif,aiff,afc,aifc",
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
461 sizeof(AIFFOutputContext),
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
462 CODEC_ID_PCM_S16BE,
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
463 CODEC_ID_NONE,
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
464 aiff_write_header,
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
465 aiff_write_packet,
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
466 aiff_write_trailer,
1679
ba58d49d4685 get rid of the [4] limitation of codec tag lists
michael
parents: 1678
diff changeset
467 .codec_tag= (const AVCodecTag*[]){codec_aiff_tags, 0},
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
468 };
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
469 #endif