annotate mpc8.c @ 5910:536e5527c1e0 libavformat

Define AVMediaType enum, and use it instead of enum CodecType, which is deprecated and will be dropped at the next major bump.
author stefano
date Tue, 30 Mar 2010 23:30:55 +0000
parents da61aef912cb
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
1 /*
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
2 * Musepack SV8 demuxer
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
3 * Copyright (c) 2007 Konstantin Shishkov
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
4 *
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
5 * This file is part of FFmpeg.
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
6 *
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
11 *
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
16 *
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
20 */
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2771
diff changeset
21
4872
304a0ea063f0 Rename bitstream.h to get_bits.h.
stefano
parents: 3908
diff changeset
22 #include "libavcodec/get_bits.h"
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2771
diff changeset
23 #include "libavcodec/unary.h"
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
24 #include "avformat.h"
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
25
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
26 /// Two-byte MPC tag
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
27 #define MKMPCTAG(a, b) (a | (b << 8))
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
28
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
29 #define TAG_MPCK MKTAG('M','P','C','K')
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
30
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
31 /// Reserved MPC tags
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
32 enum MPCPacketTags{
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
33 TAG_STREAMHDR = MKMPCTAG('S','H'),
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
34 TAG_STREAMEND = MKMPCTAG('S','E'),
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
35
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
36 TAG_AUDIOPACKET = MKMPCTAG('A','P'),
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
37
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
38 TAG_SEEKTBLOFF = MKMPCTAG('S','O'),
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
39 TAG_SEEKTABLE = MKMPCTAG('S','T'),
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
40
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
41 TAG_REPLAYGAIN = MKMPCTAG('R','G'),
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
42 TAG_ENCINFO = MKMPCTAG('E','I'),
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
43 };
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
44
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
45 static const int mpc8_rate[8] = { 44100, 48000, 37800, 32000, -1, -1, -1, -1 };
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
46
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
47 typedef struct {
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
48 int ver;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
49 int frame;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
50 int64_t header_pos;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
51 int64_t samples;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
52 } MPCContext;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
53
5208
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
54 static inline int64_t bs_get_v(uint8_t **bs)
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
55 {
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
56 int64_t v = 0;
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
57 int br = 0;
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
58 int c;
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
59
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
60 do {
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
61 c = **bs; (*bs)++;
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
62 v <<= 7;
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
63 v |= c & 0x7F;
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
64 br++;
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
65 if (br > 10)
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
66 return -1;
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
67 } while (c & 0x80);
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
68
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
69 return v - br;
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
70 }
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
71
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
72 static int mpc8_probe(AVProbeData *p)
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
73 {
5208
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
74 uint8_t *bs = p->buf + 4;
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
75 uint8_t *bs_end = bs + p->buf_size;
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
76 int64_t size;
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
77
5204
9dea59f5436a Enhance Musepack SV8 probing code
kostya
parents: 5030
diff changeset
78 if (p->buf_size < 16)
9dea59f5436a Enhance Musepack SV8 probing code
kostya
parents: 5030
diff changeset
79 return 0;
9dea59f5436a Enhance Musepack SV8 probing code
kostya
parents: 5030
diff changeset
80 if (AV_RL32(p->buf) != TAG_MPCK)
9dea59f5436a Enhance Musepack SV8 probing code
kostya
parents: 5030
diff changeset
81 return 0;
5208
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
82 while (bs < bs_end + 3) {
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
83 int header_found = (bs[0] == 'S' && bs[1] == 'H');
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
84 if (bs[0] < 'A' || bs[0] > 'Z' || bs[1] < 'A' || bs[1] > 'Z')
5204
9dea59f5436a Enhance Musepack SV8 probing code
kostya
parents: 5030
diff changeset
85 return 0;
5208
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
86 bs += 2;
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
87 size = bs_get_v(&bs);
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
88 if (size < 2)
5204
9dea59f5436a Enhance Musepack SV8 probing code
kostya
parents: 5030
diff changeset
89 return 0;
5208
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
90 if (bs + size - 2 >= bs_end)
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
91 return AVPROBE_SCORE_MAX / 4 - 1; //seems to be valid MPC but no header yet
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
92 if (header_found) {
5209
2b52ec1e8619 reindent after last commit and remove unneeded empty line
kostya
parents: 5208
diff changeset
93 if (size < 11 || size > 28)
2b52ec1e8619 reindent after last commit and remove unneeded empty line
kostya
parents: 5208
diff changeset
94 return 0;
2b52ec1e8619 reindent after last commit and remove unneeded empty line
kostya
parents: 5208
diff changeset
95 if (!AV_RL32(bs)) //zero CRC is invalid
2b52ec1e8619 reindent after last commit and remove unneeded empty line
kostya
parents: 5208
diff changeset
96 return 0;
2b52ec1e8619 reindent after last commit and remove unneeded empty line
kostya
parents: 5208
diff changeset
97 return AVPROBE_SCORE_MAX;
5208
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
98 } else {
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
99 bs += size - 2;
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
100 }
5204
9dea59f5436a Enhance Musepack SV8 probing code
kostya
parents: 5030
diff changeset
101 }
5208
af13c900ff26 Make MPC SV8 probe skip tags until stream header is found
kostya
parents: 5204
diff changeset
102 return 0;
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
103 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
104
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
105 static inline int64_t gb_get_v(GetBitContext *gb)
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
106 {
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
107 int64_t v = 0;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
108 int bits = 0;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
109 while(get_bits1(gb) && bits < 64-7){
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
110 v <<= 7;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
111 v |= get_bits(gb, 7);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
112 bits += 7;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
113 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
114 v <<= 7;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
115 v |= get_bits(gb, 7);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
116
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
117 return v;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
118 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
119
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
120 static void mpc8_get_chunk_header(ByteIOContext *pb, int *tag, int64_t *size)
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
121 {
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
122 int64_t pos;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
123 pos = url_ftell(pb);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
124 *tag = get_le16(pb);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
125 *size = ff_get_v(pb);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
126 *size -= url_ftell(pb) - pos;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
127 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
128
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
129 static void mpc8_parse_seektable(AVFormatContext *s, int64_t off)
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
130 {
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
131 MPCContext *c = s->priv_data;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
132 int tag;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
133 int64_t size, pos, ppos[2];
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
134 uint8_t *buf;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
135 int i, t, seekd;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
136 GetBitContext gb;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
137
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2709
diff changeset
138 url_fseek(s->pb, off, SEEK_SET);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2709
diff changeset
139 mpc8_get_chunk_header(s->pb, &tag, &size);
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
140 if(tag != TAG_SEEKTABLE){
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
141 av_log(s, AV_LOG_ERROR, "No seek table at given position\n");
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
142 return;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
143 }
5030
06903f8f7247 Allocate a bit more memory for MPC SV8 seek table, so bitreader won't read
kostya
parents: 4872
diff changeset
144 if(!(buf = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE)))
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
145 return;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2709
diff changeset
146 get_buffer(s->pb, buf, size);
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
147 init_get_bits(&gb, buf, size * 8);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
148 size = gb_get_v(&gb);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
149 if(size > UINT_MAX/4 || size > c->samples/1152){
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
150 av_log(s, AV_LOG_ERROR, "Seek table is too big\n");
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
151 return;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
152 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
153 seekd = get_bits(&gb, 4);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
154 for(i = 0; i < 2; i++){
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
155 pos = gb_get_v(&gb) + c->header_pos;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
156 ppos[1 - i] = pos;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
157 av_add_index_entry(s->streams[0], pos, i, 0, 0, AVINDEX_KEYFRAME);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
158 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
159 for(; i < size; i++){
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
160 t = get_unary(&gb, 1, 33) << 12;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
161 t += get_bits(&gb, 12);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
162 if(t & 1)
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
163 t = -(t & ~1);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
164 pos = (t >> 1) + ppos[0]*2 - ppos[1];
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
165 av_add_index_entry(s->streams[0], pos, i << seekd, 0, 0, AVINDEX_KEYFRAME);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
166 ppos[1] = ppos[0];
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
167 ppos[0] = pos;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
168 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
169 av_free(buf);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
170 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
171
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
172 static void mpc8_handle_chunk(AVFormatContext *s, int tag, int64_t chunk_pos, int64_t size)
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
173 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2709
diff changeset
174 ByteIOContext *pb = s->pb;
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
175 int64_t pos, off;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
176
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
177 switch(tag){
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
178 case TAG_SEEKTBLOFF:
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
179 pos = url_ftell(pb) + size;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
180 off = ff_get_v(pb);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
181 mpc8_parse_seektable(s, chunk_pos + off);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
182 url_fseek(pb, pos, SEEK_SET);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
183 break;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
184 default:
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
185 url_fskip(pb, size);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
186 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
187 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
188
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
189 static int mpc8_read_header(AVFormatContext *s, AVFormatParameters *ap)
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
190 {
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
191 MPCContext *c = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2709
diff changeset
192 ByteIOContext *pb = s->pb;
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
193 AVStream *st;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
194 int tag = 0;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
195 int64_t size, pos;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
196
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
197 c->header_pos = url_ftell(pb);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
198 if(get_le32(pb) != TAG_MPCK){
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
199 av_log(s, AV_LOG_ERROR, "Not a Musepack8 file\n");
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
200 return -1;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
201 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
202
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
203 while(!url_feof(pb)){
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
204 pos = url_ftell(pb);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
205 mpc8_get_chunk_header(pb, &tag, &size);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
206 if(tag == TAG_STREAMHDR)
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
207 break;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
208 mpc8_handle_chunk(s, tag, pos, size);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
209 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
210 if(tag != TAG_STREAMHDR){
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
211 av_log(s, AV_LOG_ERROR, "Stream header not found\n");
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
212 return -1;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
213 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
214 pos = url_ftell(pb);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
215 url_fskip(pb, 4); //CRC
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
216 c->ver = get_byte(pb);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
217 if(c->ver != 8){
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
218 av_log(s, AV_LOG_ERROR, "Unknown stream version %d\n", c->ver);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
219 return -1;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
220 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
221 c->samples = ff_get_v(pb);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
222 ff_get_v(pb); //silence samples at the beginning
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
223
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
224 st = av_new_stream(s, 0);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
225 if (!st)
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
226 return AVERROR(ENOMEM);
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5241
diff changeset
227 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
228 st->codec->codec_id = CODEC_ID_MUSEPACK8;
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3424
diff changeset
229 st->codec->bits_per_coded_sample = 16;
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
230
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
231 st->codec->extradata_size = 2;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
232 st->codec->extradata = av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
233 get_buffer(pb, st->codec->extradata, st->codec->extradata_size);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
234
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
235 st->codec->channels = (st->codec->extradata[1] >> 4) + 1;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
236 st->codec->sample_rate = mpc8_rate[st->codec->extradata[0] >> 5];
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
237 av_set_pts_info(st, 32, 1152 << (st->codec->extradata[1]&3)*2, st->codec->sample_rate);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
238 st->duration = c->samples / (1152 << (st->codec->extradata[1]&3)*2);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
239 size -= url_ftell(pb) - pos;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
240
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
241 return 0;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
242 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
243
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
244 static int mpc8_read_packet(AVFormatContext *s, AVPacket *pkt)
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
245 {
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
246 MPCContext *c = s->priv_data;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
247 int tag;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
248 int64_t pos, size;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
249
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2709
diff changeset
250 while(!url_feof(s->pb)){
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2709
diff changeset
251 pos = url_ftell(s->pb);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2709
diff changeset
252 mpc8_get_chunk_header(s->pb, &tag, &size);
5241
da61aef912cb Return an error when the parsed mpc chunk size is negative, otherwise we
reimar
parents: 5209
diff changeset
253 if (size < 0)
da61aef912cb Return an error when the parsed mpc chunk size is negative, otherwise we
reimar
parents: 5209
diff changeset
254 return -1;
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
255 if(tag == TAG_AUDIOPACKET){
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2709
diff changeset
256 if(av_get_packet(s->pb, pkt, size) < 0)
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
257 return AVERROR(ENOMEM);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
258 pkt->stream_index = 0;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
259 pkt->pts = c->frame;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
260 return 0;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
261 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
262 if(tag == TAG_STREAMEND)
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
263 return AVERROR(EIO);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
264 mpc8_handle_chunk(s, tag, pos, size);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
265 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
266 return 0;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
267 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
268
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
269 static int mpc8_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
270 {
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
271 AVStream *st = s->streams[stream_index];
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
272 MPCContext *c = s->priv_data;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
273 int index = av_index_search_timestamp(st, timestamp, flags);
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
274
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
275 if(index < 0) return -1;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2709
diff changeset
276 url_fseek(s->pb, st->index_entries[index].pos, SEEK_SET);
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
277 c->frame = st->index_entries[index].timestamp;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
278 return 0;
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
279 }
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
280
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
281
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
282 AVInputFormat mpc8_demuxer = {
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
283 "mpc8",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3286
diff changeset
284 NULL_IF_CONFIG_SMALL("Musepack SV8"),
2709
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
285 sizeof(MPCContext),
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
286 mpc8_probe,
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
287 mpc8_read_header,
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
288 mpc8_read_packet,
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
289 NULL,
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
290 mpc8_read_seek,
8f923b7f5462 Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
291 };