Originally committed as revision 18553 to svn://svn.ffmpeg.org/ffmpeg/trunk
Kostya Shishkov authored on 2009/04/17 23:09:56... | ... |
@@ -192,20 +192,22 @@ static int ir2_decode_frame(AVCodecContext *avctx, |
192 | 192 |
|
193 | 193 |
static av_cold int ir2_decode_init(AVCodecContext *avctx){ |
194 | 194 |
Ir2Context * const ic = avctx->priv_data; |
195 |
+ static VLC_TYPE vlc_tables[1 << CODE_VLC_BITS][2]; |
|
195 | 196 |
|
196 | 197 |
ic->avctx = avctx; |
197 | 198 |
|
198 | 199 |
avctx->pix_fmt= PIX_FMT_YUV410P; |
199 | 200 |
|
200 |
- if (!ir2_vlc.table) |
|
201 |
+ ir2_vlc.table = vlc_tables; |
|
202 |
+ ir2_vlc.table_allocated = 1 << CODE_VLC_BITS; |
|
201 | 203 |
#ifdef ALT_BITSTREAM_READER_LE |
202 | 204 |
init_vlc(&ir2_vlc, CODE_VLC_BITS, IR2_CODES, |
203 | 205 |
&ir2_codes[0][1], 4, 2, |
204 |
- &ir2_codes[0][0], 4, 2, INIT_VLC_USE_STATIC | INIT_VLC_LE); |
|
206 |
+ &ir2_codes[0][0], 4, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE); |
|
205 | 207 |
#else |
206 | 208 |
init_vlc(&ir2_vlc, CODE_VLC_BITS, IR2_CODES, |
207 | 209 |
&ir2_codes[0][1], 4, 2, |
208 |
- &ir2_codes[0][0], 4, 2, INIT_VLC_USE_STATIC); |
|
210 |
+ &ir2_codes[0][0], 4, 2, INIT_VLC_USE_NEW_STATIC); |
|
209 | 211 |
#endif |
210 | 212 |
|
211 | 213 |
return 0; |
... | ... |
@@ -40,6 +40,13 @@ |
40 | 40 |
|
41 | 41 |
static VLC scfi_vlc, dscf_vlc, hdr_vlc, quant_vlc[MPC7_QUANT_VLC_TABLES][2]; |
42 | 42 |
|
43 |
+static uint16_t quant_offsets[MPC7_QUANT_VLC_TABLES*2 + 1] = |
|
44 |
+{ |
|
45 |
+ 0, 512, 1024, 1536, 2052, 2564, 3076, 3588, 4100, 4612, 5124, |
|
46 |
+ 5636, 6164, 6676, 7224 |
|
47 |
+}; |
|
48 |
+ |
|
49 |
+ |
|
43 | 50 |
static av_cold int mpc7_decode_init(AVCodecContext * avctx) |
44 | 51 |
{ |
45 | 52 |
int i, j; |
... | ... |
@@ -48,6 +55,11 @@ static av_cold int mpc7_decode_init(AVCodecContext * avctx) |
48 | 48 |
uint8_t buf[16]; |
49 | 49 |
static int vlc_initialized = 0; |
50 | 50 |
|
51 |
+ static VLC_TYPE scfi_table[1 << MPC7_SCFI_BITS][2]; |
|
52 |
+ static VLC_TYPE dscf_table[1 << MPC7_DSCF_BITS][2]; |
|
53 |
+ static VLC_TYPE hdr_table[1 << MPC7_HDR_BITS][2]; |
|
54 |
+ static VLC_TYPE quant_tables[7224][2]; |
|
55 |
+ |
|
51 | 56 |
if(avctx->extradata_size < 16){ |
52 | 57 |
av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size); |
53 | 58 |
return -1; |
... | ... |
@@ -75,29 +87,37 @@ static av_cold int mpc7_decode_init(AVCodecContext * avctx) |
75 | 75 |
|
76 | 76 |
if(vlc_initialized) return 0; |
77 | 77 |
av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n"); |
78 |
+ scfi_vlc.table = scfi_table; |
|
79 |
+ scfi_vlc.table_allocated = 1 << MPC7_SCFI_BITS; |
|
78 | 80 |
if(init_vlc(&scfi_vlc, MPC7_SCFI_BITS, MPC7_SCFI_SIZE, |
79 | 81 |
&mpc7_scfi[1], 2, 1, |
80 |
- &mpc7_scfi[0], 2, 1, INIT_VLC_USE_STATIC)){ |
|
82 |
+ &mpc7_scfi[0], 2, 1, INIT_VLC_USE_NEW_STATIC)){ |
|
81 | 83 |
av_log(avctx, AV_LOG_ERROR, "Cannot init SCFI VLC\n"); |
82 | 84 |
return -1; |
83 | 85 |
} |
86 |
+ dscf_vlc.table = dscf_table; |
|
87 |
+ dscf_vlc.table_allocated = 1 << MPC7_DSCF_BITS; |
|
84 | 88 |
if(init_vlc(&dscf_vlc, MPC7_DSCF_BITS, MPC7_DSCF_SIZE, |
85 | 89 |
&mpc7_dscf[1], 2, 1, |
86 |
- &mpc7_dscf[0], 2, 1, INIT_VLC_USE_STATIC)){ |
|
90 |
+ &mpc7_dscf[0], 2, 1, INIT_VLC_USE_NEW_STATIC)){ |
|
87 | 91 |
av_log(avctx, AV_LOG_ERROR, "Cannot init DSCF VLC\n"); |
88 | 92 |
return -1; |
89 | 93 |
} |
94 |
+ hdr_vlc.table = hdr_table; |
|
95 |
+ hdr_vlc.table_allocated = 1 << MPC7_HDR_BITS; |
|
90 | 96 |
if(init_vlc(&hdr_vlc, MPC7_HDR_BITS, MPC7_HDR_SIZE, |
91 | 97 |
&mpc7_hdr[1], 2, 1, |
92 |
- &mpc7_hdr[0], 2, 1, INIT_VLC_USE_STATIC)){ |
|
98 |
+ &mpc7_hdr[0], 2, 1, INIT_VLC_USE_NEW_STATIC)){ |
|
93 | 99 |
av_log(avctx, AV_LOG_ERROR, "Cannot init HDR VLC\n"); |
94 | 100 |
return -1; |
95 | 101 |
} |
96 | 102 |
for(i = 0; i < MPC7_QUANT_VLC_TABLES; i++){ |
97 | 103 |
for(j = 0; j < 2; j++){ |
104 |
+ quant_vlc[i][j].table = &quant_tables[quant_offsets[i*2 + j]]; |
|
105 |
+ quant_vlc[i][j].table_allocated = quant_offsets[i*2 + j + 1] - quant_offsets[i*2 + j]; |
|
98 | 106 |
if(init_vlc(&quant_vlc[i][j], 9, mpc7_quant_vlc_sizes[i], |
99 | 107 |
&mpc7_quant_vlc[i][j][1], 4, 2, |
100 |
- &mpc7_quant_vlc[i][j][0], 4, 2, INIT_VLC_USE_STATIC)){ |
|
108 |
+ &mpc7_quant_vlc[i][j][0], 4, 2, INIT_VLC_USE_NEW_STATIC)){ |
|
101 | 109 |
av_log(avctx, AV_LOG_ERROR, "Cannot init QUANT VLC %i,%i\n",i,j); |
102 | 110 |
return -1; |
103 | 111 |
} |
... | ... |
@@ -88,6 +88,10 @@ static int mpc8_get_mask(GetBitContext *gb, int size, int t) |
88 | 88 |
return mask; |
89 | 89 |
} |
90 | 90 |
|
91 |
+static int vlc_offsets[13] = { |
|
92 |
+ 0, 640, 1184, 1748, 2298, 2426, 2554, 3066, 3578, 4106, 4618, 5196, 5708 |
|
93 |
+}; |
|
94 |
+ |
|
91 | 95 |
static av_cold int mpc8_decode_init(AVCodecContext * avctx) |
92 | 96 |
{ |
93 | 97 |
int i; |
... | ... |
@@ -95,6 +99,17 @@ static av_cold int mpc8_decode_init(AVCodecContext * avctx) |
95 | 95 |
GetBitContext gb; |
96 | 96 |
static int vlc_initialized = 0; |
97 | 97 |
|
98 |
+ static VLC_TYPE band_table[542][2]; |
|
99 |
+ static VLC_TYPE q1_table[520][2]; |
|
100 |
+ static VLC_TYPE q9up_table[524][2]; |
|
101 |
+ static VLC_TYPE scfi0_table[1 << MPC8_SCFI0_BITS][2]; |
|
102 |
+ static VLC_TYPE scfi1_table[1 << MPC8_SCFI1_BITS][2]; |
|
103 |
+ static VLC_TYPE dscf0_table[560][2]; |
|
104 |
+ static VLC_TYPE dscf1_table[598][2]; |
|
105 |
+ static VLC_TYPE q3_0_table[512][2]; |
|
106 |
+ static VLC_TYPE q3_1_table[516][2]; |
|
107 |
+ static VLC_TYPE codes_table[5708][2]; |
|
108 |
+ |
|
98 | 109 |
if(avctx->extradata_size < 2){ |
99 | 110 |
av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size); |
100 | 111 |
return -1; |
... | ... |
@@ -116,61 +131,91 @@ static av_cold int mpc8_decode_init(AVCodecContext * avctx) |
116 | 116 |
if(vlc_initialized) return 0; |
117 | 117 |
av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n"); |
118 | 118 |
|
119 |
+ band_vlc.table = band_table; |
|
120 |
+ band_vlc.table_allocated = 542; |
|
119 | 121 |
init_vlc(&band_vlc, MPC8_BANDS_BITS, MPC8_BANDS_SIZE, |
120 | 122 |
mpc8_bands_bits, 1, 1, |
121 |
- mpc8_bands_codes, 1, 1, INIT_VLC_USE_STATIC); |
|
123 |
+ mpc8_bands_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
122 | 124 |
|
125 |
+ q1_vlc.table = q1_table; |
|
126 |
+ q1_vlc.table_allocated = 520; |
|
123 | 127 |
init_vlc(&q1_vlc, MPC8_Q1_BITS, MPC8_Q1_SIZE, |
124 | 128 |
mpc8_q1_bits, 1, 1, |
125 |
- mpc8_q1_codes, 1, 1, INIT_VLC_USE_STATIC); |
|
129 |
+ mpc8_q1_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
130 |
+ q9up_vlc.table = q9up_table; |
|
131 |
+ q9up_vlc.table_allocated = 524; |
|
126 | 132 |
init_vlc(&q9up_vlc, MPC8_Q9UP_BITS, MPC8_Q9UP_SIZE, |
127 | 133 |
mpc8_q9up_bits, 1, 1, |
128 |
- mpc8_q9up_codes, 1, 1, INIT_VLC_USE_STATIC); |
|
134 |
+ mpc8_q9up_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
129 | 135 |
|
136 |
+ scfi_vlc[0].table = scfi0_table; |
|
137 |
+ scfi_vlc[0].table_allocated = 1 << MPC8_SCFI0_BITS; |
|
130 | 138 |
init_vlc(&scfi_vlc[0], MPC8_SCFI0_BITS, MPC8_SCFI0_SIZE, |
131 | 139 |
mpc8_scfi0_bits, 1, 1, |
132 |
- mpc8_scfi0_codes, 1, 1, INIT_VLC_USE_STATIC); |
|
140 |
+ mpc8_scfi0_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
141 |
+ scfi_vlc[1].table = scfi1_table; |
|
142 |
+ scfi_vlc[1].table_allocated = 1 << MPC8_SCFI1_BITS; |
|
133 | 143 |
init_vlc(&scfi_vlc[1], MPC8_SCFI1_BITS, MPC8_SCFI1_SIZE, |
134 | 144 |
mpc8_scfi1_bits, 1, 1, |
135 |
- mpc8_scfi1_codes, 1, 1, INIT_VLC_USE_STATIC); |
|
145 |
+ mpc8_scfi1_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
136 | 146 |
|
147 |
+ dscf_vlc[0].table = dscf0_table; |
|
148 |
+ dscf_vlc[0].table_allocated = 560; |
|
137 | 149 |
init_vlc(&dscf_vlc[0], MPC8_DSCF0_BITS, MPC8_DSCF0_SIZE, |
138 | 150 |
mpc8_dscf0_bits, 1, 1, |
139 |
- mpc8_dscf0_codes, 1, 1, INIT_VLC_USE_STATIC); |
|
151 |
+ mpc8_dscf0_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
152 |
+ dscf_vlc[1].table = dscf1_table; |
|
153 |
+ dscf_vlc[1].table_allocated = 598; |
|
140 | 154 |
init_vlc(&dscf_vlc[1], MPC8_DSCF1_BITS, MPC8_DSCF1_SIZE, |
141 | 155 |
mpc8_dscf1_bits, 1, 1, |
142 |
- mpc8_dscf1_codes, 1, 1, INIT_VLC_USE_STATIC); |
|
156 |
+ mpc8_dscf1_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
143 | 157 |
|
158 |
+ q3_vlc[0].table = q3_0_table; |
|
159 |
+ q3_vlc[0].table_allocated = 512; |
|
144 | 160 |
init_vlc_sparse(&q3_vlc[0], MPC8_Q3_BITS, MPC8_Q3_SIZE, |
145 | 161 |
mpc8_q3_bits, 1, 1, |
146 | 162 |
mpc8_q3_codes, 1, 1, |
147 |
- mpc8_q3_syms, 1, 1, INIT_VLC_USE_STATIC); |
|
163 |
+ mpc8_q3_syms, 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
164 |
+ q3_vlc[1].table = q3_1_table; |
|
165 |
+ q3_vlc[1].table_allocated = 516; |
|
148 | 166 |
init_vlc_sparse(&q3_vlc[1], MPC8_Q4_BITS, MPC8_Q4_SIZE, |
149 | 167 |
mpc8_q4_bits, 1, 1, |
150 | 168 |
mpc8_q4_codes, 1, 1, |
151 |
- mpc8_q4_syms, 1, 1, INIT_VLC_USE_STATIC); |
|
169 |
+ mpc8_q4_syms, 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
152 | 170 |
|
153 | 171 |
for(i = 0; i < 2; i++){ |
172 |
+ res_vlc[i].table = &codes_table[vlc_offsets[0+i]]; |
|
173 |
+ res_vlc[i].table_allocated = vlc_offsets[1+i] - vlc_offsets[0+i]; |
|
154 | 174 |
init_vlc(&res_vlc[i], MPC8_RES_BITS, MPC8_RES_SIZE, |
155 | 175 |
&mpc8_res_bits[i], 1, 1, |
156 |
- &mpc8_res_codes[i], 1, 1, INIT_VLC_USE_STATIC); |
|
176 |
+ &mpc8_res_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
157 | 177 |
|
178 |
+ q2_vlc[i].table = &codes_table[vlc_offsets[2+i]]; |
|
179 |
+ q2_vlc[i].table_allocated = vlc_offsets[3+i] - vlc_offsets[2+i]; |
|
158 | 180 |
init_vlc(&q2_vlc[i], MPC8_Q2_BITS, MPC8_Q2_SIZE, |
159 | 181 |
&mpc8_q2_bits[i], 1, 1, |
160 |
- &mpc8_q2_codes[i], 1, 1, INIT_VLC_USE_STATIC); |
|
182 |
+ &mpc8_q2_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
161 | 183 |
|
184 |
+ quant_vlc[0][i].table = &codes_table[vlc_offsets[4+i]]; |
|
185 |
+ quant_vlc[0][i].table_allocated = vlc_offsets[5+i] - vlc_offsets[4+i]; |
|
162 | 186 |
init_vlc(&quant_vlc[0][i], MPC8_Q5_BITS, MPC8_Q5_SIZE, |
163 | 187 |
&mpc8_q5_bits[i], 1, 1, |
164 |
- &mpc8_q5_codes[i], 1, 1, INIT_VLC_USE_STATIC); |
|
188 |
+ &mpc8_q5_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
189 |
+ quant_vlc[1][i].table = &codes_table[vlc_offsets[6+i]]; |
|
190 |
+ quant_vlc[1][i].table_allocated = vlc_offsets[7+i] - vlc_offsets[6+i]; |
|
165 | 191 |
init_vlc(&quant_vlc[1][i], MPC8_Q6_BITS, MPC8_Q6_SIZE, |
166 | 192 |
&mpc8_q6_bits[i], 1, 1, |
167 |
- &mpc8_q6_codes[i], 1, 1, INIT_VLC_USE_STATIC); |
|
193 |
+ &mpc8_q6_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
194 |
+ quant_vlc[2][i].table = &codes_table[vlc_offsets[8+i]]; |
|
195 |
+ quant_vlc[2][i].table_allocated = vlc_offsets[9+i] - vlc_offsets[8+i]; |
|
168 | 196 |
init_vlc(&quant_vlc[2][i], MPC8_Q7_BITS, MPC8_Q7_SIZE, |
169 | 197 |
&mpc8_q7_bits[i], 1, 1, |
170 |
- &mpc8_q7_codes[i], 1, 1, INIT_VLC_USE_STATIC); |
|
198 |
+ &mpc8_q7_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
199 |
+ quant_vlc[3][i].table = &codes_table[vlc_offsets[10+i]]; |
|
200 |
+ quant_vlc[3][i].table_allocated = vlc_offsets[11+i] - vlc_offsets[10+i]; |
|
171 | 201 |
init_vlc(&quant_vlc[3][i], MPC8_Q8_BITS, MPC8_Q8_SIZE, |
172 | 202 |
&mpc8_q8_bits[i], 1, 1, |
173 |
- &mpc8_q8_codes[i], 1, 1, INIT_VLC_USE_STATIC); |
|
203 |
+ &mpc8_q8_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
174 | 204 |
} |
175 | 205 |
vlc_initialized = 1; |
176 | 206 |
avctx->sample_fmt = SAMPLE_FMT_S16; |
... | ... |
@@ -129,15 +129,16 @@ static int decode_frame(AVCodecContext *avctx, |
129 | 129 |
|
130 | 130 |
static av_cold int decode_init(AVCodecContext *avctx){ |
131 | 131 |
WNV1Context * const l = avctx->priv_data; |
132 |
+ static VLC_TYPE code_table[1 << CODE_VLC_BITS][2]; |
|
132 | 133 |
|
133 | 134 |
l->avctx = avctx; |
134 | 135 |
avctx->pix_fmt = PIX_FMT_YUV422P; |
135 | 136 |
|
136 |
- if(!code_vlc.table){ |
|
137 |
+ code_vlc.table = code_table; |
|
138 |
+ code_vlc.table_allocated = 1 << CODE_VLC_BITS; |
|
137 | 139 |
init_vlc(&code_vlc, CODE_VLC_BITS, 16, |
138 | 140 |
&code_tab[0][1], 4, 2, |
139 |
- &code_tab[0][0], 4, 2, INIT_VLC_USE_STATIC); |
|
140 |
- } |
|
141 |
+ &code_tab[0][0], 4, 2, INIT_VLC_USE_NEW_STATIC); |
|
141 | 142 |
|
142 | 143 |
return 0; |
143 | 144 |
} |