Mercurial > libavformat.hg
annotate au.c @ 3717:f65dc584662d libavformat
matroskadec: list some more ebml IDs found in the wild and that we ignore
This avoid printing some warnings about unknow IDs while we in fact know
the IDs but just want to knowingly ignore them.
author | aurel |
---|---|
date | Wed, 13 Aug 2008 21:15:15 +0000 |
parents | d99961d92b99 |
children | 441e758e1a5e |
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 }, |
3599
d99961d92b99
Support 32-bit floating point audio samples in Sun AU demuxer
pross
parents:
3484
diff
changeset
|
42 { CODEC_ID_PCM_F32BE, 6 }, |
0 | 43 { CODEC_ID_PCM_ALAW, 27 }, |
44 { 0, 0 }, | |
45 }; | |
46 | |
858
66cc656ea404
Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents:
820
diff
changeset
|
47 #ifdef CONFIG_MUXERS |
0 | 48 /* AUDIO_FILE header */ |
49 static int put_au_header(ByteIOContext *pb, AVCodecContext *enc) | |
50 { | |
196 | 51 if(!enc->codec_tag) |
0 | 52 return -1; |
53 put_tag(pb, ".snd"); /* magic number */ | |
54 put_be32(pb, 24); /* header size */ | |
1885 | 55 put_be32(pb, AU_UNKNOWN_SIZE); /* data size */ |
196 | 56 put_be32(pb, (uint32_t)enc->codec_tag); /* codec ID */ |
0 | 57 put_be32(pb, enc->sample_rate); |
65 | 58 put_be32(pb, (uint32_t)enc->channels); |
0 | 59 return 0; |
60 } | |
61 | |
62 static int au_write_header(AVFormatContext *s) | |
63 { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
64 ByteIOContext *pb = s->pb; |
0 | 65 |
66 s->priv_data = NULL; | |
67 | |
68 /* 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
|
69 if (put_au_header(pb, s->streams[0]->codec) < 0) { |
0 | 70 return -1; |
71 } | |
72 | |
73 put_flush_packet(pb); | |
74 | |
75 return 0; | |
76 } | |
77 | |
468 | 78 static int au_write_packet(AVFormatContext *s, AVPacket *pkt) |
0 | 79 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
80 ByteIOContext *pb = s->pb; |
468 | 81 put_buffer(pb, pkt->data, pkt->size); |
0 | 82 return 0; |
83 } | |
84 | |
85 static int au_write_trailer(AVFormatContext *s) | |
86 { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
87 ByteIOContext *pb = s->pb; |
0 | 88 offset_t file_size; |
89 | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
90 if (!url_is_streamed(s->pb)) { |
0 | 91 |
92 /* update file size */ | |
93 file_size = url_ftell(pb); | |
94 url_fseek(pb, 8, SEEK_SET); | |
65 | 95 put_be32(pb, (uint32_t)(file_size - 24)); |
0 | 96 url_fseek(pb, file_size, SEEK_SET); |
97 | |
98 put_flush_packet(pb); | |
99 } | |
100 | |
101 return 0; | |
102 } | |
858
66cc656ea404
Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents:
820
diff
changeset
|
103 #endif //CONFIG_MUXERS |
0 | 104 |
105 static int au_probe(AVProbeData *p) | |
106 { | |
107 /* check file header */ | |
108 if (p->buf[0] == '.' && p->buf[1] == 's' && | |
109 p->buf[2] == 'n' && p->buf[3] == 'd') | |
110 return AVPROBE_SCORE_MAX; | |
111 else | |
112 return 0; | |
113 } | |
114 | |
115 /* au input */ | |
116 static int au_read_header(AVFormatContext *s, | |
306 | 117 AVFormatParameters *ap) |
0 | 118 { |
119 int size; | |
120 unsigned int tag; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
121 ByteIOContext *pb = s->pb; |
0 | 122 unsigned int id, codec, channels, rate; |
123 AVStream *st; | |
124 | |
125 /* check ".snd" header */ | |
126 tag = get_le32(pb); | |
127 if (tag != MKTAG('.', 's', 'n', 'd')) | |
128 return -1; | |
129 size = get_be32(pb); /* header size */ | |
130 get_be32(pb); /* data size */ | |
885 | 131 |
0 | 132 id = get_be32(pb); |
133 rate = get_be32(pb); | |
134 channels = get_be32(pb); | |
885 | 135 |
0 | 136 codec = codec_get_id(codec_au_tags, id); |
137 | |
138 if (size >= 24) { | |
139 /* skip unused data */ | |
140 url_fseek(pb, size - 24, SEEK_CUR); | |
141 } | |
142 | |
143 /* now we are ready: build format streams */ | |
187 | 144 st = av_new_stream(s, 0); |
0 | 145 if (!st) |
146 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
|
147 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
|
148 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
|
149 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
|
150 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
|
151 st->codec->sample_rate = rate; |
567 | 152 av_set_pts_info(st, 64, 1, rate); |
0 | 153 return 0; |
154 } | |
155 | |
156 #define MAX_SIZE 4096 | |
157 | |
158 static int au_read_packet(AVFormatContext *s, | |
159 AVPacket *pkt) | |
160 { | |
161 int ret; | |
162 | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
163 if (url_feof(s->pb)) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2001
diff
changeset
|
164 return AVERROR(EIO); |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2545
diff
changeset
|
165 ret= av_get_packet(s->pb, pkt, MAX_SIZE); |
775 | 166 if (ret < 0) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2001
diff
changeset
|
167 return AVERROR(EIO); |
0 | 168 pkt->stream_index = 0; |
169 | |
170 /* note: we need to modify the packet size here to handle the last | |
171 packet */ | |
172 pkt->size = ret; | |
173 return 0; | |
174 } | |
175 | |
1169 | 176 #ifdef CONFIG_AU_DEMUXER |
177 AVInputFormat au_demuxer = { | |
0 | 178 "au", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
2933
diff
changeset
|
179 NULL_IF_CONFIG_SMALL("SUN AU format"), |
0 | 180 0, |
181 au_probe, | |
182 au_read_header, | |
183 au_read_packet, | |
3484 | 184 NULL, |
306 | 185 pcm_read_seek, |
1679 | 186 .codec_tag= (const AVCodecTag*[]){codec_au_tags, 0}, |
0 | 187 }; |
1169 | 188 #endif |
0 | 189 |
1169 | 190 #ifdef CONFIG_AU_MUXER |
191 AVOutputFormat au_muxer = { | |
0 | 192 "au", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
2933
diff
changeset
|
193 NULL_IF_CONFIG_SMALL("SUN AU format"), |
0 | 194 "audio/basic", |
195 "au", | |
196 0, | |
197 CODEC_ID_PCM_S16BE, | |
198 CODEC_ID_NONE, | |
199 au_write_header, | |
200 au_write_packet, | |
201 au_write_trailer, | |
1679 | 202 .codec_tag= (const AVCodecTag*[]){codec_au_tags, 0}, |
0 | 203 }; |
1169 | 204 #endif //CONFIG_AU_MUXER |