annotate vocdec.c @ 1680:9240521ca4fd libavformat

this is wrong but it was that way before the AVCodecTag change, only reason why it didnt broke regressions was that the table wasnt used
author michael
date Sun, 21 Jan 2007 12:30:44 +0000
parents ba58d49d4685
children a6cf9ee93fbb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
1 /*
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
2 * Creative Voice File demuxer.
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
3 * Copyright (c) 2006 Aurelien Jacobs <aurel@gnuage.org>
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
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
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
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.
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
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,
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
15 * Lesser General Public License for more details.
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
16 *
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
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
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
20 */
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
21
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
22 #include "voc.h"
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
23
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
24
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
25 static const int voc_max_pkt_size = 2048;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
26
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
27
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
28 static int voc_probe(AVProbeData *p)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
29 {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
30 int version, check;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
31
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
32 if (p->buf_size < 26)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
33 return 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
34 if (memcmp(p->buf, voc_magic, sizeof(voc_magic) - 1))
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
35 return 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
36 version = p->buf[22] | (p->buf[23] << 8);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
37 check = p->buf[24] | (p->buf[25] << 8);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
38 if (~version + 0x1234 != check)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
39 return 10;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
40
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
41 return AVPROBE_SCORE_MAX;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
42 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
43
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
44 static int voc_read_header(AVFormatContext *s, AVFormatParameters *ap)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
45 {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
46 voc_dec_context_t *voc = s->priv_data;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
47 ByteIOContext *pb = &s->pb;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
48 int header_size;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
49 AVStream *st;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
50
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
51 url_fskip(pb, 20);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
52 header_size = get_le16(pb) - 22;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
53 if (header_size != 4) {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
54 av_log(s, AV_LOG_ERROR, "unkown header size: %d\n", header_size);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
55 return AVERROR_NOTSUPP;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
56 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
57 url_fskip(pb, header_size);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
58 st = av_new_stream(s, 0);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
59 if (!st)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
60 return AVERROR_NOMEM;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
61 st->codec->codec_type = CODEC_TYPE_AUDIO;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
62
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
63 voc->remaining_size = 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
64 return 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
65 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
66
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
67 int
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
68 voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
69 {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
70 voc_dec_context_t *voc = s->priv_data;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
71 AVCodecContext *dec = st->codec;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
72 ByteIOContext *pb = &s->pb;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
73 voc_type_t type;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
74 int size;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
75 int sample_rate = 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
76 int channels = 1;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
77
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
78 while (!voc->remaining_size) {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
79 type = get_byte(pb);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
80 if (type == VOC_TYPE_EOF)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
81 return AVERROR_IO;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
82 voc->remaining_size = get_le24(pb);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
83 max_size -= 4;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
84
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
85 switch (type) {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
86 case VOC_TYPE_VOICE_DATA:
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
87 dec->sample_rate = 1000000 / (256 - get_byte(pb));
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
88 if (sample_rate)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
89 dec->sample_rate = sample_rate;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
90 dec->channels = channels;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
91 dec->codec_id = codec_get_id(voc_codec_tags, get_byte(pb));
1159
712f2acca29a simplify the voc demuxer using av_get_bits_per_sample()
aurel
parents: 960
diff changeset
92 dec->bits_per_sample = av_get_bits_per_sample(dec->codec_id);
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
93 voc->remaining_size -= 2;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
94 max_size -= 2;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
95 channels = 1;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
96 break;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
97
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
98 case VOC_TYPE_VOICE_DATA_CONT:
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
99 break;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
100
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
101 case VOC_TYPE_EXTENDED:
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
102 sample_rate = get_le16(pb);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
103 get_byte(pb);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
104 channels = get_byte(pb) + 1;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
105 sample_rate = 256000000 / (channels * (65536 - sample_rate));
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
106 voc->remaining_size = 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
107 max_size -= 4;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
108 break;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
109
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
110 case VOC_TYPE_NEW_VOICE_DATA:
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
111 dec->sample_rate = get_le32(pb);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
112 dec->bits_per_sample = get_byte(pb);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
113 dec->channels = get_byte(pb);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
114 dec->codec_id = codec_get_id(voc_codec_tags, get_le16(pb));
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
115 url_fskip(pb, 4);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
116 voc->remaining_size -= 12;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
117 max_size -= 12;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
118 break;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
119
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
120 default:
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
121 url_fskip(pb, voc->remaining_size);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
122 max_size -= voc->remaining_size;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
123 voc->remaining_size = 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
124 break;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
125 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
126 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
127
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
128 dec->bit_rate = dec->sample_rate * dec->bits_per_sample;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
129
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
130 if (max_size <= 0)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
131 max_size = voc_max_pkt_size;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
132 size = FFMIN(voc->remaining_size, max_size);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
133 voc->remaining_size -= size;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
134 return av_get_packet(pb, pkt, size);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
135 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
136
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
137 static int voc_read_packet(AVFormatContext *s, AVPacket *pkt)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
138 {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
139 return voc_get_packet(s, pkt, s->streams[0], 0);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
140 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
141
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
142 static int voc_read_close(AVFormatContext *s)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
143 {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
144 return 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
145 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
146
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
147 AVInputFormat voc_demuxer = {
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
148 "voc",
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
149 "Creative Voice File format",
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
150 sizeof(voc_dec_context_t),
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
151 voc_probe,
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
152 voc_read_header,
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
153 voc_read_packet,
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
154 voc_read_close,
1679
ba58d49d4685 get rid of the [4] limitation of codec tag lists
michael
parents: 1678
diff changeset
155 .codec_tag=(const AVCodecTag*[]){voc_codec_tags, 0},
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
156 };