Mercurial > libavformat.hg
annotate aiff.c @ 3345:8947d86e480b libavformat
Make ac3 in avi work better.
fixes issue355.
author | michael |
---|---|
date | Mon, 26 May 2008 00:05:30 +0000 |
parents | df2df4c07d12 |
children | 7a0230981402 |
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 | 21 |
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[] = { |
925
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_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
|
29 { 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
|
30 { 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
|
31 { 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
|
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_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
|
35 { 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
|
36 { 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
|
37 { CODEC_ID_ADPCM_G726, MKTAG('G','7','2','6') }, |
2060 | 38 { CODEC_ID_PCM_S16LE, MKTAG('s','o','w','t') }, |
3066 | 39 { CODEC_ID_ADPCM_IMA_QT, MKTAG('i','m','a','4') }, |
3074 | 40 { 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
|
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 | 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 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
|
109 size++; |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
110 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
|
111 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
|
112 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
|
113 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
|
114 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
115 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
|
116 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
|
117 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
|
118 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
|
119 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
120 /* 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
|
121 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
|
122 codec->codec_tag = get_le32(pb); |
3070 | 123 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
|
124 |
3066 | 125 switch (codec->codec_id) { |
126 case CODEC_ID_PCM_S16BE: | |
3070 | 127 codec->codec_id = aiff_codec_get_id(codec->bits_per_sample); |
1376 | 128 codec->bits_per_sample = av_get_bits_per_sample(codec->codec_id); |
3066 | 129 break; |
130 case CODEC_ID_ADPCM_IMA_QT: | |
131 codec->block_align = 34*codec->channels; | |
3067 | 132 codec->frame_size = 64; |
3066 | 133 break; |
3079 | 134 case CODEC_ID_MACE3: |
3111 | 135 codec->block_align = 2*codec->channels; |
136 codec->frame_size = 6; | |
137 break; | |
3079 | 138 case CODEC_ID_MACE6: |
3111 | 139 codec->block_align = 1*codec->channels; |
3079 | 140 codec->frame_size = 6; |
141 break; | |
3066 | 142 default: |
143 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
|
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 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
|
146 } else { |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
147 /* Need the codec type */ |
3070 | 148 codec->codec_id = aiff_codec_get_id(codec->bits_per_sample); |
1376 | 149 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
|
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 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
152 /* 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
|
153 * is specific to applications -> here we use the WAVE format definition */ |
3066 | 154 if (!codec->block_align) |
155 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
|
156 |
3110
3dade22abed6
correctly compute bit rate for compressed audio, should fix seeking in aiff
bcoudurier
parents:
3079
diff
changeset
|
157 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
|
158 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
|
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 /* 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
|
161 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
|
162 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
|
163 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
164 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
|
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 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
167 #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
|
168 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
|
169 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
|
170 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
|
171 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
|
172 } AIFFOutputContext; |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
173 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
174 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
|
175 { |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
176 AIFFOutputContext *aiff = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
177 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
|
178 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
|
179 AVExtFloat sample_rate; |
1790
d30211065a35
use aiff when we can, some players only support aiff
bcoudurier
parents:
1684
diff
changeset
|
180 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
|
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 /* First verify if format is ok */ |
3070 | 183 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
|
184 return -1; |
1790
d30211065a35
use aiff when we can, some players only support aiff
bcoudurier
parents:
1684
diff
changeset
|
185 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
|
186 aifc = 1; |
d30211065a35
use aiff when we can, some players only support aiff
bcoudurier
parents:
1684
diff
changeset
|
187 |
925
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
188 /* 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
|
189 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
|
190 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
|
191 put_be32(pb, 0); /* file length */ |
1790
d30211065a35
use aiff when we can, some players only support aiff
bcoudurier
parents:
1684
diff
changeset
|
192 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
|
193 |
3068
9cc9ff5aff9c
set bps to uncompressed original sound data for compressed audio
bcoudurier
parents:
3067
diff
changeset
|
194 if (aifc) { // compressed audio |
9cc9ff5aff9c
set bps to uncompressed original sound data for compressed audio
bcoudurier
parents:
3067
diff
changeset
|
195 enc->bits_per_sample = 16; |
9cc9ff5aff9c
set bps to uncompressed original sound data for compressed audio
bcoudurier
parents:
3067
diff
changeset
|
196 if (!enc->block_align) { |
9cc9ff5aff9c
set bps to uncompressed original sound data for compressed audio
bcoudurier
parents:
3067
diff
changeset
|
197 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
|
198 return -1; |
9cc9ff5aff9c
set bps to uncompressed original sound data for compressed audio
bcoudurier
parents:
3067
diff
changeset
|
199 } |
1791 | 200 /* Version chunk */ |
201 put_tag(pb, "FVER"); | |
202 put_be32(pb, 4); | |
203 put_be32(pb, 0xA2805140); | |
1790
d30211065a35
use aiff when we can, some players only support aiff
bcoudurier
parents:
1684
diff
changeset
|
204 } |
925
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
205 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
206 /* 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
|
207 put_tag(pb, "COMM"); |
1790
d30211065a35
use aiff when we can, some players only support aiff
bcoudurier
parents:
1684
diff
changeset
|
208 put_be32(pb, aifc ? 24 : 18); /* size */ |
3070 | 209 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
|
210 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
211 aiff->frames = url_ftell(pb); |
3070 | 212 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
|
213 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
214 if (!enc->bits_per_sample) |
1375
c42cb95fa0d4
use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents:
1374
diff
changeset
|
215 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
|
216 if (!enc->bits_per_sample) { |
c42cb95fa0d4
use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents:
1374
diff
changeset
|
217 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
|
218 return -1; |
c42cb95fa0d4
use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents:
1374
diff
changeset
|
219 } |
c42cb95fa0d4
use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents:
1374
diff
changeset
|
220 if (!enc->block_align) |
c42cb95fa0d4
use av_get_bits_per_sample, compute block align if not set
bcoudurier
parents:
1374
diff
changeset
|
221 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
|
222 |
925
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
223 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
|
224 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
225 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
|
226 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
|
227 |
1790
d30211065a35
use aiff when we can, some players only support aiff
bcoudurier
parents:
1684
diff
changeset
|
228 if (aifc) { |
1791 | 229 put_le32(pb, enc->codec_tag); |
230 put_be16(pb, 0); | |
1790
d30211065a35
use aiff when we can, some players only support aiff
bcoudurier
parents:
1684
diff
changeset
|
231 } |
925
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
232 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
233 /* 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
|
234 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
|
235 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
|
236 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
|
237 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
|
238 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
|
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 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
|
241 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
242 /* 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
|
243 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
|
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 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
|
246 } |
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 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
|
249 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
250 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
|
251 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
|
252 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
|
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 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
255 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
|
256 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
257 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
|
258 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
|
259 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
|
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 /* 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
|
262 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
|
263 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
|
264 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
|
265 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
|
266 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
|
267 } |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
268 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
269 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
|
270 /* 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
|
271 url_fseek(pb, aiff->form, SEEK_SET); |
3071 | 272 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
|
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 /* 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
|
275 url_fseek(pb, aiff->frames, SEEK_SET); |
3071 | 276 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
|
277 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
278 /* 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
|
279 url_fseek(pb, aiff->ssnd, SEEK_SET); |
3071 | 280 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
|
281 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
282 /* 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
|
283 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
|
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 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
|
286 } |
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 0; |
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 #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
|
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 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
|
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 /* 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
|
295 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
|
296 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
|
297 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
|
298 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
|
299 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
|
300 else |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
301 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
|
302 } |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
303 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
304 /* 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
|
305 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
|
306 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
|
307 { |
2206
c049274b7bd4
support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents:
2060
diff
changeset
|
308 int size, filesize; |
c049274b7bd4
support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents:
2060
diff
changeset
|
309 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
|
310 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
|
311 unsigned version = AIFF_C_VERSION1; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
312 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
|
313 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
|
314 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
315 /* 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
|
316 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
|
317 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
|
318 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
|
319 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
320 /* 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
|
321 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
|
322 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
|
323 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
|
324 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
|
325 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
|
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 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
|
328 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
329 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
|
330 if (!st) |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2209
diff
changeset
|
331 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
|
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 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
|
334 /* 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
|
335 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
|
336 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
|
337 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
|
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 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
|
340 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
341 switch (tag) { |
3072 | 342 case MKTAG('C', 'O', 'M', 'M'): /* Common chunk */ |
343 /* Then for the complete header info */ | |
3295
4616ba855d62
cosmetics, remove space before opening parenthesis
bcoudurier
parents:
3286
diff
changeset
|
344 st->nb_frames = get_aiff_header(pb, st->codec, size, version); |
3072 | 345 if (st->nb_frames < 0) |
346 return st->nb_frames; | |
347 if (offset > 0) // COMM is after SSND | |
348 goto got_sound; | |
349 break; | |
350 case MKTAG('F', 'V', 'E', 'R'): /* Version chunk */ | |
351 version = get_be32(pb); | |
352 break; | |
353 case MKTAG('N', 'A', 'M', 'E'): /* Sample name chunk */ | |
3295
4616ba855d62
cosmetics, remove space before opening parenthesis
bcoudurier
parents:
3286
diff
changeset
|
354 get_meta(pb, s->title, sizeof(s->title), size); |
3072 | 355 break; |
356 case MKTAG('A', 'U', 'T', 'H'): /* Author chunk */ | |
3295
4616ba855d62
cosmetics, remove space before opening parenthesis
bcoudurier
parents:
3286
diff
changeset
|
357 get_meta(pb, s->author, sizeof(s->author), size); |
3072 | 358 break; |
359 case MKTAG('(', 'c', ')', ' '): /* Copyright chunk */ | |
3295
4616ba855d62
cosmetics, remove space before opening parenthesis
bcoudurier
parents:
3286
diff
changeset
|
360 get_meta(pb, s->copyright, sizeof(s->copyright), size); |
3072 | 361 break; |
362 case MKTAG('A', 'N', 'N', 'O'): /* Annotation chunk */ | |
3295
4616ba855d62
cosmetics, remove space before opening parenthesis
bcoudurier
parents:
3286
diff
changeset
|
363 get_meta(pb, s->comment, sizeof(s->comment), size); |
3072 | 364 break; |
365 case MKTAG('S', 'S', 'N', 'D'): /* Sampled sound chunk */ | |
366 offset = get_be32(pb); /* Offset of sound data */ | |
367 get_be32(pb); /* BlockSize... don't care */ | |
368 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
|
369 if (st->codec->block_align) /* Assume COMM already parsed */ |
3072 | 370 goto got_sound; |
371 if (url_is_streamed(pb)) { | |
372 av_log(s, AV_LOG_ERROR, "file is not seekable\n"); | |
373 return -1; | |
374 } | |
375 url_fskip(pb, size - 8); | |
376 break; | |
3074 | 377 case MKTAG('w', 'a', 'v', 'e'): |
3075 | 378 if ((uint64_t)size > (1<<30)) |
379 return -1; | |
3074 | 380 st->codec->extradata = av_mallocz(size + FF_INPUT_BUFFER_PADDING_SIZE); |
381 if (!st->codec->extradata) | |
382 return AVERROR(ENOMEM); | |
383 st->codec->extradata_size = size; | |
384 get_buffer(pb, st->codec->extradata, size); | |
385 break; | |
3072 | 386 default: /* Jump */ |
387 if (size & 1) /* Always even aligned */ | |
388 size++; | |
389 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
|
390 } |
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 |
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
|
393 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
|
394 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
|
395 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
|
396 } |
925
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 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
|
399 /* 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
|
400 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
|
401 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
|
402 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
403 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
|
404 st->start_time = 0; |
3067 | 405 st->duration = st->codec->frame_size ? |
406 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
|
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 /* 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
|
409 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
|
410 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
411 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
|
412 } |
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 #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
|
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 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
|
417 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
|
418 { |
1087 | 419 AVStream *st = s->streams[0]; |
420 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
|
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 /* End of stream may be reached */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
423 if (url_feof(s->pb)) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
424 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
|
425 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
426 /* Now for that packet */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
427 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
|
428 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
|
429 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
|
430 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
431 /* 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
|
432 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
|
433 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
|
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 |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
436 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
|
437 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
|
438 { |
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 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
|
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 | 442 #ifdef CONFIG_AIFF_DEMUXER |
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", |
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
445 "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
|
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 | 450 NULL, |
925
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
451 aiff_read_seek, |
1679 | 452 .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
|
453 }; |
1169 | 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 | 456 #ifdef CONFIG_AIFF_MUXER |
1169 | 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", |
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 IFF", |
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, |
1679 | 468 .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
|
469 }; |
1169 | 470 #endif |