Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * VC-1 and WMV3 decoder | ||
3 | * Copyright (c) 2011 Mashiat Sarker Shakkhar | ||
4 | * Copyright (c) 2006-2007 Konstantin Shishkov | ||
5 | * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer | ||
6 | * | ||
7 | * This file is part of FFmpeg. | ||
8 | * | ||
9 | * FFmpeg is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU Lesser General Public | ||
11 | * License as published by the Free Software Foundation; either | ||
12 | * version 2.1 of the License, or (at your option) any later version. | ||
13 | * | ||
14 | * FFmpeg is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
17 | * Lesser General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU Lesser General Public | ||
20 | * License along with FFmpeg; if not, write to the Free Software | ||
21 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
22 | */ | ||
23 | |||
24 | /** | ||
25 | * @file | ||
26 | * VC-1 and WMV3 block decoding routines | ||
27 | */ | ||
28 | |||
29 | #include "avcodec.h" | ||
30 | #include "mpegutils.h" | ||
31 | #include "mpegvideo.h" | ||
32 | #include "mpegvideodec.h" | ||
33 | #include "msmpeg4_vc1_data.h" | ||
34 | #include "unary.h" | ||
35 | #include "vc1.h" | ||
36 | #include "vc1_pred.h" | ||
37 | #include "vc1acdata.h" | ||
38 | #include "vc1data.h" | ||
39 | |||
40 | // offset tables for interlaced picture MVDATA decoding | ||
41 | static const uint8_t offset_table[2][9] = { | ||
42 | { 0, 1, 2, 4, 8, 16, 32, 64, 128 }, | ||
43 | { 0, 1, 3, 7, 15, 31, 63, 127, 255 }, | ||
44 | }; | ||
45 | |||
46 | // mapping table for internal block representation | ||
47 | static const int block_map[6] = {0, 2, 1, 3, 4, 5}; | ||
48 | |||
49 | /***********************************************************************/ | ||
50 | /** | ||
51 | * @name VC-1 Bitplane decoding | ||
52 | * @see 8.7, p56 | ||
53 | * @{ | ||
54 | */ | ||
55 | |||
56 | |||
57 | 10072 | static inline void init_block_index(VC1Context *v) | |
58 | { | ||
59 | 10072 | MpegEncContext *s = &v->s; | |
60 | 10072 | ff_init_block_index(s); | |
61 |
4/4✓ Branch 0 taken 1338 times.
✓ Branch 1 taken 8734 times.
✓ Branch 2 taken 669 times.
✓ Branch 3 taken 669 times.
|
10072 | if (v->field_mode && !(v->second_field ^ v->tff)) { |
62 | 669 | s->dest[0] += s->cur_pic.ptr->f->linesize[0]; | |
63 | 669 | s->dest[1] += s->cur_pic.ptr->f->linesize[1]; | |
64 | 669 | s->dest[2] += s->cur_pic.ptr->f->linesize[2]; | |
65 | } | ||
66 | 10072 | } | |
67 | |||
68 | 356913 | static inline void update_block_index(MpegEncContext *s) | |
69 | { | ||
70 | /* VC1 is always 420 except when using AV_CODEC_FLAG_GRAY | ||
71 | * (or a HWAccel). Shall we inline this value? */ | ||
72 | 356913 | ff_update_block_index(s, 8, 0, s->chroma_x_shift); | |
73 | 356913 | } | |
74 | |||
75 | /** @} */ //Bitplane group | ||
76 | |||
77 | 250176 | static void vc1_put_blocks_clamped(VC1Context *v, int put_signed) | |
78 | { | ||
79 | 250176 | MpegEncContext *s = &v->s; | |
80 | uint8_t *dest; | ||
81 | 250176 | int block_count = CONFIG_GRAY && (s->avctx->flags & AV_CODEC_FLAG_GRAY) ? 4 : 6; | |
82 | 250176 | int fieldtx = 0; | |
83 | int i; | ||
84 | |||
85 | /* The put pixels loop is one MB row and one MB column behind the decoding | ||
86 | * loop because we can only put pixels when overlap filtering is done. For | ||
87 | * interlaced frame pictures, however, the put pixels loop is only one | ||
88 | * column behind the decoding loop as interlaced frame pictures only need | ||
89 | * horizontal overlap filtering. */ | ||
90 |
4/4✓ Branch 0 taken 211976 times.
✓ Branch 1 taken 38200 times.
✓ Branch 2 taken 179816 times.
✓ Branch 3 taken 32160 times.
|
250176 | if (!s->first_slice_line && v->fcm != ILACE_FRAME) { |
91 |
2/2✓ Branch 0 taken 174364 times.
✓ Branch 1 taken 5452 times.
|
179816 | if (s->mb_x) { |
92 |
2/2✓ Branch 0 taken 1046184 times.
✓ Branch 1 taken 174364 times.
|
1220548 | for (i = 0; i < block_count; i++) { |
93 |
4/4✓ Branch 0 taken 348728 times.
✓ Branch 1 taken 697456 times.
✓ Branch 2 taken 294013 times.
✓ Branch 3 taken 752171 times.
|
1743640 | if (i > 3 ? v->mb_type[0][s->block_index[i] - s->block_wrap[i] - 1] : |
94 | 697456 | v->mb_type[0][s->block_index[i] - 2 * s->block_wrap[i] - 2]) { | |
95 | 294013 | dest = s->dest[0] + ((i & 2) - 4) * 4 * s->linesize + ((i & 1) - 2) * 8; | |
96 |
2/2✓ Branch 0 taken 192997 times.
✓ Branch 1 taken 101016 times.
|
294013 | if (put_signed) |
97 |
4/4✓ Branch 0 taken 63146 times.
✓ Branch 1 taken 129851 times.
✓ Branch 2 taken 63146 times.
✓ Branch 3 taken 129851 times.
|
256143 | s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][block_map[i]], |
98 | 63146 | i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 8 : dest, | |
99 | i > 3 ? s->uvlinesize : s->linesize); | ||
100 | else | ||
101 |
4/4✓ Branch 0 taken 33672 times.
✓ Branch 1 taken 67344 times.
✓ Branch 2 taken 33672 times.
✓ Branch 3 taken 67344 times.
|
134688 | s->idsp.put_pixels_clamped(v->block[v->topleft_blk_idx][block_map[i]], |
102 | 33672 | i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 8 : dest, | |
103 | i > 3 ? s->uvlinesize : s->linesize); | ||
104 | } | ||
105 | } | ||
106 | } | ||
107 |
2/2✓ Branch 0 taken 5451 times.
✓ Branch 1 taken 174365 times.
|
179816 | if (s->mb_x == v->end_mb_x - 1) { |
108 |
2/2✓ Branch 0 taken 32706 times.
✓ Branch 1 taken 5451 times.
|
38157 | for (i = 0; i < block_count; i++) { |
109 |
4/4✓ Branch 0 taken 10902 times.
✓ Branch 1 taken 21804 times.
✓ Branch 2 taken 11193 times.
✓ Branch 3 taken 21513 times.
|
54510 | if (i > 3 ? v->mb_type[0][s->block_index[i] - s->block_wrap[i]] : |
110 | 21804 | v->mb_type[0][s->block_index[i] - 2 * s->block_wrap[i]]) { | |
111 | 11193 | dest = s->dest[0] + ((i & 2) - 4) * 4 * s->linesize + (i & 1) * 8; | |
112 |
2/2✓ Branch 0 taken 5649 times.
✓ Branch 1 taken 5544 times.
|
11193 | if (put_signed) |
113 |
4/4✓ Branch 0 taken 1826 times.
✓ Branch 1 taken 3823 times.
✓ Branch 2 taken 1826 times.
✓ Branch 3 taken 3823 times.
|
7475 | s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][block_map[i]], |
114 | 1826 | i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest, | |
115 | i > 3 ? s->uvlinesize : s->linesize); | ||
116 | else | ||
117 |
4/4✓ Branch 0 taken 1848 times.
✓ Branch 1 taken 3696 times.
✓ Branch 2 taken 1848 times.
✓ Branch 3 taken 3696 times.
|
7392 | s->idsp.put_pixels_clamped(v->block[v->top_blk_idx][block_map[i]], |
118 | 1848 | i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest, | |
119 | i > 3 ? s->uvlinesize : s->linesize); | ||
120 | } | ||
121 | } | ||
122 | } | ||
123 | } | ||
124 |
4/4✓ Branch 0 taken 211996 times.
✓ Branch 1 taken 38180 times.
✓ Branch 2 taken 32160 times.
✓ Branch 3 taken 179836 times.
|
250176 | if (s->mb_y == s->end_mb_y - 1 || v->fcm == ILACE_FRAME) { |
125 |
2/2✓ Branch 0 taken 69038 times.
✓ Branch 1 taken 1302 times.
|
70340 | if (s->mb_x) { |
126 |
2/2✓ Branch 0 taken 32368 times.
✓ Branch 1 taken 36670 times.
|
69038 | if (v->fcm == ILACE_FRAME) |
127 | 32368 | fieldtx = v->fieldtx_plane[s->mb_y * s->mb_stride + s->mb_x - 1]; | |
128 |
2/2✓ Branch 0 taken 414228 times.
✓ Branch 1 taken 69038 times.
|
483266 | for (i = 0; i < block_count; i++) { |
129 |
4/4✓ Branch 0 taken 138076 times.
✓ Branch 1 taken 276152 times.
✓ Branch 2 taken 185719 times.
✓ Branch 3 taken 228509 times.
|
690380 | if (i > 3 ? v->mb_type[0][s->block_index[i] - 1] : |
130 | 276152 | v->mb_type[0][s->block_index[i] - 2]) { | |
131 |
2/2✓ Branch 0 taken 34086 times.
✓ Branch 1 taken 151633 times.
|
185719 | if (fieldtx) |
132 | 34086 | dest = s->dest[0] + ((i & 2) >> 1) * s->linesize + ((i & 1) - 2) * 8; | |
133 | else | ||
134 | 151633 | dest = s->dest[0] + (i & 2) * 4 * s->linesize + ((i & 1) - 2) * 8; | |
135 |
2/2✓ Branch 0 taken 178219 times.
✓ Branch 1 taken 7500 times.
|
185719 | if (put_signed) |
136 |
4/4✓ Branch 0 taken 58766 times.
✓ Branch 1 taken 119453 times.
✓ Branch 2 taken 58766 times.
✓ Branch 3 taken 119453 times.
|
356438 | s->idsp.put_signed_pixels_clamped(v->block[v->left_blk_idx][block_map[i]], |
137 | 58766 | i > 3 ? s->dest[i - 3] - 8 : dest, | |
138 | 119453 | i > 3 ? s->uvlinesize : s->linesize << fieldtx); | |
139 | else | ||
140 |
4/4✓ Branch 0 taken 2500 times.
✓ Branch 1 taken 5000 times.
✓ Branch 2 taken 2500 times.
✓ Branch 3 taken 5000 times.
|
15000 | s->idsp.put_pixels_clamped(v->block[v->left_blk_idx][block_map[i]], |
141 | 2500 | i > 3 ? s->dest[i - 3] - 8 : dest, | |
142 | 5000 | i > 3 ? s->uvlinesize : s->linesize << fieldtx); | |
143 | } | ||
144 | } | ||
145 | } | ||
146 |
2/2✓ Branch 0 taken 1302 times.
✓ Branch 1 taken 69038 times.
|
70340 | if (s->mb_x == v->end_mb_x - 1) { |
147 |
2/2✓ Branch 0 taken 272 times.
✓ Branch 1 taken 1030 times.
|
1302 | if (v->fcm == ILACE_FRAME) |
148 | 272 | fieldtx = v->fieldtx_plane[s->mb_y * s->mb_stride + s->mb_x]; | |
149 |
2/2✓ Branch 0 taken 7812 times.
✓ Branch 1 taken 1302 times.
|
9114 | for (i = 0; i < block_count; i++) { |
150 |
2/2✓ Branch 0 taken 3359 times.
✓ Branch 1 taken 4453 times.
|
7812 | if (v->mb_type[0][s->block_index[i]]) { |
151 |
2/2✓ Branch 0 taken 252 times.
✓ Branch 1 taken 3107 times.
|
3359 | if (fieldtx) |
152 | 252 | dest = s->dest[0] + ((i & 2) >> 1) * s->linesize + (i & 1) * 8; | |
153 | else | ||
154 | 3107 | dest = s->dest[0] + (i & 2) * 4 * s->linesize + (i & 1) * 8; | |
155 |
2/2✓ Branch 0 taken 2819 times.
✓ Branch 1 taken 540 times.
|
3359 | if (put_signed) |
156 |
4/4✓ Branch 0 taken 926 times.
✓ Branch 1 taken 1893 times.
✓ Branch 2 taken 926 times.
✓ Branch 3 taken 1893 times.
|
5638 | s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][block_map[i]], |
157 | 926 | i > 3 ? s->dest[i - 3] : dest, | |
158 | 1893 | i > 3 ? s->uvlinesize : s->linesize << fieldtx); | |
159 | else | ||
160 |
4/4✓ Branch 0 taken 180 times.
✓ Branch 1 taken 360 times.
✓ Branch 2 taken 180 times.
✓ Branch 3 taken 360 times.
|
1080 | s->idsp.put_pixels_clamped(v->block[v->cur_blk_idx][block_map[i]], |
161 | 180 | i > 3 ? s->dest[i - 3] : dest, | |
162 | 360 | i > 3 ? s->uvlinesize : s->linesize << fieldtx); | |
163 | } | ||
164 | } | ||
165 | } | ||
166 | } | ||
167 | 250176 | } | |
168 | |||
169 | #define inc_blk_idx(idx) do { \ | ||
170 | idx++; \ | ||
171 | if (idx >= v->n_allocated_blks) \ | ||
172 | idx = 0; \ | ||
173 | } while (0) | ||
174 | |||
175 | /***********************************************************************/ | ||
176 | /** | ||
177 | * @name VC-1 Block-level functions | ||
178 | * @see 7.1.4, p91 and 8.1.1.7, p(1)04 | ||
179 | * @{ | ||
180 | */ | ||
181 | |||
182 | /** | ||
183 | * @def GET_MQUANT | ||
184 | * @brief Get macroblock-level quantizer scale | ||
185 | */ | ||
186 | #define GET_MQUANT() \ | ||
187 | if (v->dquantfrm) { \ | ||
188 | int edges = 0; \ | ||
189 | if (v->dqprofile == DQPROFILE_ALL_MBS) { \ | ||
190 | if (v->dqbilevel) { \ | ||
191 | mquant = (get_bits1(gb)) ? -v->altpq : v->pq; \ | ||
192 | } else { \ | ||
193 | mqdiff = get_bits(gb, 3); \ | ||
194 | if (mqdiff != 7) \ | ||
195 | mquant = -v->pq - mqdiff; \ | ||
196 | else \ | ||
197 | mquant = -get_bits(gb, 5); \ | ||
198 | } \ | ||
199 | } \ | ||
200 | if (v->dqprofile == DQPROFILE_SINGLE_EDGE) \ | ||
201 | edges = 1 << v->dqsbedge; \ | ||
202 | else if (v->dqprofile == DQPROFILE_DOUBLE_EDGES) \ | ||
203 | edges = (3 << v->dqsbedge) % 15; \ | ||
204 | else if (v->dqprofile == DQPROFILE_FOUR_EDGES) \ | ||
205 | edges = 15; \ | ||
206 | if ((edges&1) && !s->mb_x) \ | ||
207 | mquant = -v->altpq; \ | ||
208 | if ((edges&2) && !s->mb_y) \ | ||
209 | mquant = -v->altpq; \ | ||
210 | if ((edges&4) && s->mb_x == (s->mb_width - 1)) \ | ||
211 | mquant = -v->altpq; \ | ||
212 | if ((edges&8) && \ | ||
213 | s->mb_y == ((s->mb_height >> v->field_mode) - 1)) \ | ||
214 | mquant = -v->altpq; \ | ||
215 | if (!mquant || mquant > 31 || mquant < -31) { \ | ||
216 | av_log(v->s.avctx, AV_LOG_ERROR, \ | ||
217 | "Overriding invalid mquant %d\n", mquant); \ | ||
218 | mquant = 1; \ | ||
219 | } \ | ||
220 | } | ||
221 | |||
222 | /** | ||
223 | * @def GET_MVDATA(_dmv_x, _dmv_y) | ||
224 | * @brief Get MV differentials | ||
225 | * @see MVDATA decoding from 8.3.5.2, p(1)20 | ||
226 | * @param _dmv_x Horizontal differential for decoded MV | ||
227 | * @param _dmv_y Vertical differential for decoded MV | ||
228 | */ | ||
229 | #define GET_MVDATA(_dmv_x, _dmv_y) \ | ||
230 | index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index], \ | ||
231 | VC1_MV_DIFF_VLC_BITS, 2); \ | ||
232 | if (index > 36) { \ | ||
233 | mb_has_coeffs = 1; \ | ||
234 | index -= 37; \ | ||
235 | } else \ | ||
236 | mb_has_coeffs = 0; \ | ||
237 | s->mb_intra = 0; \ | ||
238 | if (!index) { \ | ||
239 | _dmv_x = _dmv_y = 0; \ | ||
240 | } else if (index == 35) { \ | ||
241 | _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample); \ | ||
242 | _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample); \ | ||
243 | } else if (index == 36) { \ | ||
244 | _dmv_x = 0; \ | ||
245 | _dmv_y = 0; \ | ||
246 | s->mb_intra = 1; \ | ||
247 | } else { \ | ||
248 | index1 = index % 6; \ | ||
249 | _dmv_x = offset_table[1][index1]; \ | ||
250 | val = size_table[index1] - (!s->quarter_sample && index1 == 5); \ | ||
251 | if (val > 0) { \ | ||
252 | val = get_bits(gb, val); \ | ||
253 | sign = 0 - (val & 1); \ | ||
254 | _dmv_x = (sign ^ ((val >> 1) + _dmv_x)) - sign; \ | ||
255 | } \ | ||
256 | \ | ||
257 | index1 = index / 6; \ | ||
258 | _dmv_y = offset_table[1][index1]; \ | ||
259 | val = size_table[index1] - (!s->quarter_sample && index1 == 5); \ | ||
260 | if (val > 0) { \ | ||
261 | val = get_bits(gb, val); \ | ||
262 | sign = 0 - (val & 1); \ | ||
263 | _dmv_y = (sign ^ ((val >> 1) + _dmv_y)) - sign; \ | ||
264 | } \ | ||
265 | } | ||
266 | |||
267 | 119188 | static av_always_inline void get_mvdata_interlaced(VC1Context *v, int *dmv_x, | |
268 | int *dmv_y, int *pred_flag) | ||
269 | { | ||
270 | int index, index1; | ||
271 | int extend_x, extend_y; | ||
272 | 119188 | GetBitContext *gb = &v->s.gb; | |
273 | int bits, esc; | ||
274 | int val, sign; | ||
275 | |||
276 |
2/2✓ Branch 0 taken 59405 times.
✓ Branch 1 taken 59783 times.
|
119188 | if (v->numref) { |
277 | 59405 | bits = VC1_2REF_MVDATA_VLC_BITS; | |
278 | 59405 | esc = 125; | |
279 | } else { | ||
280 | 59783 | bits = VC1_1REF_MVDATA_VLC_BITS; | |
281 | 59783 | esc = 71; | |
282 | } | ||
283 | 119188 | extend_x = v->dmvrange & 1; | |
284 | 119188 | extend_y = (v->dmvrange >> 1) & 1; | |
285 | 119188 | index = get_vlc2(gb, v->imv_vlc, bits, 3); | |
286 |
2/2✓ Branch 0 taken 8896 times.
✓ Branch 1 taken 110292 times.
|
119188 | if (index == esc) { |
287 | 8896 | *dmv_x = get_bits(gb, v->k_x); | |
288 | 8896 | *dmv_y = get_bits(gb, v->k_y); | |
289 |
2/2✓ Branch 0 taken 414 times.
✓ Branch 1 taken 8482 times.
|
8896 | if (v->numref) { |
290 |
1/2✓ Branch 0 taken 414 times.
✗ Branch 1 not taken.
|
414 | if (pred_flag) |
291 | 414 | *pred_flag = *dmv_y & 1; | |
292 | 414 | *dmv_y = (*dmv_y + (*dmv_y & 1)) >> 1; | |
293 | } | ||
294 | } | ||
295 | else { | ||
296 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 110292 times.
|
110292 | av_assert0(index < esc); |
297 | 110292 | index1 = (index + 1) % 9; | |
298 |
2/2✓ Branch 0 taken 84924 times.
✓ Branch 1 taken 25368 times.
|
110292 | if (index1 != 0) { |
299 | 84924 | val = get_bits(gb, index1 + extend_x); | |
300 | 84924 | sign = 0 - (val & 1); | |
301 | 84924 | *dmv_x = (sign ^ ((val >> 1) + offset_table[extend_x][index1])) - sign; | |
302 | } else | ||
303 | 25368 | *dmv_x = 0; | |
304 | 110292 | index1 = (index + 1) / 9; | |
305 |
2/2✓ Branch 0 taken 76909 times.
✓ Branch 1 taken 33383 times.
|
110292 | if (index1 > v->numref) { |
306 | 76909 | val = get_bits(gb, (index1 >> v->numref) + extend_y); | |
307 | 76909 | sign = 0 - (val & 1); | |
308 | 76909 | *dmv_y = (sign ^ ((val >> 1) + offset_table[extend_y][index1 >> v->numref])) - sign; | |
309 | } else | ||
310 | 33383 | *dmv_y = 0; | |
311 |
3/4✓ Branch 0 taken 58991 times.
✓ Branch 1 taken 51301 times.
✓ Branch 2 taken 58991 times.
✗ Branch 3 not taken.
|
110292 | if (v->numref && pred_flag) |
312 | 58991 | *pred_flag = index1 & 1; | |
313 | } | ||
314 | 119188 | } | |
315 | |||
316 | /** Reconstruct motion vector for B-frame and do motion compensation | ||
317 | */ | ||
318 | 62854 | static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2], | |
319 | int direct, int mode) | ||
320 | { | ||
321 |
2/2✓ Branch 0 taken 9339 times.
✓ Branch 1 taken 53515 times.
|
62854 | if (direct) { |
322 | 9339 | ff_vc1_mc_1mv(v, 0); | |
323 | 9339 | ff_vc1_interp_mc(v); | |
324 | 9339 | return; | |
325 | } | ||
326 |
2/2✓ Branch 0 taken 12043 times.
✓ Branch 1 taken 41472 times.
|
53515 | if (mode == BMV_TYPE_INTERPOLATED) { |
327 | 12043 | ff_vc1_mc_1mv(v, 0); | |
328 | 12043 | ff_vc1_interp_mc(v); | |
329 | 12043 | return; | |
330 | } | ||
331 | |||
332 | 41472 | ff_vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD)); | |
333 | } | ||
334 | |||
335 | /** Get predicted DC value for I-frames only | ||
336 | * prediction dir: left=0, top=1 | ||
337 | * @param s MpegEncContext | ||
338 | * @param overlap flag indicating that overlap filtering is used | ||
339 | * @param pq integer part of picture quantizer | ||
340 | * @param[in] n block index in the current MB | ||
341 | * @param dc_val_ptr Pointer to DC predictor | ||
342 | * @param dir_ptr Prediction direction for use in AC prediction | ||
343 | */ | ||
344 | 114600 | static inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n, | |
345 | int16_t **dc_val_ptr, int *dir_ptr) | ||
346 | { | ||
347 | int a, b, c, wrap, pred, scale; | ||
348 | int16_t *dc_val; | ||
349 | static const uint16_t dcpred[32] = { | ||
350 | -1, 1024, 512, 341, 256, 205, 171, 146, 128, | ||
351 | 114, 102, 93, 85, 79, 73, 68, 64, | ||
352 | 60, 57, 54, 51, 49, 47, 45, 43, | ||
353 | 41, 39, 38, 37, 35, 34, 33 | ||
354 | }; | ||
355 | |||
356 | /* find prediction - wmv3_dc_scale always used here in fact */ | ||
357 |
2/2✓ Branch 0 taken 76400 times.
✓ Branch 1 taken 38200 times.
|
114600 | if (n < 4) scale = s->y_dc_scale; |
358 | 38200 | else scale = s->c_dc_scale; | |
359 | |||
360 | 114600 | wrap = s->block_wrap[n]; | |
361 | 114600 | dc_val = s->dc_val[0] + s->block_index[n]; | |
362 | |||
363 | /* B A | ||
364 | * C X | ||
365 | */ | ||
366 | 114600 | c = dc_val[ - 1]; | |
367 | 114600 | b = dc_val[ - 1 - wrap]; | |
368 | 114600 | a = dc_val[ - wrap]; | |
369 | |||
370 |
3/4✓ Branch 0 taken 58320 times.
✓ Branch 1 taken 56280 times.
✓ Branch 2 taken 58320 times.
✗ Branch 3 not taken.
|
114600 | if (pq < 9 || !overlap) { |
371 | /* Set outer values */ | ||
372 |
6/6✓ Branch 0 taken 8040 times.
✓ Branch 1 taken 106560 times.
✓ Branch 2 taken 6700 times.
✓ Branch 3 taken 1340 times.
✓ Branch 4 taken 5360 times.
✓ Branch 5 taken 1340 times.
|
114600 | if (s->first_slice_line && (n != 2 && n != 3)) |
373 | 5360 | b = a = dcpred[scale]; | |
374 |
6/6✓ Branch 0 taken 6084 times.
✓ Branch 1 taken 108516 times.
✓ Branch 2 taken 5070 times.
✓ Branch 3 taken 1014 times.
✓ Branch 4 taken 4056 times.
✓ Branch 5 taken 1014 times.
|
114600 | if (s->mb_x == 0 && (n != 1 && n != 3)) |
375 | 4056 | b = c = dcpred[scale]; | |
376 | } else { | ||
377 | /* Set outer values */ | ||
378 | ✗ | if (s->first_slice_line && (n != 2 && n != 3)) | |
379 | ✗ | b = a = 0; | |
380 | ✗ | if (s->mb_x == 0 && (n != 1 && n != 3)) | |
381 | ✗ | b = c = 0; | |
382 | } | ||
383 | |||
384 |
2/2✓ Branch 0 taken 77612 times.
✓ Branch 1 taken 36988 times.
|
114600 | if (abs(a - b) <= abs(b - c)) { |
385 | 77612 | pred = c; | |
386 | 77612 | *dir_ptr = 1; // left | |
387 | } else { | ||
388 | 36988 | pred = a; | |
389 | 36988 | *dir_ptr = 0; // top | |
390 | } | ||
391 | |||
392 | /* update predictor */ | ||
393 | 114600 | *dc_val_ptr = &dc_val[0]; | |
394 | 114600 | return pred; | |
395 | } | ||
396 | |||
397 | |||
398 | /** Get predicted DC value | ||
399 | * prediction dir: left=0, top=1 | ||
400 | * @param s MpegEncContext | ||
401 | * @param overlap flag indicating that overlap filtering is used | ||
402 | * @param pq integer part of picture quantizer | ||
403 | * @param[in] n block index in the current MB | ||
404 | * @param a_avail flag indicating top block availability | ||
405 | * @param c_avail flag indicating left block availability | ||
406 | * @param dc_val_ptr Pointer to DC predictor | ||
407 | * @param dir_ptr Prediction direction for use in AC prediction | ||
408 | */ | ||
409 | 381610 | static inline int ff_vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n, | |
410 | int a_avail, int c_avail, | ||
411 | int16_t **dc_val_ptr, int *dir_ptr) | ||
412 | { | ||
413 | int a, b, c, wrap, pred; | ||
414 | int16_t *dc_val; | ||
415 | 381610 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
416 | 381610 | int q1, q2 = 0; | |
417 | int dqscale_index; | ||
418 | |||
419 | /* scale predictors if needed */ | ||
420 | 381610 | q1 = FFABS(s->cur_pic.qscale_table[mb_pos]); | |
421 | 381610 | dqscale_index = s->y_dc_scale_table[q1] - 1; | |
422 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 381610 times.
|
381610 | if (dqscale_index < 0) |
423 | ✗ | return 0; | |
424 | |||
425 | 381610 | wrap = s->block_wrap[n]; | |
426 | 381610 | dc_val = s->dc_val[0] + s->block_index[n]; | |
427 | |||
428 | /* B A | ||
429 | * C X | ||
430 | */ | ||
431 | 381610 | c = dc_val[ - 1]; | |
432 | 381610 | b = dc_val[ - 1 - wrap]; | |
433 | 381610 | a = dc_val[ - wrap]; | |
434 | |||
435 |
6/6✓ Branch 0 taken 286987 times.
✓ Branch 1 taken 94623 times.
✓ Branch 2 taken 224380 times.
✓ Branch 3 taken 62607 times.
✓ Branch 4 taken 161716 times.
✓ Branch 5 taken 62664 times.
|
381610 | if (c_avail && (n != 1 && n != 3)) { |
436 | 161716 | q2 = FFABS(s->cur_pic.qscale_table[mb_pos - 1]); | |
437 |
3/4✓ Branch 0 taken 161716 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10876 times.
✓ Branch 3 taken 150840 times.
|
161716 | if (q2 && q2 != q1) |
438 | 10876 | c = (int)((unsigned)c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18; | |
439 | } | ||
440 |
6/6✓ Branch 0 taken 267085 times.
✓ Branch 1 taken 114525 times.
✓ Branch 2 taken 204442 times.
✓ Branch 3 taken 62643 times.
✓ Branch 4 taken 141745 times.
✓ Branch 5 taken 62697 times.
|
381610 | if (a_avail && (n != 2 && n != 3)) { |
441 | 141745 | q2 = FFABS(s->cur_pic.qscale_table[mb_pos - s->mb_stride]); | |
442 |
3/4✓ Branch 0 taken 141745 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10104 times.
✓ Branch 3 taken 131641 times.
|
141745 | if (q2 && q2 != q1) |
443 | 10104 | a = (int)((unsigned)a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18; | |
444 | } | ||
445 |
6/6✓ Branch 0 taken 267085 times.
✓ Branch 1 taken 114525 times.
✓ Branch 2 taken 225911 times.
✓ Branch 3 taken 41174 times.
✓ Branch 4 taken 163754 times.
✓ Branch 5 taken 62157 times.
|
381610 | if (a_avail && c_avail && (n != 3)) { |
446 | 163754 | int off = mb_pos; | |
447 |
2/2✓ Branch 0 taken 128389 times.
✓ Branch 1 taken 35365 times.
|
163754 | if (n != 1) |
448 | 128389 | off--; | |
449 |
2/2✓ Branch 0 taken 123403 times.
✓ Branch 1 taken 40351 times.
|
163754 | if (n != 2) |
450 | 123403 | off -= s->mb_stride; | |
451 | 163754 | q2 = FFABS(s->cur_pic.qscale_table[off]); | |
452 |
4/4✓ Branch 0 taken 163179 times.
✓ Branch 1 taken 575 times.
✓ Branch 2 taken 13767 times.
✓ Branch 3 taken 149412 times.
|
163754 | if (q2 && q2 != q1) |
453 | 13767 | b = (int)((unsigned)b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18; | |
454 | } | ||
455 | |||
456 |
6/6✓ Branch 0 taken 286987 times.
✓ Branch 1 taken 94623 times.
✓ Branch 2 taken 225911 times.
✓ Branch 3 taken 61076 times.
✓ Branch 4 taken 148792 times.
✓ Branch 5 taken 77119 times.
|
381610 | if (c_avail && (!a_avail || abs(a - b) <= abs(b - c))) { |
457 | 209868 | pred = c; | |
458 | 209868 | *dir_ptr = 1; // left | |
459 |
2/2✓ Branch 0 taken 118293 times.
✓ Branch 1 taken 53449 times.
|
171742 | } else if (a_avail) { |
460 | 118293 | pred = a; | |
461 | 118293 | *dir_ptr = 0; // top | |
462 | } else { | ||
463 | 53449 | pred = 0; | |
464 | 53449 | *dir_ptr = 1; // left | |
465 | } | ||
466 | |||
467 | /* update predictor */ | ||
468 | 381610 | *dc_val_ptr = &dc_val[0]; | |
469 | 381610 | return pred; | |
470 | } | ||
471 | |||
472 | /** @} */ // Block group | ||
473 | |||
474 | /** | ||
475 | * @name VC1 Macroblock-level functions in Simple/Main Profiles | ||
476 | * @see 7.1.4, p91 and 8.1.1.7, p(1)04 | ||
477 | * @{ | ||
478 | */ | ||
479 | |||
480 | 173312 | static inline int vc1_coded_block_pred(MpegEncContext * s, int n, | |
481 | uint8_t **coded_block_ptr) | ||
482 | { | ||
483 | int xy, wrap, pred, a, b, c; | ||
484 | |||
485 | 173312 | xy = s->block_index[n]; | |
486 | 173312 | wrap = s->b8_stride; | |
487 | |||
488 | /* B C | ||
489 | * A X | ||
490 | */ | ||
491 | 173312 | a = s->coded_block[xy - 1 ]; | |
492 | 173312 | b = s->coded_block[xy - 1 - wrap]; | |
493 | 173312 | c = s->coded_block[xy - wrap]; | |
494 | |||
495 |
2/2✓ Branch 0 taken 157230 times.
✓ Branch 1 taken 16082 times.
|
173312 | if (b == c) { |
496 | 157230 | pred = a; | |
497 | } else { | ||
498 | 16082 | pred = c; | |
499 | } | ||
500 | |||
501 | /* store value */ | ||
502 | 173312 | *coded_block_ptr = &s->coded_block[xy]; | |
503 | |||
504 | 173312 | return pred; | |
505 | } | ||
506 | |||
507 | /** | ||
508 | * Decode one AC coefficient | ||
509 | * @param v The VC1 context | ||
510 | * @param last Last coefficient | ||
511 | * @param skip How much zero coefficients to skip | ||
512 | * @param value Decoded AC coefficient value | ||
513 | * @param codingset set of VLC to decode data | ||
514 | * @see 8.1.3.4 | ||
515 | */ | ||
516 | 8423957 | static int vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, | |
517 | int *value, int codingset) | ||
518 | { | ||
519 | 8423957 | GetBitContext *gb = &v->s.gb; | |
520 | int index, run, level, lst, sign; | ||
521 | |||
522 | 8423957 | index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset], AC_VLC_BITS, 3); | |
523 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8423957 times.
|
8423957 | if (index < 0) |
524 | ✗ | return index; | |
525 |
2/2✓ Branch 0 taken 8351956 times.
✓ Branch 1 taken 72001 times.
|
8423957 | if (index != ff_vc1_ac_sizes[codingset] - 1) { |
526 | 8351956 | run = vc1_index_decode_table[codingset][index][0]; | |
527 | 8351956 | level = vc1_index_decode_table[codingset][index][1]; | |
528 |
4/4✓ Branch 0 taken 7029679 times.
✓ Branch 1 taken 1322277 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 7029676 times.
|
8351956 | lst = index >= vc1_last_decode_table[codingset] || get_bits_left(gb) < 0; |
529 | 8351956 | sign = get_bits1(gb); | |
530 | } else { | ||
531 | 72001 | int escape = decode210(gb); | |
532 |
2/2✓ Branch 0 taken 62172 times.
✓ Branch 1 taken 9829 times.
|
72001 | if (escape != 2) { |
533 | 62172 | index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset], AC_VLC_BITS, 3); | |
534 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 62172 times.
|
62172 | if (index >= ff_vc1_ac_sizes[codingset] - 1U) |
535 | ✗ | return AVERROR_INVALIDDATA; | |
536 | 62172 | run = vc1_index_decode_table[codingset][index][0]; | |
537 | 62172 | level = vc1_index_decode_table[codingset][index][1]; | |
538 | 62172 | lst = index >= vc1_last_decode_table[codingset]; | |
539 |
2/2✓ Branch 0 taken 31204 times.
✓ Branch 1 taken 30968 times.
|
62172 | if (escape == 0) { |
540 |
2/2✓ Branch 0 taken 12124 times.
✓ Branch 1 taken 19080 times.
|
31204 | if (lst) |
541 | 12124 | level += vc1_last_delta_level_table[codingset][run]; | |
542 | else | ||
543 | 19080 | level += vc1_delta_level_table[codingset][run]; | |
544 | } else { | ||
545 |
2/2✓ Branch 0 taken 11240 times.
✓ Branch 1 taken 19728 times.
|
30968 | if (lst) |
546 | 11240 | run += vc1_last_delta_run_table[codingset][level] + 1; | |
547 | else | ||
548 | 19728 | run += vc1_delta_run_table[codingset][level] + 1; | |
549 | } | ||
550 | 62172 | sign = get_bits1(gb); | |
551 | } else { | ||
552 | 9829 | lst = get_bits1(gb); | |
553 |
2/2✓ Branch 0 taken 389 times.
✓ Branch 1 taken 9440 times.
|
9829 | if (v->s.esc3_level_length == 0) { |
554 |
4/4✓ Branch 0 taken 65 times.
✓ Branch 1 taken 324 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 58 times.
|
389 | if (v->pq < 8 || v->dquantfrm) { // table 59 |
555 | 331 | v->s.esc3_level_length = get_bits(gb, 3); | |
556 |
2/2✓ Branch 0 taken 24 times.
✓ Branch 1 taken 307 times.
|
331 | if (!v->s.esc3_level_length) |
557 | 24 | v->s.esc3_level_length = get_bits(gb, 2) + 8; | |
558 | } else { // table 60 | ||
559 | 58 | v->s.esc3_level_length = get_unary(gb, 1, 6) + 2; | |
560 | } | ||
561 | 389 | v->s.esc3_run_length = 3 + get_bits(gb, 2); | |
562 | } | ||
563 | 9829 | run = get_bits(gb, v->s.esc3_run_length); | |
564 | 9829 | sign = get_bits1(gb); | |
565 | 9829 | level = get_bits(gb, v->s.esc3_level_length); | |
566 | } | ||
567 | } | ||
568 | |||
569 | 8423957 | *last = lst; | |
570 | 8423957 | *skip = run; | |
571 | 8423957 | *value = (level ^ -sign) + sign; | |
572 | |||
573 | 8423957 | return 0; | |
574 | } | ||
575 | |||
576 | /** Decode intra block in intra frames - should be faster than decode_intra_block | ||
577 | * @param v VC1Context | ||
578 | * @param block block to decode | ||
579 | * @param[in] n subblock index | ||
580 | * @param coded are AC coeffs present or not | ||
581 | * @param codingset set of VLC to decode data | ||
582 | */ | ||
583 | 114600 | static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, | |
584 | int coded, int codingset) | ||
585 | { | ||
586 | 114600 | GetBitContext *gb = &v->s.gb; | |
587 | 114600 | MpegEncContext *s = &v->s; | |
588 | 114600 | int dc_pred_dir = 0; /* Direction of the DC prediction used */ | |
589 | int i; | ||
590 | int16_t *dc_val; | ||
591 | int16_t *ac_val, *ac_val2; | ||
592 | int dcdiff, scale; | ||
593 | |||
594 | /* Get DC differential */ | ||
595 | 114600 | dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_vlc[s->dc_table_index][n >= 4], | |
596 | MSMP4_DC_VLC_BITS, 3); | ||
597 |
2/2✓ Branch 0 taken 84375 times.
✓ Branch 1 taken 30225 times.
|
114600 | if (dcdiff) { |
598 |
4/4✓ Branch 0 taken 70475 times.
✓ Branch 1 taken 13900 times.
✓ Branch 2 taken 17266 times.
✓ Branch 3 taken 53209 times.
|
84375 | const int m = (v->pq == 1 || v->pq == 2) ? 3 - v->pq : 0; |
599 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 84373 times.
|
84375 | if (dcdiff == 119 /* ESC index value */) { |
600 | 2 | dcdiff = get_bits(gb, 8 + m); | |
601 | } else { | ||
602 |
2/2✓ Branch 0 taken 31164 times.
✓ Branch 1 taken 53209 times.
|
84373 | if (m) |
603 | 31164 | dcdiff = (dcdiff << m) + get_bits(gb, m) - ((1 << m) - 1); | |
604 | } | ||
605 |
2/2✓ Branch 1 taken 43828 times.
✓ Branch 2 taken 40547 times.
|
84375 | if (get_bits1(gb)) |
606 | 43828 | dcdiff = -dcdiff; | |
607 | } | ||
608 | |||
609 | /* Prediction */ | ||
610 | 114600 | dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir); | |
611 | 114600 | *dc_val = dcdiff; | |
612 | |||
613 | /* Store the quantized DC coeff, used for prediction */ | ||
614 |
2/2✓ Branch 0 taken 76400 times.
✓ Branch 1 taken 38200 times.
|
114600 | if (n < 4) |
615 | 76400 | scale = s->y_dc_scale; | |
616 | else | ||
617 | 38200 | scale = s->c_dc_scale; | |
618 | 114600 | block[0] = dcdiff * scale; | |
619 | |||
620 | 114600 | ac_val = s->ac_val[0][s->block_index[n]]; | |
621 | 114600 | ac_val2 = ac_val; | |
622 |
2/2✓ Branch 0 taken 77612 times.
✓ Branch 1 taken 36988 times.
|
114600 | if (dc_pred_dir) // left |
623 | 77612 | ac_val -= 16; | |
624 | else // top | ||
625 | 36988 | ac_val -= 16 * s->block_wrap[n]; | |
626 | |||
627 | 114600 | scale = v->pq * 2 + v->halfpq; | |
628 | |||
629 | //AC Decoding | ||
630 | 114600 | i = !!coded; | |
631 | |||
632 |
2/2✓ Branch 0 taken 60031 times.
✓ Branch 1 taken 54569 times.
|
114600 | if (coded) { |
633 | 60031 | int last = 0, skip, value; | |
634 | const uint8_t *zz_table; | ||
635 | int k; | ||
636 | |||
637 |
2/2✓ Branch 0 taken 14906 times.
✓ Branch 1 taken 45125 times.
|
60031 | if (v->s.ac_pred) { |
638 |
2/2✓ Branch 0 taken 5075 times.
✓ Branch 1 taken 9831 times.
|
14906 | if (!dc_pred_dir) |
639 | 5075 | zz_table = v->zz_8x8[2]; | |
640 | else | ||
641 | 9831 | zz_table = v->zz_8x8[3]; | |
642 | } else | ||
643 | 45125 | zz_table = v->zz_8x8[1]; | |
644 | |||
645 |
2/2✓ Branch 0 taken 940300 times.
✓ Branch 1 taken 60031 times.
|
1000331 | while (!last) { |
646 | 940300 | int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); | |
647 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 940300 times.
|
940300 | if (ret < 0) |
648 | ✗ | return ret; | |
649 | 940300 | i += skip; | |
650 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 940300 times.
|
940300 | if (i > 63) |
651 | ✗ | break; | |
652 | 940300 | block[zz_table[i++]] = value; | |
653 | } | ||
654 | |||
655 | /* apply AC prediction if needed */ | ||
656 |
2/2✓ Branch 0 taken 14906 times.
✓ Branch 1 taken 45125 times.
|
60031 | if (s->ac_pred) { |
657 | int sh; | ||
658 |
2/2✓ Branch 0 taken 9831 times.
✓ Branch 1 taken 5075 times.
|
14906 | if (dc_pred_dir) { // left |
659 | 9831 | sh = v->left_blk_sh; | |
660 | } else { // top | ||
661 | 5075 | sh = v->top_blk_sh; | |
662 | 5075 | ac_val += 8; | |
663 | } | ||
664 |
2/2✓ Branch 0 taken 104342 times.
✓ Branch 1 taken 14906 times.
|
119248 | for (k = 1; k < 8; k++) |
665 | 104342 | block[k << sh] += ac_val[k]; | |
666 | } | ||
667 | /* save AC coeffs for further prediction */ | ||
668 |
2/2✓ Branch 0 taken 420217 times.
✓ Branch 1 taken 60031 times.
|
480248 | for (k = 1; k < 8; k++) { |
669 | 420217 | ac_val2[k] = block[k << v->left_blk_sh]; | |
670 | 420217 | ac_val2[k + 8] = block[k << v->top_blk_sh]; | |
671 | } | ||
672 | |||
673 | /* scale AC coeffs */ | ||
674 |
2/2✓ Branch 0 taken 3781953 times.
✓ Branch 1 taken 60031 times.
|
3841984 | for (k = 1; k < 64; k++) |
675 |
2/2✓ Branch 0 taken 939667 times.
✓ Branch 1 taken 2842286 times.
|
3781953 | if (block[k]) { |
676 | 939667 | block[k] *= scale; | |
677 |
2/2✓ Branch 0 taken 66540 times.
✓ Branch 1 taken 873127 times.
|
939667 | if (!v->pquantizer) |
678 |
2/2✓ Branch 0 taken 33090 times.
✓ Branch 1 taken 33450 times.
|
66540 | block[k] += (block[k] < 0) ? -v->pq : v->pq; |
679 | } | ||
680 | |||
681 | } else { | ||
682 | int k; | ||
683 | |||
684 | 54569 | memset(ac_val2, 0, 16 * 2); | |
685 | |||
686 | /* apply AC prediction if needed */ | ||
687 |
2/2✓ Branch 0 taken 4204 times.
✓ Branch 1 taken 50365 times.
|
54569 | if (s->ac_pred) { |
688 | int sh; | ||
689 |
2/2✓ Branch 0 taken 3180 times.
✓ Branch 1 taken 1024 times.
|
4204 | if (dc_pred_dir) { //left |
690 | 3180 | sh = v->left_blk_sh; | |
691 | } else { // top | ||
692 | 1024 | sh = v->top_blk_sh; | |
693 | 1024 | ac_val += 8; | |
694 | 1024 | ac_val2 += 8; | |
695 | } | ||
696 | 4204 | memcpy(ac_val2, ac_val, 8 * 2); | |
697 |
2/2✓ Branch 0 taken 29428 times.
✓ Branch 1 taken 4204 times.
|
33632 | for (k = 1; k < 8; k++) { |
698 | 29428 | block[k << sh] = ac_val[k] * scale; | |
699 |
4/4✓ Branch 0 taken 20286 times.
✓ Branch 1 taken 9142 times.
✓ Branch 2 taken 590 times.
✓ Branch 3 taken 19696 times.
|
29428 | if (!v->pquantizer && block[k << sh]) |
700 |
2/2✓ Branch 0 taken 267 times.
✓ Branch 1 taken 323 times.
|
590 | block[k << sh] += (block[k << sh] < 0) ? -v->pq : v->pq; |
701 | } | ||
702 | } | ||
703 | } | ||
704 |
2/2✓ Branch 0 taken 19110 times.
✓ Branch 1 taken 95490 times.
|
114600 | if (s->ac_pred) i = 63; |
705 | 114600 | s->block_last_index[n] = i; | |
706 | |||
707 | 114600 | return 0; | |
708 | } | ||
709 | |||
710 | /** Decode intra block in intra frames - should be faster than decode_intra_block | ||
711 | * @param v VC1Context | ||
712 | * @param block block to decode | ||
713 | * @param[in] n subblock number | ||
714 | * @param coded are AC coeffs present or not | ||
715 | * @param codingset set of VLC to decode data | ||
716 | * @param mquant quantizer value for this macroblock | ||
717 | */ | ||
718 | 145368 | static int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n, | |
719 | int coded, int codingset, int mquant) | ||
720 | { | ||
721 | 145368 | GetBitContext *gb = &v->s.gb; | |
722 | 145368 | MpegEncContext *s = &v->s; | |
723 | 145368 | int dc_pred_dir = 0; /* Direction of the DC prediction used */ | |
724 | int i; | ||
725 | 145368 | int16_t *dc_val = NULL; | |
726 | int16_t *ac_val, *ac_val2; | ||
727 | int dcdiff; | ||
728 | 145368 | int a_avail = v->a_avail, c_avail = v->c_avail; | |
729 | 145368 | int use_pred = s->ac_pred; | |
730 | int scale; | ||
731 | 145368 | int q1, q2 = 0; | |
732 | 145368 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
733 | 145368 | int quant = FFABS(mquant); | |
734 | |||
735 | /* Get DC differential */ | ||
736 | 145368 | dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_vlc[s->dc_table_index][n >= 4], | |
737 | MSMP4_DC_VLC_BITS, 3); | ||
738 |
2/2✓ Branch 0 taken 100398 times.
✓ Branch 1 taken 44970 times.
|
145368 | if (dcdiff) { |
739 |
4/4✓ Branch 0 taken 92074 times.
✓ Branch 1 taken 8324 times.
✓ Branch 2 taken 4766 times.
✓ Branch 3 taken 87308 times.
|
100398 | const int m = (quant == 1 || quant == 2) ? 3 - quant : 0; |
740 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 100396 times.
|
100398 | if (dcdiff == 119 /* ESC index value */) { |
741 | 2 | dcdiff = get_bits(gb, 8 + m); | |
742 | } else { | ||
743 |
2/2✓ Branch 0 taken 13090 times.
✓ Branch 1 taken 87306 times.
|
100396 | if (m) |
744 | 13090 | dcdiff = (dcdiff << m) + get_bits(gb, m) - ((1 << m) - 1); | |
745 | } | ||
746 |
2/2✓ Branch 1 taken 51735 times.
✓ Branch 2 taken 48663 times.
|
100398 | if (get_bits1(gb)) |
747 | 51735 | dcdiff = -dcdiff; | |
748 | } | ||
749 | |||
750 | /* Prediction */ | ||
751 | 145368 | dcdiff += ff_vc1_pred_dc(&v->s, v->overlap, quant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir); | |
752 | 145368 | *dc_val = dcdiff; | |
753 | |||
754 | /* Store the quantized DC coeff, used for prediction */ | ||
755 |
2/2✓ Branch 0 taken 96912 times.
✓ Branch 1 taken 48456 times.
|
145368 | if (n < 4) |
756 | 96912 | scale = s->y_dc_scale; | |
757 | else | ||
758 | 48456 | scale = s->c_dc_scale; | |
759 | 145368 | block[0] = dcdiff * scale; | |
760 | |||
761 | /* check if AC is needed at all */ | ||
762 |
4/4✓ Branch 0 taken 4656 times.
✓ Branch 1 taken 140712 times.
✓ Branch 2 taken 84 times.
✓ Branch 3 taken 4572 times.
|
145368 | if (!a_avail && !c_avail) |
763 | 84 | use_pred = 0; | |
764 | |||
765 |
2/2✓ Branch 0 taken 47448 times.
✓ Branch 1 taken 97920 times.
|
145368 | scale = quant * 2 + ((mquant < 0) ? 0 : v->halfpq); |
766 | |||
767 | 145368 | ac_val = s->ac_val[0][s->block_index[n]]; | |
768 | 145368 | ac_val2 = ac_val; | |
769 |
2/2✓ Branch 0 taken 96277 times.
✓ Branch 1 taken 49091 times.
|
145368 | if (dc_pred_dir) // left |
770 | 96277 | ac_val -= 16; | |
771 | else // top | ||
772 | 49091 | ac_val -= 16 * s->block_wrap[n]; | |
773 | |||
774 | 145368 | q1 = s->cur_pic.qscale_table[mb_pos]; | |
775 |
2/2✓ Branch 0 taken 24228 times.
✓ Branch 1 taken 121140 times.
|
145368 | if (n == 3) |
776 | 24228 | q2 = q1; | |
777 |
2/2✓ Branch 0 taken 81287 times.
✓ Branch 1 taken 39853 times.
|
121140 | else if (dc_pred_dir) { |
778 |
2/2✓ Branch 0 taken 16438 times.
✓ Branch 1 taken 64849 times.
|
81287 | if (n == 1) |
779 | 16438 | q2 = q1; | |
780 |
3/4✓ Branch 0 taken 64765 times.
✓ Branch 1 taken 84 times.
✓ Branch 2 taken 64765 times.
✗ Branch 3 not taken.
|
64849 | else if (c_avail && mb_pos) |
781 | 64765 | q2 = s->cur_pic.qscale_table[mb_pos - 1]; | |
782 | } else { | ||
783 |
2/2✓ Branch 0 taken 9816 times.
✓ Branch 1 taken 30037 times.
|
39853 | if (n == 2) |
784 | 9816 | q2 = q1; | |
785 |
2/4✓ Branch 0 taken 30037 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 30037 times.
✗ Branch 3 not taken.
|
30037 | else if (a_avail && mb_pos >= s->mb_stride) |
786 | 30037 | q2 = s->cur_pic.qscale_table[mb_pos - s->mb_stride]; | |
787 | } | ||
788 | |||
789 | //AC Decoding | ||
790 | 145368 | i = 1; | |
791 | |||
792 |
2/2✓ Branch 0 taken 131297 times.
✓ Branch 1 taken 14071 times.
|
145368 | if (coded) { |
793 | 131297 | int last = 0, skip, value; | |
794 | const uint8_t *zz_table; | ||
795 | int k; | ||
796 | |||
797 |
2/2✓ Branch 0 taken 32458 times.
✓ Branch 1 taken 98839 times.
|
131297 | if (v->s.ac_pred) { |
798 |
4/4✓ Branch 0 taken 24 times.
✓ Branch 1 taken 32434 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 18 times.
|
32458 | if (!use_pred && v->fcm == ILACE_FRAME) { |
799 | 6 | zz_table = v->zzi_8x8; | |
800 | } else { | ||
801 |
2/2✓ Branch 0 taken 11944 times.
✓ Branch 1 taken 20508 times.
|
32452 | if (!dc_pred_dir) // top |
802 | 11944 | zz_table = v->zz_8x8[2]; | |
803 | else // left | ||
804 | 20508 | zz_table = v->zz_8x8[3]; | |
805 | } | ||
806 | } else { | ||
807 |
2/2✓ Branch 0 taken 25079 times.
✓ Branch 1 taken 73760 times.
|
98839 | if (v->fcm != ILACE_FRAME) |
808 | 25079 | zz_table = v->zz_8x8[1]; | |
809 | else | ||
810 | 73760 | zz_table = v->zzi_8x8; | |
811 | } | ||
812 | |||
813 |
2/2✓ Branch 0 taken 1562576 times.
✓ Branch 1 taken 131297 times.
|
1693873 | while (!last) { |
814 | 1562576 | int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); | |
815 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1562576 times.
|
1562576 | if (ret < 0) |
816 | ✗ | return ret; | |
817 | 1562576 | i += skip; | |
818 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1562576 times.
|
1562576 | if (i > 63) |
819 | ✗ | break; | |
820 | 1562576 | block[zz_table[i++]] = value; | |
821 | } | ||
822 | |||
823 | /* apply AC prediction if needed */ | ||
824 |
2/2✓ Branch 0 taken 32434 times.
✓ Branch 1 taken 98863 times.
|
131297 | if (use_pred) { |
825 | int sh; | ||
826 |
2/2✓ Branch 0 taken 20490 times.
✓ Branch 1 taken 11944 times.
|
32434 | if (dc_pred_dir) { // left |
827 | 20490 | sh = v->left_blk_sh; | |
828 | } else { // top | ||
829 | 11944 | sh = v->top_blk_sh; | |
830 | 11944 | ac_val += 8; | |
831 | } | ||
832 | /* scale predictors if needed*/ | ||
833 |
2/2✓ Branch 0 taken 12022 times.
✓ Branch 1 taken 20412 times.
|
32434 | q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; |
834 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 32434 times.
|
32434 | if (q1 < 1) |
835 | ✗ | return AVERROR_INVALIDDATA; | |
836 |
1/2✓ Branch 0 taken 32434 times.
✗ Branch 1 not taken.
|
32434 | if (q2) |
837 |
2/2✓ Branch 0 taken 12022 times.
✓ Branch 1 taken 20412 times.
|
32434 | q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; |
838 |
3/4✓ Branch 0 taken 32434 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2034 times.
✓ Branch 3 taken 30400 times.
|
32434 | if (q2 && q1 != q2) { |
839 |
2/2✓ Branch 0 taken 14238 times.
✓ Branch 1 taken 2034 times.
|
16272 | for (k = 1; k < 8; k++) |
840 | 14238 | block[k << sh] += (int)(ac_val[k] * (unsigned)q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
841 | } else { | ||
842 |
2/2✓ Branch 0 taken 212800 times.
✓ Branch 1 taken 30400 times.
|
243200 | for (k = 1; k < 8; k++) |
843 | 212800 | block[k << sh] += ac_val[k]; | |
844 | } | ||
845 | } | ||
846 | /* save AC coeffs for further prediction */ | ||
847 |
2/2✓ Branch 0 taken 919079 times.
✓ Branch 1 taken 131297 times.
|
1050376 | for (k = 1; k < 8; k++) { |
848 | 919079 | ac_val2[k ] = block[k << v->left_blk_sh]; | |
849 | 919079 | ac_val2[k + 8] = block[k << v->top_blk_sh]; | |
850 | } | ||
851 | |||
852 | /* scale AC coeffs */ | ||
853 |
2/2✓ Branch 0 taken 8271711 times.
✓ Branch 1 taken 131297 times.
|
8403008 | for (k = 1; k < 64; k++) |
854 |
2/2✓ Branch 0 taken 1560534 times.
✓ Branch 1 taken 6711177 times.
|
8271711 | if (block[k]) { |
855 | 1560534 | block[k] *= scale; | |
856 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1560534 times.
|
1560534 | if (!v->pquantizer) |
857 | ✗ | block[k] += (block[k] < 0) ? -quant : quant; | |
858 | } | ||
859 | |||
860 | } else { // no AC coeffs | ||
861 | int k; | ||
862 | |||
863 | 14071 | memset(ac_val2, 0, 16 * 2); | |
864 | |||
865 | /* apply AC prediction if needed */ | ||
866 |
2/2✓ Branch 0 taken 3290 times.
✓ Branch 1 taken 10781 times.
|
14071 | if (use_pred) { |
867 | int sh; | ||
868 |
2/2✓ Branch 0 taken 2833 times.
✓ Branch 1 taken 457 times.
|
3290 | if (dc_pred_dir) { // left |
869 | 2833 | sh = v->left_blk_sh; | |
870 | } else { // top | ||
871 | 457 | sh = v->top_blk_sh; | |
872 | 457 | ac_val += 8; | |
873 | 457 | ac_val2 += 8; | |
874 | } | ||
875 | 3290 | memcpy(ac_val2, ac_val, 8 * 2); | |
876 |
2/2✓ Branch 0 taken 2564 times.
✓ Branch 1 taken 726 times.
|
3290 | q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; |
877 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3290 times.
|
3290 | if (q1 < 1) |
878 | ✗ | return AVERROR_INVALIDDATA; | |
879 |
1/2✓ Branch 0 taken 3290 times.
✗ Branch 1 not taken.
|
3290 | if (q2) |
880 |
2/2✓ Branch 0 taken 2564 times.
✓ Branch 1 taken 726 times.
|
3290 | q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; |
881 |
3/4✓ Branch 0 taken 3290 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 210 times.
✓ Branch 3 taken 3080 times.
|
3290 | if (q2 && q1 != q2) { |
882 |
2/2✓ Branch 0 taken 1470 times.
✓ Branch 1 taken 210 times.
|
1680 | for (k = 1; k < 8; k++) |
883 | 1470 | ac_val2[k] = (int)(ac_val2[k] * q2 * (unsigned)ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
884 | } | ||
885 |
2/2✓ Branch 0 taken 23030 times.
✓ Branch 1 taken 3290 times.
|
26320 | for (k = 1; k < 8; k++) { |
886 | 23030 | block[k << sh] = ac_val2[k] * scale; | |
887 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 23030 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
23030 | if (!v->pquantizer && block[k << sh]) |
888 | ✗ | block[k << sh] += (block[k << sh] < 0) ? -quant : quant; | |
889 | } | ||
890 | } | ||
891 | } | ||
892 |
2/2✓ Branch 0 taken 35724 times.
✓ Branch 1 taken 109644 times.
|
145368 | if (use_pred) i = 63; |
893 | 145368 | s->block_last_index[n] = i; | |
894 | |||
895 | 145368 | return 0; | |
896 | } | ||
897 | |||
898 | /** Decode intra block in inter frames - more generic version than vc1_decode_i_block | ||
899 | * @param v VC1Context | ||
900 | * @param block block to decode | ||
901 | * @param[in] n subblock index | ||
902 | * @param coded are AC coeffs present or not | ||
903 | * @param mquant block quantizer | ||
904 | * @param codingset set of VLC to decode data | ||
905 | */ | ||
906 | 236242 | static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n, | |
907 | int coded, int mquant, int codingset) | ||
908 | { | ||
909 | 236242 | GetBitContext *gb = &v->s.gb; | |
910 | 236242 | MpegEncContext *s = &v->s; | |
911 | 236242 | int dc_pred_dir = 0; /* Direction of the DC prediction used */ | |
912 | int i; | ||
913 | 236242 | int16_t *dc_val = NULL; | |
914 | int16_t *ac_val, *ac_val2; | ||
915 | int dcdiff; | ||
916 | 236242 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
917 | 236242 | int a_avail = v->a_avail, c_avail = v->c_avail; | |
918 | 236242 | int use_pred = s->ac_pred; | |
919 | int scale; | ||
920 | 236242 | int q1, q2 = 0; | |
921 | 236242 | int quant = FFABS(mquant); | |
922 | |||
923 | 236242 | s->bdsp.clear_block(block); | |
924 | |||
925 | /* XXX: Guard against dumb values of mquant */ | ||
926 | 236242 | quant = av_clip_uintp2(quant, 5); | |
927 | |||
928 | /* Set DC scale - y and c use the same */ | ||
929 | 236242 | s->y_dc_scale = s->y_dc_scale_table[quant]; | |
930 | 236242 | s->c_dc_scale = s->c_dc_scale_table[quant]; | |
931 | |||
932 | /* Get DC differential */ | ||
933 | 236242 | dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_vlc[s->dc_table_index][n >= 4], | |
934 | MSMP4_DC_VLC_BITS, 3); | ||
935 |
2/2✓ Branch 0 taken 190507 times.
✓ Branch 1 taken 45735 times.
|
236242 | if (dcdiff) { |
936 |
3/4✓ Branch 0 taken 190507 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18284 times.
✓ Branch 3 taken 172223 times.
|
190507 | const int m = (quant == 1 || quant == 2) ? 3 - quant : 0; |
937 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 190504 times.
|
190507 | if (dcdiff == 119 /* ESC index value */) { |
938 | 3 | dcdiff = get_bits(gb, 8 + m); | |
939 | } else { | ||
940 |
2/2✓ Branch 0 taken 18284 times.
✓ Branch 1 taken 172220 times.
|
190504 | if (m) |
941 | 18284 | dcdiff = (dcdiff << m) + get_bits(gb, m) - ((1 << m) - 1); | |
942 | } | ||
943 |
2/2✓ Branch 1 taken 106640 times.
✓ Branch 2 taken 83867 times.
|
190507 | if (get_bits1(gb)) |
944 | 106640 | dcdiff = -dcdiff; | |
945 | } | ||
946 | |||
947 | /* Prediction */ | ||
948 | 236242 | dcdiff += ff_vc1_pred_dc(&v->s, v->overlap, quant, n, a_avail, c_avail, &dc_val, &dc_pred_dir); | |
949 | 236242 | *dc_val = dcdiff; | |
950 | |||
951 | /* Store the quantized DC coeff, used for prediction */ | ||
952 | |||
953 |
2/2✓ Branch 0 taken 159392 times.
✓ Branch 1 taken 76850 times.
|
236242 | if (n < 4) { |
954 | 159392 | block[0] = dcdiff * s->y_dc_scale; | |
955 | } else { | ||
956 | 76850 | block[0] = dcdiff * s->c_dc_scale; | |
957 | } | ||
958 | |||
959 | //AC Decoding | ||
960 | 236242 | i = 1; | |
961 | |||
962 | /* check if AC is needed at all and adjust direction if needed */ | ||
963 |
2/2✓ Branch 0 taken 109869 times.
✓ Branch 1 taken 126373 times.
|
236242 | if (!a_avail) dc_pred_dir = 1; |
964 |
2/2✓ Branch 0 taken 93175 times.
✓ Branch 1 taken 143067 times.
|
236242 | if (!c_avail) dc_pred_dir = 0; |
965 |
4/4✓ Branch 0 taken 109869 times.
✓ Branch 1 taken 126373 times.
✓ Branch 2 taken 53365 times.
✓ Branch 3 taken 56504 times.
|
236242 | if (!a_avail && !c_avail) use_pred = 0; |
966 | 236242 | ac_val = s->ac_val[0][s->block_index[n]]; | |
967 | 236242 | ac_val2 = ac_val; | |
968 | |||
969 |
2/2✓ Branch 0 taken 232678 times.
✓ Branch 1 taken 3564 times.
|
236242 | scale = quant * 2 + ((mquant < 0) ? 0 : v->halfpq); |
970 | |||
971 |
2/2✓ Branch 0 taken 113675 times.
✓ Branch 1 taken 122567 times.
|
236242 | if (dc_pred_dir) //left |
972 | 113675 | ac_val -= 16; | |
973 | else //top | ||
974 | 122567 | ac_val -= 16 * s->block_wrap[n]; | |
975 | |||
976 | 236242 | q1 = s->cur_pic.qscale_table[mb_pos]; | |
977 |
5/6✓ Branch 0 taken 113675 times.
✓ Branch 1 taken 122567 times.
✓ Branch 2 taken 113675 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 113596 times.
✓ Branch 5 taken 79 times.
|
236242 | if (dc_pred_dir && c_avail && mb_pos) |
978 | 113596 | q2 = s->cur_pic.qscale_table[mb_pos - 1]; | |
979 |
6/6✓ Branch 0 taken 122567 times.
✓ Branch 1 taken 113675 times.
✓ Branch 2 taken 69202 times.
✓ Branch 3 taken 53365 times.
✓ Branch 4 taken 67664 times.
✓ Branch 5 taken 1538 times.
|
236242 | if (!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) |
980 | 67664 | q2 = s->cur_pic.qscale_table[mb_pos - s->mb_stride]; | |
981 |
4/4✓ Branch 0 taken 113675 times.
✓ Branch 1 taken 122567 times.
✓ Branch 2 taken 34090 times.
✓ Branch 3 taken 79585 times.
|
236242 | if (dc_pred_dir && n == 1) |
982 | 34090 | q2 = q1; | |
983 |
4/4✓ Branch 0 taken 122567 times.
✓ Branch 1 taken 113675 times.
✓ Branch 2 taken 28445 times.
✓ Branch 3 taken 94122 times.
|
236242 | if (!dc_pred_dir && n == 2) |
984 | 28445 | q2 = q1; | |
985 |
2/2✓ Branch 0 taken 39896 times.
✓ Branch 1 taken 196346 times.
|
236242 | if (n == 3) q2 = q1; |
986 | |||
987 |
2/2✓ Branch 0 taken 163776 times.
✓ Branch 1 taken 72466 times.
|
236242 | if (coded) { |
988 | 163776 | int last = 0, skip, value; | |
989 | int k; | ||
990 | |||
991 |
2/2✓ Branch 0 taken 1543069 times.
✓ Branch 1 taken 163774 times.
|
1706843 | while (!last) { |
992 | 1543069 | int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); | |
993 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1543069 times.
|
1543069 | if (ret < 0) |
994 | ✗ | return ret; | |
995 | 1543069 | i += skip; | |
996 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1543067 times.
|
1543069 | if (i > 63) |
997 | 2 | break; | |
998 |
2/2✓ Branch 0 taken 925417 times.
✓ Branch 1 taken 617650 times.
|
1543067 | if (v->fcm == PROGRESSIVE) |
999 | 925417 | block[v->zz_8x8[0][i++]] = value; | |
1000 | else { | ||
1001 |
4/4✓ Branch 0 taken 191926 times.
✓ Branch 1 taken 425724 times.
✓ Branch 2 taken 19188 times.
✓ Branch 3 taken 172738 times.
|
617650 | if (use_pred && (v->fcm == ILACE_FRAME)) { |
1002 |
2/2✓ Branch 0 taken 8623 times.
✓ Branch 1 taken 10565 times.
|
19188 | if (!dc_pred_dir) // top |
1003 | 8623 | block[v->zz_8x8[2][i++]] = value; | |
1004 | else // left | ||
1005 | 10565 | block[v->zz_8x8[3][i++]] = value; | |
1006 | } else { | ||
1007 | 598462 | block[v->zzi_8x8[i++]] = value; | |
1008 | } | ||
1009 | } | ||
1010 | } | ||
1011 | |||
1012 | /* apply AC prediction if needed */ | ||
1013 |
2/2✓ Branch 0 taken 43023 times.
✓ Branch 1 taken 120753 times.
|
163776 | if (use_pred) { |
1014 | /* scale predictors if needed*/ | ||
1015 |
2/2✓ Branch 0 taken 42128 times.
✓ Branch 1 taken 895 times.
|
43023 | q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; |
1016 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 43023 times.
|
43023 | if (q1 < 1) |
1017 | ✗ | return AVERROR_INVALIDDATA; | |
1018 |
1/2✓ Branch 0 taken 43023 times.
✗ Branch 1 not taken.
|
43023 | if (q2) |
1019 |
2/2✓ Branch 0 taken 42018 times.
✓ Branch 1 taken 1005 times.
|
43023 | q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; |
1020 |
3/4✓ Branch 0 taken 43023 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 354 times.
✓ Branch 3 taken 42669 times.
|
43023 | if (q2 && q1 != q2) { |
1021 |
2/2✓ Branch 0 taken 235 times.
✓ Branch 1 taken 119 times.
|
354 | if (dc_pred_dir) { // left |
1022 |
2/2✓ Branch 0 taken 1645 times.
✓ Branch 1 taken 235 times.
|
1880 | for (k = 1; k < 8; k++) |
1023 | 1645 | block[k << v->left_blk_sh] += (int)(ac_val[k] * q2 * (unsigned)ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
1024 | } else { //top | ||
1025 |
2/2✓ Branch 0 taken 833 times.
✓ Branch 1 taken 119 times.
|
952 | for (k = 1; k < 8; k++) |
1026 | 833 | block[k << v->top_blk_sh] += (int)(ac_val[k + 8] * q2 * (unsigned)ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
1027 | } | ||
1028 | } else { | ||
1029 |
2/2✓ Branch 0 taken 25655 times.
✓ Branch 1 taken 17014 times.
|
42669 | if (dc_pred_dir) { // left |
1030 |
2/2✓ Branch 0 taken 179585 times.
✓ Branch 1 taken 25655 times.
|
205240 | for (k = 1; k < 8; k++) |
1031 | 179585 | block[k << v->left_blk_sh] += ac_val[k]; | |
1032 | } else { // top | ||
1033 |
2/2✓ Branch 0 taken 119098 times.
✓ Branch 1 taken 17014 times.
|
136112 | for (k = 1; k < 8; k++) |
1034 | 119098 | block[k << v->top_blk_sh] += ac_val[k + 8]; | |
1035 | } | ||
1036 | } | ||
1037 | } | ||
1038 | /* save AC coeffs for further prediction */ | ||
1039 |
2/2✓ Branch 0 taken 1146432 times.
✓ Branch 1 taken 163776 times.
|
1310208 | for (k = 1; k < 8; k++) { |
1040 | 1146432 | ac_val2[k ] = block[k << v->left_blk_sh]; | |
1041 | 1146432 | ac_val2[k + 8] = block[k << v->top_blk_sh]; | |
1042 | } | ||
1043 | |||
1044 | /* scale AC coeffs */ | ||
1045 |
2/2✓ Branch 0 taken 10317888 times.
✓ Branch 1 taken 163776 times.
|
10481664 | for (k = 1; k < 64; k++) |
1046 |
2/2✓ Branch 0 taken 1546034 times.
✓ Branch 1 taken 8771854 times.
|
10317888 | if (block[k]) { |
1047 | 1546034 | block[k] *= scale; | |
1048 |
2/2✓ Branch 0 taken 28424 times.
✓ Branch 1 taken 1517610 times.
|
1546034 | if (!v->pquantizer) |
1049 |
2/2✓ Branch 0 taken 14356 times.
✓ Branch 1 taken 14068 times.
|
28424 | block[k] += (block[k] < 0) ? -quant : quant; |
1050 | } | ||
1051 | |||
1052 |
2/2✓ Branch 0 taken 43023 times.
✓ Branch 1 taken 120753 times.
|
163776 | if (use_pred) i = 63; |
1053 | } else { // no AC coeffs | ||
1054 | int k; | ||
1055 | |||
1056 | 72466 | memset(ac_val2, 0, 16 * 2); | |
1057 |
2/2✓ Branch 0 taken 34095 times.
✓ Branch 1 taken 38371 times.
|
72466 | if (dc_pred_dir) { // left |
1058 |
2/2✓ Branch 0 taken 6724 times.
✓ Branch 1 taken 27371 times.
|
34095 | if (use_pred) { |
1059 | 6724 | memcpy(ac_val2, ac_val, 8 * 2); | |
1060 |
2/2✓ Branch 0 taken 5988 times.
✓ Branch 1 taken 736 times.
|
6724 | q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; |
1061 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6724 times.
|
6724 | if (q1 < 1) |
1062 | ✗ | return AVERROR_INVALIDDATA; | |
1063 |
1/2✓ Branch 0 taken 6724 times.
✗ Branch 1 not taken.
|
6724 | if (q2) |
1064 |
2/2✓ Branch 0 taken 5988 times.
✓ Branch 1 taken 736 times.
|
6724 | q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; |
1065 |
3/4✓ Branch 0 taken 6724 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 32 times.
✓ Branch 3 taken 6692 times.
|
6724 | if (q2 && q1 != q2) { |
1066 |
2/2✓ Branch 0 taken 224 times.
✓ Branch 1 taken 32 times.
|
256 | for (k = 1; k < 8; k++) |
1067 | 224 | ac_val2[k] = (int)(ac_val2[k] * (unsigned)q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
1068 | } | ||
1069 | } | ||
1070 | } else { // top | ||
1071 |
2/2✓ Branch 0 taken 2674 times.
✓ Branch 1 taken 35697 times.
|
38371 | if (use_pred) { |
1072 | 2674 | memcpy(ac_val2 + 8, ac_val + 8, 8 * 2); | |
1073 |
2/2✓ Branch 0 taken 2580 times.
✓ Branch 1 taken 94 times.
|
2674 | q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; |
1074 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2674 times.
|
2674 | if (q1 < 1) |
1075 | ✗ | return AVERROR_INVALIDDATA; | |
1076 |
1/2✓ Branch 0 taken 2674 times.
✗ Branch 1 not taken.
|
2674 | if (q2) |
1077 |
2/2✓ Branch 0 taken 2581 times.
✓ Branch 1 taken 93 times.
|
2674 | q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; |
1078 |
3/4✓ Branch 0 taken 2674 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 13 times.
✓ Branch 3 taken 2661 times.
|
2674 | if (q2 && q1 != q2) { |
1079 |
2/2✓ Branch 0 taken 91 times.
✓ Branch 1 taken 13 times.
|
104 | for (k = 1; k < 8; k++) |
1080 | 91 | ac_val2[k + 8] = (int)(ac_val2[k + 8] * (unsigned)q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
1081 | } | ||
1082 | } | ||
1083 | } | ||
1084 | |||
1085 | /* apply AC prediction if needed */ | ||
1086 |
2/2✓ Branch 0 taken 9398 times.
✓ Branch 1 taken 63068 times.
|
72466 | if (use_pred) { |
1087 |
2/2✓ Branch 0 taken 6724 times.
✓ Branch 1 taken 2674 times.
|
9398 | if (dc_pred_dir) { // left |
1088 |
2/2✓ Branch 0 taken 47068 times.
✓ Branch 1 taken 6724 times.
|
53792 | for (k = 1; k < 8; k++) { |
1089 | 47068 | block[k << v->left_blk_sh] = ac_val2[k] * scale; | |
1090 |
4/4✓ Branch 0 taken 5341 times.
✓ Branch 1 taken 41727 times.
✓ Branch 2 taken 127 times.
✓ Branch 3 taken 5214 times.
|
47068 | if (!v->pquantizer && block[k << v->left_blk_sh]) |
1091 |
2/2✓ Branch 0 taken 42 times.
✓ Branch 1 taken 85 times.
|
127 | block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -quant : quant; |
1092 | } | ||
1093 | } else { // top | ||
1094 |
2/2✓ Branch 0 taken 18718 times.
✓ Branch 1 taken 2674 times.
|
21392 | for (k = 1; k < 8; k++) { |
1095 | 18718 | block[k << v->top_blk_sh] = ac_val2[k + 8] * scale; | |
1096 |
4/4✓ Branch 0 taken 3493 times.
✓ Branch 1 taken 15225 times.
✓ Branch 2 taken 129 times.
✓ Branch 3 taken 3364 times.
|
18718 | if (!v->pquantizer && block[k << v->top_blk_sh]) |
1097 |
2/2✓ Branch 0 taken 48 times.
✓ Branch 1 taken 81 times.
|
129 | block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -quant : quant; |
1098 | } | ||
1099 | } | ||
1100 | 9398 | i = 63; | |
1101 | } | ||
1102 | } | ||
1103 | 236242 | s->block_last_index[n] = i; | |
1104 | |||
1105 | 236242 | return 0; | |
1106 | } | ||
1107 | |||
1108 | /** Decode P block | ||
1109 | */ | ||
1110 | 705481 | static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n, | |
1111 | int mquant, int ttmb, int first_block, | ||
1112 | uint8_t *dst, int linesize, int skip_block, | ||
1113 | int *ttmb_out) | ||
1114 | { | ||
1115 | 705481 | MpegEncContext *s = &v->s; | |
1116 | 705481 | GetBitContext *gb = &s->gb; | |
1117 | int i, j; | ||
1118 | 705481 | int subblkpat = 0; | |
1119 | int scale, off, idx, last, skip, value; | ||
1120 | 705481 | int ttblk = ttmb & 7; | |
1121 | 705481 | int pat = 0; | |
1122 | 705481 | int quant = FFABS(mquant); | |
1123 | |||
1124 | 705481 | s->bdsp.clear_block(block); | |
1125 | |||
1126 |
2/2✓ Branch 0 taken 328239 times.
✓ Branch 1 taken 377242 times.
|
705481 | if (ttmb == -1) { |
1127 | 328239 | ttblk = ff_vc1_ttblk_to_tt[v->tt_index][get_vlc2(gb, ff_vc1_ttblk_vlc[v->tt_index], VC1_TTBLK_VLC_BITS, 1)]; | |
1128 | } | ||
1129 |
2/2✓ Branch 0 taken 78333 times.
✓ Branch 1 taken 627148 times.
|
705481 | if (ttblk == TT_4X4) { |
1130 | 78333 | subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index], VC1_SUBBLKPAT_VLC_BITS, 1) + 1); | |
1131 | } | ||
1132 |
4/4✓ Branch 0 taken 352415 times.
✓ Branch 1 taken 353066 times.
✓ Branch 2 taken 274082 times.
✓ Branch 3 taken 78333 times.
|
705481 | if ((ttblk != TT_8X8 && ttblk != TT_4X4) |
1133 |
8/8✓ Branch 0 taken 274062 times.
✓ Branch 1 taken 20 times.
✓ Branch 2 taken 108094 times.
✓ Branch 3 taken 165968 times.
✓ Branch 4 taken 43444 times.
✓ Branch 5 taken 64650 times.
✓ Branch 6 taken 12667 times.
✓ Branch 7 taken 30777 times.
|
274082 | && ((v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block)) |
1134 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 243285 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
243285 | || (!v->res_rtm_flag && !first_block))) { |
1135 | 30797 | subblkpat = decode012(gb); | |
1136 |
2/2✓ Branch 0 taken 11209 times.
✓ Branch 1 taken 19588 times.
|
30797 | if (subblkpat) |
1137 | 11209 | subblkpat ^= 3; // swap decoded pattern bits | |
1138 |
4/4✓ Branch 0 taken 27940 times.
✓ Branch 1 taken 2857 times.
✓ Branch 2 taken 2882 times.
✓ Branch 3 taken 25058 times.
|
30797 | if (ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) |
1139 | 5739 | ttblk = TT_8X4; | |
1140 |
4/4✓ Branch 0 taken 28554 times.
✓ Branch 1 taken 2243 times.
✓ Branch 2 taken 1746 times.
✓ Branch 3 taken 26808 times.
|
30797 | if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) |
1141 | 3989 | ttblk = TT_4X8; | |
1142 | } | ||
1143 |
2/2✓ Branch 0 taken 675330 times.
✓ Branch 1 taken 30151 times.
|
705481 | scale = quant * 2 + ((mquant < 0) ? 0 : v->halfpq); |
1144 | |||
1145 | // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT | ||
1146 |
4/4✓ Branch 0 taken 686634 times.
✓ Branch 1 taken 18847 times.
✓ Branch 2 taken 20159 times.
✓ Branch 3 taken 666475 times.
|
705481 | if (ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) { |
1147 |
2/2✓ Branch 0 taken 18847 times.
✓ Branch 1 taken 20159 times.
|
39006 | subblkpat = 2 - (ttblk == TT_8X4_TOP); |
1148 | 39006 | ttblk = TT_8X4; | |
1149 | } | ||
1150 |
4/4✓ Branch 0 taken 681363 times.
✓ Branch 1 taken 24118 times.
✓ Branch 2 taken 23560 times.
✓ Branch 3 taken 657803 times.
|
705481 | if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) { |
1151 |
2/2✓ Branch 0 taken 23560 times.
✓ Branch 1 taken 24118 times.
|
47678 | subblkpat = 2 - (ttblk == TT_4X8_LEFT); |
1152 | 47678 | ttblk = TT_4X8; | |
1153 | } | ||
1154 |
4/5✓ Branch 0 taken 353066 times.
✓ Branch 1 taken 78333 times.
✓ Branch 2 taken 134484 times.
✓ Branch 3 taken 139598 times.
✗ Branch 4 not taken.
|
705481 | switch (ttblk) { |
1155 | 353066 | case TT_8X8: | |
1156 | 353066 | pat = 0xF; | |
1157 | 353066 | i = 0; | |
1158 | 353066 | last = 0; | |
1159 |
2/2✓ Branch 0 taken 2080609 times.
✓ Branch 1 taken 353066 times.
|
2433675 | while (!last) { |
1160 | 2080609 | int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
1161 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2080609 times.
|
2080609 | if (ret < 0) |
1162 | ✗ | return ret; | |
1163 | 2080609 | i += skip; | |
1164 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2080609 times.
|
2080609 | if (i > 63) |
1165 | ✗ | break; | |
1166 |
2/2✓ Branch 0 taken 934770 times.
✓ Branch 1 taken 1145839 times.
|
2080609 | if (!v->fcm) |
1167 | 934770 | idx = v->zz_8x8[0][i++]; | |
1168 | else | ||
1169 | 1145839 | idx = v->zzi_8x8[i++]; | |
1170 | 2080609 | block[idx] = value * scale; | |
1171 |
2/2✓ Branch 0 taken 201139 times.
✓ Branch 1 taken 1879470 times.
|
2080609 | if (!v->pquantizer) |
1172 |
2/2✓ Branch 0 taken 100867 times.
✓ Branch 1 taken 100272 times.
|
201139 | block[idx] += (block[idx] < 0) ? -quant : quant; |
1173 | } | ||
1174 |
1/2✓ Branch 0 taken 353066 times.
✗ Branch 1 not taken.
|
353066 | if (!skip_block) { |
1175 |
2/2✓ Branch 0 taken 48601 times.
✓ Branch 1 taken 304465 times.
|
353066 | if (i == 1) |
1176 | 48601 | v->vc1dsp.vc1_inv_trans_8x8_dc(dst, linesize, block); | |
1177 | else { | ||
1178 | 304465 | v->vc1dsp.vc1_inv_trans_8x8(block); | |
1179 | 304465 | s->idsp.add_pixels_clamped(block, dst, linesize); | |
1180 | } | ||
1181 | } | ||
1182 | 353066 | break; | |
1183 | 78333 | case TT_4X4: | |
1184 | 78333 | pat = ~subblkpat & 0xF; | |
1185 |
2/2✓ Branch 0 taken 313332 times.
✓ Branch 1 taken 78333 times.
|
391665 | for (j = 0; j < 4; j++) { |
1186 | 313332 | last = subblkpat & (1 << (3 - j)); | |
1187 | 313332 | i = 0; | |
1188 | 313332 | off = (j & 1) * 4 + (j & 2) * 16; | |
1189 |
2/2✓ Branch 0 taken 512755 times.
✓ Branch 1 taken 313332 times.
|
826087 | while (!last) { |
1190 | 512755 | int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
1191 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 512755 times.
|
512755 | if (ret < 0) |
1192 | ✗ | return ret; | |
1193 | 512755 | i += skip; | |
1194 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 512755 times.
|
512755 | if (i > 15) |
1195 | ✗ | break; | |
1196 |
2/2✓ Branch 0 taken 283472 times.
✓ Branch 1 taken 229283 times.
|
512755 | if (!v->fcm) |
1197 | 283472 | idx = ff_vc1_simple_progressive_4x4_zz[i++]; | |
1198 | else | ||
1199 | 229283 | idx = ff_vc1_adv_interlaced_4x4_zz[i++]; | |
1200 | 512755 | block[idx + off] = value * scale; | |
1201 |
2/2✓ Branch 0 taken 9718 times.
✓ Branch 1 taken 503037 times.
|
512755 | if (!v->pquantizer) |
1202 |
2/2✓ Branch 0 taken 4862 times.
✓ Branch 1 taken 4856 times.
|
9718 | block[idx + off] += (block[idx + off] < 0) ? -quant : quant; |
1203 | } | ||
1204 |
3/4✓ Branch 0 taken 191401 times.
✓ Branch 1 taken 121931 times.
✓ Branch 2 taken 191401 times.
✗ Branch 3 not taken.
|
313332 | if (!(subblkpat & (1 << (3 - j))) && !skip_block) { |
1205 |
2/2✓ Branch 0 taken 21249 times.
✓ Branch 1 taken 170152 times.
|
191401 | if (i == 1) |
1206 | 21249 | v->vc1dsp.vc1_inv_trans_4x4_dc(dst + (j & 1) * 4 + (j & 2) * 2 * linesize, linesize, block + off); | |
1207 | else | ||
1208 | 170152 | v->vc1dsp.vc1_inv_trans_4x4(dst + (j & 1) * 4 + (j & 2) * 2 * linesize, linesize, block + off); | |
1209 | } | ||
1210 | } | ||
1211 | 78333 | break; | |
1212 | 134484 | case TT_8X4: | |
1213 | 134484 | pat = ~((subblkpat & 2) * 6 + (subblkpat & 1) * 3) & 0xF; | |
1214 |
2/2✓ Branch 0 taken 268968 times.
✓ Branch 1 taken 134484 times.
|
403452 | for (j = 0; j < 2; j++) { |
1215 | 268968 | last = subblkpat & (1 << (1 - j)); | |
1216 | 268968 | i = 0; | |
1217 | 268968 | off = j * 32; | |
1218 |
2/2✓ Branch 0 taken 902639 times.
✓ Branch 1 taken 268968 times.
|
1171607 | while (!last) { |
1219 | 902639 | int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
1220 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 902639 times.
|
902639 | if (ret < 0) |
1221 | ✗ | return ret; | |
1222 | 902639 | i += skip; | |
1223 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 902639 times.
|
902639 | if (i > 31) |
1224 | ✗ | break; | |
1225 |
2/2✓ Branch 0 taken 470573 times.
✓ Branch 1 taken 432066 times.
|
902639 | if (!v->fcm) |
1226 | 470573 | idx = v->zz_8x4[i++] + off; | |
1227 | else | ||
1228 | 432066 | idx = ff_vc1_adv_interlaced_8x4_zz[i++] + off; | |
1229 | 902639 | block[idx] = value * scale; | |
1230 |
2/2✓ Branch 0 taken 9538 times.
✓ Branch 1 taken 893101 times.
|
902639 | if (!v->pquantizer) |
1231 |
2/2✓ Branch 0 taken 4864 times.
✓ Branch 1 taken 4674 times.
|
9538 | block[idx] += (block[idx] < 0) ? -quant : quant; |
1232 | } | ||
1233 |
3/4✓ Branch 0 taken 223232 times.
✓ Branch 1 taken 45736 times.
✓ Branch 2 taken 223232 times.
✗ Branch 3 not taken.
|
268968 | if (!(subblkpat & (1 << (1 - j))) && !skip_block) { |
1234 |
2/2✓ Branch 0 taken 15847 times.
✓ Branch 1 taken 207385 times.
|
223232 | if (i == 1) |
1235 | 15847 | v->vc1dsp.vc1_inv_trans_8x4_dc(dst + j * 4 * linesize, linesize, block + off); | |
1236 | else | ||
1237 | 207385 | v->vc1dsp.vc1_inv_trans_8x4(dst + j * 4 * linesize, linesize, block + off); | |
1238 | } | ||
1239 | } | ||
1240 | 134484 | break; | |
1241 | 139598 | case TT_4X8: | |
1242 | 139598 | pat = ~(subblkpat * 5) & 0xF; | |
1243 |
2/2✓ Branch 0 taken 279196 times.
✓ Branch 1 taken 139598 times.
|
418794 | for (j = 0; j < 2; j++) { |
1244 | 279196 | last = subblkpat & (1 << (1 - j)); | |
1245 | 279196 | i = 0; | |
1246 | 279196 | off = j * 4; | |
1247 |
2/2✓ Branch 0 taken 882009 times.
✓ Branch 1 taken 279190 times.
|
1161199 | while (!last) { |
1248 | 882009 | int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
1249 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 882009 times.
|
882009 | if (ret < 0) |
1250 | ✗ | return ret; | |
1251 | 882009 | i += skip; | |
1252 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 882003 times.
|
882009 | if (i > 31) |
1253 | 6 | break; | |
1254 |
2/2✓ Branch 0 taken 432119 times.
✓ Branch 1 taken 449884 times.
|
882003 | if (!v->fcm) |
1255 | 432119 | idx = v->zz_4x8[i++] + off; | |
1256 | else | ||
1257 | 449884 | idx = ff_vc1_adv_interlaced_4x8_zz[i++] + off; | |
1258 | 882003 | block[idx] = value * scale; | |
1259 |
2/2✓ Branch 0 taken 10845 times.
✓ Branch 1 taken 871158 times.
|
882003 | if (!v->pquantizer) |
1260 |
2/2✓ Branch 0 taken 5474 times.
✓ Branch 1 taken 5371 times.
|
10845 | block[idx] += (block[idx] < 0) ? -quant : quant; |
1261 | } | ||
1262 |
3/4✓ Branch 0 taken 227039 times.
✓ Branch 1 taken 52157 times.
✓ Branch 2 taken 227039 times.
✗ Branch 3 not taken.
|
279196 | if (!(subblkpat & (1 << (1 - j))) && !skip_block) { |
1263 |
2/2✓ Branch 0 taken 17934 times.
✓ Branch 1 taken 209105 times.
|
227039 | if (i == 1) |
1264 | 17934 | v->vc1dsp.vc1_inv_trans_4x8_dc(dst + j * 4, linesize, block + off); | |
1265 | else | ||
1266 | 209105 | v->vc1dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off); | |
1267 | } | ||
1268 | } | ||
1269 | 139598 | break; | |
1270 | } | ||
1271 |
2/2✓ Branch 0 taken 648016 times.
✓ Branch 1 taken 57465 times.
|
705481 | if (ttmb_out) |
1272 | 648016 | *ttmb_out |= ttblk << (n * 4); | |
1273 | 705481 | return pat; | |
1274 | } | ||
1275 | |||
1276 | /** @} */ // Macroblock group | ||
1277 | |||
1278 | static const uint8_t size_table[6] = { 0, 2, 3, 4, 5, 8 }; | ||
1279 | |||
1280 | /** Decode one P-frame MB | ||
1281 | */ | ||
1282 | 152608 | static int vc1_decode_p_mb(VC1Context *v) | |
1283 | { | ||
1284 | 152608 | MpegEncContext *s = &v->s; | |
1285 | 152608 | GetBitContext *gb = &s->gb; | |
1286 | int i, j; | ||
1287 | 152608 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
1288 | int cbp; /* cbp decoding stuff */ | ||
1289 | int mqdiff, mquant; /* MB quantization */ | ||
1290 | 152608 | int ttmb = v->ttfrm; /* MB Transform type */ | |
1291 | |||
1292 | 152608 | int mb_has_coeffs = 1; /* last_flag */ | |
1293 | int dmv_x, dmv_y; /* Differential MV components */ | ||
1294 | int index, index1; /* LUT indexes */ | ||
1295 | int val, sign; /* temp values */ | ||
1296 | 152608 | int first_block = 1; | |
1297 | int dst_idx, off; | ||
1298 | int skipped, fourmv; | ||
1299 | 152608 | int block_cbp = 0, pat, block_tt = 0, block_intra = 0; | |
1300 | int ret; | ||
1301 | |||
1302 | 152608 | mquant = v->pq; /* lossy initialization */ | |
1303 | |||
1304 |
2/2✓ Branch 0 taken 58770 times.
✓ Branch 1 taken 93838 times.
|
152608 | if (v->mv_type_is_raw) |
1305 | 58770 | fourmv = get_bits1(gb); | |
1306 | else | ||
1307 | 93838 | fourmv = v->mv_type_mb_plane[mb_pos]; | |
1308 |
2/2✓ Branch 0 taken 58470 times.
✓ Branch 1 taken 94138 times.
|
152608 | if (v->skip_is_raw) |
1309 | 58470 | skipped = get_bits1(gb); | |
1310 | else | ||
1311 | 94138 | skipped = v->s.mbskip_table[mb_pos]; | |
1312 | |||
1313 |
2/2✓ Branch 0 taken 126032 times.
✓ Branch 1 taken 26576 times.
|
152608 | if (!fourmv) { /* 1MV mode */ |
1314 |
2/2✓ Branch 0 taken 113910 times.
✓ Branch 1 taken 12122 times.
|
126032 | if (!skipped) { |
1315 |
20/20✓ Branch 1 taken 92378 times.
✓ Branch 2 taken 21532 times.
✓ Branch 3 taken 23737 times.
✓ Branch 4 taken 90173 times.
✓ Branch 5 taken 1950 times.
✓ Branch 6 taken 88223 times.
✓ Branch 9 taken 24987 times.
✓ Branch 10 taken 63236 times.
✓ Branch 11 taken 22380 times.
✓ Branch 12 taken 40856 times.
✓ Branch 13 taken 153 times.
✓ Branch 14 taken 22227 times.
✓ Branch 15 taken 47286 times.
✓ Branch 16 taken 15950 times.
✓ Branch 18 taken 22380 times.
✓ Branch 19 taken 40856 times.
✓ Branch 20 taken 130 times.
✓ Branch 21 taken 22250 times.
✓ Branch 22 taken 49139 times.
✓ Branch 23 taken 14097 times.
|
113910 | GET_MVDATA(dmv_x, dmv_y); |
1316 | |||
1317 |
2/2✓ Branch 0 taken 24987 times.
✓ Branch 1 taken 88923 times.
|
113910 | if (s->mb_intra) { |
1318 | 24987 | s->cur_pic.motion_val[1][s->block_index[0]][0] = 0; | |
1319 | 24987 | s->cur_pic.motion_val[1][s->block_index[0]][1] = 0; | |
1320 | } | ||
1321 |
2/2✓ Branch 0 taken 24987 times.
✓ Branch 1 taken 88923 times.
|
113910 | s->cur_pic.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16; |
1322 | 113910 | ff_vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0); | |
1323 | |||
1324 | /* FIXME Set DC val for inter block ? */ | ||
1325 |
4/4✓ Branch 0 taken 24987 times.
✓ Branch 1 taken 88923 times.
✓ Branch 2 taken 2748 times.
✓ Branch 3 taken 22239 times.
|
113910 | if (s->mb_intra && !mb_has_coeffs) { |
1326 |
21/38✓ Branch 0 taken 99 times.
✓ Branch 1 taken 2649 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 99 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 13 taken 98 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 49 times.
✓ Branch 20 taken 50 times.
✓ Branch 21 taken 3 times.
✓ Branch 22 taken 46 times.
✓ Branch 23 taken 48 times.
✓ Branch 24 taken 51 times.
✓ Branch 25 taken 7 times.
✓ Branch 26 taken 41 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 99 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 3 times.
✓ Branch 32 taken 96 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 3 times.
✓ Branch 35 taken 99 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 99 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 40 taken 99 times.
|
2748 | GET_MQUANT(); |
1327 | 2748 | s->ac_pred = get_bits1(gb); | |
1328 | 2748 | cbp = 0; | |
1329 |
2/2✓ Branch 0 taken 92378 times.
✓ Branch 1 taken 18784 times.
|
111162 | } else if (mb_has_coeffs) { |
1330 |
2/2✓ Branch 0 taken 22239 times.
✓ Branch 1 taken 70139 times.
|
92378 | if (s->mb_intra) |
1331 | 22239 | s->ac_pred = get_bits1(gb); | |
1332 | 92378 | cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); | |
1333 |
27/38✓ Branch 0 taken 8185 times.
✓ Branch 1 taken 84193 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8185 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 13 taken 7970 times.
✓ Branch 14 taken 215 times.
✓ Branch 15 taken 203 times.
✓ Branch 16 taken 12 times.
✓ Branch 17 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2077 times.
✓ Branch 20 taken 6108 times.
✓ Branch 21 taken 38 times.
✓ Branch 22 taken 2039 times.
✓ Branch 23 taken 5912 times.
✓ Branch 24 taken 2273 times.
✓ Branch 25 taken 349 times.
✓ Branch 26 taken 5563 times.
✓ Branch 27 taken 120 times.
✓ Branch 28 taken 8065 times.
✓ Branch 29 taken 6 times.
✓ Branch 30 taken 114 times.
✓ Branch 31 taken 315 times.
✓ Branch 32 taken 7870 times.
✓ Branch 33 taken 1 times.
✓ Branch 34 taken 314 times.
✓ Branch 35 taken 8185 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 8185 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 40 taken 8185 times.
|
92378 | GET_MQUANT(); |
1334 | } else { | ||
1335 | 18784 | mquant = v->pq; | |
1336 | 18784 | cbp = 0; | |
1337 | } | ||
1338 | 113910 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
1339 | |||
1340 |
6/6✓ Branch 0 taken 75248 times.
✓ Branch 1 taken 38662 times.
✓ Branch 2 taken 53768 times.
✓ Branch 3 taken 21480 times.
✓ Branch 4 taken 42234 times.
✓ Branch 5 taken 11534 times.
|
113910 | if (!v->ttmbf && !s->mb_intra && mb_has_coeffs) |
1341 | 42234 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], | |
1342 | VC1_TTMB_VLC_BITS, 2); | ||
1343 |
2/2✓ Branch 0 taken 88923 times.
✓ Branch 1 taken 24987 times.
|
113910 | if (!s->mb_intra) ff_vc1_mc_1mv(v, 0); |
1344 | 113910 | dst_idx = 0; | |
1345 |
2/2✓ Branch 0 taken 683460 times.
✓ Branch 1 taken 113910 times.
|
797370 | for (i = 0; i < 6; i++) { |
1346 | 683460 | s->dc_val[0][s->block_index[i]] = 0; | |
1347 | 683460 | dst_idx += i >> 2; | |
1348 | 683460 | val = ((cbp >> (5 - i)) & 1); | |
1349 |
2/2✓ Branch 0 taken 455640 times.
✓ Branch 1 taken 227820 times.
|
683460 | off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); |
1350 | 683460 | v->mb_type[0][s->block_index[i]] = s->mb_intra; | |
1351 |
2/2✓ Branch 0 taken 149922 times.
✓ Branch 1 taken 533538 times.
|
683460 | if (s->mb_intra) { |
1352 | /* check if prediction blocks A and C are available */ | ||
1353 | 149922 | v->a_avail = v->c_avail = 0; | |
1354 |
6/6✓ Branch 0 taken 124935 times.
✓ Branch 1 taken 24987 times.
✓ Branch 2 taken 99948 times.
✓ Branch 3 taken 24987 times.
✓ Branch 4 taken 60556 times.
✓ Branch 5 taken 39392 times.
|
149922 | if (i == 2 || i == 3 || !s->first_slice_line) |
1355 | 110530 | v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; | |
1356 |
6/6✓ Branch 0 taken 124935 times.
✓ Branch 1 taken 24987 times.
✓ Branch 2 taken 99948 times.
✓ Branch 3 taken 24987 times.
✓ Branch 4 taken 97332 times.
✓ Branch 5 taken 2616 times.
|
149922 | if (i == 1 || i == 3 || s->mb_x) |
1357 | 147306 | v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
1358 | |||
1359 | 149922 | ret = vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, val, mquant, | |
1360 |
2/2✓ Branch 0 taken 49974 times.
✓ Branch 1 taken 99948 times.
|
149922 | (i & 4) ? v->codingset2 : v->codingset); |
1361 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 149922 times.
|
149922 | if (ret < 0) |
1362 | ✗ | return ret; | |
1363 | if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) | ||
1364 | continue; | ||
1365 | 149922 | v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]); | |
1366 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 149922 times.
|
149922 | if (v->rangeredfrm) |
1367 | ✗ | for (j = 0; j < 64; j++) | |
1368 | ✗ | v->block[v->cur_blk_idx][block_map[i]][j] *= 2; | |
1369 | 149922 | block_cbp |= 0xF << (i << 2); | |
1370 | 149922 | block_intra |= 1 << i; | |
1371 |
2/2✓ Branch 0 taken 219478 times.
✓ Branch 1 taken 314060 times.
|
533538 | } else if (val) { |
1372 | 658434 | pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb, first_block, | |
1373 |
2/2✓ Branch 0 taken 33600 times.
✓ Branch 1 taken 185878 times.
|
219478 | s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize, |
1374 | CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt); | ||
1375 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 219478 times.
|
219478 | if (pat < 0) |
1376 | ✗ | return pat; | |
1377 | 219478 | block_cbp |= pat << (i << 2); | |
1378 |
4/4✓ Branch 0 taken 131418 times.
✓ Branch 1 taken 88060 times.
✓ Branch 2 taken 87522 times.
✓ Branch 3 taken 43896 times.
|
219478 | if (!v->ttmbf && ttmb < 8) |
1379 | 87522 | ttmb = -1; | |
1380 | 219478 | first_block = 0; | |
1381 | } | ||
1382 | } | ||
1383 | } else { // skipped | ||
1384 | 12122 | s->mb_intra = 0; | |
1385 |
2/2✓ Branch 0 taken 72732 times.
✓ Branch 1 taken 12122 times.
|
84854 | for (i = 0; i < 6; i++) { |
1386 | 72732 | v->mb_type[0][s->block_index[i]] = 0; | |
1387 | 72732 | s->dc_val[0][s->block_index[i]] = 0; | |
1388 | } | ||
1389 | 12122 | s->cur_pic.mb_type[mb_pos] = MB_TYPE_SKIP; | |
1390 | 12122 | s->cur_pic.qscale_table[mb_pos] = 0; | |
1391 | 12122 | ff_vc1_pred_mv(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0); | |
1392 | 12122 | ff_vc1_mc_1mv(v, 0); | |
1393 | } | ||
1394 | } else { // 4MV mode | ||
1395 |
2/2✓ Branch 0 taken 22855 times.
✓ Branch 1 taken 3721 times.
|
26576 | if (!skipped /* unskipped MB */) { |
1396 | 22855 | int intra_count = 0, coded_inter = 0; | |
1397 | int is_intra[6], is_coded[6]; | ||
1398 | /* Get CBPCY */ | ||
1399 | 22855 | cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); | |
1400 |
2/2✓ Branch 0 taken 137130 times.
✓ Branch 1 taken 22855 times.
|
159985 | for (i = 0; i < 6; i++) { |
1401 | 137130 | val = ((cbp >> (5 - i)) & 1); | |
1402 | 137130 | s->dc_val[0][s->block_index[i]] = 0; | |
1403 | 137130 | s->mb_intra = 0; | |
1404 |
2/2✓ Branch 0 taken 91420 times.
✓ Branch 1 taken 45710 times.
|
137130 | if (i < 4) { |
1405 | 91420 | dmv_x = dmv_y = 0; | |
1406 | 91420 | s->mb_intra = 0; | |
1407 | 91420 | mb_has_coeffs = 0; | |
1408 |
2/2✓ Branch 0 taken 71997 times.
✓ Branch 1 taken 19423 times.
|
91420 | if (val) { |
1409 |
14/20✓ Branch 1 taken 59461 times.
✓ Branch 2 taken 12536 times.
✓ Branch 3 taken 21378 times.
✓ Branch 4 taken 50619 times.
✓ Branch 5 taken 3130 times.
✓ Branch 6 taken 47489 times.
✓ Branch 9 taken 10564 times.
✓ Branch 10 taken 36925 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 36925 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 27632 times.
✓ Branch 16 taken 9293 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 36925 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 26108 times.
✓ Branch 23 taken 10817 times.
|
71997 | GET_MVDATA(dmv_x, dmv_y); |
1410 | } | ||
1411 | 91420 | ff_vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0); | |
1412 |
2/2✓ Branch 0 taken 80856 times.
✓ Branch 1 taken 10564 times.
|
91420 | if (!s->mb_intra) |
1413 | 80856 | ff_vc1_mc_4mv_luma(v, i, 0, 0); | |
1414 | 91420 | intra_count += s->mb_intra; | |
1415 | 91420 | is_intra[i] = s->mb_intra; | |
1416 | 91420 | is_coded[i] = mb_has_coeffs; | |
1417 | } | ||
1418 |
2/2✓ Branch 0 taken 45710 times.
✓ Branch 1 taken 91420 times.
|
137130 | if (i & 4) { |
1419 | 45710 | is_intra[i] = (intra_count >= 3); | |
1420 | 45710 | is_coded[i] = val; | |
1421 | } | ||
1422 |
2/2✓ Branch 0 taken 22855 times.
✓ Branch 1 taken 114275 times.
|
137130 | if (i == 4) |
1423 | 22855 | ff_vc1_mc_4mv_chroma(v, 0); | |
1424 | 137130 | v->mb_type[0][s->block_index[i]] = is_intra[i]; | |
1425 |
2/2✓ Branch 0 taken 52317 times.
✓ Branch 1 taken 84813 times.
|
137130 | if (!coded_inter) |
1426 | 52317 | coded_inter = !is_intra[i] & is_coded[i]; | |
1427 | } | ||
1428 | // if there are no coded blocks then don't do anything more | ||
1429 | 22855 | dst_idx = 0; | |
1430 |
4/4✓ Branch 0 taken 16906 times.
✓ Branch 1 taken 5949 times.
✓ Branch 2 taken 2699 times.
✓ Branch 3 taken 14207 times.
|
22855 | if (!intra_count && !coded_inter) |
1431 | 2699 | goto end; | |
1432 |
1/38✗ Branch 0 not taken.
✓ Branch 1 taken 20156 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
|
20156 | GET_MQUANT(); |
1433 | 20156 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
1434 | /* test if block is intra and has pred */ | ||
1435 | { | ||
1436 | 20156 | int intrapred = 0; | |
1437 |
2/2✓ Branch 0 taken 106282 times.
✓ Branch 1 taken 16462 times.
|
122744 | for (i = 0; i < 6; i++) |
1438 |
2/2✓ Branch 0 taken 7257 times.
✓ Branch 1 taken 99025 times.
|
106282 | if (is_intra[i]) { |
1439 |
8/8✓ Branch 0 taken 2657 times.
✓ Branch 1 taken 4600 times.
✓ Branch 2 taken 2099 times.
✓ Branch 3 taken 558 times.
✓ Branch 4 taken 467 times.
✓ Branch 5 taken 1632 times.
✓ Branch 6 taken 3831 times.
✓ Branch 7 taken 1794 times.
|
7257 | if (((!s->first_slice_line || (i == 2 || i == 3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]]) |
1440 |
8/8✓ Branch 0 taken 145 times.
✓ Branch 1 taken 5318 times.
✓ Branch 2 taken 116 times.
✓ Branch 3 taken 29 times.
✓ Branch 4 taken 23 times.
✓ Branch 5 taken 93 times.
✓ Branch 6 taken 1900 times.
✓ Branch 7 taken 3470 times.
|
5463 | || ((s->mb_x || (i == 1 || i == 3)) && v->mb_type[0][s->block_index[i] - 1])) { |
1441 | 3694 | intrapred = 1; | |
1442 | 3694 | break; | |
1443 | } | ||
1444 | } | ||
1445 |
2/2✓ Branch 0 taken 3694 times.
✓ Branch 1 taken 16462 times.
|
20156 | if (intrapred) |
1446 | 3694 | s->ac_pred = get_bits1(gb); | |
1447 | else | ||
1448 | 16462 | s->ac_pred = 0; | |
1449 | } | ||
1450 |
4/4✓ Branch 0 taken 19197 times.
✓ Branch 1 taken 959 times.
✓ Branch 2 taken 18220 times.
✓ Branch 3 taken 977 times.
|
20156 | if (!v->ttmbf && coded_inter) |
1451 | 18220 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); | |
1452 |
2/2✓ Branch 0 taken 120936 times.
✓ Branch 1 taken 20156 times.
|
141092 | for (i = 0; i < 6; i++) { |
1453 | 120936 | dst_idx += i >> 2; | |
1454 |
2/2✓ Branch 0 taken 80624 times.
✓ Branch 1 taken 40312 times.
|
120936 | off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); |
1455 | 120936 | s->mb_intra = is_intra[i]; | |
1456 |
2/2✓ Branch 0 taken 13000 times.
✓ Branch 1 taken 107936 times.
|
120936 | if (is_intra[i]) { |
1457 | /* check if prediction blocks A and C are available */ | ||
1458 | 13000 | v->a_avail = v->c_avail = 0; | |
1459 |
6/6✓ Branch 0 taken 10330 times.
✓ Branch 1 taken 2670 times.
✓ Branch 2 taken 7641 times.
✓ Branch 3 taken 2689 times.
✓ Branch 4 taken 4662 times.
✓ Branch 5 taken 2979 times.
|
13000 | if (i == 2 || i == 3 || !s->first_slice_line) |
1460 | 10021 | v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; | |
1461 |
6/6✓ Branch 0 taken 10345 times.
✓ Branch 1 taken 2655 times.
✓ Branch 2 taken 7656 times.
✓ Branch 3 taken 2689 times.
✓ Branch 4 taken 7460 times.
✓ Branch 5 taken 196 times.
|
13000 | if (i == 1 || i == 3 || s->mb_x) |
1462 | 12804 | v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
1463 | |||
1464 | 13000 | ret = vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, is_coded[i], mquant, | |
1465 |
2/2✓ Branch 0 taken 2436 times.
✓ Branch 1 taken 10564 times.
|
13000 | (i & 4) ? v->codingset2 : v->codingset); |
1466 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 13000 times.
|
13000 | if (ret < 0) |
1467 | ✗ | return ret; | |
1468 | if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) | ||
1469 | continue; | ||
1470 | 13000 | v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]); | |
1471 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 13000 times.
|
13000 | if (v->rangeredfrm) |
1472 | ✗ | for (j = 0; j < 64; j++) | |
1473 | ✗ | v->block[v->cur_blk_idx][block_map[i]][j] *= 2; | |
1474 | 13000 | block_cbp |= 0xF << (i << 2); | |
1475 | 13000 | block_intra |= 1 << i; | |
1476 |
2/2✓ Branch 0 taken 66705 times.
✓ Branch 1 taken 41231 times.
|
107936 | } else if (is_coded[i]) { |
1477 | 200115 | pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb, | |
1478 | 66705 | first_block, s->dest[dst_idx] + off, | |
1479 |
2/2✓ Branch 0 taken 15468 times.
✓ Branch 1 taken 51237 times.
|
66705 | (i & 4) ? s->uvlinesize : s->linesize, |
1480 | CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), | ||
1481 | &block_tt); | ||
1482 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66705 times.
|
66705 | if (pat < 0) |
1483 | ✗ | return pat; | |
1484 | 66705 | block_cbp |= pat << (i << 2); | |
1485 |
4/4✓ Branch 0 taken 63583 times.
✓ Branch 1 taken 3122 times.
✓ Branch 2 taken 44004 times.
✓ Branch 3 taken 19579 times.
|
66705 | if (!v->ttmbf && ttmb < 8) |
1486 | 44004 | ttmb = -1; | |
1487 | 66705 | first_block = 0; | |
1488 | } | ||
1489 | } | ||
1490 | } else { // skipped MB | ||
1491 | 3721 | s->mb_intra = 0; | |
1492 | 3721 | s->cur_pic.qscale_table[mb_pos] = 0; | |
1493 |
2/2✓ Branch 0 taken 22326 times.
✓ Branch 1 taken 3721 times.
|
26047 | for (i = 0; i < 6; i++) { |
1494 | 22326 | v->mb_type[0][s->block_index[i]] = 0; | |
1495 | 22326 | s->dc_val[0][s->block_index[i]] = 0; | |
1496 | } | ||
1497 |
2/2✓ Branch 0 taken 14884 times.
✓ Branch 1 taken 3721 times.
|
18605 | for (i = 0; i < 4; i++) { |
1498 | 14884 | ff_vc1_pred_mv(v, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0); | |
1499 | 14884 | ff_vc1_mc_4mv_luma(v, i, 0, 0); | |
1500 | } | ||
1501 | 3721 | ff_vc1_mc_4mv_chroma(v, 0); | |
1502 | 3721 | s->cur_pic.qscale_table[mb_pos] = 0; | |
1503 | } | ||
1504 | } | ||
1505 | 152608 | end: | |
1506 |
3/4✓ Branch 0 taken 107428 times.
✓ Branch 1 taken 45180 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 107428 times.
|
152608 | if (v->overlap && v->pq >= 9) |
1507 | ✗ | ff_vc1_p_overlap_filter(v); | |
1508 | 152608 | vc1_put_blocks_clamped(v, 1); | |
1509 | |||
1510 | 152608 | v->cbp[s->mb_x] = block_cbp; | |
1511 | 152608 | v->ttblk[s->mb_x] = block_tt; | |
1512 | 152608 | v->is_intra[s->mb_x] = block_intra; | |
1513 | |||
1514 | 152608 | return 0; | |
1515 | } | ||
1516 | |||
1517 | /* Decode one macroblock in an interlaced frame p picture */ | ||
1518 | |||
1519 | 16320 | static int vc1_decode_p_mb_intfr(VC1Context *v) | |
1520 | { | ||
1521 | 16320 | MpegEncContext *s = &v->s; | |
1522 | 16320 | GetBitContext *gb = &s->gb; | |
1523 | int i; | ||
1524 | 16320 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
1525 | 16320 | int cbp = 0; /* cbp decoding stuff */ | |
1526 | int mqdiff, mquant; /* MB quantization */ | ||
1527 | 16320 | int ttmb = v->ttfrm; /* MB Transform type */ | |
1528 | |||
1529 | 16320 | int mb_has_coeffs = 1; /* last_flag */ | |
1530 | int dmv_x, dmv_y; /* Differential MV components */ | ||
1531 | int val; /* temp value */ | ||
1532 | 16320 | int first_block = 1; | |
1533 | int dst_idx, off; | ||
1534 | 16320 | int skipped, fourmv = 0, twomv = 0; | |
1535 | 16320 | int block_cbp = 0, pat, block_tt = 0; | |
1536 | 16320 | int idx_mbmode = 0, mvbp; | |
1537 | int fieldtx; | ||
1538 | int ret; | ||
1539 | |||
1540 | 16320 | mquant = v->pq; /* Lossy initialization */ | |
1541 | |||
1542 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 16320 times.
|
16320 | if (v->skip_is_raw) |
1543 | ✗ | skipped = get_bits1(gb); | |
1544 | else | ||
1545 | 16320 | skipped = v->s.mbskip_table[mb_pos]; | |
1546 |
2/2✓ Branch 0 taken 16307 times.
✓ Branch 1 taken 13 times.
|
16320 | if (!skipped) { |
1547 |
1/2✓ Branch 0 taken 16307 times.
✗ Branch 1 not taken.
|
16307 | if (v->fourmvswitch) |
1548 | 16307 | idx_mbmode = get_vlc2(gb, v->mbmode_vlc, VC1_INTFR_4MV_MBMODE_VLC_BITS, 2); // try getting this done | |
1549 | else | ||
1550 | ✗ | idx_mbmode = get_vlc2(gb, v->mbmode_vlc, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); // in a single line | |
1551 |
5/5✓ Branch 0 taken 704 times.
✓ Branch 1 taken 1084 times.
✓ Branch 2 taken 4797 times.
✓ Branch 3 taken 8046 times.
✓ Branch 4 taken 1676 times.
|
16307 | switch (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0]) { |
1552 | /* store the motion vector type in a flag (useful later) */ | ||
1553 | 704 | case MV_PMODE_INTFR_4MV: | |
1554 | 704 | fourmv = 1; | |
1555 | 704 | v->blk_mv_type[s->block_index[0]] = 0; | |
1556 | 704 | v->blk_mv_type[s->block_index[1]] = 0; | |
1557 | 704 | v->blk_mv_type[s->block_index[2]] = 0; | |
1558 | 704 | v->blk_mv_type[s->block_index[3]] = 0; | |
1559 | 704 | break; | |
1560 | 1084 | case MV_PMODE_INTFR_4MV_FIELD: | |
1561 | 1084 | fourmv = 1; | |
1562 | 1084 | v->blk_mv_type[s->block_index[0]] = 1; | |
1563 | 1084 | v->blk_mv_type[s->block_index[1]] = 1; | |
1564 | 1084 | v->blk_mv_type[s->block_index[2]] = 1; | |
1565 | 1084 | v->blk_mv_type[s->block_index[3]] = 1; | |
1566 | 1084 | break; | |
1567 | 4797 | case MV_PMODE_INTFR_2MV_FIELD: | |
1568 | 4797 | twomv = 1; | |
1569 | 4797 | v->blk_mv_type[s->block_index[0]] = 1; | |
1570 | 4797 | v->blk_mv_type[s->block_index[1]] = 1; | |
1571 | 4797 | v->blk_mv_type[s->block_index[2]] = 1; | |
1572 | 4797 | v->blk_mv_type[s->block_index[3]] = 1; | |
1573 | 4797 | break; | |
1574 | 8046 | case MV_PMODE_INTFR_1MV: | |
1575 | 8046 | v->blk_mv_type[s->block_index[0]] = 0; | |
1576 | 8046 | v->blk_mv_type[s->block_index[1]] = 0; | |
1577 | 8046 | v->blk_mv_type[s->block_index[2]] = 0; | |
1578 | 8046 | v->blk_mv_type[s->block_index[3]] = 0; | |
1579 | 8046 | break; | |
1580 | } | ||
1581 |
2/2✓ Branch 0 taken 1676 times.
✓ Branch 1 taken 14631 times.
|
16307 | if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_INTRA) { // intra MB |
1582 |
2/2✓ Branch 0 taken 6704 times.
✓ Branch 1 taken 1676 times.
|
8380 | for (i = 0; i < 4; i++) { |
1583 | 6704 | s->cur_pic.motion_val[1][s->block_index[i]][0] = 0; | |
1584 | 6704 | s->cur_pic.motion_val[1][s->block_index[i]][1] = 0; | |
1585 | } | ||
1586 | 1676 | v->is_intra[s->mb_x] = 0x3f; // Set the bitfield to all 1. | |
1587 | 1676 | s->mb_intra = 1; | |
1588 | 1676 | s->cur_pic.mb_type[mb_pos] = MB_TYPE_INTRA; | |
1589 | 1676 | fieldtx = v->fieldtx_plane[mb_pos] = get_bits1(gb); | |
1590 | 1676 | mb_has_coeffs = get_bits1(gb); | |
1591 |
2/2✓ Branch 0 taken 1615 times.
✓ Branch 1 taken 61 times.
|
1676 | if (mb_has_coeffs) |
1592 | 1615 | cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); | |
1593 | 1676 | v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb); | |
1594 |
15/38✓ Branch 0 taken 1676 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1676 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1676 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 347 times.
✓ Branch 8 taken 1329 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1676 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1676 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1676 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1676 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1676 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1676 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 1676 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 1676 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1676 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 40 taken 1676 times.
|
1676 | GET_MQUANT(); |
1595 | 1676 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
1596 | /* Set DC scale - y and c use the same (not sure if necessary here) */ | ||
1597 |
2/2✓ Branch 0 taken 1329 times.
✓ Branch 1 taken 347 times.
|
1676 | s->y_dc_scale = s->y_dc_scale_table[FFABS(mquant)]; |
1598 |
2/2✓ Branch 0 taken 1329 times.
✓ Branch 1 taken 347 times.
|
1676 | s->c_dc_scale = s->c_dc_scale_table[FFABS(mquant)]; |
1599 | 1676 | dst_idx = 0; | |
1600 |
2/2✓ Branch 0 taken 10056 times.
✓ Branch 1 taken 1676 times.
|
11732 | for (i = 0; i < 6; i++) { |
1601 | 10056 | v->a_avail = v->c_avail = 0; | |
1602 | 10056 | v->mb_type[0][s->block_index[i]] = 1; | |
1603 | 10056 | s->dc_val[0][s->block_index[i]] = 0; | |
1604 | 10056 | dst_idx += i >> 2; | |
1605 | 10056 | val = ((cbp >> (5 - i)) & 1); | |
1606 |
6/6✓ Branch 0 taken 8380 times.
✓ Branch 1 taken 1676 times.
✓ Branch 2 taken 6704 times.
✓ Branch 3 taken 1676 times.
✓ Branch 4 taken 6488 times.
✓ Branch 5 taken 216 times.
|
10056 | if (i == 2 || i == 3 || !s->first_slice_line) |
1607 | 9840 | v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; | |
1608 |
6/6✓ Branch 0 taken 8380 times.
✓ Branch 1 taken 1676 times.
✓ Branch 2 taken 6704 times.
✓ Branch 3 taken 1676 times.
✓ Branch 4 taken 6648 times.
✓ Branch 5 taken 56 times.
|
10056 | if (i == 1 || i == 3 || s->mb_x) |
1609 | 10000 | v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
1610 | |||
1611 | 10056 | ret = vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, val, mquant, | |
1612 |
2/2✓ Branch 0 taken 3352 times.
✓ Branch 1 taken 6704 times.
|
10056 | (i & 4) ? v->codingset2 : v->codingset); |
1613 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10056 times.
|
10056 | if (ret < 0) |
1614 | ✗ | return ret; | |
1615 | if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) | ||
1616 | continue; | ||
1617 | 10056 | v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]); | |
1618 | 10056 | block_cbp |= 0xf << (i << 2); | |
1619 | } | ||
1620 | |||
1621 | } else { // inter MB | ||
1622 | 14631 | mb_has_coeffs = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][3]; | |
1623 |
2/2✓ Branch 0 taken 13330 times.
✓ Branch 1 taken 1301 times.
|
14631 | if (mb_has_coeffs) |
1624 | 13330 | cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); | |
1625 |
2/2✓ Branch 0 taken 4797 times.
✓ Branch 1 taken 9834 times.
|
14631 | if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) { |
1626 | 4797 | v->twomvbp = get_vlc2(gb, v->twomvbp_vlc, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1); | |
1627 | } else { | ||
1628 |
2/2✓ Branch 0 taken 9130 times.
✓ Branch 1 taken 704 times.
|
9834 | if ((ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV) |
1629 |
2/2✓ Branch 0 taken 1084 times.
✓ Branch 1 taken 8046 times.
|
9130 | || (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV_FIELD)) { |
1630 | 1788 | v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); | |
1631 | } | ||
1632 | } | ||
1633 | 14631 | s->mb_intra = v->is_intra[s->mb_x] = 0; | |
1634 |
2/2✓ Branch 0 taken 87786 times.
✓ Branch 1 taken 14631 times.
|
102417 | for (i = 0; i < 6; i++) |
1635 | 87786 | v->mb_type[0][s->block_index[i]] = 0; | |
1636 | 14631 | fieldtx = v->fieldtx_plane[mb_pos] = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][1]; | |
1637 | /* for all motion vector read MVDATA and motion compensate each block */ | ||
1638 | 14631 | dst_idx = 0; | |
1639 |
2/2✓ Branch 0 taken 1788 times.
✓ Branch 1 taken 12843 times.
|
14631 | if (fourmv) { |
1640 | 1788 | mvbp = v->fourmvbp; | |
1641 |
2/2✓ Branch 0 taken 7152 times.
✓ Branch 1 taken 1788 times.
|
8940 | for (i = 0; i < 4; i++) { |
1642 | 7152 | dmv_x = dmv_y = 0; | |
1643 |
2/2✓ Branch 0 taken 5798 times.
✓ Branch 1 taken 1354 times.
|
7152 | if (mvbp & (8 >> i)) |
1644 | 5798 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); | |
1645 | 7152 | ff_vc1_pred_mv_intfr(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, 0); | |
1646 | 7152 | ff_vc1_mc_4mv_luma(v, i, 0, 0); | |
1647 | } | ||
1648 | 1788 | ff_vc1_mc_4mv_chroma4(v, 0, 0, 0); | |
1649 |
2/2✓ Branch 0 taken 4797 times.
✓ Branch 1 taken 8046 times.
|
12843 | } else if (twomv) { |
1650 | 4797 | mvbp = v->twomvbp; | |
1651 | 4797 | dmv_x = dmv_y = 0; | |
1652 |
2/2✓ Branch 0 taken 4513 times.
✓ Branch 1 taken 284 times.
|
4797 | if (mvbp & 2) { |
1653 | 4513 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); | |
1654 | } | ||
1655 | 4797 | ff_vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 2, v->range_x, v->range_y, 0); | |
1656 | 4797 | ff_vc1_mc_4mv_luma(v, 0, 0, 0); | |
1657 | 4797 | ff_vc1_mc_4mv_luma(v, 1, 0, 0); | |
1658 | 4797 | dmv_x = dmv_y = 0; | |
1659 |
2/2✓ Branch 0 taken 4517 times.
✓ Branch 1 taken 280 times.
|
4797 | if (mvbp & 1) { |
1660 | 4517 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); | |
1661 | } | ||
1662 | 4797 | ff_vc1_pred_mv_intfr(v, 2, dmv_x, dmv_y, 2, v->range_x, v->range_y, 0); | |
1663 | 4797 | ff_vc1_mc_4mv_luma(v, 2, 0, 0); | |
1664 | 4797 | ff_vc1_mc_4mv_luma(v, 3, 0, 0); | |
1665 | 4797 | ff_vc1_mc_4mv_chroma4(v, 0, 0, 0); | |
1666 | } else { | ||
1667 | 8046 | mvbp = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][2]; | |
1668 | 8046 | dmv_x = dmv_y = 0; | |
1669 |
2/2✓ Branch 0 taken 7892 times.
✓ Branch 1 taken 154 times.
|
8046 | if (mvbp) { |
1670 | 7892 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); | |
1671 | } | ||
1672 | 8046 | ff_vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, 0); | |
1673 | 8046 | ff_vc1_mc_1mv(v, 0); | |
1674 | } | ||
1675 |
2/2✓ Branch 0 taken 13330 times.
✓ Branch 1 taken 1301 times.
|
14631 | if (cbp) |
1676 |
15/38✓ Branch 0 taken 13330 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 13330 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13330 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3698 times.
✓ Branch 8 taken 9632 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 13330 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 13330 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 13330 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 13330 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 13330 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 13330 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 13330 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 13330 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 13330 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 40 taken 13330 times.
|
13330 | GET_MQUANT(); // p. 227 |
1677 | 14631 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
1678 |
3/4✓ Branch 0 taken 14631 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 13330 times.
✓ Branch 3 taken 1301 times.
|
14631 | if (!v->ttmbf && cbp) |
1679 | 13330 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); | |
1680 |
2/2✓ Branch 0 taken 87786 times.
✓ Branch 1 taken 14631 times.
|
102417 | for (i = 0; i < 6; i++) { |
1681 | 87786 | s->dc_val[0][s->block_index[i]] = 0; | |
1682 | 87786 | dst_idx += i >> 2; | |
1683 | 87786 | val = ((cbp >> (5 - i)) & 1); | |
1684 |
2/2✓ Branch 0 taken 70050 times.
✓ Branch 1 taken 17736 times.
|
87786 | if (!fieldtx) |
1685 |
2/2✓ Branch 0 taken 46700 times.
✓ Branch 1 taken 23350 times.
|
70050 | off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); |
1686 | else | ||
1687 |
2/2✓ Branch 0 taken 11824 times.
✓ Branch 1 taken 5912 times.
|
17736 | off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize)); |
1688 |
2/2✓ Branch 0 taken 63627 times.
✓ Branch 1 taken 24159 times.
|
87786 | if (val) { |
1689 | 190881 | pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb, | |
1690 | 63627 | first_block, s->dest[dst_idx] + off, | |
1691 |
2/2✓ Branch 0 taken 20177 times.
✓ Branch 1 taken 43450 times.
|
63627 | (i & 4) ? s->uvlinesize : (s->linesize << fieldtx), |
1692 | CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt); | ||
1693 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 63627 times.
|
63627 | if (pat < 0) |
1694 | ✗ | return pat; | |
1695 | 63627 | block_cbp |= pat << (i << 2); | |
1696 |
3/4✓ Branch 0 taken 63627 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 44047 times.
✓ Branch 3 taken 19580 times.
|
63627 | if (!v->ttmbf && ttmb < 8) |
1697 | 44047 | ttmb = -1; | |
1698 | 63627 | first_block = 0; | |
1699 | } | ||
1700 | } | ||
1701 | } | ||
1702 | } else { // skipped | ||
1703 | 13 | s->mb_intra = v->is_intra[s->mb_x] = 0; | |
1704 |
2/2✓ Branch 0 taken 78 times.
✓ Branch 1 taken 13 times.
|
91 | for (i = 0; i < 6; i++) { |
1705 | 78 | v->mb_type[0][s->block_index[i]] = 0; | |
1706 | 78 | s->dc_val[0][s->block_index[i]] = 0; | |
1707 | } | ||
1708 | 13 | s->cur_pic.mb_type[mb_pos] = MB_TYPE_SKIP; | |
1709 | 13 | s->cur_pic.qscale_table[mb_pos] = 0; | |
1710 | 13 | v->blk_mv_type[s->block_index[0]] = 0; | |
1711 | 13 | v->blk_mv_type[s->block_index[1]] = 0; | |
1712 | 13 | v->blk_mv_type[s->block_index[2]] = 0; | |
1713 | 13 | v->blk_mv_type[s->block_index[3]] = 0; | |
1714 | 13 | ff_vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, 0); | |
1715 | 13 | ff_vc1_mc_1mv(v, 0); | |
1716 | 13 | v->fieldtx_plane[mb_pos] = 0; | |
1717 | } | ||
1718 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 16320 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
16320 | if (v->overlap && v->pq >= 9) |
1719 | ✗ | ff_vc1_p_overlap_filter(v); | |
1720 | 16320 | vc1_put_blocks_clamped(v, 1); | |
1721 | |||
1722 | 16320 | v->cbp[s->mb_x] = block_cbp; | |
1723 | 16320 | v->ttblk[s->mb_x] = block_tt; | |
1724 | |||
1725 | 16320 | return 0; | |
1726 | } | ||
1727 | |||
1728 | 37920 | static int vc1_decode_p_mb_intfi(VC1Context *v) | |
1729 | { | ||
1730 | 37920 | MpegEncContext *s = &v->s; | |
1731 | 37920 | GetBitContext *gb = &s->gb; | |
1732 | int i; | ||
1733 | 37920 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
1734 | 37920 | int cbp = 0; /* cbp decoding stuff */ | |
1735 | int mqdiff, mquant; /* MB quantization */ | ||
1736 | 37920 | int ttmb = v->ttfrm; /* MB Transform type */ | |
1737 | |||
1738 | 37920 | int mb_has_coeffs = 1; /* last_flag */ | |
1739 | int dmv_x, dmv_y; /* Differential MV components */ | ||
1740 | int val; /* temp values */ | ||
1741 | 37920 | int first_block = 1; | |
1742 | int dst_idx, off; | ||
1743 | 37920 | int pred_flag = 0; | |
1744 | 37920 | int block_cbp = 0, pat, block_tt = 0; | |
1745 | 37920 | int idx_mbmode = 0; | |
1746 | int ret; | ||
1747 | |||
1748 | 37920 | mquant = v->pq; /* Lossy initialization */ | |
1749 | |||
1750 | 37920 | idx_mbmode = get_vlc2(gb, v->mbmode_vlc, VC1_IF_MBMODE_VLC_BITS, 2); | |
1751 |
2/2✓ Branch 0 taken 10225 times.
✓ Branch 1 taken 27695 times.
|
37920 | if (idx_mbmode <= 1) { // intra MB |
1752 | 10225 | v->is_intra[s->mb_x] = 0x3f; // Set the bitfield to all 1. | |
1753 | 10225 | s->mb_intra = 1; | |
1754 | 10225 | s->cur_pic.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0; | |
1755 | 10225 | s->cur_pic.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0; | |
1756 | 10225 | s->cur_pic.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA; | |
1757 |
16/38✓ Branch 0 taken 2966 times.
✓ Branch 1 taken 7259 times.
✓ Branch 2 taken 2966 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2966 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 189 times.
✓ Branch 8 taken 2777 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 2966 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2966 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2966 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2966 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 2966 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 2966 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 2966 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 2966 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 2966 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 40 taken 2966 times.
|
10225 | GET_MQUANT(); |
1758 | 10225 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
1759 | /* Set DC scale - y and c use the same (not sure if necessary here) */ | ||
1760 |
2/2✓ Branch 0 taken 10036 times.
✓ Branch 1 taken 189 times.
|
10225 | s->y_dc_scale = s->y_dc_scale_table[FFABS(mquant)]; |
1761 |
2/2✓ Branch 0 taken 10036 times.
✓ Branch 1 taken 189 times.
|
10225 | s->c_dc_scale = s->c_dc_scale_table[FFABS(mquant)]; |
1762 | 10225 | v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb); | |
1763 | 10225 | mb_has_coeffs = idx_mbmode & 1; | |
1764 |
2/2✓ Branch 0 taken 9472 times.
✓ Branch 1 taken 753 times.
|
10225 | if (mb_has_coeffs) |
1765 | 9472 | cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_ICBPCY_VLC_BITS, 2); | |
1766 | 10225 | dst_idx = 0; | |
1767 |
2/2 |