Mercurial > libavformat.hg
annotate au.c @ 2136:b53a19eed95d libavformat
remove duplicate PAT scaning code and actual PAT scan
also disabling the nonsense 3yr old rawts change (it would after the
above chage totally break the demuxer if its left enabled)
author | michael |
---|---|
date | Mon, 04 Jun 2007 14:44:52 +0000 |
parents | 1a3c9056982a |
children | b21c2af60bc9 |
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" | |
1142
e3a585883bbd
Move initialisations and internal symbols in allformats.h,
gpoirier
parents:
896
diff
changeset
|
31 #include "allformats.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 }, |
40 { CODEC_ID_PCM_S16BE, 3 }, | |
41 { CODEC_ID_PCM_ALAW, 27 }, | |
42 { 0, 0 }, | |
43 }; | |
44 | |
858
66cc656ea404
Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents:
820
diff
changeset
|
45 #ifdef CONFIG_MUXERS |
0 | 46 /* AUDIO_FILE header */ |
47 static int put_au_header(ByteIOContext *pb, AVCodecContext *enc) | |
48 { | |
196 | 49 if(!enc->codec_tag) |
0 | 50 return -1; |
51 put_tag(pb, ".snd"); /* magic number */ | |
52 put_be32(pb, 24); /* header size */ | |
1885 | 53 put_be32(pb, AU_UNKNOWN_SIZE); /* data size */ |
196 | 54 put_be32(pb, (uint32_t)enc->codec_tag); /* codec ID */ |
0 | 55 put_be32(pb, enc->sample_rate); |
65 | 56 put_be32(pb, (uint32_t)enc->channels); |
0 | 57 return 0; |
58 } | |
59 | |
60 static int au_write_header(AVFormatContext *s) | |
61 { | |
62 ByteIOContext *pb = &s->pb; | |
63 | |
64 s->priv_data = NULL; | |
65 | |
66 /* 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
|
67 if (put_au_header(pb, s->streams[0]->codec) < 0) { |
0 | 68 return -1; |
69 } | |
70 | |
71 put_flush_packet(pb); | |
72 | |
73 return 0; | |
74 } | |
75 | |
468 | 76 static int au_write_packet(AVFormatContext *s, AVPacket *pkt) |
0 | 77 { |
78 ByteIOContext *pb = &s->pb; | |
468 | 79 put_buffer(pb, pkt->data, pkt->size); |
0 | 80 return 0; |
81 } | |
82 | |
83 static int au_write_trailer(AVFormatContext *s) | |
84 { | |
85 ByteIOContext *pb = &s->pb; | |
86 offset_t file_size; | |
87 | |
88 if (!url_is_streamed(&s->pb)) { | |
89 | |
90 /* update file size */ | |
91 file_size = url_ftell(pb); | |
92 url_fseek(pb, 8, SEEK_SET); | |
65 | 93 put_be32(pb, (uint32_t)(file_size - 24)); |
0 | 94 url_fseek(pb, file_size, SEEK_SET); |
95 | |
96 put_flush_packet(pb); | |
97 } | |
98 | |
99 return 0; | |
100 } | |
858
66cc656ea404
Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents:
820
diff
changeset
|
101 #endif //CONFIG_MUXERS |
0 | 102 |
103 static int au_probe(AVProbeData *p) | |
104 { | |
105 /* check file header */ | |
106 if (p->buf[0] == '.' && p->buf[1] == 's' && | |
107 p->buf[2] == 'n' && p->buf[3] == 'd') | |
108 return AVPROBE_SCORE_MAX; | |
109 else | |
110 return 0; | |
111 } | |
112 | |
113 /* au input */ | |
114 static int au_read_header(AVFormatContext *s, | |
306 | 115 AVFormatParameters *ap) |
0 | 116 { |
117 int size; | |
118 unsigned int tag; | |
119 ByteIOContext *pb = &s->pb; | |
120 unsigned int id, codec, channels, rate; | |
121 AVStream *st; | |
122 | |
123 /* check ".snd" header */ | |
124 tag = get_le32(pb); | |
125 if (tag != MKTAG('.', 's', 'n', 'd')) | |
126 return -1; | |
127 size = get_be32(pb); /* header size */ | |
128 get_be32(pb); /* data size */ | |
885 | 129 |
0 | 130 id = get_be32(pb); |
131 rate = get_be32(pb); | |
132 channels = get_be32(pb); | |
885 | 133 |
0 | 134 codec = codec_get_id(codec_au_tags, id); |
135 | |
136 if (size >= 24) { | |
137 /* skip unused data */ | |
138 url_fseek(pb, size - 24, SEEK_CUR); | |
139 } | |
140 | |
141 /* now we are ready: build format streams */ | |
187 | 142 st = av_new_stream(s, 0); |
0 | 143 if (!st) |
144 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
|
145 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
|
146 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
|
147 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
|
148 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
|
149 st->codec->sample_rate = rate; |
567 | 150 av_set_pts_info(st, 64, 1, rate); |
0 | 151 return 0; |
152 } | |
153 | |
154 #define MAX_SIZE 4096 | |
155 | |
156 static int au_read_packet(AVFormatContext *s, | |
157 AVPacket *pkt) | |
158 { | |
159 int ret; | |
160 | |
161 if (url_feof(&s->pb)) | |
482 | 162 return AVERROR_IO; |
775 | 163 ret= av_get_packet(&s->pb, pkt, MAX_SIZE); |
164 if (ret < 0) | |
482 | 165 return AVERROR_IO; |
0 | 166 pkt->stream_index = 0; |
167 | |
168 /* note: we need to modify the packet size here to handle the last | |
169 packet */ | |
170 pkt->size = ret; | |
171 return 0; | |
172 } | |
173 | |
174 static int au_read_close(AVFormatContext *s) | |
175 { | |
176 return 0; | |
177 } | |
178 | |
1169 | 179 #ifdef CONFIG_AU_DEMUXER |
180 AVInputFormat au_demuxer = { | |
0 | 181 "au", |
182 "SUN AU Format", | |
183 0, | |
184 au_probe, | |
185 au_read_header, | |
186 au_read_packet, | |
187 au_read_close, | |
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", |
196 "SUN AU Format", | |
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 |