annotate aiff.c @ 3957:9f943bb755f9 libavformat

Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us that it only describes the lower-level transport (TCP vs. UDP) and not the actual data layout (e.g. RDT vs. RTP). See discussion in "Realmedia patch" thread on ML.
author rbultje
date Tue, 30 Sep 2008 13:18:41 +0000
parents 1d3d17de20ba
children 4fd67f05bad9
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 */
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3111
diff changeset
21
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3111
diff changeset
22 #include "libavutil/intfloat_readwrite.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
23 #include "avformat.h"
2545
213268d7594e move unrelated functions declarations out of allformats.h
aurel
parents: 2274
diff changeset
24 #include "raw.h"
1172
6a5e58d2114b move common stuff from avienc.c and wav.c to new file riff.c
mru
parents: 1170
diff changeset
25 #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
26
1677
2a85c82b8538 add codec_id <-> codec_tag tables to AVIn/OutputFormat
michael
parents: 1481
diff changeset
27 static const AVCodecTag codec_aiff_tags[] = {
3529
579f6524e344 cosmetics, align vertically
bcoudurier
parents: 3435
diff changeset
28 { CODEC_ID_PCM_S16BE, MKTAG('N','O','N','E') },
579f6524e344 cosmetics, align vertically
bcoudurier
parents: 3435
diff changeset
29 { CODEC_ID_PCM_S8, MKTAG('N','O','N','E') },
579f6524e344 cosmetics, align vertically
bcoudurier
parents: 3435
diff changeset
30 { CODEC_ID_PCM_S24BE, MKTAG('N','O','N','E') },
579f6524e344 cosmetics, align vertically
bcoudurier
parents: 3435
diff changeset
31 { CODEC_ID_PCM_S32BE, MKTAG('N','O','N','E') },
3739
d7fa8d9effe5 Make AIFF demuxer handle F32BE and F64BE PCM audio.
pross
parents: 3530
diff changeset
32 { CODEC_ID_PCM_F32BE, MKTAG('f','l','3','2') },
d7fa8d9effe5 Make AIFF demuxer handle F32BE and F64BE PCM audio.
pross
parents: 3530
diff changeset
33 { CODEC_ID_PCM_F64BE, MKTAG('f','l','6','4') },
3529
579f6524e344 cosmetics, align vertically
bcoudurier
parents: 3435
diff changeset
34 { CODEC_ID_PCM_ALAW, MKTAG('a','l','a','w') },
579f6524e344 cosmetics, align vertically
bcoudurier
parents: 3435
diff changeset
35 { CODEC_ID_PCM_MULAW, MKTAG('u','l','a','w') },
579f6524e344 cosmetics, align vertically
bcoudurier
parents: 3435
diff changeset
36 { CODEC_ID_MACE3, MKTAG('M','A','C','3') },
579f6524e344 cosmetics, align vertically
bcoudurier
parents: 3435
diff changeset
37 { CODEC_ID_MACE6, MKTAG('M','A','C','6') },
579f6524e344 cosmetics, align vertically
bcoudurier
parents: 3435
diff changeset
38 { CODEC_ID_GSM, MKTAG('G','S','M',' ') },
579f6524e344 cosmetics, align vertically
bcoudurier
parents: 3435
diff changeset
39 { CODEC_ID_ADPCM_G726, MKTAG('G','7','2','6') },
579f6524e344 cosmetics, align vertically
bcoudurier
parents: 3435
diff changeset
40 { CODEC_ID_PCM_S16LE, MKTAG('s','o','w','t') },
3066
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
41 { CODEC_ID_ADPCM_IMA_QT, MKTAG('i','m','a','4') },
3529
579f6524e344 cosmetics, align vertically
bcoudurier
parents: 3435
diff changeset
42 { CODEC_ID_QDM2, MKTAG('Q','D','M','2') },
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
43 { 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
44 };
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
45
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
46 #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
47 #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
48
3530
a997151117a2 cosmetics
bcoudurier
parents: 3529
diff changeset
49 static int aiff_codec_get_id(int bps)
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
50 {
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 <= 8)
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_S8;
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 <= 16)
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_S16BE;
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 <= 24)
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_S24BE;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
57 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
58 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
59
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
60 /* 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
61 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
62 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
63
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
64 /* 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
65 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
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 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
68
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
69 if (url_feof(pb))
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
70 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
71
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
72 *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
73 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
74
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
75 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
76 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
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 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
79 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
80
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
81 /* 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
82 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
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 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
85
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
86 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
87 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
88 else
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
89 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
90
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
91 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
92 return;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
93
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
94 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
95 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
96 size++;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
97 size -= res;
1792
bcoudurier
parents: 1791
diff changeset
98 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
99 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
100 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
101
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
102 /* 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
103 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
104 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
105 {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
106 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
107 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
108 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
109
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
110 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
111 size++;
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);
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3891
diff changeset
115 codec->bits_per_coded_sample = get_be16(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
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);
3070
f4d4687e5b1f cosmetics
bcoudurier
parents: 3069
diff changeset
125 codec->codec_id = codec_get_id(codec_aiff_tags, codec->codec_tag);
925
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:
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3891
diff changeset
129 codec->codec_id = aiff_codec_get_id(codec->bits_per_coded_sample);
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3891
diff changeset
130 codec->bits_per_coded_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;
3079
475106eb507e fix mace duration
bcoudurier
parents: 3075
diff changeset
136 case CODEC_ID_MACE3:
3111
6f505b24ed57 set block align for mace3/6
bcoudurier
parents: 3110
diff changeset
137 codec->block_align = 2*codec->channels;
6f505b24ed57 set block align for mace3/6
bcoudurier
parents: 3110
diff changeset
138 codec->frame_size = 6;
6f505b24ed57 set block align for mace3/6
bcoudurier
parents: 3110
diff changeset
139 break;
3079
475106eb507e fix mace duration
bcoudurier
parents: 3075
diff changeset
140 case CODEC_ID_MACE6:
3111
6f505b24ed57 set block align for mace3/6
bcoudurier
parents: 3110
diff changeset
141 codec->block_align = 1*codec->channels;
3079
475106eb507e fix mace duration
bcoudurier
parents: 3075
diff changeset
142 codec->frame_size = 6;
475106eb507e fix mace duration
bcoudurier
parents: 3075
diff changeset
143 break;
3891
fbe8704f513a set block align and frame size for gsm in aiff
bcoudurier
parents: 3871
diff changeset
144 case CODEC_ID_GSM:
fbe8704f513a set block align and frame size for gsm in aiff
bcoudurier
parents: 3871
diff changeset
145 codec->block_align = 33;
fbe8704f513a set block align and frame size for gsm in aiff
bcoudurier
parents: 3871
diff changeset
146 codec->frame_size = 160;
fbe8704f513a set block align and frame size for gsm in aiff
bcoudurier
parents: 3871
diff changeset
147 break;
3066
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
148 default:
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
149 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
150 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
151 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
152 } else {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
153 /* Need the codec type */
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3891
diff changeset
154 codec->codec_id = aiff_codec_get_id(codec->bits_per_coded_sample);
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3891
diff changeset
155 codec->bits_per_coded_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
156 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
157
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
158 /* 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
159 * is specific to applications -> here we use the WAVE format definition */
3066
5a69d7493dab ima4 in aiff support
bcoudurier
parents: 2771
diff changeset
160 if (!codec->block_align)
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3891
diff changeset
161 codec->block_align = (codec->bits_per_coded_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
162
3110
3dade22abed6 correctly compute bit rate for compressed audio, should fix seeking in aiff
bcoudurier
parents: 3079
diff changeset
163 codec->bit_rate = (codec->frame_size ? codec->sample_rate/codec->frame_size :
3dade22abed6 correctly compute bit rate for compressed audio, should fix seeking in aiff
bcoudurier
parents: 3079
diff changeset
164 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
165
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
166 /* 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
167 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
168 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
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 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
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
3871
e6aeb2733e34 Replace generic CONFIG_MUXERS preprocessor conditionals by more specific
diego
parents: 3766
diff changeset
173 #ifdef CONFIG_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
174 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
175 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
176 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
177 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
178 } AIFFOutputContext;
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
179
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
180 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
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 AIFFOutputContext *aiff = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
183 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
184 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
185 AVExtFloat sample_rate;
1790
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
186 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
187
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
188 /* First verify if format is ok */
3070
f4d4687e5b1f cosmetics
bcoudurier
parents: 3069
diff changeset
189 if (!enc->codec_tag)
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
190 return -1;
1790
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
191 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
192 aifc = 1;
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
193
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
194 /* 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
195 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
196 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
197 put_be32(pb, 0); /* file length */
1790
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
198 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
199
3068
9cc9ff5aff9c set bps to uncompressed original sound data for compressed audio
bcoudurier
parents: 3067
diff changeset
200 if (aifc) { // compressed audio
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3891
diff changeset
201 enc->bits_per_coded_sample = 16;
3068
9cc9ff5aff9c set bps to uncompressed original sound data for compressed audio
bcoudurier
parents: 3067
diff changeset
202 if (!enc->block_align) {
9cc9ff5aff9c set bps to uncompressed original sound data for compressed audio
bcoudurier
parents: 3067
diff changeset
203 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
204 return -1;
9cc9ff5aff9c set bps to uncompressed original sound data for compressed audio
bcoudurier
parents: 3067
diff changeset
205 }
1791
0523fb44aa72 indentation
bcoudurier
parents: 1790
diff changeset
206 /* Version chunk */
0523fb44aa72 indentation
bcoudurier
parents: 1790
diff changeset
207 put_tag(pb, "FVER");
0523fb44aa72 indentation
bcoudurier
parents: 1790
diff changeset
208 put_be32(pb, 4);
0523fb44aa72 indentation
bcoudurier
parents: 1790
diff changeset
209 put_be32(pb, 0xA2805140);
1790
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
210 }
925
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 /* 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
213 put_tag(pb, "COMM");
1790
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
214 put_be32(pb, aifc ? 24 : 18); /* size */
3070
f4d4687e5b1f cosmetics
bcoudurier
parents: 3069
diff changeset
215 put_be16(pb, enc->channels); /* Number of channels */
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
216
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
217 aiff->frames = url_ftell(pb);
3070
f4d4687e5b1f cosmetics
bcoudurier
parents: 3069
diff changeset
218 put_be32(pb, 0); /* Number of 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
219
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3891
diff changeset
220 if (!enc->bits_per_coded_sample)
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3891
diff changeset
221 enc->bits_per_coded_sample = av_get_bits_per_sample(enc->codec_id);
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3891
diff changeset
222 if (!enc->bits_per_coded_sample) {
1375
c42cb95fa0d4 use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents: 1374
diff changeset
223 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
224 return -1;
c42cb95fa0d4 use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents: 1374
diff changeset
225 }
c42cb95fa0d4 use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents: 1374
diff changeset
226 if (!enc->block_align)
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3891
diff changeset
227 enc->block_align = (enc->bits_per_coded_sample * enc->channels) >> 3;
1375
c42cb95fa0d4 use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents: 1374
diff changeset
228
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3891
diff changeset
229 put_be16(pb, enc->bits_per_coded_sample); /* Sample 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
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 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
232 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
233
1790
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
234 if (aifc) {
1791
0523fb44aa72 indentation
bcoudurier
parents: 1790
diff changeset
235 put_le32(pb, enc->codec_tag);
0523fb44aa72 indentation
bcoudurier
parents: 1790
diff changeset
236 put_be16(pb, 0);
1790
d30211065a35 use aiff when we can, some players only support aiff
bcoudurier
parents: 1684
diff changeset
237 }
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
238
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
239 /* 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
240 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
241 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
242 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
243 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
244 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
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 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
247
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
248 /* 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
249 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
250
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
251 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
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
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
254 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
255 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
256 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
257 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
258 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
259 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
260
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
261 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
262 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
263 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
264 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
265 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
266
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
267 /* 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
268 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
269 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
270 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
271 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
272 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
273 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
274
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
275 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
276 /* 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
277 url_fseek(pb, aiff->form, SEEK_SET);
3071
c4121744e2a7 remove useless casts
bcoudurier
parents: 3070
diff changeset
278 put_be32(pb, file_size - aiff->form - 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
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 /* 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
281 url_fseek(pb, aiff->frames, SEEK_SET);
3071
c4121744e2a7 remove useless casts
bcoudurier
parents: 3070
diff changeset
282 put_be32(pb, (file_size-aiff->ssnd-12)/enc->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
283
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
284 /* 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
285 url_fseek(pb, aiff->ssnd, SEEK_SET);
3071
c4121744e2a7 remove useless casts
bcoudurier
parents: 3070
diff changeset
286 put_be32(pb, file_size - aiff->ssnd - 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
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 /* 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
289 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
290
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
291 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
292 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
293
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
294 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
295 }
3871
e6aeb2733e34 Replace generic CONFIG_MUXERS preprocessor conditionals by more specific
diego
parents: 3766
diff changeset
296 #endif /* CONFIG_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
297
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
298 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
299 {
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
300 /* 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
301 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
302 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
303 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
304 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
305 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
306 else
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
307 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
308 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
309
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
310 /* 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
311 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
312 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
313 {
2206
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
314 int size, filesize;
c049274b7bd4 support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents: 2060
diff changeset
315 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
316 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
317 unsigned version = AIFF_C_VERSION1;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
318 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
319 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
320
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
321 /* 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
322 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
323 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
324 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
325
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
326 /* 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
327 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
328 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
329 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
330 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
331 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
332
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
333 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
334
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
335 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
336 if (!st)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2209
diff changeset
337 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
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 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
340 /* 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
341 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
342 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
343 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
344
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
345 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
346
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
347 switch (tag) {
3072
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
348 case MKTAG('C', 'O', 'M', 'M'): /* Common chunk */
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
349 /* Then for the complete header info */
3295
4616ba855d62 cosmetics, remove space before opening parenthesis
bcoudurier
parents: 3286
diff changeset
350 st->nb_frames = get_aiff_header(pb, st->codec, size, version);
3072
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
351 if (st->nb_frames < 0)
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
352 return st->nb_frames;
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
353 if (offset > 0) // COMM is after SSND
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
354 goto got_sound;
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
355 break;
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
356 case MKTAG('F', 'V', 'E', 'R'): /* Version chunk */
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
357 version = get_be32(pb);
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
358 break;
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
359 case MKTAG('N', 'A', 'M', 'E'): /* Sample name chunk */
3295
4616ba855d62 cosmetics, remove space before opening parenthesis
bcoudurier
parents: 3286
diff changeset
360 get_meta(pb, s->title, sizeof(s->title), size);
3072
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
361 break;
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
362 case MKTAG('A', 'U', 'T', 'H'): /* Author chunk */
3295
4616ba855d62 cosmetics, remove space before opening parenthesis
bcoudurier
parents: 3286
diff changeset
363 get_meta(pb, s->author, sizeof(s->author), size);
3072
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
364 break;
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
365 case MKTAG('(', 'c', ')', ' '): /* Copyright chunk */
3295
4616ba855d62 cosmetics, remove space before opening parenthesis
bcoudurier
parents: 3286
diff changeset
366 get_meta(pb, s->copyright, sizeof(s->copyright), size);
3072
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
367 break;
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
368 case MKTAG('A', 'N', 'N', 'O'): /* Annotation chunk */
3295
4616ba855d62 cosmetics, remove space before opening parenthesis
bcoudurier
parents: 3286
diff changeset
369 get_meta(pb, s->comment, sizeof(s->comment), size);
3072
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
370 break;
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
371 case MKTAG('S', 'S', 'N', 'D'): /* Sampled sound chunk */
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
372 offset = get_be32(pb); /* Offset of sound data */
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
373 get_be32(pb); /* BlockSize... don't care */
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
374 offset += url_ftell(pb); /* Compute absolute data offset */
3297
df2df4c07d12 try to demux even if codec is not recognized, should demux M1F1-float32C-AFsp.aif and fix #454
bcoudurier
parents: 3296
diff changeset
375 if (st->codec->block_align) /* Assume COMM already parsed */
3072
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
376 goto got_sound;
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
377 if (url_is_streamed(pb)) {
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
378 av_log(s, AV_LOG_ERROR, "file is not seekable\n");
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
379 return -1;
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
380 }
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
381 url_fskip(pb, size - 8);
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
382 break;
3074
815859771e8b support QDM2 in aiff, QDM2.aif
bcoudurier
parents: 3073
diff changeset
383 case MKTAG('w', 'a', 'v', 'e'):
3075
b273d958cf52 10l, protect malloc overflow
bcoudurier
parents: 3074
diff changeset
384 if ((uint64_t)size > (1<<30))
b273d958cf52 10l, protect malloc overflow
bcoudurier
parents: 3074
diff changeset
385 return -1;
3074
815859771e8b support QDM2 in aiff, QDM2.aif
bcoudurier
parents: 3073
diff changeset
386 st->codec->extradata = av_mallocz(size + FF_INPUT_BUFFER_PADDING_SIZE);
815859771e8b support QDM2 in aiff, QDM2.aif
bcoudurier
parents: 3073
diff changeset
387 if (!st->codec->extradata)
815859771e8b support QDM2 in aiff, QDM2.aif
bcoudurier
parents: 3073
diff changeset
388 return AVERROR(ENOMEM);
815859771e8b support QDM2 in aiff, QDM2.aif
bcoudurier
parents: 3073
diff changeset
389 st->codec->extradata_size = size;
815859771e8b support QDM2 in aiff, QDM2.aif
bcoudurier
parents: 3073
diff changeset
390 get_buffer(pb, st->codec->extradata, size);
815859771e8b support QDM2 in aiff, QDM2.aif
bcoudurier
parents: 3073
diff changeset
391 break;
3072
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
392 default: /* Jump */
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
393 if (size & 1) /* Always even aligned */
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
394 size++;
0e84da9b7183 indentation
bcoudurier
parents: 3071
diff changeset
395 url_fskip (pb, 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
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 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
398
3297
df2df4c07d12 try to demux even if codec is not recognized, should demux M1F1-float32C-AFsp.aif and fix #454
bcoudurier
parents: 3296
diff changeset
399 if (!st->codec->block_align) {
df2df4c07d12 try to demux even if codec is not recognized, should demux M1F1-float32C-AFsp.aif and fix #454
bcoudurier
parents: 3296
diff changeset
400 av_log(s, AV_LOG_ERROR, "could not find COMM tag\n");
df2df4c07d12 try to demux even if codec is not recognized, should demux M1F1-float32C-AFsp.aif and fix #454
bcoudurier
parents: 3296
diff changeset
401 return -1;
df2df4c07d12 try to demux even if codec is not recognized, should demux M1F1-float32C-AFsp.aif and fix #454
bcoudurier
parents: 3296
diff changeset
402 }
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
403
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
404 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
405 /* 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
406 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
407 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
408
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
409 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
410 st->start_time = 0;
3067
2dc78258f848 fix duration for ima4
bcoudurier
parents: 3066
diff changeset
411 st->duration = st->codec->frame_size ?
2dc78258f848 fix duration for ima4
bcoudurier
parents: 3066
diff changeset
412 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
413
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
414 /* 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
415 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
416
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
417 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
418 }
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 #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
421
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
422 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
423 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
424 {
1087
8ffbf9385972 fix pcm_s24be demuxing, simplify
bcoudurier
parents: 925
diff changeset
425 AVStream *st = s->streams[0];
8ffbf9385972 fix pcm_s24be demuxing, simplify
bcoudurier
parents: 925
diff changeset
426 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
427
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
428 /* End of stream may be reached */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
429 if (url_feof(s->pb))
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
430 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
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 /* Now for that packet */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
433 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
434 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
435 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
436
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
437 /* 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
438 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
439 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
440 }
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
441
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
442 #ifdef CONFIG_AIFF_DEMUXER
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
443 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
444 "aiff",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3297
diff changeset
445 NULL_IF_CONFIG_SMALL("Audio IFF"),
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
446 0,
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_probe,
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_header,
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_packet,
3073
ed7b32bedcb5 remove useless close function
bcoudurier
parents: 3072
diff changeset
450 NULL,
3435
a81155640306 Remove wrappers of pcm_read_seek().
ramiro
parents: 3424
diff changeset
451 pcm_read_seek,
3766
f062deeedb8d Change codec_tag type from const struct AVCodecTag ** to const struct AVCodecTag * const *
reimar
parents: 3739
diff changeset
452 .codec_tag= (const AVCodecTag* const []){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
453 };
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
454 #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
455
1170
de5e5e04a33a CONFIG_AIFF_DEMUXER vs CONFIG_AIFF_MUXER typo
diego
parents: 1169
diff changeset
456 #ifdef CONFIG_AIFF_MUXER
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
457 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
458 "aiff",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3297
diff changeset
459 NULL_IF_CONFIG_SMALL("Audio IFF"),
925
2d9a65a1d9ea AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff changeset
460 "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
461 "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
462 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
463 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
464 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
465 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
466 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
467 aiff_write_trailer,
3766
f062deeedb8d Change codec_tag type from const struct AVCodecTag ** to const struct AVCodecTag * const *
reimar
parents: 3739
diff changeset
468 .codec_tag= (const AVCodecTag* const []){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
469 };
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
470 #endif