annotate mpc8.c @ 12032:572c81b3be19 libavcodec

CMOV-ify vp56 arithcoder This incantation causes gcc 4.3 to generate cmov on x86, a vastly better option than a completely unpredictable branch. Hopefully this carries over to newer versions and other CPUs with conditionals. ~5 cycles saved per call on a Core i7.
author darkshikari
date Wed, 30 Jun 2010 23:18:47 +0000
parents 7dd2a45249a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
1 /*
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
2 * Musepack SV8 decoder
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
3 * Copyright (c) 2007 Konstantin Shishkov
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
4 *
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
5 * This file is part of FFmpeg.
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
6 *
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
11 *
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
16 *
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
20 */
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
21
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
22 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
23 * @file
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
24 * MPEG Audio Layer 1/2 -like codec with frames of 1152 samples
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
25 * divided into 32 subbands.
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
26 */
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
27
9153
4e91d96dd045 Make Musepack decoders use LFG pseudorandom generator
kostya
parents: 8718
diff changeset
28 #include "libavutil/lfg.h"
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
29 #include "avcodec.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9355
diff changeset
30 #include "get_bits.h"
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
31 #include "dsputil.h"
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
32 #include "mpegaudio.h"
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
33
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
34 #include "mpc.h"
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
35 #include "mpcdata.h"
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
36 #include "mpc8data.h"
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
37 #include "mpc8huff.h"
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
38
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
39 static VLC band_vlc, scfi_vlc[2], dscf_vlc[2], res_vlc[2];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
40 static VLC q1_vlc, q2_vlc[2], q3_vlc[2], quant_vlc[4][2], q9up_vlc;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
41
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
42 static const int q3_offsets[2] = { MPC8_Q3_OFFSET, MPC8_Q4_OFFSET };
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
43 static const int quant_offsets[6] = { MPC8_Q5_OFFSET, MPC8_Q6_OFFSET, MPC8_Q7_OFFSET, MPC8_Q8_OFFSET };
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
44
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
45 static inline int mpc8_dec_base(GetBitContext *gb, int k, int n)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
46 {
9849
d1119c095555 Correct reading bits in MPC SV8 base codes (when we have to read 0 or >16 bits).
kostya
parents: 9517
diff changeset
47 int len = mpc8_cnk_len[k-1][n-1] - 1;
d1119c095555 Correct reading bits in MPC SV8 base codes (when we have to read 0 or >16 bits).
kostya
parents: 9517
diff changeset
48 int code = len ? get_bits_long(gb, len) : 0;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
49
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
50 if (code >= mpc8_cnk_lost[k-1][n-1])
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
51 code = ((code << 1) | get_bits1(gb)) - mpc8_cnk_lost[k-1][n-1];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
52
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
53 return code;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
54 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
55
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
56 static inline int mpc8_dec_enum(GetBitContext *gb, int k, int n)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
57 {
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
58 int bits = 0;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
59 const uint32_t * C = mpc8_cnk[k-1];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
60 int code = mpc8_dec_base(gb, k, n);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
61
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
62 do {
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
63 n--;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
64 if (code >= C[n]) {
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
65 bits |= 1 << n;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
66 code -= C[n];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
67 C -= 32;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
68 k--;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
69 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
70 } while(k > 0);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
71
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
72 return bits;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
73 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
74
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
75 static inline int mpc8_get_mod_golomb(GetBitContext *gb, int m)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
76 {
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
77 if(mpc8_cnk_len[0][m] < 1) return 0;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
78 return mpc8_dec_base(gb, 1, m+1);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
79 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
80
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
81 static int mpc8_get_mask(GetBitContext *gb, int size, int t)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
82 {
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
83 int mask = 0;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
84
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
85 if(t && t != size)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
86 mask = mpc8_dec_enum(gb, FFMIN(t, size - t), size);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
87 if((t << 1) > size) mask = ~mask;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
88
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
89 return mask;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
90 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
91
9517
dcae1f330498 Compact and make constant two tables used by Musepack decoders
kostya
parents: 9463
diff changeset
92 static const uint16_t vlc_offsets[13] = {
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
93 0, 640, 1184, 1748, 2298, 2426, 2554, 3066, 3578, 4106, 4618, 5196, 5708
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
94 };
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
95
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6350
diff changeset
96 static av_cold int mpc8_decode_init(AVCodecContext * avctx)
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
97 {
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
98 int i;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
99 MPCContext *c = avctx->priv_data;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
100 GetBitContext gb;
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6218
diff changeset
101 static int vlc_initialized = 0;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
102
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
103 static VLC_TYPE band_table[542][2];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
104 static VLC_TYPE q1_table[520][2];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
105 static VLC_TYPE q9up_table[524][2];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
106 static VLC_TYPE scfi0_table[1 << MPC8_SCFI0_BITS][2];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
107 static VLC_TYPE scfi1_table[1 << MPC8_SCFI1_BITS][2];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
108 static VLC_TYPE dscf0_table[560][2];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
109 static VLC_TYPE dscf1_table[598][2];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
110 static VLC_TYPE q3_0_table[512][2];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
111 static VLC_TYPE q3_1_table[516][2];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
112 static VLC_TYPE codes_table[5708][2];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
113
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
114 if(avctx->extradata_size < 2){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
115 av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
116 return -1;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
117 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
118 memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
9153
4e91d96dd045 Make Musepack decoders use LFG pseudorandom generator
kostya
parents: 8718
diff changeset
119 av_lfg_init(&c->rnd, 0xDEADBEEF);
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
120 dsputil_init(&c->dsp, avctx);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
121
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
122 ff_mpc_init();
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
123
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
124 init_get_bits(&gb, avctx->extradata, 16);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
125
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
126 skip_bits(&gb, 3);//sample rate
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
127 c->maxbands = get_bits(&gb, 5) + 1;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
128 skip_bits(&gb, 4);//channels
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
129 c->MSS = get_bits1(&gb);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
130 c->frames = 1 << (get_bits(&gb, 3) * 2);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
131
10602
987373501407 Fix an issue uncovered by commit 20623:
attila
parents: 9849
diff changeset
132 avctx->sample_fmt = SAMPLE_FMT_S16;
987373501407 Fix an issue uncovered by commit 20623:
attila
parents: 9849
diff changeset
133 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO;
987373501407 Fix an issue uncovered by commit 20623:
attila
parents: 9849
diff changeset
134
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6218
diff changeset
135 if(vlc_initialized) return 0;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
136 av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n");
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
137
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
138 band_vlc.table = band_table;
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
139 band_vlc.table_allocated = 542;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
140 init_vlc(&band_vlc, MPC8_BANDS_BITS, MPC8_BANDS_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
141 mpc8_bands_bits, 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
142 mpc8_bands_codes, 1, 1, INIT_VLC_USE_NEW_STATIC);
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
143
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
144 q1_vlc.table = q1_table;
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
145 q1_vlc.table_allocated = 520;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
146 init_vlc(&q1_vlc, MPC8_Q1_BITS, MPC8_Q1_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
147 mpc8_q1_bits, 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
148 mpc8_q1_codes, 1, 1, INIT_VLC_USE_NEW_STATIC);
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
149 q9up_vlc.table = q9up_table;
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
150 q9up_vlc.table_allocated = 524;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
151 init_vlc(&q9up_vlc, MPC8_Q9UP_BITS, MPC8_Q9UP_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
152 mpc8_q9up_bits, 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
153 mpc8_q9up_codes, 1, 1, INIT_VLC_USE_NEW_STATIC);
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
154
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
155 scfi_vlc[0].table = scfi0_table;
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
156 scfi_vlc[0].table_allocated = 1 << MPC8_SCFI0_BITS;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
157 init_vlc(&scfi_vlc[0], MPC8_SCFI0_BITS, MPC8_SCFI0_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
158 mpc8_scfi0_bits, 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
159 mpc8_scfi0_codes, 1, 1, INIT_VLC_USE_NEW_STATIC);
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
160 scfi_vlc[1].table = scfi1_table;
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
161 scfi_vlc[1].table_allocated = 1 << MPC8_SCFI1_BITS;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
162 init_vlc(&scfi_vlc[1], MPC8_SCFI1_BITS, MPC8_SCFI1_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
163 mpc8_scfi1_bits, 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
164 mpc8_scfi1_codes, 1, 1, INIT_VLC_USE_NEW_STATIC);
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
165
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
166 dscf_vlc[0].table = dscf0_table;
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
167 dscf_vlc[0].table_allocated = 560;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
168 init_vlc(&dscf_vlc[0], MPC8_DSCF0_BITS, MPC8_DSCF0_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
169 mpc8_dscf0_bits, 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
170 mpc8_dscf0_codes, 1, 1, INIT_VLC_USE_NEW_STATIC);
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
171 dscf_vlc[1].table = dscf1_table;
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
172 dscf_vlc[1].table_allocated = 598;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
173 init_vlc(&dscf_vlc[1], MPC8_DSCF1_BITS, MPC8_DSCF1_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
174 mpc8_dscf1_bits, 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
175 mpc8_dscf1_codes, 1, 1, INIT_VLC_USE_NEW_STATIC);
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
176
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
177 q3_vlc[0].table = q3_0_table;
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
178 q3_vlc[0].table_allocated = 512;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
179 init_vlc_sparse(&q3_vlc[0], MPC8_Q3_BITS, MPC8_Q3_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
180 mpc8_q3_bits, 1, 1,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
181 mpc8_q3_codes, 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
182 mpc8_q3_syms, 1, 1, INIT_VLC_USE_NEW_STATIC);
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
183 q3_vlc[1].table = q3_1_table;
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
184 q3_vlc[1].table_allocated = 516;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
185 init_vlc_sparse(&q3_vlc[1], MPC8_Q4_BITS, MPC8_Q4_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
186 mpc8_q4_bits, 1, 1,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
187 mpc8_q4_codes, 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
188 mpc8_q4_syms, 1, 1, INIT_VLC_USE_NEW_STATIC);
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
189
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
190 for(i = 0; i < 2; i++){
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
191 res_vlc[i].table = &codes_table[vlc_offsets[0+i]];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
192 res_vlc[i].table_allocated = vlc_offsets[1+i] - vlc_offsets[0+i];
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
193 init_vlc(&res_vlc[i], MPC8_RES_BITS, MPC8_RES_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
194 &mpc8_res_bits[i], 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
195 &mpc8_res_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
196
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
197 q2_vlc[i].table = &codes_table[vlc_offsets[2+i]];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
198 q2_vlc[i].table_allocated = vlc_offsets[3+i] - vlc_offsets[2+i];
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
199 init_vlc(&q2_vlc[i], MPC8_Q2_BITS, MPC8_Q2_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
200 &mpc8_q2_bits[i], 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
201 &mpc8_q2_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
202
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
203 quant_vlc[0][i].table = &codes_table[vlc_offsets[4+i]];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
204 quant_vlc[0][i].table_allocated = vlc_offsets[5+i] - vlc_offsets[4+i];
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
205 init_vlc(&quant_vlc[0][i], MPC8_Q5_BITS, MPC8_Q5_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
206 &mpc8_q5_bits[i], 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
207 &mpc8_q5_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
208 quant_vlc[1][i].table = &codes_table[vlc_offsets[6+i]];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
209 quant_vlc[1][i].table_allocated = vlc_offsets[7+i] - vlc_offsets[6+i];
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
210 init_vlc(&quant_vlc[1][i], MPC8_Q6_BITS, MPC8_Q6_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
211 &mpc8_q6_bits[i], 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
212 &mpc8_q6_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
213 quant_vlc[2][i].table = &codes_table[vlc_offsets[8+i]];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
214 quant_vlc[2][i].table_allocated = vlc_offsets[9+i] - vlc_offsets[8+i];
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
215 init_vlc(&quant_vlc[2][i], MPC8_Q7_BITS, MPC8_Q7_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
216 &mpc8_q7_bits[i], 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
217 &mpc8_q7_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
218 quant_vlc[3][i].table = &codes_table[vlc_offsets[10+i]];
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
219 quant_vlc[3][i].table_allocated = vlc_offsets[11+i] - vlc_offsets[10+i];
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
220 init_vlc(&quant_vlc[3][i], MPC8_Q8_BITS, MPC8_Q8_SIZE,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
221 &mpc8_q8_bits[i], 1, 1,
9463
d719a2711c64 Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents: 9428
diff changeset
222 &mpc8_q8_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
223 }
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6218
diff changeset
224 vlc_initialized = 1;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
225 return 0;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
226 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
227
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
228 static int mpc8_decode_frame(AVCodecContext * avctx,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
229 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9153
diff changeset
230 AVPacket *avpkt)
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
231 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9153
diff changeset
232 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9153
diff changeset
233 int buf_size = avpkt->size;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
234 MPCContext *c = avctx->priv_data;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
235 GetBitContext gb2, *gb = &gb2;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
236 int i, j, k, ch, cnt, res, t;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
237 Band *bands = c->bands;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
238 int off;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
239 int maxband, keyframe;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
240 int last[2];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
241
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
242 keyframe = c->cur_frame == 0;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
243
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
244 if(keyframe){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
245 memset(c->Q, 0, sizeof(c->Q));
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
246 c->last_bits_used = 0;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
247 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
248 init_get_bits(gb, buf, buf_size * 8);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
249 skip_bits(gb, c->last_bits_used & 7);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
250
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
251 if(keyframe)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
252 maxband = mpc8_get_mod_golomb(gb, c->maxbands + 1);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
253 else{
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
254 maxband = c->last_max_band + get_vlc2(gb, band_vlc.table, MPC8_BANDS_BITS, 2);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
255 if(maxband > 32) maxband -= 33;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
256 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
257 c->last_max_band = maxband;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
258
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
259 /* read subband indexes */
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
260 if(maxband){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
261 last[0] = last[1] = 0;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
262 for(i = maxband - 1; i >= 0; i--){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
263 for(ch = 0; ch < 2; ch++){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
264 last[ch] = get_vlc2(gb, res_vlc[last[ch] > 2].table, MPC8_RES_BITS, 2) + last[ch];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
265 if(last[ch] > 15) last[ch] -= 17;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
266 bands[i].res[ch] = last[ch];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
267 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
268 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
269 if(c->MSS){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
270 int mask;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
271
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
272 cnt = 0;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
273 for(i = 0; i < maxband; i++)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
274 if(bands[i].res[0] || bands[i].res[1])
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
275 cnt++;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
276 t = mpc8_get_mod_golomb(gb, cnt);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
277 mask = mpc8_get_mask(gb, cnt, t);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
278 for(i = maxband - 1; i >= 0; i--)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
279 if(bands[i].res[0] || bands[i].res[1]){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
280 bands[i].msf = mask & 1;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
281 mask >>= 1;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
282 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
283 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
284 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
285 for(i = maxband; i < c->maxbands; i++)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
286 bands[i].res[0] = bands[i].res[1] = 0;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
287
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
288 if(keyframe){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
289 for(i = 0; i < 32; i++)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
290 c->oldDSCF[0][i] = c->oldDSCF[1][i] = 1;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
291 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
292
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
293 for(i = 0; i < maxband; i++){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
294 if(bands[i].res[0] || bands[i].res[1]){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
295 cnt = !!bands[i].res[0] + !!bands[i].res[1] - 1;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
296 if(cnt >= 0){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
297 t = get_vlc2(gb, scfi_vlc[cnt].table, scfi_vlc[cnt].bits, 1);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
298 if(bands[i].res[0]) bands[i].scfi[0] = t >> (2 * cnt);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
299 if(bands[i].res[1]) bands[i].scfi[1] = t & 3;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
300 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
301 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
302 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
303
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
304 for(i = 0; i < maxband; i++){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
305 for(ch = 0; ch < 2; ch++){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
306 if(!bands[i].res[ch]) continue;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
307
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
308 if(c->oldDSCF[ch][i]){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
309 bands[i].scf_idx[ch][0] = get_bits(gb, 7) - 6;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
310 c->oldDSCF[ch][i] = 0;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
311 }else{
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
312 t = get_vlc2(gb, dscf_vlc[1].table, MPC8_DSCF1_BITS, 2);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
313 if(t == 64)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
314 t += get_bits(gb, 6);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
315 bands[i].scf_idx[ch][0] = ((bands[i].scf_idx[ch][2] + t - 25) & 0x7F) - 6;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
316 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
317 for(j = 0; j < 2; j++){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
318 if((bands[i].scfi[ch] << j) & 2)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
319 bands[i].scf_idx[ch][j + 1] = bands[i].scf_idx[ch][j];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
320 else{
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
321 t = get_vlc2(gb, dscf_vlc[0].table, MPC8_DSCF0_BITS, 2);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
322 if(t == 31)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
323 t = 64 + get_bits(gb, 6);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
324 bands[i].scf_idx[ch][j + 1] = ((bands[i].scf_idx[ch][j] + t - 25) & 0x7F) - 6;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
325 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
326 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
327 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
328 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
329
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
330 for(i = 0, off = 0; i < maxband; i++, off += SAMPLES_PER_BAND){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
331 for(ch = 0; ch < 2; ch++){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
332 res = bands[i].res[ch];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
333 switch(res){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
334 case -1:
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
335 for(j = 0; j < SAMPLES_PER_BAND; j++)
9153
4e91d96dd045 Make Musepack decoders use LFG pseudorandom generator
kostya
parents: 8718
diff changeset
336 c->Q[ch][off + j] = (av_lfg_get(&c->rnd) & 0x3FC) - 510;
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
337 break;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
338 case 0:
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
339 break;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
340 case 1:
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
341 for(j = 0; j < SAMPLES_PER_BAND; j += SAMPLES_PER_BAND / 2){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
342 cnt = get_vlc2(gb, q1_vlc.table, MPC8_Q1_BITS, 2);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
343 t = mpc8_get_mask(gb, 18, cnt);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
344 for(k = 0; k < SAMPLES_PER_BAND / 2; k++, t <<= 1)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
345 c->Q[ch][off + j + k] = (t & 0x20000) ? (get_bits1(gb) << 1) - 1 : 0;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
346 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
347 break;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
348 case 2:
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
349 cnt = 6;//2*mpc8_thres[res]
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
350 for(j = 0; j < SAMPLES_PER_BAND; j += 3){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
351 t = get_vlc2(gb, q2_vlc[cnt > 3].table, MPC8_Q2_BITS, 2);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
352 c->Q[ch][off + j + 0] = mpc8_idx50[t];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
353 c->Q[ch][off + j + 1] = mpc8_idx51[t];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
354 c->Q[ch][off + j + 2] = mpc8_idx52[t];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
355 cnt = (cnt >> 1) + mpc8_huffq2[t];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
356 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
357 break;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
358 case 3:
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
359 case 4:
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
360 for(j = 0; j < SAMPLES_PER_BAND; j += 2){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
361 t = get_vlc2(gb, q3_vlc[res - 3].table, MPC8_Q3_BITS, 2) + q3_offsets[res - 3];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
362 c->Q[ch][off + j + 1] = t >> 4;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
363 c->Q[ch][off + j + 0] = (t & 8) ? (t & 0xF) - 16 : (t & 0xF);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
364 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
365 break;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
366 case 5:
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
367 case 6:
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
368 case 7:
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
369 case 8:
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
370 cnt = 2 * mpc8_thres[res];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
371 for(j = 0; j < SAMPLES_PER_BAND; j++){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
372 t = get_vlc2(gb, quant_vlc[res - 5][cnt > mpc8_thres[res]].table, quant_vlc[res - 5][cnt > mpc8_thres[res]].bits, 2) + quant_offsets[res - 5];
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
373 c->Q[ch][off + j] = t;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
374 cnt = (cnt >> 1) + FFABS(c->Q[ch][off + j]);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
375 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
376 break;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
377 default:
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
378 for(j = 0; j < SAMPLES_PER_BAND; j++){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
379 c->Q[ch][off + j] = get_vlc2(gb, q9up_vlc.table, MPC8_Q9UP_BITS, 2);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
380 if(res != 9){
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
381 c->Q[ch][off + j] <<= res - 9;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
382 c->Q[ch][off + j] |= get_bits(gb, res - 9);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
383 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
384 c->Q[ch][off + j] -= (1 << (res - 2)) - 1;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
385 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
386 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
387 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
388 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
389
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
390 ff_mpc_dequantize_and_synth(c, maxband, data);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
391
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
392 c->cur_frame++;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
393
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
394 c->last_bits_used = get_bits_count(gb);
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
395 if(c->cur_frame >= c->frames)
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
396 c->cur_frame = 0;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
397 *data_size = MPC_FRAME_SIZE * 4;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
398
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
399 return c->cur_frame ? c->last_bits_used >> 3 : buf_size;
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
400 }
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
401
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
402 AVCodec mpc8_decoder = {
6716
aa09311685b2 Transform codec names into single words.
diego
parents: 6710
diff changeset
403 "mpc8",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 10602
diff changeset
404 AVMEDIA_TYPE_AUDIO,
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
405 CODEC_ID_MUSEPACK8,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
406 sizeof(MPCContext),
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
407 mpc8_decode_init,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
408 NULL,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
409 NULL,
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
410 mpc8_decode_frame,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6763
diff changeset
411 .long_name = NULL_IF_CONFIG_SMALL("Musepack SV8"),
5879
ad73103623ab Musepack SV8 demuxer and decoder
kostya
parents:
diff changeset
412 };