Mercurial > libavformat.hg
annotate au.c @ 3754:8d267b43eaba libavformat
Move malloc() down until after all initializations, so that the resource is
only allocated if initialization worked. This means that on failure, we
don't have to deallocate it.
author | rbultje |
---|---|
date | Sat, 23 Aug 2008 18:46:30 +0000 |
parents | 441e758e1a5e |
children | f062deeedb8d |
rev | line source |
---|---|
885 | 1 /* |
1415
3b00fb8ef8e4
replace coder/decoder file description in libavformat by muxer/demuxer
aurel
parents:
1358
diff
changeset
|
2 * AU muxer and demuxer |
0 | 3 * Copyright (c) 2001 Fabrice Bellard. |
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 |
0 | 8 * modify it under the terms of the GNU Lesser General Public |
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. |
0 | 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, |
0 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
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 |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
885
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 20 */ |
21 | |
22 /* | |
23 * First version by Francois Revol revol@free.fr | |
24 * | |
25 * Reference documents: | |
26 * http://www.opengroup.org/public/pubs/external/auformat.html | |
27 * http://www.goice.co.jp/member/mo/formats/au.html | |
28 */ | |
29 | |
30 #include "avformat.h" | |
2545
213268d7594e
move unrelated functions declarations out of allformats.h
aurel
parents:
2274
diff
changeset
|
31 #include "raw.h" |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
1169
diff
changeset
|
32 #include "riff.h" |
0 | 33 |
34 /* if we don't know the size in advance */ | |
1885 | 35 #define AU_UNKNOWN_SIZE ((uint32_t)(~0)) |
0 | 36 |
37 /* The ffmpeg codecs we support, and the IDs they have in the file */ | |
1677
2a85c82b8538
add codec_id <-> codec_tag tables to AVIn/OutputFormat
michael
parents:
1415
diff
changeset
|
38 static const AVCodecTag codec_au_tags[] = { |
0 | 39 { CODEC_ID_PCM_MULAW, 1 }, |
2933 | 40 { CODEC_ID_PCM_S8, 2 }, |
0 | 41 { CODEC_ID_PCM_S16BE, 3 }, |
3736
441e758e1a5e
Make AU demuxer handle S24BE, S32BE and F64BE PCM audio.
pross
parents:
3599
diff
changeset
|
42 { CODEC_ID_PCM_S24BE, 4 }, |
441e758e1a5e
Make AU demuxer handle S24BE, S32BE and F64BE PCM audio.
pross
parents:
3599
diff
changeset
|
43 { CODEC_ID_PCM_S32BE, 5 }, |
3599
d99961d92b99
Support 32-bit floating point audio samples in Sun AU demuxer
pross
parents:
3484
diff
changeset
|
44 { CODEC_ID_PCM_F32BE, 6 }, |
3736
441e758e1a5e
Make AU demuxer handle S24BE, S32BE and F64BE PCM audio.
pross
parents:
3599
diff
changeset
|
45 { CODEC_ID_PCM_F64BE, 7 }, |
0 | 46 { CODEC_ID_PCM_ALAW, 27 }, |
47 { 0, 0 }, | |
48 }; | |
49 | |
858
66cc656ea404
Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents:
820
diff
changeset
|
50 #ifdef CONFIG_MUXERS |
0 | 51 /* AUDIO_FILE header */ |
52 static int put_au_header(ByteIOContext *pb, AVCodecContext *enc) | |
53 { | |
196 | 54 if(!enc->codec_tag) |
0 | 55 return -1; |
56 put_tag(pb, ".snd"); /* magic number */ | |
57 put_be32(pb, 24); /* header size */ | |
1885 | 58 put_be32(pb, AU_UNKNOWN_SIZE); /* data size */ |
196 | 59 put_be32(pb, (uint32_t)enc->codec_tag); /* codec ID */ |
0 | 60 put_be32(pb, enc->sample_rate); |
65 | 61 put_be32(pb, (uint32_t)enc->channels); |
0 | 62 return 0; |
63 } | |
64 | |
65 static int au_write_header(AVFormatContext *s) | |
66 { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
67 ByteIOContext *pb = s->pb; |
0 | 68 |
69 s->priv_data = NULL; | |
70 | |
71 /* format header */ | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
72 if (put_au_header(pb, s->streams[0]->codec) < 0) { |
0 | 73 return -1; |
74 } | |
75 | |
76 put_flush_packet(pb); | |
77 | |
78 return 0; | |
79 } | |
80 | |
468 | 81 static int au_write_packet(AVFormatContext *s, AVPacket *pkt) |
0 | 82 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
83 ByteIOContext *pb = s->pb; |
468 | 84 put_buffer(pb, pkt->data, pkt->size); |
0 | 85 return 0; |
86 } | |
87 | |
88 static int au_write_trailer(AVFormatContext *s) | |
89 { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
90 ByteIOContext *pb = s->pb; |
0 | 91 offset_t file_size; |
92 | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
93 if (!url_is_streamed(s->pb)) { |
0 | 94 |
95 /* update file size */ | |
96 file_size = url_ftell(pb); | |
97 url_fseek(pb, 8, SEEK_SET); | |
65 | 98 put_be32(pb, (uint32_t)(file_size - 24)); |
0 | 99 url_fseek(pb, file_size, SEEK_SET); |
100 | |
101 put_flush_packet(pb); | |
102 } | |
103 | |
104 return 0; | |
105 } | |
858
66cc656ea404
Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents:
820
diff
changeset
|
106 #endif //CONFIG_MUXERS |
0 | 107 |
108 static int au_probe(AVProbeData *p) | |
109 { | |
110 /* check file header */ | |
111 if (p->buf[0] == '.' && p->buf[1] == 's' && | |
112 p->buf[2] == 'n' && p->buf[3] == 'd') | |
113 return AVPROBE_SCORE_MAX; | |
114 else | |
115 return 0; | |
116 } | |
117 | |
118 /* au input */ | |
119 static int au_read_header(AVFormatContext *s, | |
306 | 120 AVFormatParameters *ap) |
0 | 121 { |
122 int size; | |
123 unsigned int tag; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
124 ByteIOContext *pb = s->pb; |
0 | 125 unsigned int id, codec, channels, rate; |
126 AVStream *st; | |
127 | |
128 /* check ".snd" header */ | |
129 tag = get_le32(pb); | |
130 if (tag != MKTAG('.', 's', 'n', 'd')) | |
131 return -1; | |
132 size = get_be32(pb); /* header size */ | |
133 get_be32(pb); /* data size */ | |
885 | 134 |
0 | 135 id = get_be32(pb); |
136 rate = get_be32(pb); | |
137 channels = get_be32(pb); | |
885 | 138 |
0 | 139 codec = codec_get_id(codec_au_tags, id); |
140 | |
141 if (size >= 24) { | |
142 /* skip unused data */ | |
143 url_fseek(pb, size - 24, SEEK_CUR); | |
144 } | |
145 | |
146 /* now we are ready: build format streams */ | |
187 | 147 st = av_new_stream(s, 0); |
0 | 148 if (!st) |
149 return -1; | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
150 st->codec->codec_type = CODEC_TYPE_AUDIO; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
151 st->codec->codec_tag = id; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
152 st->codec->codec_id = codec; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
153 st->codec->channels = channels; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
154 st->codec->sample_rate = rate; |
567 | 155 av_set_pts_info(st, 64, 1, rate); |
0 | 156 return 0; |
157 } | |
158 | |
159 #define MAX_SIZE 4096 | |
160 | |
161 static int au_read_packet(AVFormatContext *s, | |
162 AVPacket *pkt) | |
163 { | |
164 int ret; | |
165 | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
166 if (url_feof(s->pb)) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2001
diff
changeset
|
167 return AVERROR(EIO); |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
168 ret= av_get_packet(s->pb, pkt, MAX_SIZE); |
775 | 169 if (ret < 0) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2001
diff
changeset
|
170 return AVERROR(EIO); |
0 | 171 pkt->stream_index = 0; |
172 | |
173 /* note: we need to modify the packet size here to handle the last | |
174 packet */ | |
175 pkt->size = ret; | |
176 return 0; | |
177 } | |
178 | |
1169 | 179 #ifdef CONFIG_AU_DEMUXER |
180 AVInputFormat au_demuxer = { | |
0 | 181 "au", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
2933
diff
changeset
|
182 NULL_IF_CONFIG_SMALL("SUN AU format"), |
0 | 183 0, |
184 au_probe, | |
185 au_read_header, | |
186 au_read_packet, | |
3484 | 187 NULL, |
306 | 188 pcm_read_seek, |
1679 | 189 .codec_tag= (const AVCodecTag*[]){codec_au_tags, 0}, |
0 | 190 }; |
1169 | 191 #endif |
0 | 192 |
1169 | 193 #ifdef CONFIG_AU_MUXER |
194 AVOutputFormat au_muxer = { | |
0 | 195 "au", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
2933
diff
changeset
|
196 NULL_IF_CONFIG_SMALL("SUN AU format"), |
0 | 197 "audio/basic", |
198 "au", | |
199 0, | |
200 CODEC_ID_PCM_S16BE, | |
201 CODEC_ID_NONE, | |
202 au_write_header, | |
203 au_write_packet, | |
204 au_write_trailer, | |
1679 | 205 .codec_tag= (const AVCodecTag*[]){codec_au_tags, 0}, |
0 | 206 }; |
1169 | 207 #endif //CONFIG_AU_MUXER |