3023
|
1 /*
|
|
2 Copyright (C) 2008 Reimar Döffinger
|
|
3
|
|
4 Permission is hereby granted, free of charge, to any person
|
|
5 obtaining a copy of this software and associated documentation
|
|
6 files (the "Software"), to deal in the Software without
|
|
7 restriction, including without limitation the rights to use, copy,
|
|
8 modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
9 of the Software, and to permit persons to whom the Software is
|
|
10 furnished to do so, subject to the following conditions:
|
|
11
|
|
12 The above copyright notice and this permission notice shall be
|
|
13 included in all copies or substantial portions of the Software.
|
|
14
|
|
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
19 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
20 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
22 DEALINGS IN THE SOFTWARE.
|
|
23 **/
|
|
24
|
|
25 #include <stdlib.h>
|
3286
|
26 #include "libavutil/bswap.h"
|
|
27 #include "libavutil/avstring.h"
|
4872
|
28 #include "libavcodec/get_bits.h"
|
3286
|
29 #include "libavcodec/bytestream.h"
|
3023
|
30 #include "avformat.h"
|
|
31 #include "oggdec.h"
|
|
32
|
|
33 static int speex_header(AVFormatContext *s, int idx) {
|
4016
|
34 struct ogg *ogg = s->priv_data;
|
|
35 struct ogg_stream *os = ogg->streams + idx;
|
3023
|
36 AVStream *st = s->streams[idx];
|
|
37 uint8_t *p = os->buf + os->pstart;
|
|
38
|
4765
|
39 if (os->seq > 1)
|
|
40 return 0;
|
3023
|
41
|
4765
|
42 if (os->seq == 0) {
|
4766
|
43 st->codec->codec_type = CODEC_TYPE_AUDIO;
|
|
44 st->codec->codec_id = CODEC_ID_SPEEX;
|
3023
|
45
|
4766
|
46 st->codec->sample_rate = AV_RL32(p + 36);
|
|
47 st->codec->channels = AV_RL32(p + 48);
|
4948
|
48 st->codec->frame_size = AV_RL32(p + 56);
|
4766
|
49 st->codec->extradata_size = os->psize;
|
|
50 st->codec->extradata = av_malloc(st->codec->extradata_size);
|
|
51 memcpy(st->codec->extradata, p, st->codec->extradata_size);
|
3023
|
52
|
4766
|
53 st->time_base.num = 1;
|
|
54 st->time_base.den = st->codec->sample_rate;
|
4765
|
55 } else
|
|
56 vorbis_comment(s, p, os->psize);
|
3023
|
57
|
4765
|
58 return 1;
|
3023
|
59 }
|
|
60
|
4016
|
61 const struct ogg_codec ff_speex_codec = {
|
3023
|
62 .magic = "Speex ",
|
|
63 .magicsize = 8,
|
|
64 .header = speex_header
|
|
65 };
|