Mercurial > libavformat.hg
annotate aiffdec.c @ 6491:b7f807b4cd88 libavformat tip
In mov demuxer, check that nb_streams is valid before using it in read_dac3
| author | bcoudurier |
|---|---|
| date | Tue, 28 Sep 2010 00:33:21 +0000 |
| parents | 4aaed59641ff |
| children |
| 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 /* |
|
5283
63c52dca959b
Split up the AIFF muxer and demuxer into separate files.
jbr
parents:
5279
diff
changeset
|
2 * AIFF/AIFF-C 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" |
| 6445 | 24 #include "pcm.h" |
|
5283
63c52dca959b
Split up the AIFF muxer and demuxer into separate files.
jbr
parents:
5279
diff
changeset
|
25 #include "aiff.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 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
27 #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
|
28 #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
|
29 |
|
5279
0a917464c1dc
Do not read data past the end of the SSND chunk in the AIFF demuxer.
jbr
parents:
5255
diff
changeset
|
30 typedef struct { |
|
0a917464c1dc
Do not read data past the end of the SSND chunk in the AIFF demuxer.
jbr
parents:
5255
diff
changeset
|
31 int64_t data_end; |
|
0a917464c1dc
Do not read data past the end of the SSND chunk in the AIFF demuxer.
jbr
parents:
5255
diff
changeset
|
32 } AIFFInputContext; |
|
0a917464c1dc
Do not read data past the end of the SSND chunk in the AIFF demuxer.
jbr
parents:
5255
diff
changeset
|
33 |
| 3967 | 34 static enum CodecID 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
|
35 { |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
36 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
|
37 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
|
38 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
|
39 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
|
40 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
|
41 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
|
42 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
|
43 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
|
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 /* bigger than 32 isn't allowed */ |
| 3967 | 46 return CODEC_ID_NONE; |
|
925
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
47 } |
|
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 /* 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
|
50 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
|
51 { |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
52 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
|
53 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
54 if (url_feof(pb)) |
|
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
55 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
|
56 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
57 *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
|
58 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
|
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 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
|
61 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
|
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 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
|
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 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
66 /* Metadata string read */ |
| 4364 | 67 static void get_meta(AVFormatContext *s, const char *key, int 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
|
68 { |
|
5446
4211f91f69b1
Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents:
5395
diff
changeset
|
69 uint8_t *str = av_malloc(size+1); |
|
4211f91f69b1
Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents:
5395
diff
changeset
|
70 int res; |
|
4211f91f69b1
Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents:
5395
diff
changeset
|
71 |
|
4211f91f69b1
Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents:
5395
diff
changeset
|
72 if (!str) { |
|
4211f91f69b1
Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents:
5395
diff
changeset
|
73 url_fskip(s->pb, size); |
|
4211f91f69b1
Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents:
5395
diff
changeset
|
74 return; |
|
4211f91f69b1
Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents:
5395
diff
changeset
|
75 } |
|
4211f91f69b1
Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents:
5395
diff
changeset
|
76 |
|
4211f91f69b1
Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents:
5395
diff
changeset
|
77 res = get_buffer(s->pb, str, 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
|
78 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
|
79 return; |
|
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 str[res] = 0; |
|
5446
4211f91f69b1
Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents:
5395
diff
changeset
|
82 av_metadata_set2(&s->metadata, key, str, AV_METADATA_DONT_STRDUP_VAL); |
|
925
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 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
85 /* 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
|
86 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
|
87 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
|
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 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
|
90 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
|
91 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
|
92 |
|
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++; |
|
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5446
diff
changeset
|
95 codec->codec_type = AVMEDIA_TYPE_AUDIO; |
|
925
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
96 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
|
97 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
|
98 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
|
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 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
|
101 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
|
102 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
|
103 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
|
104 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
105 /* 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
|
106 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
|
107 codec->codec_tag = get_le32(pb); |
|
5283
63c52dca959b
Split up the AIFF muxer and demuxer into separate files.
jbr
parents:
5279
diff
changeset
|
108 codec->codec_id = ff_codec_get_id(ff_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
|
109 |
| 3066 | 110 switch (codec->codec_id) { |
| 111 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
|
112 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
|
113 codec->bits_per_coded_sample = av_get_bits_per_sample(codec->codec_id); |
| 3066 | 114 break; |
| 115 case CODEC_ID_ADPCM_IMA_QT: | |
| 116 codec->block_align = 34*codec->channels; | |
| 3067 | 117 codec->frame_size = 64; |
| 3066 | 118 break; |
| 3079 | 119 case CODEC_ID_MACE3: |
| 3111 | 120 codec->block_align = 2*codec->channels; |
| 121 codec->frame_size = 6; | |
| 122 break; | |
| 3079 | 123 case CODEC_ID_MACE6: |
| 3111 | 124 codec->block_align = 1*codec->channels; |
| 3079 | 125 codec->frame_size = 6; |
| 126 break; | |
| 3891 | 127 case CODEC_ID_GSM: |
| 128 codec->block_align = 33; | |
| 129 codec->frame_size = 160; | |
| 130 break; | |
|
5395
af65f63f2063
decode qcelp in aiff, implement #1524, patch by Vitor
bcoudurier
parents:
5284
diff
changeset
|
131 case CODEC_ID_QCELP: |
|
af65f63f2063
decode qcelp in aiff, implement #1524, patch by Vitor
bcoudurier
parents:
5284
diff
changeset
|
132 codec->block_align = 35; |
|
af65f63f2063
decode qcelp in aiff, implement #1524, patch by Vitor
bcoudurier
parents:
5284
diff
changeset
|
133 codec->frame_size= 160; |
|
af65f63f2063
decode qcelp in aiff, implement #1524, patch by Vitor
bcoudurier
parents:
5284
diff
changeset
|
134 break; |
| 3066 | 135 default: |
| 136 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
|
137 } |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
138 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
|
139 } else { |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
140 /* Need the codec type */ |
|
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3891
diff
changeset
|
141 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
|
142 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
|
143 } |
|
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 /* 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
|
146 * is specific to applications -> here we use the WAVE format definition */ |
| 3066 | 147 if (!codec->block_align) |
|
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3891
diff
changeset
|
148 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
|
149 |
|
3110
3dade22abed6
correctly compute bit rate for compressed audio, should fix seeking in aiff
bcoudurier
parents:
3079
diff
changeset
|
150 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
|
151 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
|
152 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
153 /* 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
|
154 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
|
155 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
|
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 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
|
158 } |
|
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 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
|
161 { |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
162 /* 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
|
163 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
|
164 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
|
165 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
|
166 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
|
167 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
|
168 else |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
169 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
|
170 } |
|
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 /* 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
|
173 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
|
174 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
|
175 { |
|
2206
c049274b7bd4
support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
bcoudurier
parents:
2060
diff
changeset
|
176 int size, filesize; |
|
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3967
diff
changeset
|
177 int64_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
|
178 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
|
179 unsigned version = AIFF_C_VERSION1; |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
180 ByteIOContext *pb = s->pb; |
|
4889
848722752aa5
Remove useless init from aiff_read_header() found by CSA.
michael
parents:
4364
diff
changeset
|
181 AVStream * st; |
|
5279
0a917464c1dc
Do not read data past the end of the SSND chunk in the AIFF demuxer.
jbr
parents:
5255
diff
changeset
|
182 AIFFInputContext *aiff = s->priv_data; |
|
925
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
183 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
184 /* 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
|
185 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
|
186 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
|
187 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
|
188 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
189 /* 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
|
190 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
|
191 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
|
192 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
|
193 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
|
194 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
|
195 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
196 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
|
197 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
198 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
|
199 if (!st) |
|
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2209
diff
changeset
|
200 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
|
201 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
202 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
|
203 /* 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
|
204 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
|
205 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
|
206 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
|
207 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
208 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
|
209 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
210 switch (tag) { |
| 3072 | 211 case MKTAG('C', 'O', 'M', 'M'): /* Common chunk */ |
| 212 /* Then for the complete header info */ | |
|
3295
4616ba855d62
cosmetics, remove space before opening parenthesis
bcoudurier
parents:
3286
diff
changeset
|
213 st->nb_frames = get_aiff_header(pb, st->codec, size, version); |
| 3072 | 214 if (st->nb_frames < 0) |
| 215 return st->nb_frames; | |
| 216 if (offset > 0) // COMM is after SSND | |
| 217 goto got_sound; | |
| 218 break; | |
| 219 case MKTAG('F', 'V', 'E', 'R'): /* Version chunk */ | |
| 220 version = get_be32(pb); | |
| 221 break; | |
| 222 case MKTAG('N', 'A', 'M', 'E'): /* Sample name chunk */ | |
| 4364 | 223 get_meta(s, "title" , size); |
| 3072 | 224 break; |
| 225 case MKTAG('A', 'U', 'T', 'H'): /* Author chunk */ | |
| 4364 | 226 get_meta(s, "author" , size); |
| 3072 | 227 break; |
| 228 case MKTAG('(', 'c', ')', ' '): /* Copyright chunk */ | |
| 4364 | 229 get_meta(s, "copyright", size); |
| 3072 | 230 break; |
| 231 case MKTAG('A', 'N', 'N', 'O'): /* Annotation chunk */ | |
| 4364 | 232 get_meta(s, "comment" , size); |
| 3072 | 233 break; |
| 234 case MKTAG('S', 'S', 'N', 'D'): /* Sampled sound chunk */ | |
|
5279
0a917464c1dc
Do not read data past the end of the SSND chunk in the AIFF demuxer.
jbr
parents:
5255
diff
changeset
|
235 aiff->data_end = url_ftell(pb) + size; |
| 3072 | 236 offset = get_be32(pb); /* Offset of sound data */ |
| 237 get_be32(pb); /* BlockSize... don't care */ | |
| 238 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
|
239 if (st->codec->block_align) /* Assume COMM already parsed */ |
| 3072 | 240 goto got_sound; |
| 241 if (url_is_streamed(pb)) { | |
| 242 av_log(s, AV_LOG_ERROR, "file is not seekable\n"); | |
| 243 return -1; | |
| 244 } | |
| 245 url_fskip(pb, size - 8); | |
| 246 break; | |
| 3074 | 247 case MKTAG('w', 'a', 'v', 'e'): |
| 3075 | 248 if ((uint64_t)size > (1<<30)) |
| 249 return -1; | |
| 3074 | 250 st->codec->extradata = av_mallocz(size + FF_INPUT_BUFFER_PADDING_SIZE); |
| 251 if (!st->codec->extradata) | |
| 252 return AVERROR(ENOMEM); | |
| 253 st->codec->extradata_size = size; | |
| 254 get_buffer(pb, st->codec->extradata, size); | |
| 255 break; | |
| 3072 | 256 default: /* Jump */ |
| 257 if (size & 1) /* Always even aligned */ | |
| 258 size++; | |
| 259 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
|
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 } |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
262 |
|
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
|
263 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
|
264 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
|
265 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
|
266 } |
|
925
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 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
|
269 /* 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
|
270 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
|
271 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
|
272 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
273 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
|
274 st->start_time = 0; |
| 3067 | 275 st->duration = st->codec->frame_size ? |
| 276 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
|
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 /* 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
|
279 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
|
280 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
281 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
|
282 } |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
283 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
284 #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
|
285 |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
286 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
|
287 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
|
288 { |
| 1087 | 289 AVStream *st = s->streams[0]; |
|
5279
0a917464c1dc
Do not read data past the end of the SSND chunk in the AIFF demuxer.
jbr
parents:
5255
diff
changeset
|
290 AIFFInputContext *aiff = s->priv_data; |
|
0a917464c1dc
Do not read data past the end of the SSND chunk in the AIFF demuxer.
jbr
parents:
5255
diff
changeset
|
291 int64_t max_size; |
|
5395
af65f63f2063
decode qcelp in aiff, implement #1524, patch by Vitor
bcoudurier
parents:
5284
diff
changeset
|
292 int res, 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
|
293 |
|
5279
0a917464c1dc
Do not read data past the end of the SSND chunk in the AIFF demuxer.
jbr
parents:
5255
diff
changeset
|
294 /* calculate size of remaining data */ |
|
0a917464c1dc
Do not read data past the end of the SSND chunk in the AIFF demuxer.
jbr
parents:
5255
diff
changeset
|
295 max_size = aiff->data_end - url_ftell(s->pb); |
|
0a917464c1dc
Do not read data past the end of the SSND chunk in the AIFF demuxer.
jbr
parents:
5255
diff
changeset
|
296 if (max_size <= 0) |
|
0a917464c1dc
Do not read data past the end of the SSND chunk in the AIFF demuxer.
jbr
parents:
5255
diff
changeset
|
297 return AVERROR_EOF; |
|
0a917464c1dc
Do not read data past the end of the SSND chunk in the AIFF demuxer.
jbr
parents:
5255
diff
changeset
|
298 |
|
925
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
299 /* Now for that packet */ |
|
5395
af65f63f2063
decode qcelp in aiff, implement #1524, patch by Vitor
bcoudurier
parents:
5284
diff
changeset
|
300 if (st->codec->block_align >= 33) // GSM, QCLP, IMA4 |
|
af65f63f2063
decode qcelp in aiff, implement #1524, patch by Vitor
bcoudurier
parents:
5284
diff
changeset
|
301 size = st->codec->block_align; |
|
af65f63f2063
decode qcelp in aiff, implement #1524, patch by Vitor
bcoudurier
parents:
5284
diff
changeset
|
302 else |
|
af65f63f2063
decode qcelp in aiff, implement #1524, patch by Vitor
bcoudurier
parents:
5284
diff
changeset
|
303 size = (MAX_SIZE / st->codec->block_align) * st->codec->block_align; |
|
af65f63f2063
decode qcelp in aiff, implement #1524, patch by Vitor
bcoudurier
parents:
5284
diff
changeset
|
304 size = FFMIN(max_size, size); |
|
af65f63f2063
decode qcelp in aiff, implement #1524, patch by Vitor
bcoudurier
parents:
5284
diff
changeset
|
305 res = av_get_packet(s->pb, pkt, 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
|
306 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
|
307 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
|
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 /* 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
|
310 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
|
311 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
|
312 } |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
313 |
| 1169 | 314 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
|
315 "aiff", |
|
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3297
diff
changeset
|
316 NULL_IF_CONFIG_SMALL("Audio IFF"), |
|
5279
0a917464c1dc
Do not read data past the end of the SSND chunk in the AIFF demuxer.
jbr
parents:
5255
diff
changeset
|
317 sizeof(AIFFInputContext), |
|
925
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
318 aiff_probe, |
|
2d9a65a1d9ea
AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
michael
parents:
diff
changeset
|
319 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
|
320 aiff_read_packet, |
| 3073 | 321 NULL, |
| 3435 | 322 pcm_read_seek, |
|
5283
63c52dca959b
Split up the AIFF muxer and demuxer into separate files.
jbr
parents:
5279
diff
changeset
|
323 .codec_tag= (const AVCodecTag* const []){ff_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
|
324 }; |
