annotate vocdec.c @ 2065:64bd1b09cef2 libavformat

patch so that the deprecated items show up correctly when building doxygen docs patch by mark cox melbournemark plus ffmpeg minus devel chez gmail dot com
author benoit
date Wed, 02 May 2007 09:13:47 +0000
parents 1a3c9056982a
children 38dd9318e1a6
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
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
26
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
27 static int voc_probe(AVProbeData *p)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
28 {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
29 int version, check;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
30
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
31 if (memcmp(p->buf, voc_magic, sizeof(voc_magic) - 1))
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
32 return 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
33 version = p->buf[22] | (p->buf[23] << 8);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
34 check = p->buf[24] | (p->buf[25] << 8);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
35 if (~version + 0x1234 != check)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
36 return 10;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
37
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
38 return AVPROBE_SCORE_MAX;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
39 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
40
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
41 static int voc_read_header(AVFormatContext *s, AVFormatParameters *ap)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
42 {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
43 voc_dec_context_t *voc = s->priv_data;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
44 ByteIOContext *pb = &s->pb;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
45 int header_size;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
46 AVStream *st;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
47
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
48 url_fskip(pb, 20);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
49 header_size = get_le16(pb) - 22;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
50 if (header_size != 4) {
1883
a6cf9ee93fbb typo: unkown->unknown
alex
parents: 1679
diff changeset
51 av_log(s, AV_LOG_ERROR, "unknown header size: %d\n", header_size);
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
52 return AVERROR_NOTSUPP;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
53 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
54 url_fskip(pb, header_size);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
55 st = av_new_stream(s, 0);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
56 if (!st)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
57 return AVERROR_NOMEM;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
58 st->codec->codec_type = CODEC_TYPE_AUDIO;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
59
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
60 voc->remaining_size = 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
61 return 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
62 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
63
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
64 int
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
65 voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
66 {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
67 voc_dec_context_t *voc = s->priv_data;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
68 AVCodecContext *dec = st->codec;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
69 ByteIOContext *pb = &s->pb;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
70 voc_type_t type;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
71 int size;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
72 int sample_rate = 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
73 int channels = 1;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
74
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
75 while (!voc->remaining_size) {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
76 type = get_byte(pb);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
77 if (type == VOC_TYPE_EOF)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
78 return AVERROR_IO;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
79 voc->remaining_size = get_le24(pb);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
80 max_size -= 4;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
81
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
82 switch (type) {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
83 case VOC_TYPE_VOICE_DATA:
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
84 dec->sample_rate = 1000000 / (256 - get_byte(pb));
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
85 if (sample_rate)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
86 dec->sample_rate = sample_rate;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
87 dec->channels = channels;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
88 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
89 dec->bits_per_sample = av_get_bits_per_sample(dec->codec_id);
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
90 voc->remaining_size -= 2;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
91 max_size -= 2;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
92 channels = 1;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
93 break;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
94
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
95 case VOC_TYPE_VOICE_DATA_CONT:
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_EXTENDED:
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
99 sample_rate = get_le16(pb);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
100 get_byte(pb);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
101 channels = get_byte(pb) + 1;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
102 sample_rate = 256000000 / (channels * (65536 - sample_rate));
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
103 voc->remaining_size = 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
104 max_size -= 4;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
105 break;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
106
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
107 case VOC_TYPE_NEW_VOICE_DATA:
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
108 dec->sample_rate = get_le32(pb);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
109 dec->bits_per_sample = get_byte(pb);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
110 dec->channels = get_byte(pb);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
111 dec->codec_id = codec_get_id(voc_codec_tags, get_le16(pb));
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
112 url_fskip(pb, 4);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
113 voc->remaining_size -= 12;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
114 max_size -= 12;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
115 break;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
116
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
117 default:
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
118 url_fskip(pb, voc->remaining_size);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
119 max_size -= voc->remaining_size;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
120 voc->remaining_size = 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
121 break;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
122 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
123 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
124
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
125 dec->bit_rate = dec->sample_rate * dec->bits_per_sample;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
126
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
127 if (max_size <= 0)
1884
1792b6c5387b simplification
alex
parents: 1883
diff changeset
128 max_size = 2048;
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
129 size = FFMIN(voc->remaining_size, max_size);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
130 voc->remaining_size -= size;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
131 return av_get_packet(pb, pkt, size);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
132 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
133
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
134 static int voc_read_packet(AVFormatContext *s, AVPacket *pkt)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
135 {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
136 return voc_get_packet(s, pkt, s->streams[0], 0);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
137 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
138
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
139 static int voc_read_close(AVFormatContext *s)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
140 {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
141 return 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
142 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
143
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
144 AVInputFormat voc_demuxer = {
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
145 "voc",
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
146 "Creative Voice File format",
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
147 sizeof(voc_dec_context_t),
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
148 voc_probe,
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
149 voc_read_header,
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
150 voc_read_packet,
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
151 voc_read_close,
1679
ba58d49d4685 get rid of the [4] limitation of codec tag lists
michael
parents: 1678
diff changeset
152 .codec_tag=(const AVCodecTag*[]){voc_codec_tags, 0},
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
153 };