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 | 114600 | scale = s->y_dc_scale; | |
358 | |||
359 | 114600 | wrap = s->block_wrap[n]; | |
360 | 114600 | dc_val = s->dc_val[0] + s->block_index[n]; | |
361 | |||
362 | /* B A | ||
363 | * C X | ||
364 | */ | ||
365 | 114600 | c = dc_val[ - 1]; | |
366 | 114600 | b = dc_val[ - 1 - wrap]; | |
367 | 114600 | a = dc_val[ - wrap]; | |
368 | |||
369 |
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) { |
370 | /* Set outer values */ | ||
371 |
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)) |
372 | 5360 | b = a = dcpred[scale]; | |
373 |
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)) |
374 | 4056 | b = c = dcpred[scale]; | |
375 | } else { | ||
376 | /* Set outer values */ | ||
377 | ✗ | if (s->first_slice_line && (n != 2 && n != 3)) | |
378 | ✗ | b = a = 0; | |
379 | ✗ | if (s->mb_x == 0 && (n != 1 && n != 3)) | |
380 | ✗ | b = c = 0; | |
381 | } | ||
382 | |||
383 |
2/2✓ Branch 0 taken 77612 times.
✓ Branch 1 taken 36988 times.
|
114600 | if (abs(a - b) <= abs(b - c)) { |
384 | 77612 | pred = c; | |
385 | 77612 | *dir_ptr = 1; // left | |
386 | } else { | ||
387 | 36988 | pred = a; | |
388 | 36988 | *dir_ptr = 0; // top | |
389 | } | ||
390 | |||
391 | /* update predictor */ | ||
392 | 114600 | *dc_val_ptr = &dc_val[0]; | |
393 | 114600 | return pred; | |
394 | } | ||
395 | |||
396 | |||
397 | /** Get predicted DC value | ||
398 | * prediction dir: left=0, top=1 | ||
399 | * @param s MpegEncContext | ||
400 | * @param overlap flag indicating that overlap filtering is used | ||
401 | * @param pq integer part of picture quantizer | ||
402 | * @param[in] n block index in the current MB | ||
403 | * @param a_avail flag indicating top block availability | ||
404 | * @param c_avail flag indicating left block availability | ||
405 | * @param dc_val_ptr Pointer to DC predictor | ||
406 | * @param dir_ptr Prediction direction for use in AC prediction | ||
407 | */ | ||
408 | 381610 | static inline int ff_vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n, | |
409 | int a_avail, int c_avail, | ||
410 | int16_t **dc_val_ptr, int *dir_ptr) | ||
411 | { | ||
412 | int a, b, c, wrap, pred; | ||
413 | int16_t *dc_val; | ||
414 | 381610 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
415 | 381610 | int q1, q2 = 0; | |
416 | int dqscale_index; | ||
417 | |||
418 | /* scale predictors if needed */ | ||
419 | 381610 | q1 = FFABS(s->cur_pic.qscale_table[mb_pos]); | |
420 | 381610 | dqscale_index = ff_wmv3_dc_scale_table[q1] - 1; | |
421 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 381610 times.
|
381610 | if (dqscale_index < 0) |
422 | ✗ | return 0; | |
423 | |||
424 | 381610 | wrap = s->block_wrap[n]; | |
425 | 381610 | dc_val = s->dc_val[0] + s->block_index[n]; | |
426 | |||
427 | /* B A | ||
428 | * C X | ||
429 | */ | ||
430 | 381610 | c = dc_val[ - 1]; | |
431 | 381610 | b = dc_val[ - 1 - wrap]; | |
432 | 381610 | a = dc_val[ - wrap]; | |
433 | |||
434 |
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)) { |
435 | 161716 | q2 = FFABS(s->cur_pic.qscale_table[mb_pos - 1]); | |
436 |
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) |
437 | 10876 | c = (int)((unsigned)c * ff_wmv3_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18; | |
438 | } | ||
439 |
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)) { |
440 | 141745 | q2 = FFABS(s->cur_pic.qscale_table[mb_pos - s->mb_stride]); | |
441 |
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) |
442 | 10104 | a = (int)((unsigned)a * ff_wmv3_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18; | |
443 | } | ||
444 |
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)) { |
445 | 163754 | int off = mb_pos; | |
446 |
2/2✓ Branch 0 taken 128389 times.
✓ Branch 1 taken 35365 times.
|
163754 | if (n != 1) |
447 | 128389 | off--; | |
448 |
2/2✓ Branch 0 taken 123403 times.
✓ Branch 1 taken 40351 times.
|
163754 | if (n != 2) |
449 | 123403 | off -= s->mb_stride; | |
450 | 163754 | q2 = FFABS(s->cur_pic.qscale_table[off]); | |
451 |
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) |
452 | 13767 | b = (int)((unsigned)b * ff_wmv3_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18; | |
453 | } | ||
454 | |||
455 |
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))) { |
456 | 209868 | pred = c; | |
457 | 209868 | *dir_ptr = 1; // left | |
458 |
2/2✓ Branch 0 taken 118293 times.
✓ Branch 1 taken 53449 times.
|
171742 | } else if (a_avail) { |
459 | 118293 | pred = a; | |
460 | 118293 | *dir_ptr = 0; // top | |
461 | } else { | ||
462 | 53449 | pred = 0; | |
463 | 53449 | *dir_ptr = 1; // left | |
464 | } | ||
465 | |||
466 | /* update predictor */ | ||
467 | 381610 | *dc_val_ptr = &dc_val[0]; | |
468 | 381610 | return pred; | |
469 | } | ||
470 | |||
471 | /** @} */ // Block group | ||
472 | |||
473 | /** | ||
474 | * @name VC1 Macroblock-level functions in Simple/Main Profiles | ||
475 | * @see 7.1.4, p91 and 8.1.1.7, p(1)04 | ||
476 | * @{ | ||
477 | */ | ||
478 | |||
479 | 173312 | static inline int vc1_coded_block_pred(MpegEncContext * s, int n, | |
480 | uint8_t **coded_block_ptr) | ||
481 | { | ||
482 | int xy, wrap, pred, a, b, c; | ||
483 | |||
484 | 173312 | xy = s->block_index[n]; | |
485 | 173312 | wrap = s->b8_stride; | |
486 | |||
487 | /* B C | ||
488 | * A X | ||
489 | */ | ||
490 | 173312 | a = s->coded_block[xy - 1 ]; | |
491 | 173312 | b = s->coded_block[xy - 1 - wrap]; | |
492 | 173312 | c = s->coded_block[xy - wrap]; | |
493 | |||
494 |
2/2✓ Branch 0 taken 157230 times.
✓ Branch 1 taken 16082 times.
|
173312 | if (b == c) { |
495 | 157230 | pred = a; | |
496 | } else { | ||
497 | 16082 | pred = c; | |
498 | } | ||
499 | |||
500 | /* store value */ | ||
501 | 173312 | *coded_block_ptr = &s->coded_block[xy]; | |
502 | |||
503 | 173312 | return pred; | |
504 | } | ||
505 | |||
506 | /** | ||
507 | * Decode one AC coefficient | ||
508 | * @param v The VC1 context | ||
509 | * @param last Last coefficient | ||
510 | * @param skip How much zero coefficients to skip | ||
511 | * @param value Decoded AC coefficient value | ||
512 | * @param codingset set of VLC to decode data | ||
513 | * @see 8.1.3.4 | ||
514 | */ | ||
515 | 8423957 | static int vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, | |
516 | int *value, int codingset) | ||
517 | { | ||
518 | 8423957 | GetBitContext *gb = &v->s.gb; | |
519 | int index, run, level, lst, sign; | ||
520 | |||
521 | 8423957 | index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset], AC_VLC_BITS, 3); | |
522 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8423957 times.
|
8423957 | if (index < 0) |
523 | ✗ | return index; | |
524 |
2/2✓ Branch 0 taken 8351956 times.
✓ Branch 1 taken 72001 times.
|
8423957 | if (index != ff_vc1_ac_sizes[codingset] - 1) { |
525 | 8351956 | run = vc1_index_decode_table[codingset][index][0]; | |
526 | 8351956 | level = vc1_index_decode_table[codingset][index][1]; | |
527 |
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; |
528 | 8351956 | sign = get_bits1(gb); | |
529 | } else { | ||
530 | 72001 | int escape = decode210(gb); | |
531 |
2/2✓ Branch 0 taken 62172 times.
✓ Branch 1 taken 9829 times.
|
72001 | if (escape != 2) { |
532 | 62172 | index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset], AC_VLC_BITS, 3); | |
533 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 62172 times.
|
62172 | if (index >= ff_vc1_ac_sizes[codingset] - 1U) |
534 | ✗ | return AVERROR_INVALIDDATA; | |
535 | 62172 | run = vc1_index_decode_table[codingset][index][0]; | |
536 | 62172 | level = vc1_index_decode_table[codingset][index][1]; | |
537 | 62172 | lst = index >= vc1_last_decode_table[codingset]; | |
538 |
2/2✓ Branch 0 taken 31204 times.
✓ Branch 1 taken 30968 times.
|
62172 | if (escape == 0) { |
539 |
2/2✓ Branch 0 taken 12124 times.
✓ Branch 1 taken 19080 times.
|
31204 | if (lst) |
540 | 12124 | level += vc1_last_delta_level_table[codingset][run]; | |
541 | else | ||
542 | 19080 | level += vc1_delta_level_table[codingset][run]; | |
543 | } else { | ||
544 |
2/2✓ Branch 0 taken 11240 times.
✓ Branch 1 taken 19728 times.
|
30968 | if (lst) |
545 | 11240 | run += vc1_last_delta_run_table[codingset][level] + 1; | |
546 | else | ||
547 | 19728 | run += vc1_delta_run_table[codingset][level] + 1; | |
548 | } | ||
549 | 62172 | sign = get_bits1(gb); | |
550 | } else { | ||
551 | 9829 | lst = get_bits1(gb); | |
552 |
2/2✓ Branch 0 taken 389 times.
✓ Branch 1 taken 9440 times.
|
9829 | if (v->s.esc3_level_length == 0) { |
553 |
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 |
554 | 331 | v->s.esc3_level_length = get_bits(gb, 3); | |
555 |
2/2✓ Branch 0 taken 24 times.
✓ Branch 1 taken 307 times.
|
331 | if (!v->s.esc3_level_length) |
556 | 24 | v->s.esc3_level_length = get_bits(gb, 2) + 8; | |
557 | } else { // table 60 | ||
558 | 58 | v->s.esc3_level_length = get_unary(gb, 1, 6) + 2; | |
559 | } | ||
560 | 389 | v->s.esc3_run_length = 3 + get_bits(gb, 2); | |
561 | } | ||
562 | 9829 | run = get_bits(gb, v->s.esc3_run_length); | |
563 | 9829 | sign = get_bits1(gb); | |
564 | 9829 | level = get_bits(gb, v->s.esc3_level_length); | |
565 | } | ||
566 | } | ||
567 | |||
568 | 8423957 | *last = lst; | |
569 | 8423957 | *skip = run; | |
570 | 8423957 | *value = (level ^ -sign) + sign; | |
571 | |||
572 | 8423957 | return 0; | |
573 | } | ||
574 | |||
575 | /** Decode intra block in intra frames - should be faster than decode_intra_block | ||
576 | * @param v VC1Context | ||
577 | * @param block block to decode | ||
578 | * @param[in] n subblock index | ||
579 | * @param coded are AC coeffs present or not | ||
580 | * @param codingset set of VLC to decode data | ||
581 | */ | ||
582 | 114600 | static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, | |
583 | int coded, int codingset) | ||
584 | { | ||
585 | 114600 | GetBitContext *gb = &v->s.gb; | |
586 | 114600 | MpegEncContext *s = &v->s; | |
587 | 114600 | int dc_pred_dir = 0; /* Direction of the DC prediction used */ | |
588 | int i; | ||
589 | int16_t *dc_val; | ||
590 | int16_t *ac_val, *ac_val2; | ||
591 | int dcdiff, scale; | ||
592 | |||
593 | /* Get DC differential */ | ||
594 | 114600 | dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_vlc[s->dc_table_index][n >= 4], | |
595 | MSMP4_DC_VLC_BITS, 3); | ||
596 |
2/2✓ Branch 0 taken 84375 times.
✓ Branch 1 taken 30225 times.
|
114600 | if (dcdiff) { |
597 |
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; |
598 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 84373 times.
|
84375 | if (dcdiff == 119 /* ESC index value */) { |
599 | 2 | dcdiff = get_bits(gb, 8 + m); | |
600 | } else { | ||
601 |
2/2✓ Branch 0 taken 31164 times.
✓ Branch 1 taken 53209 times.
|
84373 | if (m) |
602 | 31164 | dcdiff = (dcdiff << m) + get_bits(gb, m) - ((1 << m) - 1); | |
603 | } | ||
604 |
2/2✓ Branch 1 taken 43828 times.
✓ Branch 2 taken 40547 times.
|
84375 | if (get_bits1(gb)) |
605 | 43828 | dcdiff = -dcdiff; | |
606 | } | ||
607 | |||
608 | /* Prediction */ | ||
609 | 114600 | dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir); | |
610 | 114600 | *dc_val = dcdiff; | |
611 | |||
612 | /* Store the quantized DC coeff, used for prediction */ | ||
613 | 114600 | block[0] = dcdiff * s->y_dc_scale; | |
614 | |||
615 | 114600 | ac_val = s->ac_val[0][s->block_index[n]]; | |
616 | 114600 | ac_val2 = ac_val; | |
617 |
2/2✓ Branch 0 taken 77612 times.
✓ Branch 1 taken 36988 times.
|
114600 | if (dc_pred_dir) // left |
618 | 77612 | ac_val -= 16; | |
619 | else // top | ||
620 | 36988 | ac_val -= 16 * s->block_wrap[n]; | |
621 | |||
622 | 114600 | scale = v->pq * 2 + v->halfpq; | |
623 | |||
624 | //AC Decoding | ||
625 | 114600 | i = !!coded; | |
626 | |||
627 |
2/2✓ Branch 0 taken 60031 times.
✓ Branch 1 taken 54569 times.
|
114600 | if (coded) { |
628 | 60031 | int last = 0, skip, value; | |
629 | const uint8_t *zz_table; | ||
630 | int k; | ||
631 | |||
632 |
2/2✓ Branch 0 taken 14906 times.
✓ Branch 1 taken 45125 times.
|
60031 | if (v->s.ac_pred) { |
633 |
2/2✓ Branch 0 taken 5075 times.
✓ Branch 1 taken 9831 times.
|
14906 | if (!dc_pred_dir) |
634 | 5075 | zz_table = v->zz_8x8[2]; | |
635 | else | ||
636 | 9831 | zz_table = v->zz_8x8[3]; | |
637 | } else | ||
638 | 45125 | zz_table = v->zz_8x8[1]; | |
639 | |||
640 |
2/2✓ Branch 0 taken 940300 times.
✓ Branch 1 taken 60031 times.
|
1000331 | while (!last) { |
641 | 940300 | int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); | |
642 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 940300 times.
|
940300 | if (ret < 0) |
643 | ✗ | return ret; | |
644 | 940300 | i += skip; | |
645 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 940300 times.
|
940300 | if (i > 63) |
646 | ✗ | break; | |
647 | 940300 | block[zz_table[i++]] = value; | |
648 | } | ||
649 | |||
650 | /* apply AC prediction if needed */ | ||
651 |
2/2✓ Branch 0 taken 14906 times.
✓ Branch 1 taken 45125 times.
|
60031 | if (s->ac_pred) { |
652 | int sh; | ||
653 |
2/2✓ Branch 0 taken 9831 times.
✓ Branch 1 taken 5075 times.
|
14906 | if (dc_pred_dir) { // left |
654 | 9831 | sh = v->left_blk_sh; | |
655 | } else { // top | ||
656 | 5075 | sh = v->top_blk_sh; | |
657 | 5075 | ac_val += 8; | |
658 | } | ||
659 |
2/2✓ Branch 0 taken 104342 times.
✓ Branch 1 taken 14906 times.
|
119248 | for (k = 1; k < 8; k++) |
660 | 104342 | block[k << sh] += ac_val[k]; | |
661 | } | ||
662 | /* save AC coeffs for further prediction */ | ||
663 |
2/2✓ Branch 0 taken 420217 times.
✓ Branch 1 taken 60031 times.
|
480248 | for (k = 1; k < 8; k++) { |
664 | 420217 | ac_val2[k] = block[k << v->left_blk_sh]; | |
665 | 420217 | ac_val2[k + 8] = block[k << v->top_blk_sh]; | |
666 | } | ||
667 | |||
668 | /* scale AC coeffs */ | ||
669 |
2/2✓ Branch 0 taken 3781953 times.
✓ Branch 1 taken 60031 times.
|
3841984 | for (k = 1; k < 64; k++) |
670 |
2/2✓ Branch 0 taken 939667 times.
✓ Branch 1 taken 2842286 times.
|
3781953 | if (block[k]) { |
671 | 939667 | block[k] *= scale; | |
672 |
2/2✓ Branch 0 taken 66540 times.
✓ Branch 1 taken 873127 times.
|
939667 | if (!v->pquantizer) |
673 |
2/2✓ Branch 0 taken 33090 times.
✓ Branch 1 taken 33450 times.
|
66540 | block[k] += (block[k] < 0) ? -v->pq : v->pq; |
674 | } | ||
675 | |||
676 | } else { | ||
677 | int k; | ||
678 | |||
679 | 54569 | memset(ac_val2, 0, 16 * 2); | |
680 | |||
681 | /* apply AC prediction if needed */ | ||
682 |
2/2✓ Branch 0 taken 4204 times.
✓ Branch 1 taken 50365 times.
|
54569 | if (s->ac_pred) { |
683 | int sh; | ||
684 |
2/2✓ Branch 0 taken 3180 times.
✓ Branch 1 taken 1024 times.
|
4204 | if (dc_pred_dir) { //left |
685 | 3180 | sh = v->left_blk_sh; | |
686 | } else { // top | ||
687 | 1024 | sh = v->top_blk_sh; | |
688 | 1024 | ac_val += 8; | |
689 | 1024 | ac_val2 += 8; | |
690 | } | ||
691 | 4204 | memcpy(ac_val2, ac_val, 8 * 2); | |
692 |
2/2✓ Branch 0 taken 29428 times.
✓ Branch 1 taken 4204 times.
|
33632 | for (k = 1; k < 8; k++) { |
693 | 29428 | block[k << sh] = ac_val[k] * scale; | |
694 |
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]) |
695 |
2/2✓ Branch 0 taken 267 times.
✓ Branch 1 taken 323 times.
|
590 | block[k << sh] += (block[k << sh] < 0) ? -v->pq : v->pq; |
696 | } | ||
697 | } | ||
698 | } | ||
699 |
2/2✓ Branch 0 taken 19110 times.
✓ Branch 1 taken 95490 times.
|
114600 | if (s->ac_pred) i = 63; |
700 | 114600 | s->block_last_index[n] = i; | |
701 | |||
702 | 114600 | return 0; | |
703 | } | ||
704 | |||
705 | /** Decode intra block in intra frames - should be faster than decode_intra_block | ||
706 | * @param v VC1Context | ||
707 | * @param block block to decode | ||
708 | * @param[in] n subblock number | ||
709 | * @param coded are AC coeffs present or not | ||
710 | * @param codingset set of VLC to decode data | ||
711 | * @param mquant quantizer value for this macroblock | ||
712 | */ | ||
713 | 145368 | static int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n, | |
714 | int coded, int codingset, int mquant) | ||
715 | { | ||
716 | 145368 | GetBitContext *gb = &v->s.gb; | |
717 | 145368 | MpegEncContext *s = &v->s; | |
718 | 145368 | int dc_pred_dir = 0; /* Direction of the DC prediction used */ | |
719 | int i; | ||
720 | 145368 | int16_t *dc_val = NULL; | |
721 | int16_t *ac_val, *ac_val2; | ||
722 | int dcdiff; | ||
723 | 145368 | int a_avail = v->a_avail, c_avail = v->c_avail; | |
724 | 145368 | int use_pred = s->ac_pred; | |
725 | int scale; | ||
726 | 145368 | int q1, q2 = 0; | |
727 | 145368 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
728 | 145368 | int quant = FFABS(mquant); | |
729 | |||
730 | /* Get DC differential */ | ||
731 | 145368 | dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_vlc[s->dc_table_index][n >= 4], | |
732 | MSMP4_DC_VLC_BITS, 3); | ||
733 |
2/2✓ Branch 0 taken 100398 times.
✓ Branch 1 taken 44970 times.
|
145368 | if (dcdiff) { |
734 |
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; |
735 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 100396 times.
|
100398 | if (dcdiff == 119 /* ESC index value */) { |
736 | 2 | dcdiff = get_bits(gb, 8 + m); | |
737 | } else { | ||
738 |
2/2✓ Branch 0 taken 13090 times.
✓ Branch 1 taken 87306 times.
|
100396 | if (m) |
739 | 13090 | dcdiff = (dcdiff << m) + get_bits(gb, m) - ((1 << m) - 1); | |
740 | } | ||
741 |
2/2✓ Branch 1 taken 51735 times.
✓ Branch 2 taken 48663 times.
|
100398 | if (get_bits1(gb)) |
742 | 51735 | dcdiff = -dcdiff; | |
743 | } | ||
744 | |||
745 | /* Prediction */ | ||
746 | 145368 | dcdiff += ff_vc1_pred_dc(&v->s, v->overlap, quant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir); | |
747 | 145368 | *dc_val = dcdiff; | |
748 | |||
749 | /* Store the quantized DC coeff, used for prediction */ | ||
750 | 145368 | block[0] = dcdiff * s->y_dc_scale; | |
751 | |||
752 | /* check if AC is needed at all */ | ||
753 |
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) |
754 | 84 | use_pred = 0; | |
755 | |||
756 |
2/2✓ Branch 0 taken 47448 times.
✓ Branch 1 taken 97920 times.
|
145368 | scale = quant * 2 + ((mquant < 0) ? 0 : v->halfpq); |
757 | |||
758 | 145368 | ac_val = s->ac_val[0][s->block_index[n]]; | |
759 | 145368 | ac_val2 = ac_val; | |
760 |
2/2✓ Branch 0 taken 96277 times.
✓ Branch 1 taken 49091 times.
|
145368 | if (dc_pred_dir) // left |
761 | 96277 | ac_val -= 16; | |
762 | else // top | ||
763 | 49091 | ac_val -= 16 * s->block_wrap[n]; | |
764 | |||
765 | 145368 | q1 = s->cur_pic.qscale_table[mb_pos]; | |
766 |
2/2✓ Branch 0 taken 24228 times.
✓ Branch 1 taken 121140 times.
|
145368 | if (n == 3) |
767 | 24228 | q2 = q1; | |
768 |
2/2✓ Branch 0 taken 81287 times.
✓ Branch 1 taken 39853 times.
|
121140 | else if (dc_pred_dir) { |
769 |
2/2✓ Branch 0 taken 16438 times.
✓ Branch 1 taken 64849 times.
|
81287 | if (n == 1) |
770 | 16438 | q2 = q1; | |
771 |
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) |
772 | 64765 | q2 = s->cur_pic.qscale_table[mb_pos - 1]; | |
773 | } else { | ||
774 |
2/2✓ Branch 0 taken 9816 times.
✓ Branch 1 taken 30037 times.
|
39853 | if (n == 2) |
775 | 9816 | q2 = q1; | |
776 |
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) |
777 | 30037 | q2 = s->cur_pic.qscale_table[mb_pos - s->mb_stride]; | |
778 | } | ||
779 | |||
780 | //AC Decoding | ||
781 | 145368 | i = 1; | |
782 | |||
783 |
2/2✓ Branch 0 taken 131297 times.
✓ Branch 1 taken 14071 times.
|
145368 | if (coded) { |
784 | 131297 | int last = 0, skip, value; | |
785 | const uint8_t *zz_table; | ||
786 | int k; | ||
787 | |||
788 |
2/2✓ Branch 0 taken 32458 times.
✓ Branch 1 taken 98839 times.
|
131297 | if (v->s.ac_pred) { |
789 |
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) { |
790 | 6 | zz_table = v->zzi_8x8; | |
791 | } else { | ||
792 |
2/2✓ Branch 0 taken 11944 times.
✓ Branch 1 taken 20508 times.
|
32452 | if (!dc_pred_dir) // top |
793 | 11944 | zz_table = v->zz_8x8[2]; | |
794 | else // left | ||
795 | 20508 | zz_table = v->zz_8x8[3]; | |
796 | } | ||
797 | } else { | ||
798 |
2/2✓ Branch 0 taken 25079 times.
✓ Branch 1 taken 73760 times.
|
98839 | if (v->fcm != ILACE_FRAME) |
799 | 25079 | zz_table = v->zz_8x8[1]; | |
800 | else | ||
801 | 73760 | zz_table = v->zzi_8x8; | |
802 | } | ||
803 | |||
804 |
2/2✓ Branch 0 taken 1562576 times.
✓ Branch 1 taken 131297 times.
|
1693873 | while (!last) { |
805 | 1562576 | int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); | |
806 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1562576 times.
|
1562576 | if (ret < 0) |
807 | ✗ | return ret; | |
808 | 1562576 | i += skip; | |
809 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1562576 times.
|
1562576 | if (i > 63) |
810 | ✗ | break; | |
811 | 1562576 | block[zz_table[i++]] = value; | |
812 | } | ||
813 | |||
814 | /* apply AC prediction if needed */ | ||
815 |
2/2✓ Branch 0 taken 32434 times.
✓ Branch 1 taken 98863 times.
|
131297 | if (use_pred) { |
816 | int sh; | ||
817 |
2/2✓ Branch 0 taken 20490 times.
✓ Branch 1 taken 11944 times.
|
32434 | if (dc_pred_dir) { // left |
818 | 20490 | sh = v->left_blk_sh; | |
819 | } else { // top | ||
820 | 11944 | sh = v->top_blk_sh; | |
821 | 11944 | ac_val += 8; | |
822 | } | ||
823 | /* scale predictors if needed*/ | ||
824 |
2/2✓ Branch 0 taken 12022 times.
✓ Branch 1 taken 20412 times.
|
32434 | q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; |
825 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 32434 times.
|
32434 | if (q1 < 1) |
826 | ✗ | return AVERROR_INVALIDDATA; | |
827 |
1/2✓ Branch 0 taken 32434 times.
✗ Branch 1 not taken.
|
32434 | if (q2) |
828 |
2/2✓ Branch 0 taken 12022 times.
✓ Branch 1 taken 20412 times.
|
32434 | q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; |
829 |
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) { |
830 |
2/2✓ Branch 0 taken 14238 times.
✓ Branch 1 taken 2034 times.
|
16272 | for (k = 1; k < 8; k++) |
831 | 14238 | block[k << sh] += (int)(ac_val[k] * (unsigned)q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
832 | } else { | ||
833 |
2/2✓ Branch 0 taken 212800 times.
✓ Branch 1 taken 30400 times.
|
243200 | for (k = 1; k < 8; k++) |
834 | 212800 | block[k << sh] += ac_val[k]; | |
835 | } | ||
836 | } | ||
837 | /* save AC coeffs for further prediction */ | ||
838 |
2/2✓ Branch 0 taken 919079 times.
✓ Branch 1 taken 131297 times.
|
1050376 | for (k = 1; k < 8; k++) { |
839 | 919079 | ac_val2[k ] = block[k << v->left_blk_sh]; | |
840 | 919079 | ac_val2[k + 8] = block[k << v->top_blk_sh]; | |
841 | } | ||
842 | |||
843 | /* scale AC coeffs */ | ||
844 |
2/2✓ Branch 0 taken 8271711 times.
✓ Branch 1 taken 131297 times.
|
8403008 | for (k = 1; k < 64; k++) |
845 |
2/2✓ Branch 0 taken 1560534 times.
✓ Branch 1 taken 6711177 times.
|
8271711 | if (block[k]) { |
846 | 1560534 | block[k] *= scale; | |
847 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1560534 times.
|
1560534 | if (!v->pquantizer) |
848 | ✗ | block[k] += (block[k] < 0) ? -quant : quant; | |
849 | } | ||
850 | |||
851 | } else { // no AC coeffs | ||
852 | int k; | ||
853 | |||
854 | 14071 | memset(ac_val2, 0, 16 * 2); | |
855 | |||
856 | /* apply AC prediction if needed */ | ||
857 |
2/2✓ Branch 0 taken 3290 times.
✓ Branch 1 taken 10781 times.
|
14071 | if (use_pred) { |
858 | int sh; | ||
859 |
2/2✓ Branch 0 taken 2833 times.
✓ Branch 1 taken 457 times.
|
3290 | if (dc_pred_dir) { // left |
860 | 2833 | sh = v->left_blk_sh; | |
861 | } else { // top | ||
862 | 457 | sh = v->top_blk_sh; | |
863 | 457 | ac_val += 8; | |
864 | 457 | ac_val2 += 8; | |
865 | } | ||
866 | 3290 | memcpy(ac_val2, ac_val, 8 * 2); | |
867 |
2/2✓ Branch 0 taken 2564 times.
✓ Branch 1 taken 726 times.
|
3290 | q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; |
868 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3290 times.
|
3290 | if (q1 < 1) |
869 | ✗ | return AVERROR_INVALIDDATA; | |
870 |
1/2✓ Branch 0 taken 3290 times.
✗ Branch 1 not taken.
|
3290 | if (q2) |
871 |
2/2✓ Branch 0 taken 2564 times.
✓ Branch 1 taken 726 times.
|
3290 | q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; |
872 |
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) { |
873 |
2/2✓ Branch 0 taken 1470 times.
✓ Branch 1 taken 210 times.
|
1680 | for (k = 1; k < 8; k++) |
874 | 1470 | ac_val2[k] = (int)(ac_val2[k] * q2 * (unsigned)ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
875 | } | ||
876 |
2/2✓ Branch 0 taken 23030 times.
✓ Branch 1 taken 3290 times.
|
26320 | for (k = 1; k < 8; k++) { |
877 | 23030 | block[k << sh] = ac_val2[k] * scale; | |
878 |
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]) |
879 | ✗ | block[k << sh] += (block[k << sh] < 0) ? -quant : quant; | |
880 | } | ||
881 | } | ||
882 | } | ||
883 |
2/2✓ Branch 0 taken 35724 times.
✓ Branch 1 taken 109644 times.
|
145368 | if (use_pred) i = 63; |
884 | 145368 | s->block_last_index[n] = i; | |
885 | |||
886 | 145368 | return 0; | |
887 | } | ||
888 | |||
889 | /** Decode intra block in inter frames - more generic version than vc1_decode_i_block | ||
890 | * @param v VC1Context | ||
891 | * @param block block to decode | ||
892 | * @param[in] n subblock index | ||
893 | * @param coded are AC coeffs present or not | ||
894 | * @param mquant block quantizer | ||
895 | * @param codingset set of VLC to decode data | ||
896 | */ | ||
897 | 236242 | static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n, | |
898 | int coded, int mquant, int codingset) | ||
899 | { | ||
900 | 236242 | GetBitContext *gb = &v->s.gb; | |
901 | 236242 | MpegEncContext *s = &v->s; | |
902 | 236242 | int dc_pred_dir = 0; /* Direction of the DC prediction used */ | |
903 | int i; | ||
904 | 236242 | int16_t *dc_val = NULL; | |
905 | int16_t *ac_val, *ac_val2; | ||
906 | int dcdiff; | ||
907 | 236242 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
908 | 236242 | int a_avail = v->a_avail, c_avail = v->c_avail; | |
909 | 236242 | int use_pred = s->ac_pred; | |
910 | int scale; | ||
911 | 236242 | int q1, q2 = 0; | |
912 | 236242 | int quant = FFABS(mquant); | |
913 | |||
914 | 236242 | s->bdsp.clear_block(block); | |
915 | |||
916 | /* XXX: Guard against dumb values of mquant */ | ||
917 | 236242 | quant = av_clip_uintp2(quant, 5); | |
918 | |||
919 | /* Set DC scale - y and c use the same so we only set y */ | ||
920 | 236242 | s->y_dc_scale = ff_wmv3_dc_scale_table[quant]; | |
921 | |||
922 | /* Get DC differential */ | ||
923 | 236242 | dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_vlc[s->dc_table_index][n >= 4], | |
924 | MSMP4_DC_VLC_BITS, 3); | ||
925 |
2/2✓ Branch 0 taken 190507 times.
✓ Branch 1 taken 45735 times.
|
236242 | if (dcdiff) { |
926 |
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; |
927 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 190504 times.
|
190507 | if (dcdiff == 119 /* ESC index value */) { |
928 | 3 | dcdiff = get_bits(gb, 8 + m); | |
929 | } else { | ||
930 |
2/2✓ Branch 0 taken 18284 times.
✓ Branch 1 taken 172220 times.
|
190504 | if (m) |
931 | 18284 | dcdiff = (dcdiff << m) + get_bits(gb, m) - ((1 << m) - 1); | |
932 | } | ||
933 |
2/2✓ Branch 1 taken 106640 times.
✓ Branch 2 taken 83867 times.
|
190507 | if (get_bits1(gb)) |
934 | 106640 | dcdiff = -dcdiff; | |
935 | } | ||
936 | |||
937 | /* Prediction */ | ||
938 | 236242 | dcdiff += ff_vc1_pred_dc(&v->s, v->overlap, quant, n, a_avail, c_avail, &dc_val, &dc_pred_dir); | |
939 | 236242 | *dc_val = dcdiff; | |
940 | |||
941 | /* Store the quantized DC coeff, used for prediction */ | ||
942 | 236242 | block[0] = dcdiff * s->y_dc_scale; | |
943 | |||
944 | //AC Decoding | ||
945 | 236242 | i = 1; | |
946 | |||
947 | /* check if AC is needed at all and adjust direction if needed */ | ||
948 |
2/2✓ Branch 0 taken 109869 times.
✓ Branch 1 taken 126373 times.
|
236242 | if (!a_avail) dc_pred_dir = 1; |
949 |
2/2✓ Branch 0 taken 93175 times.
✓ Branch 1 taken 143067 times.
|
236242 | if (!c_avail) dc_pred_dir = 0; |
950 |
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; |
951 | 236242 | ac_val = s->ac_val[0][s->block_index[n]]; | |
952 | 236242 | ac_val2 = ac_val; | |
953 | |||
954 |
2/2✓ Branch 0 taken 232678 times.
✓ Branch 1 taken 3564 times.
|
236242 | scale = quant * 2 + ((mquant < 0) ? 0 : v->halfpq); |
955 | |||
956 |
2/2✓ Branch 0 taken 113675 times.
✓ Branch 1 taken 122567 times.
|
236242 | if (dc_pred_dir) //left |
957 | 113675 | ac_val -= 16; | |
958 | else //top | ||
959 | 122567 | ac_val -= 16 * s->block_wrap[n]; | |
960 | |||
961 | 236242 | q1 = s->cur_pic.qscale_table[mb_pos]; | |
962 |
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) |
963 | 113596 | q2 = s->cur_pic.qscale_table[mb_pos - 1]; | |
964 |
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) |
965 | 67664 | q2 = s->cur_pic.qscale_table[mb_pos - s->mb_stride]; | |
966 |
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) |
967 | 34090 | q2 = q1; | |
968 |
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) |
969 | 28445 | q2 = q1; | |
970 |
2/2✓ Branch 0 taken 39896 times.
✓ Branch 1 taken 196346 times.
|
236242 | if (n == 3) q2 = q1; |
971 | |||
972 |
2/2✓ Branch 0 taken 163776 times.
✓ Branch 1 taken 72466 times.
|
236242 | if (coded) { |
973 | 163776 | int last = 0, skip, value; | |
974 | int k; | ||
975 | |||
976 |
2/2✓ Branch 0 taken 1543069 times.
✓ Branch 1 taken 163774 times.
|
1706843 | while (!last) { |
977 | 1543069 | int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); | |
978 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1543069 times.
|
1543069 | if (ret < 0) |
979 | ✗ | return ret; | |
980 | 1543069 | i += skip; | |
981 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1543067 times.
|
1543069 | if (i > 63) |
982 | 2 | break; | |
983 |
2/2✓ Branch 0 taken 925417 times.
✓ Branch 1 taken 617650 times.
|
1543067 | if (v->fcm == PROGRESSIVE) |
984 | 925417 | block[v->zz_8x8[0][i++]] = value; | |
985 | else { | ||
986 |
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)) { |
987 |
2/2✓ Branch 0 taken 8623 times.
✓ Branch 1 taken 10565 times.
|
19188 | if (!dc_pred_dir) // top |
988 | 8623 | block[v->zz_8x8[2][i++]] = value; | |
989 | else // left | ||
990 | 10565 | block[v->zz_8x8[3][i++]] = value; | |
991 | } else { | ||
992 | 598462 | block[v->zzi_8x8[i++]] = value; | |
993 | } | ||
994 | } | ||
995 | } | ||
996 | |||
997 | /* apply AC prediction if needed */ | ||
998 |
2/2✓ Branch 0 taken 43023 times.
✓ Branch 1 taken 120753 times.
|
163776 | if (use_pred) { |
999 | /* scale predictors if needed*/ | ||
1000 |
2/2✓ Branch 0 taken 42128 times.
✓ Branch 1 taken 895 times.
|
43023 | q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; |
1001 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 43023 times.
|
43023 | if (q1 < 1) |
1002 | ✗ | return AVERROR_INVALIDDATA; | |
1003 |
1/2✓ Branch 0 taken 43023 times.
✗ Branch 1 not taken.
|
43023 | if (q2) |
1004 |
2/2✓ Branch 0 taken 42018 times.
✓ Branch 1 taken 1005 times.
|
43023 | q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; |
1005 |
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) { |
1006 |
2/2✓ Branch 0 taken 235 times.
✓ Branch 1 taken 119 times.
|
354 | if (dc_pred_dir) { // left |
1007 |
2/2✓ Branch 0 taken 1645 times.
✓ Branch 1 taken 235 times.
|
1880 | for (k = 1; k < 8; k++) |
1008 | 1645 | block[k << v->left_blk_sh] += (int)(ac_val[k] * q2 * (unsigned)ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
1009 | } else { //top | ||
1010 |
2/2✓ Branch 0 taken 833 times.
✓ Branch 1 taken 119 times.
|
952 | for (k = 1; k < 8; k++) |
1011 | 833 | block[k << v->top_blk_sh] += (int)(ac_val[k + 8] * q2 * (unsigned)ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
1012 | } | ||
1013 | } else { | ||
1014 |
2/2✓ Branch 0 taken 25655 times.
✓ Branch 1 taken 17014 times.
|
42669 | if (dc_pred_dir) { // left |
1015 |
2/2✓ Branch 0 taken 179585 times.
✓ Branch 1 taken 25655 times.
|
205240 | for (k = 1; k < 8; k++) |
1016 | 179585 | block[k << v->left_blk_sh] += ac_val[k]; | |
1017 | } else { // top | ||
1018 |
2/2✓ Branch 0 taken 119098 times.
✓ Branch 1 taken 17014 times.
|
136112 | for (k = 1; k < 8; k++) |
1019 | 119098 | block[k << v->top_blk_sh] += ac_val[k + 8]; | |
1020 | } | ||
1021 | } | ||
1022 | } | ||
1023 | /* save AC coeffs for further prediction */ | ||
1024 |
2/2✓ Branch 0 taken 1146432 times.
✓ Branch 1 taken 163776 times.
|
1310208 | for (k = 1; k < 8; k++) { |
1025 | 1146432 | ac_val2[k ] = block[k << v->left_blk_sh]; | |
1026 | 1146432 | ac_val2[k + 8] = block[k << v->top_blk_sh]; | |
1027 | } | ||
1028 | |||
1029 | /* scale AC coeffs */ | ||
1030 |
2/2✓ Branch 0 taken 10317888 times.
✓ Branch 1 taken 163776 times.
|
10481664 | for (k = 1; k < 64; k++) |
1031 |
2/2✓ Branch 0 taken 1546034 times.
✓ Branch 1 taken 8771854 times.
|
10317888 | if (block[k]) { |
1032 | 1546034 | block[k] *= scale; | |
1033 |
2/2✓ Branch 0 taken 28424 times.
✓ Branch 1 taken 1517610 times.
|
1546034 | if (!v->pquantizer) |
1034 |
2/2✓ Branch 0 taken 14356 times.
✓ Branch 1 taken 14068 times.
|
28424 | block[k] += (block[k] < 0) ? -quant : quant; |
1035 | } | ||
1036 | |||
1037 |
2/2✓ Branch 0 taken 43023 times.
✓ Branch 1 taken 120753 times.
|
163776 | if (use_pred) i = 63; |
1038 | } else { // no AC coeffs | ||
1039 | int k; | ||
1040 | |||
1041 | 72466 | memset(ac_val2, 0, 16 * 2); | |
1042 |
2/2✓ Branch 0 taken 34095 times.
✓ Branch 1 taken 38371 times.
|
72466 | if (dc_pred_dir) { // left |
1043 |
2/2✓ Branch 0 taken 6724 times.
✓ Branch 1 taken 27371 times.
|
34095 | if (use_pred) { |
1044 | 6724 | memcpy(ac_val2, ac_val, 8 * 2); | |
1045 |
2/2✓ Branch 0 taken 5988 times.
✓ Branch 1 taken 736 times.
|
6724 | q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; |
1046 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6724 times.
|
6724 | if (q1 < 1) |
1047 | ✗ | return AVERROR_INVALIDDATA; | |
1048 |
1/2✓ Branch 0 taken 6724 times.
✗ Branch 1 not taken.
|
6724 | if (q2) |
1049 |
2/2✓ Branch 0 taken 5988 times.
✓ Branch 1 taken 736 times.
|
6724 | q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; |
1050 |
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) { |
1051 |
2/2✓ Branch 0 taken 224 times.
✓ Branch 1 taken 32 times.
|
256 | for (k = 1; k < 8; k++) |
1052 | 224 | ac_val2[k] = (int)(ac_val2[k] * (unsigned)q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
1053 | } | ||
1054 | } | ||
1055 | } else { // top | ||
1056 |
2/2✓ Branch 0 taken 2674 times.
✓ Branch 1 taken 35697 times.
|
38371 | if (use_pred) { |
1057 | 2674 | memcpy(ac_val2 + 8, ac_val + 8, 8 * 2); | |
1058 |
2/2✓ Branch 0 taken 2580 times.
✓ Branch 1 taken 94 times.
|
2674 | q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; |
1059 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2674 times.
|
2674 | if (q1 < 1) |
1060 | ✗ | return AVERROR_INVALIDDATA; | |
1061 |
1/2✓ Branch 0 taken 2674 times.
✗ Branch 1 not taken.
|
2674 | if (q2) |
1062 |
2/2✓ Branch 0 taken 2581 times.
✓ Branch 1 taken 93 times.
|
2674 | q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; |
1063 |
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) { |
1064 |
2/2✓ Branch 0 taken 91 times.
✓ Branch 1 taken 13 times.
|
104 | for (k = 1; k < 8; k++) |
1065 | 91 | ac_val2[k + 8] = (int)(ac_val2[k + 8] * (unsigned)q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
1066 | } | ||
1067 | } | ||
1068 | } | ||
1069 | |||
1070 | /* apply AC prediction if needed */ | ||
1071 |
2/2✓ Branch 0 taken 9398 times.
✓ Branch 1 taken 63068 times.
|
72466 | if (use_pred) { |
1072 |
2/2✓ Branch 0 taken 6724 times.
✓ Branch 1 taken 2674 times.
|
9398 | if (dc_pred_dir) { // left |
1073 |
2/2✓ Branch 0 taken 47068 times.
✓ Branch 1 taken 6724 times.
|
53792 | for (k = 1; k < 8; k++) { |
1074 | 47068 | block[k << v->left_blk_sh] = ac_val2[k] * scale; | |
1075 |
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]) |
1076 |
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; |
1077 | } | ||
1078 | } else { // top | ||
1079 |
2/2✓ Branch 0 taken 18718 times.
✓ Branch 1 taken 2674 times.
|
21392 | for (k = 1; k < 8; k++) { |
1080 | 18718 | block[k << v->top_blk_sh] = ac_val2[k + 8] * scale; | |
1081 |
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]) |
1082 |
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; |
1083 | } | ||
1084 | } | ||
1085 | 9398 | i = 63; | |
1086 | } | ||
1087 | } | ||
1088 | 236242 | s->block_last_index[n] = i; | |
1089 | |||
1090 | 236242 | return 0; | |
1091 | } | ||
1092 | |||
1093 | /** Decode P block | ||
1094 | */ | ||
1095 | 705481 | static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n, | |
1096 | int mquant, int ttmb, int first_block, | ||
1097 | uint8_t *dst, int linesize, int skip_block, | ||
1098 | int *ttmb_out) | ||
1099 | { | ||
1100 | 705481 | MpegEncContext *s = &v->s; | |
1101 | 705481 | GetBitContext *gb = &s->gb; | |
1102 | int i, j; | ||
1103 | 705481 | int subblkpat = 0; | |
1104 | int scale, off, idx, last, skip, value; | ||
1105 | 705481 | int ttblk = ttmb & 7; | |
1106 | 705481 | int pat = 0; | |
1107 | 705481 | int quant = FFABS(mquant); | |
1108 | |||
1109 | 705481 | s->bdsp.clear_block(block); | |
1110 | |||
1111 |
2/2✓ Branch 0 taken 328239 times.
✓ Branch 1 taken 377242 times.
|
705481 | if (ttmb == -1) { |
1112 | 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)]; | |
1113 | } | ||
1114 |
2/2✓ Branch 0 taken 78333 times.
✓ Branch 1 taken 627148 times.
|
705481 | if (ttblk == TT_4X4) { |
1115 | 78333 | subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index], VC1_SUBBLKPAT_VLC_BITS, 1) + 1); | |
1116 | } | ||
1117 |
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) |
1118 |
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)) |
1119 |
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))) { |
1120 | 30797 | subblkpat = decode012(gb); | |
1121 |
2/2✓ Branch 0 taken 11209 times.
✓ Branch 1 taken 19588 times.
|
30797 | if (subblkpat) |
1122 | 11209 | subblkpat ^= 3; // swap decoded pattern bits | |
1123 |
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) |
1124 | 5739 | ttblk = TT_8X4; | |
1125 |
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) |
1126 | 3989 | ttblk = TT_4X8; | |
1127 | } | ||
1128 |
2/2✓ Branch 0 taken 675330 times.
✓ Branch 1 taken 30151 times.
|
705481 | scale = quant * 2 + ((mquant < 0) ? 0 : v->halfpq); |
1129 | |||
1130 | // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT | ||
1131 |
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) { |
1132 |
2/2✓ Branch 0 taken 18847 times.
✓ Branch 1 taken 20159 times.
|
39006 | subblkpat = 2 - (ttblk == TT_8X4_TOP); |
1133 | 39006 | ttblk = TT_8X4; | |
1134 | } | ||
1135 |
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) { |
1136 |
2/2✓ Branch 0 taken 23560 times.
✓ Branch 1 taken 24118 times.
|
47678 | subblkpat = 2 - (ttblk == TT_4X8_LEFT); |
1137 | 47678 | ttblk = TT_4X8; | |
1138 | } | ||
1139 |
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) { |
1140 | 353066 | case TT_8X8: | |
1141 | 353066 | pat = 0xF; | |
1142 | 353066 | i = 0; | |
1143 | 353066 | last = 0; | |
1144 |
2/2✓ Branch 0 taken 2080609 times.
✓ Branch 1 taken 353066 times.
|
2433675 | while (!last) { |
1145 | 2080609 | int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
1146 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2080609 times.
|
2080609 | if (ret < 0) |
1147 | ✗ | return ret; | |
1148 | 2080609 | i += skip; | |
1149 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2080609 times.
|
2080609 | if (i > 63) |
1150 | ✗ | break; | |
1151 |
2/2✓ Branch 0 taken 934770 times.
✓ Branch 1 taken 1145839 times.
|
2080609 | if (!v->fcm) |
1152 | 934770 | idx = v->zz_8x8[0][i++]; | |
1153 | else | ||
1154 | 1145839 | idx = v->zzi_8x8[i++]; | |
1155 | 2080609 | block[idx] = value * scale; | |
1156 |
2/2✓ Branch 0 taken 201139 times.
✓ Branch 1 taken 1879470 times.
|
2080609 | if (!v->pquantizer) |
1157 |
2/2✓ Branch 0 taken 100867 times.
✓ Branch 1 taken 100272 times.
|
201139 | block[idx] += (block[idx] < 0) ? -quant : quant; |
1158 | } | ||
1159 |
1/2✓ Branch 0 taken 353066 times.
✗ Branch 1 not taken.
|
353066 | if (!skip_block) { |
1160 |
2/2✓ Branch 0 taken 48601 times.
✓ Branch 1 taken 304465 times.
|
353066 | if (i == 1) |
1161 | 48601 | v->vc1dsp.vc1_inv_trans_8x8_dc(dst, linesize, block); | |
1162 | else { | ||
1163 | 304465 | v->vc1dsp.vc1_inv_trans_8x8(block); | |
1164 | 304465 | s->idsp.add_pixels_clamped(block, dst, linesize); | |
1165 | } | ||
1166 | } | ||
1167 | 353066 | break; | |
1168 | 78333 | case TT_4X4: | |
1169 | 78333 | pat = ~subblkpat & 0xF; | |
1170 |
2/2✓ Branch 0 taken 313332 times.
✓ Branch 1 taken 78333 times.
|
391665 | for (j = 0; j < 4; j++) { |
1171 | 313332 | last = subblkpat & (1 << (3 - j)); | |
1172 | 313332 | i = 0; | |
1173 | 313332 | off = (j & 1) * 4 + (j & 2) * 16; | |
1174 |
2/2✓ Branch 0 taken 512755 times.
✓ Branch 1 taken 313332 times.
|
826087 | while (!last) { |
1175 | 512755 | int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
1176 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 512755 times.
|
512755 | if (ret < 0) |
1177 | ✗ | return ret; | |
1178 | 512755 | i += skip; | |
1179 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 512755 times.
|
512755 | if (i > 15) |
1180 | ✗ | break; | |
1181 |
2/2✓ Branch 0 taken 283472 times.
✓ Branch 1 taken 229283 times.
|
512755 | if (!v->fcm) |
1182 | 283472 | idx = ff_vc1_simple_progressive_4x4_zz[i++]; | |
1183 | else | ||
1184 | 229283 | idx = ff_vc1_adv_interlaced_4x4_zz[i++]; | |
1185 | 512755 | block[idx + off] = value * scale; | |
1186 |
2/2✓ Branch 0 taken 9718 times.
✓ Branch 1 taken 503037 times.
|
512755 | if (!v->pquantizer) |
1187 |
2/2✓ Branch 0 taken 4862 times.
✓ Branch 1 taken 4856 times.
|
9718 | block[idx + off] += (block[idx + off] < 0) ? -quant : quant; |
1188 | } | ||
1189 |
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) { |
1190 |
2/2✓ Branch 0 taken 21249 times.
✓ Branch 1 taken 170152 times.
|
191401 | if (i == 1) |
1191 | 21249 | v->vc1dsp.vc1_inv_trans_4x4_dc(dst + (j & 1) * 4 + (j & 2) * 2 * linesize, linesize, block + off); | |
1192 | else | ||
1193 | 170152 | v->vc1dsp.vc1_inv_trans_4x4(dst + (j & 1) * 4 + (j & 2) * 2 * linesize, linesize, block + off); | |
1194 | } | ||
1195 | } | ||
1196 | 78333 | break; | |
1197 | 134484 | case TT_8X4: | |
1198 | 134484 | pat = ~((subblkpat & 2) * 6 + (subblkpat & 1) * 3) & 0xF; | |
1199 |
2/2✓ Branch 0 taken 268968 times.
✓ Branch 1 taken 134484 times.
|
403452 | for (j = 0; j < 2; j++) { |
1200 | 268968 | last = subblkpat & (1 << (1 - j)); | |
1201 | 268968 | i = 0; | |
1202 | 268968 | off = j * 32; | |
1203 |
2/2✓ Branch 0 taken 902639 times.
✓ Branch 1 taken 268968 times.
|
1171607 | while (!last) { |
1204 | 902639 | int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
1205 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 902639 times.
|
902639 | if (ret < 0) |
1206 | ✗ | return ret; | |
1207 | 902639 | i += skip; | |
1208 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 902639 times.
|
902639 | if (i > 31) |
1209 | ✗ | break; | |
1210 |
2/2✓ Branch 0 taken 470573 times.
✓ Branch 1 taken 432066 times.
|
902639 | if (!v->fcm) |
1211 | 470573 | idx = v->zz_8x4[i++] + off; | |
1212 | else | ||
1213 | 432066 | idx = ff_vc1_adv_interlaced_8x4_zz[i++] + off; | |
1214 | 902639 | block[idx] = value * scale; | |
1215 |
2/2✓ Branch 0 taken 9538 times.
✓ Branch 1 taken 893101 times.
|
902639 | if (!v->pquantizer) |
1216 |
2/2✓ Branch 0 taken 4864 times.
✓ Branch 1 taken 4674 times.
|
9538 | block[idx] += (block[idx] < 0) ? -quant : quant; |
1217 | } | ||
1218 |
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) { |
1219 |
2/2✓ Branch 0 taken 15847 times.
✓ Branch 1 taken 207385 times.
|
223232 | if (i == 1) |
1220 | 15847 | v->vc1dsp.vc1_inv_trans_8x4_dc(dst + j * 4 * linesize, linesize, block + off); | |
1221 | else | ||
1222 | 207385 | v->vc1dsp.vc1_inv_trans_8x4(dst + j * 4 * linesize, linesize, block + off); | |
1223 | } | ||
1224 | } | ||
1225 | 134484 | break; | |
1226 | 139598 | case TT_4X8: | |
1227 | 139598 | pat = ~(subblkpat * 5) & 0xF; | |
1228 |
2/2✓ Branch 0 taken 279196 times.
✓ Branch 1 taken 139598 times.
|
418794 | for (j = 0; j < 2; j++) { |
1229 | 279196 | last = subblkpat & (1 << (1 - j)); | |
1230 | 279196 | i = 0; | |
1231 | 279196 | off = j * 4; | |
1232 |
2/2✓ Branch 0 taken 882009 times.
✓ Branch 1 taken 279190 times.
|
1161199 | while (!last) { |
1233 | 882009 | int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
1234 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 882009 times.
|
882009 | if (ret < 0) |
1235 | ✗ | return ret; | |
1236 | 882009 | i += skip; | |
1237 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 882003 times.
|
882009 | if (i > 31) |
1238 | 6 | break; | |
1239 |
2/2✓ Branch 0 taken 432119 times.
✓ Branch 1 taken 449884 times.
|
882003 | if (!v->fcm) |
1240 | 432119 | idx = v->zz_4x8[i++] + off; | |
1241 | else | ||
1242 | 449884 | idx = ff_vc1_adv_interlaced_4x8_zz[i++] + off; | |
1243 | 882003 | block[idx] = value * scale; | |
1244 |
2/2✓ Branch 0 taken 10845 times.
✓ Branch 1 taken 871158 times.
|
882003 | if (!v->pquantizer) |
1245 |
2/2✓ Branch 0 taken 5474 times.
✓ Branch 1 taken 5371 times.
|
10845 | block[idx] += (block[idx] < 0) ? -quant : quant; |
1246 | } | ||
1247 |
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) { |
1248 |
2/2✓ Branch 0 taken 17934 times.
✓ Branch 1 taken 209105 times.
|
227039 | if (i == 1) |
1249 | 17934 | v->vc1dsp.vc1_inv_trans_4x8_dc(dst + j * 4, linesize, block + off); | |
1250 | else | ||
1251 | 209105 | v->vc1dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off); | |
1252 | } | ||
1253 | } | ||
1254 | 139598 | break; | |
1255 | } | ||
1256 |
2/2✓ Branch 0 taken 648016 times.
✓ Branch 1 taken 57465 times.
|
705481 | if (ttmb_out) |
1257 | 648016 | *ttmb_out |= ttblk << (n * 4); | |
1258 | 705481 | return pat; | |
1259 | } | ||
1260 | |||
1261 | /** @} */ // Macroblock group | ||
1262 | |||
1263 | static const uint8_t size_table[6] = { 0, 2, 3, 4, 5, 8 }; | ||
1264 | |||
1265 | /** Decode one P-frame MB | ||
1266 | */ | ||
1267 | 152608 | static int vc1_decode_p_mb(VC1Context *v) | |
1268 | { | ||
1269 | 152608 | MpegEncContext *s = &v->s; | |
1270 | 152608 | GetBitContext *gb = &s->gb; | |
1271 | int i, j; | ||
1272 | 152608 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
1273 | int cbp; /* cbp decoding stuff */ | ||
1274 | int mqdiff, mquant; /* MB quantization */ | ||
1275 | 152608 | int ttmb = v->ttfrm; /* MB Transform type */ | |
1276 | |||
1277 | 152608 | int mb_has_coeffs = 1; /* last_flag */ | |
1278 | int dmv_x, dmv_y; /* Differential MV components */ | ||
1279 | int index, index1; /* LUT indexes */ | ||
1280 | int val, sign; /* temp values */ | ||
1281 | 152608 | int first_block = 1; | |
1282 | int dst_idx, off; | ||
1283 | int skipped, fourmv; | ||
1284 | 152608 | int block_cbp = 0, pat, block_tt = 0, block_intra = 0; | |
1285 | int ret; | ||
1286 | |||
1287 | 152608 | mquant = v->pq; /* lossy initialization */ | |
1288 | |||
1289 |
2/2✓ Branch 0 taken 58770 times.
✓ Branch 1 taken 93838 times.
|
152608 | if (v->mv_type_is_raw) |
1290 | 58770 | fourmv = get_bits1(gb); | |
1291 | else | ||
1292 | 93838 | fourmv = v->mv_type_mb_plane[mb_pos]; | |
1293 |
2/2✓ Branch 0 taken 58470 times.
✓ Branch 1 taken 94138 times.
|
152608 | if (v->skip_is_raw) |
1294 | 58470 | skipped = get_bits1(gb); | |
1295 | else | ||
1296 | 94138 | skipped = v->s.mbskip_table[mb_pos]; | |
1297 | |||
1298 |
2/2✓ Branch 0 taken 126032 times.
✓ Branch 1 taken 26576 times.
|
152608 | if (!fourmv) { /* 1MV mode */ |
1299 |
2/2✓ Branch 0 taken 113910 times.
✓ Branch 1 taken 12122 times.
|
126032 | if (!skipped) { |
1300 |
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); |
1301 | |||
1302 |
2/2✓ Branch 0 taken 24987 times.
✓ Branch 1 taken 88923 times.
|
113910 | if (s->mb_intra) { |
1303 | 24987 | s->cur_pic.motion_val[1][s->block_index[0]][0] = 0; | |
1304 | 24987 | s->cur_pic.motion_val[1][s->block_index[0]][1] = 0; | |
1305 | } | ||
1306 |
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; |
1307 | 113910 | ff_vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0); | |
1308 | |||
1309 | /* FIXME Set DC val for inter block ? */ | ||
1310 |
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) { |
1311 |
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(); |
1312 | 2748 | s->ac_pred = get_bits1(gb); | |
1313 | 2748 | cbp = 0; | |
1314 |
2/2✓ Branch 0 taken 92378 times.
✓ Branch 1 taken 18784 times.
|
111162 | } else if (mb_has_coeffs) { |
1315 |
2/2✓ Branch 0 taken 22239 times.
✓ Branch 1 taken 70139 times.
|
92378 | if (s->mb_intra) |
1316 | 22239 | s->ac_pred = get_bits1(gb); | |
1317 | 92378 | cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); | |
1318 |
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(); |
1319 | } else { | ||
1320 | 18784 | mquant = v->pq; | |
1321 | 18784 | cbp = 0; | |
1322 | } | ||
1323 | 113910 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
1324 | |||
1325 |
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) |
1326 | 42234 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], | |
1327 | VC1_TTMB_VLC_BITS, 2); | ||
1328 |
2/2✓ Branch 0 taken 88923 times.
✓ Branch 1 taken 24987 times.
|
113910 | if (!s->mb_intra) ff_vc1_mc_1mv(v, 0); |
1329 | 113910 | dst_idx = 0; | |
1330 |
2/2✓ Branch 0 taken 683460 times.
✓ Branch 1 taken 113910 times.
|
797370 | for (i = 0; i < 6; i++) { |
1331 | 683460 | s->dc_val[0][s->block_index[i]] = 0; | |
1332 | 683460 | dst_idx += i >> 2; | |
1333 | 683460 | val = ((cbp >> (5 - i)) & 1); | |
1334 |
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); |
1335 | 683460 | v->mb_type[0][s->block_index[i]] = s->mb_intra; | |
1336 |
2/2✓ Branch 0 taken 149922 times.
✓ Branch 1 taken 533538 times.
|
683460 | if (s->mb_intra) { |
1337 | /* check if prediction blocks A and C are available */ | ||
1338 | 149922 | v->a_avail = v->c_avail = 0; | |
1339 |
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) |
1340 | 110530 | v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; | |
1341 |
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) |
1342 | 147306 | v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
1343 | |||
1344 | 149922 | ret = vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, val, mquant, | |
1345 |
2/2✓ Branch 0 taken 49974 times.
✓ Branch 1 taken 99948 times.
|
149922 | (i & 4) ? v->codingset2 : v->codingset); |
1346 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 149922 times.
|
149922 | if (ret < 0) |
1347 | ✗ | return ret; | |
1348 | if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) | ||
1349 | continue; | ||
1350 | 149922 | v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]); | |
1351 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 149922 times.
|
149922 | if (v->rangeredfrm) |
1352 | ✗ | for (j = 0; j < 64; j++) | |
1353 | ✗ | v->block[v->cur_blk_idx][block_map[i]][j] *= 2; | |
1354 | 149922 | block_cbp |= 0xF << (i << 2); | |
1355 | 149922 | block_intra |= 1 << i; | |
1356 |
2/2✓ Branch 0 taken 219478 times.
✓ Branch 1 taken 314060 times.
|
533538 | } else if (val) { |
1357 | 658434 | pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb, first_block, | |
1358 |
2/2✓ Branch 0 taken 33600 times.
✓ Branch 1 taken 185878 times.
|
219478 | s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize, |
1359 | CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt); | ||
1360 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 219478 times.
|
219478 | if (pat < 0) |
1361 | ✗ | return pat; | |
1362 | 219478 | block_cbp |= pat << (i << 2); | |
1363 |
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) |
1364 | 87522 | ttmb = -1; | |
1365 | 219478 | first_block = 0; | |
1366 | } | ||
1367 | } | ||
1368 | } else { // skipped | ||
1369 | 12122 | s->mb_intra = 0; | |
1370 |
2/2✓ Branch 0 taken 72732 times.
✓ Branch 1 taken 12122 times.
|
84854 | for (i = 0; i < 6; i++) { |
1371 | 72732 | v->mb_type[0][s->block_index[i]] = 0; | |
1372 | 72732 | s->dc_val[0][s->block_index[i]] = 0; | |
1373 | } | ||
1374 | 12122 | s->cur_pic.mb_type[mb_pos] = MB_TYPE_SKIP; | |
1375 | 12122 | s->cur_pic.qscale_table[mb_pos] = 0; | |
1376 | 12122 | ff_vc1_pred_mv(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0); | |
1377 | 12122 | ff_vc1_mc_1mv(v, 0); | |
1378 | } | ||
1379 | } else { // 4MV mode | ||
1380 |
2/2✓ Branch 0 taken 22855 times.
✓ Branch 1 taken 3721 times.
|
26576 | if (!skipped /* unskipped MB */) { |
1381 | 22855 | int intra_count = 0, coded_inter = 0; | |
1382 | int is_intra[6], is_coded[6]; | ||
1383 | /* Get CBPCY */ | ||
1384 | 22855 | cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); | |
1385 |
2/2✓ Branch 0 taken 137130 times.
✓ Branch 1 taken 22855 times.
|
159985 | for (i = 0; i < 6; i++) { |
1386 | 137130 | val = ((cbp >> (5 - i)) & 1); | |
1387 | 137130 | s->dc_val[0][s->block_index[i]] = 0; | |
1388 | 137130 | s->mb_intra = 0; | |
1389 |
2/2✓ Branch 0 taken 91420 times.
✓ Branch 1 taken 45710 times.
|
137130 | if (i < 4) { |
1390 | 91420 | dmv_x = dmv_y = 0; | |
1391 | 91420 | s->mb_intra = 0; | |
1392 | 91420 | mb_has_coeffs = 0; | |
1393 |
2/2✓ Branch 0 taken 71997 times.
✓ Branch 1 taken 19423 times.
|
91420 | if (val) { |
1394 |
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); |
1395 | } | ||
1396 | 91420 | ff_vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0); | |
1397 |
2/2✓ Branch 0 taken 80856 times.
✓ Branch 1 taken 10564 times.
|
91420 | if (!s->mb_intra) |
1398 | 80856 | ff_vc1_mc_4mv_luma(v, i, 0, 0); | |
1399 | 91420 | intra_count += s->mb_intra; | |
1400 | 91420 | is_intra[i] = s->mb_intra; | |
1401 | 91420 | is_coded[i] = mb_has_coeffs; | |
1402 | } | ||
1403 |
2/2✓ Branch 0 taken 45710 times.
✓ Branch 1 taken 91420 times.
|
137130 | if (i & 4) { |
1404 | 45710 | is_intra[i] = (intra_count >= 3); | |
1405 | 45710 | is_coded[i] = val; | |
1406 | } | ||
1407 |
2/2✓ Branch 0 taken 22855 times.
✓ Branch 1 taken 114275 times.
|
137130 | if (i == 4) |
1408 | 22855 | ff_vc1_mc_4mv_chroma(v, 0); | |
1409 | 137130 | v->mb_type[0][s->block_index[i]] = is_intra[i]; | |
1410 |
2/2✓ Branch 0 taken 52317 times.
✓ Branch 1 taken 84813 times.
|
137130 | if (!coded_inter) |
1411 | 52317 | coded_inter = !is_intra[i] & is_coded[i]; | |
1412 | } | ||
1413 | // if there are no coded blocks then don't do anything more | ||
1414 | 22855 | dst_idx = 0; | |
1415 |
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) |
1416 | 2699 | goto end; | |
1417 |
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(); |
1418 | 20156 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
1419 | /* test if block is intra and has pred */ | ||
1420 | { | ||
1421 | 20156 | int intrapred = 0; | |
1422 |
2/2✓ Branch 0 taken 106282 times.
✓ Branch 1 taken 16462 times.
|
122744 | for (i = 0; i < 6; i++) |
1423 |
2/2✓ Branch 0 taken 7257 times.
✓ Branch 1 taken 99025 times.
|
106282 | if (is_intra[i]) { |
1424 |
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]]) |
1425 |
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])) { |
1426 | 3694 | intrapred = 1; | |
1427 | 3694 | break; | |
1428 | } | ||
1429 | } | ||
1430 |
2/2✓ Branch 0 taken 3694 times.
✓ Branch 1 taken 16462 times.
|
20156 | if (intrapred) |
1431 | 3694 | s->ac_pred = get_bits1(gb); | |
1432 | else | ||
1433 | 16462 | s->ac_pred = 0; | |
1434 | } | ||
1435 |
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) |
1436 | 18220 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); | |
1437 |
2/2✓ Branch 0 taken 120936 times.
✓ Branch 1 taken 20156 times.
|
141092 | for (i = 0; i < 6; i++) { |
1438 | 120936 | dst_idx += i >> 2; | |
1439 |
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); |
1440 | 120936 | s->mb_intra = is_intra[i]; | |
1441 |
2/2✓ Branch 0 taken 13000 times.
✓ Branch 1 taken 107936 times.
|
120936 | if (is_intra[i]) { |
1442 | /* check if prediction blocks A and C are available */ | ||
1443 | 13000 | v->a_avail = v->c_avail = 0; | |
1444 |
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) |
1445 | 10021 | v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; | |
1446 |
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) |
1447 | 12804 | v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
1448 | |||
1449 | 13000 | ret = vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, is_coded[i], mquant, | |
1450 |
2/2✓ Branch 0 taken 2436 times.
✓ Branch 1 taken 10564 times.
|
13000 | (i & 4) ? v->codingset2 : v->codingset); |
1451 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 13000 times.
|
13000 | if (ret < 0) |
1452 | ✗ | return ret; | |
1453 | if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) | ||
1454 | continue; | ||
1455 | 13000 | v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]); | |
1456 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 13000 times.
|
13000 | if (v->rangeredfrm) |
1457 | ✗ | for (j = 0; j < 64; j++) | |
1458 | ✗ | v->block[v->cur_blk_idx][block_map[i]][j] *= 2; | |
1459 | 13000 | block_cbp |= 0xF << (i << 2); | |
1460 | 13000 | block_intra |= 1 << i; | |
1461 |
2/2✓ Branch 0 taken 66705 times.
✓ Branch 1 taken 41231 times.
|
107936 | } else if (is_coded[i]) { |
1462 | 200115 | pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb, | |
1463 | 66705 | first_block, s->dest[dst_idx] + off, | |
1464 |
2/2✓ Branch 0 taken 15468 times.
✓ Branch 1 taken 51237 times.
|
66705 | (i & 4) ? s->uvlinesize : s->linesize, |
1465 | CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), | ||
1466 | &block_tt); | ||
1467 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66705 times.
|
66705 | if (pat < 0) |
1468 | ✗ | return pat; | |
1469 | 66705 | block_cbp |= pat << (i << 2); | |
1470 |
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) |
1471 | 44004 | ttmb = -1; | |
1472 | 66705 | first_block = 0; | |
1473 | } | ||
1474 | } | ||
1475 | } else { // skipped MB | ||
1476 | 3721 | s->mb_intra = 0; | |
1477 | 3721 | s->cur_pic.qscale_table[mb_pos] = 0; | |
1478 |
2/2✓ Branch 0 taken 22326 times.
✓ Branch 1 taken 3721 times.
|
26047 | for (i = 0; i < 6; i++) { |
1479 | 22326 | v->mb_type[0][s->block_index[i]] = 0; | |
1480 | 22326 | s->dc_val[0][s->block_index[i]] = 0; | |
1481 | } | ||
1482 |
2/2✓ Branch 0 taken 14884 times.
✓ Branch 1 taken 3721 times.
|
18605 | for (i = 0; i < 4; i++) { |
1483 | 14884 | ff_vc1_pred_mv(v, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0); | |
1484 | 14884 | ff_vc1_mc_4mv_luma(v, i, 0, 0); | |
1485 | } | ||
1486 | 3721 | ff_vc1_mc_4mv_chroma(v, 0); | |
1487 | 3721 | s->cur_pic.qscale_table[mb_pos] = 0; | |
1488 | } | ||
1489 | } | ||
1490 | 152608 | end: | |
1491 |
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) |
1492 | ✗ | ff_vc1_p_overlap_filter(v); | |
1493 | 152608 | vc1_put_blocks_clamped(v, 1); | |
1494 | |||
1495 | 152608 | v->cbp[s->mb_x] = block_cbp; | |
1496 | 152608 | v->ttblk[s->mb_x] = block_tt; | |
1497 | 152608 | v->is_intra[s->mb_x] = block_intra; | |
1498 | |||
1499 | 152608 | return 0; | |
1500 | } | ||
1501 | |||
1502 | /* Decode one macroblock in an interlaced frame p picture */ | ||
1503 | |||
1504 | 16320 | static int vc1_decode_p_mb_intfr(VC1Context *v) | |
1505 | { | ||
1506 | 16320 | MpegEncContext *s = &v->s; | |
1507 | 16320 | GetBitContext *gb = &s->gb; | |
1508 | int i; | ||
1509 | 16320 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
1510 | 16320 | int cbp = 0; /* cbp decoding stuff */ | |
1511 | int mqdiff, mquant; /* MB quantization */ | ||
1512 | 16320 | int ttmb = v->ttfrm; /* MB Transform type */ | |
1513 | |||
1514 | 16320 | int mb_has_coeffs = 1; /* last_flag */ | |
1515 | int dmv_x, dmv_y; /* Differential MV components */ | ||
1516 | int val; /* temp value */ | ||
1517 | 16320 | int first_block = 1; | |
1518 | int dst_idx, off; | ||
1519 | 16320 | int skipped, fourmv = 0, twomv = 0; | |
1520 | 16320 | int block_cbp = 0, pat, block_tt = 0; | |
1521 | 16320 | int idx_mbmode = 0, mvbp; | |
1522 | int fieldtx; | ||
1523 | int ret; | ||
1524 | |||
1525 | 16320 | mquant = v->pq; /* Lossy initialization */ | |
1526 | |||
1527 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 16320 times.
|
16320 | if (v->skip_is_raw) |
1528 | ✗ | skipped = get_bits1(gb); | |
1529 | else | ||
1530 | 16320 | skipped = v->s.mbskip_table[mb_pos]; | |
1531 |
2/2✓ Branch 0 taken 16307 times.
✓ Branch 1 taken 13 times.
|
16320 | if (!skipped) { |
1532 |
1/2✓ Branch 0 taken 16307 times.
✗ Branch 1 not taken.
|
16307 | if (v->fourmvswitch) |
1533 | 16307 | idx_mbmode = get_vlc2(gb, v->mbmode_vlc, VC1_INTFR_4MV_MBMODE_VLC_BITS, 2); // try getting this done | |
1534 | else | ||
1535 | ✗ | idx_mbmode = get_vlc2(gb, v->mbmode_vlc, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); // in a single line | |
1536 |
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]) { |
1537 | /* store the motion vector type in a flag (useful later) */ | ||
1538 | 704 | case MV_PMODE_INTFR_4MV: | |
1539 | 704 | fourmv = 1; | |
1540 | 704 | v->blk_mv_type[s->block_index[0]] = 0; | |
1541 | 704 | v->blk_mv_type[s->block_index[1]] = 0; | |
1542 | 704 | v->blk_mv_type[s->block_index[2]] = 0; | |
1543 | 704 | v->blk_mv_type[s->block_index[3]] = 0; | |
1544 | 704 | break; | |
1545 | 1084 | case MV_PMODE_INTFR_4MV_FIELD: | |
1546 | 1084 | fourmv = 1; | |
1547 | 1084 | v->blk_mv_type[s->block_index[0]] = 1; | |
1548 | 1084 | v->blk_mv_type[s->block_index[1]] = 1; | |
1549 | 1084 | v->blk_mv_type[s->block_index[2]] = 1; | |
1550 | 1084 | v->blk_mv_type[s->block_index[3]] = 1; | |
1551 | 1084 | break; | |
1552 | 4797 | case MV_PMODE_INTFR_2MV_FIELD: | |
1553 | 4797 | twomv = 1; | |
1554 | 4797 | v->blk_mv_type[s->block_index[0]] = 1; | |
1555 | 4797 | v->blk_mv_type[s->block_index[1]] = 1; | |
1556 | 4797 | v->blk_mv_type[s->block_index[2]] = 1; | |
1557 | 4797 | v->blk_mv_type[s->block_index[3]] = 1; | |
1558 | 4797 | break; | |
1559 | 8046 | case MV_PMODE_INTFR_1MV: | |
1560 | 8046 | v->blk_mv_type[s->block_index[0]] = 0; | |
1561 | 8046 | v->blk_mv_type[s->block_index[1]] = 0; | |
1562 | 8046 | v->blk_mv_type[s->block_index[2]] = 0; | |
1563 | 8046 | v->blk_mv_type[s->block_index[3]] = 0; | |
1564 | 8046 | break; | |
1565 | } | ||
1566 |
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 |
1567 |
2/2✓ Branch 0 taken 6704 times.
✓ Branch 1 taken 1676 times.
|
8380 | for (i = 0; i < 4; i++) { |
1568 | 6704 | s->cur_pic.motion_val[1][s->block_index[i]][0] = 0; | |
1569 | 6704 | s->cur_pic.motion_val[1][s->block_index[i]][1] = 0; | |
1570 | } | ||
1571 | 1676 | v->is_intra[s->mb_x] = 0x3f; // Set the bitfield to all 1. | |
1572 | 1676 | s->mb_intra = 1; | |
1573 | 1676 | s->cur_pic.mb_type[mb_pos] = MB_TYPE_INTRA; | |
1574 | 1676 | fieldtx = v->fieldtx_plane[mb_pos] = get_bits1(gb); | |
1575 | 1676 | mb_has_coeffs = get_bits1(gb); | |
1576 |
2/2✓ Branch 0 taken 1615 times.
✓ Branch 1 taken 61 times.
|
1676 | if (mb_has_coeffs) |
1577 | 1615 | cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); | |
1578 | 1676 | v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb); | |
1579 |
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(); |
1580 | 1676 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
1581 | /* Set DC scale - y and c use the same so we only set y */ | ||
1582 | 1676 | s->y_dc_scale = ff_wmv3_dc_scale_table[FFABS(mquant)]; | |
1583 | 1676 | dst_idx = 0; | |
1584 |
2/2✓ Branch 0 taken 10056 times.
✓ Branch 1 taken 1676 times.
|
11732 | for (i = 0; i < 6; i++) { |
1585 | 10056 | v->a_avail = v->c_avail = 0; | |
1586 | 10056 | v->mb_type[0][s->block_index[i]] = 1; | |
1587 | 10056 | s->dc_val[0][s->block_index[i]] = 0; | |
1588 | 10056 | dst_idx += i >> 2; | |
1589 | 10056 | val = ((cbp >> (5 - i)) & 1); | |
1590 |
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) |
1591 | 9840 | v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; | |
1592 |
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) |
1593 | 10000 | v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
1594 | |||
1595 | 10056 | ret = vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, val, mquant, | |
1596 |
2/2✓ Branch 0 taken 3352 times.
✓ Branch 1 taken 6704 times.
|
10056 | (i & 4) ? v->codingset2 : v->codingset); |
1597 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10056 times.
|
10056 | if (ret < 0) |
1598 | ✗ | return ret; | |
1599 | if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) | ||
1600 | continue; | ||
1601 | 10056 | v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]); | |
1602 | 10056 | block_cbp |= 0xf << (i << 2); | |
1603 | } | ||
1604 | |||
1605 | } else { // inter MB | ||
1606 | 14631 | mb_has_coeffs = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][3]; | |
1607 |
2/2✓ Branch 0 taken 13330 times.
✓ Branch 1 taken 1301 times.
|
14631 | if (mb_has_coeffs) |
1608 | 13330 | cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); | |
1609 |
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) { |
1610 | 4797 | v->twomvbp = get_vlc2(gb, v->twomvbp_vlc, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1); | |
1611 | } else { | ||
1612 |
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) |
1613 |
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)) { |
1614 | 1788 | v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); | |
1615 | } | ||
1616 | } | ||
1617 | 14631 | s->mb_intra = v->is_intra[s->mb_x] = 0; | |
1618 |
2/2✓ Branch 0 taken 87786 times.
✓ Branch 1 taken 14631 times.
|
102417 | for (i = 0; i < 6; i++) |
1619 | 87786 | v->mb_type[0][s->block_index[i]] = 0; | |
1620 | 14631 | fieldtx = v->fieldtx_plane[mb_pos] = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][1]; | |
1621 | /* for all motion vector read MVDATA and motion compensate each block */ | ||
1622 | 14631 | dst_idx = 0; | |
1623 |
2/2✓ Branch 0 taken 1788 times.
✓ Branch 1 taken 12843 times.
|
14631 | if (fourmv) { |
1624 | 1788 | mvbp = v->fourmvbp; | |
1625 |
2/2✓ Branch 0 taken 7152 times.
✓ Branch 1 taken 1788 times.
|
8940 | for (i = 0; i < 4; i++) { |
1626 | 7152 | dmv_x = dmv_y = 0; | |
1627 |
2/2✓ Branch 0 taken 5798 times.
✓ Branch 1 taken 1354 times.
|
7152 | if (mvbp & (8 >> i)) |
1628 | 5798 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); | |
1629 | 7152 | ff_vc1_pred_mv_intfr(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, 0); | |
1630 | 7152 | ff_vc1_mc_4mv_luma(v, i, 0, 0); | |
1631 | } | ||
1632 | 1788 | ff_vc1_mc_4mv_chroma4(v, 0, 0, 0); | |
1633 |
2/2✓ Branch 0 taken 4797 times.
✓ Branch 1 taken 8046 times.
|
12843 | } else if (twomv) { |
1634 | 4797 | mvbp = v->twomvbp; | |
1635 | 4797 | dmv_x = dmv_y = 0; | |
1636 |
2/2✓ Branch 0 taken 4513 times.
✓ Branch 1 taken 284 times.
|
4797 | if (mvbp & 2) { |
1637 | 4513 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); | |
1638 | } | ||
1639 | 4797 | ff_vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 2, v->range_x, v->range_y, 0); | |
1640 | 4797 | ff_vc1_mc_4mv_luma(v, 0, 0, 0); | |
1641 | 4797 | ff_vc1_mc_4mv_luma(v, 1, 0, 0); | |
1642 | 4797 | dmv_x = dmv_y = 0; | |
1643 |
2/2✓ Branch 0 taken 4517 times.
✓ Branch 1 taken 280 times.
|
4797 | if (mvbp & 1) { |
1644 | 4517 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); | |
1645 | } | ||
1646 | 4797 | ff_vc1_pred_mv_intfr(v, 2, dmv_x, dmv_y, 2, v->range_x, v->range_y, 0); | |
1647 | 4797 | ff_vc1_mc_4mv_luma(v, 2, 0, 0); | |
1648 | 4797 | ff_vc1_mc_4mv_luma(v, 3, 0, 0); | |
1649 | 4797 | ff_vc1_mc_4mv_chroma4(v, 0, 0, 0); | |
1650 | } else { | ||
1651 | 8046 | mvbp = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][2]; | |
1652 | 8046 | dmv_x = dmv_y = 0; | |
1653 |
2/2✓ Branch 0 taken 7892 times.
✓ Branch 1 taken 154 times.
|
8046 | if (mvbp) { |
1654 | 7892 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); | |
1655 | } | ||
1656 | 8046 | ff_vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, 0); | |
1657 | 8046 | ff_vc1_mc_1mv(v, 0); | |
1658 | } | ||
1659 |
2/2✓ Branch 0 taken 13330 times.
✓ Branch 1 taken 1301 times.
|
14631 | if (cbp) |
1660 |
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 |
1661 | 14631 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
1662 |
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) |
1663 | 13330 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); | |
1664 |
2/2✓ Branch 0 taken 87786 times.
✓ Branch 1 taken 14631 times.
|
102417 | for (i = 0; i < 6; i++) { |
1665 | 87786 | s->dc_val[0][s->block_index[i]] = 0; | |
1666 | 87786 | dst_idx += i >> 2; | |
1667 | 87786 | val = ((cbp >> (5 - i)) & 1); | |
1668 |
2/2✓ Branch 0 taken 70050 times.
✓ Branch 1 taken 17736 times.
|
87786 | if (!fieldtx) |
1669 |
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); |
1670 | else | ||
1671 |
2/2✓ Branch 0 taken 11824 times.
✓ Branch 1 taken 5912 times.
|
17736 | off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize)); |
1672 |
2/2✓ Branch 0 taken 63627 times.
✓ Branch 1 taken 24159 times.
|
87786 | if (val) { |
1673 | 190881 | pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb, | |
1674 | 63627 | first_block, s->dest[dst_idx] + off, | |
1675 |
2/2✓ Branch 0 taken 20177 times.
✓ Branch 1 taken 43450 times.
|
63627 | (i & 4) ? s->uvlinesize : (s->linesize << fieldtx), |
1676 | CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt); | ||
1677 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 63627 times.
|
63627 | if (pat < 0) |
1678 | ✗ | return pat; | |
1679 | 63627 | block_cbp |= pat << (i << 2); | |
1680 |
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) |
1681 | 44047 | ttmb = -1; | |
1682 | 63627 | first_block = 0; | |
1683 | } | ||
1684 | } | ||
1685 | } | ||
1686 | } else { // skipped | ||
1687 | 13 | s->mb_intra = v->is_intra[s->mb_x] = 0; | |
1688 |
2/2✓ Branch 0 taken 78 times.
✓ Branch 1 taken 13 times.
|
91 | for (i = 0; i < 6; i++) { |
1689 | 78 | v->mb_type[0][s->block_index[i]] = 0; | |
1690 | 78 | s->dc_val[0][s->block_index[i]] = 0; | |
1691 | } | ||
1692 | 13 | s->cur_pic.mb_type[mb_pos] = MB_TYPE_SKIP; | |
1693 | 13 | s->cur_pic.qscale_table[mb_pos] = 0; | |
1694 | 13 | v->blk_mv_type[s->block_index[0]] = 0; | |
1695 | 13 | v->blk_mv_type[s->block_index[1]] = 0; | |
1696 | 13 | v->blk_mv_type[s->block_index[2]] = 0; | |
1697 | 13 | v->blk_mv_type[s->block_index[3]] = 0; | |
1698 | 13 | ff_vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, 0); | |
1699 | 13 | ff_vc1_mc_1mv(v, 0); | |
1700 | 13 | v->fieldtx_plane[mb_pos] = 0; | |
1701 | } | ||
1702 |
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) |
1703 | ✗ | ff_vc1_p_overlap_filter(v); | |
1704 | 16320 | vc1_put_blocks_clamped(v, 1); | |
1705 | |||
1706 | 16320 | v->cbp[s->mb_x] = block_cbp; | |
1707 | 16320 | v->ttblk[s->mb_x] = block_tt; | |
1708 | |||
1709 | 16320 | return 0; | |
1710 | } | ||
1711 | |||
1712 | 37920 | static int vc1_decode_p_mb_intfi(VC1Context *v) | |
1713 | { | ||
1714 | 37920 | MpegEncContext *s = &v->s; | |
1715 | 37920 | GetBitContext *gb = &s->gb; | |
1716 | int i; | ||
1717 | 37920 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
1718 | 37920 | int cbp = 0; /* cbp decoding stuff */ | |
1719 | int mqdiff, mquant; /* MB quantization */ | ||
1720 | 37920 | int ttmb = v->ttfrm; /* MB Transform type */ | |
1721 | |||
1722 | 37920 | int mb_has_coeffs = 1; /* last_flag */ | |
1723 | int dmv_x, dmv_y; /* Differential MV components */ | ||
1724 | int val; /* temp values */ | ||
1725 | 37920 | int first_block = 1; | |
1726 | int dst_idx, off; | ||
1727 | 37920 | int pred_flag = 0; | |
1728 | 37920 | int block_cbp = 0, pat, block_tt = 0; | |
1729 | 37920 | int idx_mbmode = 0; | |
1730 | int ret; | ||
1731 | |||
1732 | 37920 | mquant = v->pq; /* Lossy initialization */ | |
1733 | |||
1734 | 37920 | idx_mbmode = get_vlc2(gb, v->mbmode_vlc, VC1_IF_MBMODE_VLC_BITS, 2); | |
1735 |
2/2✓ Branch 0 taken 10225 times.
✓ Branch 1 taken 27695 times.
|
37920 | if (idx_mbmode <= 1) { // intra MB |
1736 | 10225 | v->is_intra[s->mb_x] = 0x3f; // Set the bitfield to all 1. | |
1737 | 10225 | s->mb_intra = 1; | |
1738 | 10225 | s->cur_pic.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0; | |
1739 | 10225 | s->cur_pic.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0; | |
1740 | 10225 | s->cur_pic.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA; | |
1741 |
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(); |
1742 | 10225 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
1743 | /* Set DC scale - y and c use the same so we only set y */ | ||
1744 | 10225 | s->y_dc_scale = ff_wmv3_dc_scale_table[FFABS(mquant)]; | |
1745 | 10225 | v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb); | |
1746 | 10225 | mb_has_coeffs = idx_mbmode & 1; | |
1747 |
2/2✓ Branch 0 taken 9472 times.
✓ Branch 1 taken 753 times.
|
10225 | if (mb_has_coeffs) |
1748 | 9472 | cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_ICBPCY_VLC_BITS, 2); | |
1749 | 10225 | dst_idx = 0; | |
1750 |
2/2✓ Branch 0 taken 61350 times.
✓ Branch 1 taken 10225 times.
|
71575 | for (i = 0; i < 6; i++) { |
1751 | 61350 | v->a_avail = v->c_avail = 0; | |
1752 | 61350 | v->mb_type[0][s->block_index[i]] = 1; | |
1753 | 61350 | s->dc_val[0][s->block_index[i]] = 0; | |
1754 | 61350 | dst_idx += i >> 2; | |
1755 | 61350 | val = ((cbp >> (5 - i)) & 1); | |
1756 |
6/6✓ Branch 0 taken 51125 times.
✓ Branch 1 taken 10225 times.
✓ Branch 2 taken 40900 times.
✓ Branch 3 taken 10225 times.
✓ Branch 4 taken 38332 times.
✓ Branch 5 taken 2568 times.
|
61350 | if (i == 2 || i == 3 || !s->first_slice_line) |
1757 | 58782 | v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; | |
1758 |
6/6✓ Branch 0 taken 51125 times.
✓ Branch 1 taken 10225 times.
✓ Branch 2 taken 40900 times.
✓ Branch 3 taken 10225 times.
✓ Branch 4 taken 40116 times.
✓ Branch 5 taken 784 times.
|
61350 | if (i == 1 || i == 3 || s->mb_x) |
1759 | 60566 | v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
1760 | |||
1761 | 61350 | ret = vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, val, mquant, | |
1762 |
2/2✓ Branch 0 taken 20450 times.
✓ Branch 1 taken 40900 times.
|
61350 | (i & 4) ? v->codingset2 : v->codingset); |
1763 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 61350 times.
|
61350 | if (ret < 0) |
1764 | ✗ | return ret; | |
1765 | if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) | ||
1766 | continue; | ||
1767 | 61350 | v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]); | |
1768 | 61350 | block_cbp |= 0xf << (i << 2); | |
1769 | } | ||
1770 | } else { | ||
1771 | 27695 | s->mb_intra = v->is_intra[s->mb_x] = 0; | |
1772 | 27695 | s->cur_pic.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16; | |
1773 |
2/2✓ Branch 0 taken 166170 times.
✓ Branch 1 taken 27695 times.
|
193865 | for (i = 0; i < 6; i++) |
1774 | 166170 | v->mb_type[0][s->block_index[i]] = 0; | |
1775 |
2/2✓ Branch 0 taken 20627 times.
✓ Branch 1 taken 7068 times.
|
27695 | if (idx_mbmode <= 5) { // 1-MV |
1776 | 20627 | dmv_x = dmv_y = pred_flag = 0; | |
1777 |
2/2✓ Branch 0 taken 15875 times.
✓ Branch 1 taken 4752 times.
|
20627 | if (idx_mbmode & 1) { |
1778 | 15875 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag); | |
1779 | } | ||
1780 | 20627 | ff_vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0); | |
1781 | 20627 | ff_vc1_mc_1mv(v, 0); | |
1782 | 20627 | mb_has_coeffs = !(idx_mbmode & 2); | |
1783 | } else { // 4-MV | ||
1784 | 7068 | v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); | |
1785 |
2/2✓ Branch 0 taken 28272 times.
✓ Branch 1 taken 7068 times.
|
35340 | for (i = 0; i < 4; i++) { |
1786 | 28272 | dmv_x = dmv_y = pred_flag = 0; | |
1787 |
2/2✓ Branch 0 taken 8553 times.
✓ Branch 1 taken 19719 times.
|
28272 | if (v->fourmvbp & (8 >> i)) |
1788 | 8553 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag); | |
1789 | 28272 | ff_vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0); | |
1790 | 28272 | ff_vc1_mc_4mv_luma(v, i, 0, 0); | |
1791 | } | ||
1792 | 7068 | ff_vc1_mc_4mv_chroma(v, 0); | |
1793 | 7068 | mb_has_coeffs = idx_mbmode & 1; | |
1794 | } | ||
1795 |
2/2✓ Branch 0 taken 20790 times.
✓ Branch 1 taken 6905 times.
|
27695 | if (mb_has_coeffs) |
1796 | 20790 | cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); | |
1797 |
2/2✓ Branch 0 taken 20790 times.
✓ Branch 1 taken 6905 times.
|
27695 | if (cbp) { |
1798 |
16/38✓ Branch 0 taken 12145 times.
✓ Branch 1 taken 8645 times.
✓ Branch 2 taken 12145 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12145 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3055 times.
✓ Branch 8 taken 9090 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 12145 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12145 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 12145 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 12145 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 12145 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 12145 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 12145 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 12145 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 12145 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 40 taken 12145 times.
|
20790 | GET_MQUANT(); |
1799 | } | ||
1800 | 27695 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
1801 |
3/4✓ Branch 0 taken 27695 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 20790 times.
✓ Branch 3 taken 6905 times.
|
27695 | if (!v->ttmbf && cbp) { |
1802 | 20790 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); | |
1803 | } | ||
1804 | 27695 | dst_idx = 0; | |
1805 |
2/2✓ Branch 0 taken 166170 times.
✓ Branch 1 taken 27695 times.
|
193865 | for (i = 0; i < 6; i++) { |
1806 | 166170 | s->dc_val[0][s->block_index[i]] = 0; | |
1807 | 166170 | dst_idx += i >> 2; | |
1808 | 166170 | val = ((cbp >> (5 - i)) & 1); | |
1809 |
2/2✓ Branch 0 taken 110780 times.
✓ Branch 1 taken 55390 times.
|
166170 | off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize; |
1810 |
2/2✓ Branch 0 taken 91115 times.
✓ Branch 1 taken 75055 times.
|
166170 | if (val) { |
1811 | 273345 | pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb, | |
1812 | 91115 | first_block, s->dest[dst_idx] + off, | |
1813 |
2/2✓ Branch 0 taken 24386 times.
✓ Branch 1 taken 66729 times.
|
91115 | (i & 4) ? s->uvlinesize : s->linesize, |
1814 | CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), | ||
1815 | &block_tt); | ||
1816 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 91115 times.
|
91115 | if (pat < 0) |
1817 | ✗ | return pat; | |
1818 | 91115 | block_cbp |= pat << (i << 2); | |
1819 |
3/4✓ Branch 0 taken 91115 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 59029 times.
✓ Branch 3 taken 32086 times.
|
91115 | if (!v->ttmbf && ttmb < 8) |
1820 | 59029 | ttmb = -1; | |
1821 | 91115 | first_block = 0; | |
1822 | } | ||
1823 | } | ||
1824 | } | ||
1825 |
3/4✓ Branch 0 taken 21600 times.
✓ Branch 1 taken 16320 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 21600 times.
|
37920 | if (v->overlap && v->pq >= 9) |
1826 | ✗ | ff_vc1_p_overlap_filter(v); | |
1827 | 37920 | vc1_put_blocks_clamped(v, 1); | |
1828 | |||
1829 | 37920 | v->cbp[s->mb_x] = block_cbp; | |
1830 | 37920 | v->ttblk[s->mb_x] = block_tt; | |
1831 | |||
1832 | 37920 | return 0; | |
1833 | } | ||
1834 | |||
1835 | /** Decode one B-frame MB (in Main profile) | ||
1836 | */ | ||
1837 | 20940 | static int vc1_decode_b_mb(VC1Context *v) | |
1838 | { | ||
1839 | 20940 | MpegEncContext *s = &v->s; | |
1840 | 20940 | GetBitContext *gb = &s->gb; | |
1841 | int i, j; | ||
1842 | 20940 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
1843 | 20940 | int cbp = 0; /* cbp decoding stuff */ | |
1844 | int mqdiff, mquant; /* MB quantization */ | ||
1845 | 20940 | int ttmb = v->ttfrm; /* MB Transform type */ | |
1846 | 20940 | int mb_has_coeffs = 0; /* last_flag */ | |
1847 | int index, index1; /* LUT indexes */ | ||
1848 | int val, sign; /* temp values */ | ||
1849 | 20940 | int first_block = 1; | |
1850 | int dst_idx, off; | ||
1851 | int skipped, direct; | ||
1852 | int dmv_x[2], dmv_y[2]; | ||
1853 | 20940 | int bmvtype = BMV_TYPE_BACKWARD; | |
1854 | int ret; | ||
1855 | |||
1856 | 20940 | mquant = v->pq; /* lossy initialization */ | |
1857 | 20940 | s->mb_intra = 0; | |
1858 | |||
1859 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 20940 times.
|
20940 | if (v->dmb_is_raw) |
1860 | ✗ | direct = get_bits1(gb); | |
1861 | else | ||
1862 | 20940 | direct = v->direct_mb_plane[mb_pos]; | |
1863 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 20940 times.
|
20940 | if (v->skip_is_raw) |
1864 | ✗ | skipped = get_bits1(gb); | |
1865 | else | ||
1866 | 20940 | skipped = v->s.mbskip_table[mb_pos]; | |
1867 | |||
1868 | 20940 | dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0; | |
1869 |
2/2✓ Branch 0 taken 125640 times.
✓ Branch 1 taken 20940 times.
|
146580 | for (i = 0; i < 6; i++) { |
1870 | 125640 | v->mb_type[0][s->block_index[i]] = 0; | |
1871 | 125640 | s->dc_val[0][s->block_index[i]] = 0; | |
1872 | } | ||
1873 | 20940 | s->cur_pic.qscale_table[mb_pos] = 0; | |
1874 | |||
1875 |
2/2✓ Branch 0 taken 18371 times.
✓ Branch 1 taken 2569 times.
|
20940 | if (!direct) { |
1876 |
2/2✓ Branch 0 taken 15906 times.
✓ Branch 1 taken 2465 times.
|
18371 | if (!skipped) { |
1877 |
14/20✓ Branch 1 taken 14871 times.
✓ Branch 2 taken 1035 times.
✓ Branch 3 taken 6626 times.
✓ Branch 4 taken 9280 times.
✓ Branch 5 taken 146 times.
✓ Branch 6 taken 9134 times.
✓ Branch 9 taken 170 times.
✓ Branch 10 taken 8964 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 8964 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 7005 times.
✓ Branch 16 taken 1959 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8964 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 6314 times.
✓ Branch 23 taken 2650 times.
|
15906 | GET_MVDATA(dmv_x[0], dmv_y[0]); |
1878 | 15906 | dmv_x[1] = dmv_x[0]; | |
1879 | 15906 | dmv_y[1] = dmv_y[0]; | |
1880 | } | ||
1881 |
4/4✓ Branch 0 taken 15906 times.
✓ Branch 1 taken 2465 times.
✓ Branch 2 taken 15736 times.
✓ Branch 3 taken 170 times.
|
18371 | if (skipped || !s->mb_intra) { |
1882 | 18201 | bmvtype = decode012(gb); | |
1883 |
3/4✓ Branch 0 taken 8021 times.
✓ Branch 1 taken 4023 times.
✓ Branch 2 taken 6157 times.
✗ Branch 3 not taken.
|
18201 | switch (bmvtype) { |
1884 | 8021 | case 0: | |
1885 | 8021 | bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD; | |
1886 | 8021 | break; | |
1887 | 4023 | case 1: | |
1888 | 4023 | bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD; | |
1889 | 4023 | break; | |
1890 | 6157 | case 2: | |
1891 | 6157 | bmvtype = BMV_TYPE_INTERPOLATED; | |
1892 | 6157 | dmv_x[0] = dmv_y[0] = 0; | |
1893 | } | ||
1894 | } | ||
1895 | } | ||
1896 |
2/2✓ Branch 0 taken 125640 times.
✓ Branch 1 taken 20940 times.
|
146580 | for (i = 0; i < 6; i++) |
1897 | 125640 | v->mb_type[0][s->block_index[i]] = s->mb_intra; | |
1898 | |||
1899 |
2/2✓ Branch 0 taken 3578 times.
✓ Branch 1 taken 17362 times.
|
20940 | if (skipped) { |
1900 |
2/2✓ Branch 0 taken 1113 times.
✓ Branch 1 taken 2465 times.
|
3578 | if (direct) |
1901 | 1113 | bmvtype = BMV_TYPE_INTERPOLATED; | |
1902 | 3578 | ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); | |
1903 | 3578 | vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); | |
1904 | 3578 | return 0; | |
1905 | } | ||
1906 |
2/2✓ Branch 0 taken 1456 times.
✓ Branch 1 taken 15906 times.
|
17362 | if (direct) { |
1907 | 1456 | cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); | |
1908 |
1/38✗ Branch 0 not taken.
✓ Branch 1 taken 1456 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.
|
1456 | GET_MQUANT(); |
1909 | 1456 | s->mb_intra = 0; | |
1910 | 1456 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
1911 |
1/2✓ Branch 0 taken 1456 times.
✗ Branch 1 not taken.
|
1456 | if (!v->ttmbf) |
1912 | 1456 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); | |
1913 | 1456 | dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0; | |
1914 | 1456 | ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); | |
1915 | 1456 | vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); | |
1916 | } else { | ||
1917 |
3/4✓ Branch 0 taken 1035 times.
✓ Branch 1 taken 14871 times.
✓ Branch 2 taken 1035 times.
✗ Branch 3 not taken.
|
15906 | if (!mb_has_coeffs && !s->mb_intra) { |
1918 | /* no coded blocks - effectively skipped */ | ||
1919 | 1035 | ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); | |
1920 | 1035 | vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); | |
1921 | 1035 | return 0; | |
1922 | } | ||
1923 |
3/4✓ Branch 0 taken 170 times.
✓ Branch 1 taken 14701 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 170 times.
|
14871 | if (s->mb_intra && !mb_has_coeffs) { |
1924 | ✗ | GET_MQUANT(); | |
1925 | ✗ | s->cur_pic.qscale_table[mb_pos] = mquant; | |
1926 | ✗ | s->ac_pred = get_bits1(gb); | |
1927 | ✗ | cbp = 0; | |
1928 | ✗ | ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); | |
1929 | } else { | ||
1930 |
2/2✓ Branch 0 taken 5289 times.
✓ Branch 1 taken 9582 times.
|
14871 | if (bmvtype == BMV_TYPE_INTERPOLATED) { |
1931 |
13/20✓ Branch 1 taken 4814 times.
✓ Branch 2 taken 475 times.
✓ Branch 3 taken 1908 times.
✓ Branch 4 taken 3381 times.
✓ Branch 5 taken 72 times.
✓ Branch 6 taken 3309 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3309 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3309 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2641 times.
✓ Branch 16 taken 668 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3309 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 2422 times.
✓ Branch 23 taken 887 times.
|
5289 | GET_MVDATA(dmv_x[0], dmv_y[0]); |
1932 |
2/2✓ Branch 0 taken 475 times.
✓ Branch 1 taken 4814 times.
|
5289 | if (!mb_has_coeffs) { |
1933 | /* interpolated skipped block */ | ||
1934 | 475 | ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); | |
1935 | 475 | vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); | |
1936 | 475 | return 0; | |
1937 | } | ||
1938 | } | ||
1939 | 14396 | ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); | |
1940 |
2/2✓ Branch 0 taken 14226 times.
✓ Branch 1 taken 170 times.
|
14396 | if (!s->mb_intra) { |
1941 | 14226 | vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); | |
1942 | } | ||
1943 |
2/2✓ Branch 0 taken 170 times.
✓ Branch 1 taken 14226 times.
|
14396 | if (s->mb_intra) |
1944 | 170 | s->ac_pred = get_bits1(gb); | |
1945 | 14396 | cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); | |
1946 |
1/38✗ Branch 0 not taken.
✓ Branch 1 taken 14396 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.
|
14396 | GET_MQUANT(); |
1947 | 14396 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
1948 |
4/6✓ Branch 0 taken 14396 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 14226 times.
✓ Branch 3 taken 170 times.
✓ Branch 4 taken 14226 times.
✗ Branch 5 not taken.
|
14396 | if (!v->ttmbf && !s->mb_intra && mb_has_coeffs) |
1949 | 14226 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); | |
1950 | } | ||
1951 | } | ||
1952 | 15852 | dst_idx = 0; | |
1953 |
2/2✓ Branch 0 taken 95112 times.
✓ Branch 1 taken 15852 times.
|
110964 | for (i = 0; i < 6; i++) { |
1954 | 95112 | s->dc_val[0][s->block_index[i]] = 0; | |
1955 | 95112 | dst_idx += i >> 2; | |
1956 | 95112 | val = ((cbp >> (5 - i)) & 1); | |
1957 |
2/2✓ Branch 0 taken 63408 times.
✓ Branch 1 taken 31704 times.
|
95112 | off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); |
1958 | 95112 | v->mb_type[0][s->block_index[i]] = s->mb_intra; | |
1959 |
2/2✓ Branch 0 taken 1020 times.
✓ Branch 1 taken 94092 times.
|
95112 | if (s->mb_intra) { |
1960 | /* check if prediction blocks A and C are available */ | ||
1961 | 1020 | v->a_avail = v->c_avail = 0; | |
1962 |
6/6✓ Branch 0 taken 850 times.
✓ Branch 1 taken 170 times.
✓ Branch 2 taken 680 times.
✓ Branch 3 taken 170 times.
✓ Branch 4 taken 656 times.
✓ Branch 5 taken 24 times.
|
1020 | if (i == 2 || i == 3 || !s->first_slice_line) |
1963 | 996 | v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; | |
1964 |
6/6✓ Branch 0 taken 850 times.
✓ Branch 1 taken 170 times.
✓ Branch 2 taken 680 times.
✓ Branch 3 taken 170 times.
✓ Branch 4 taken 652 times.
✓ Branch 5 taken 28 times.
|
1020 | if (i == 1 || i == 3 || s->mb_x) |
1965 | 992 | v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
1966 | |||
1967 | 1020 | ret = vc1_decode_intra_block(v, s->block[i], i, val, mquant, | |
1968 |
2/2✓ Branch 0 taken 340 times.
✓ Branch 1 taken 680 times.
|
1020 | (i & 4) ? v->codingset2 : v->codingset); |
1969 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1020 times.
|
1020 | if (ret < 0) |
1970 | ✗ | return ret; | |
1971 | if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) | ||
1972 | continue; | ||
1973 | 1020 | v->vc1dsp.vc1_inv_trans_8x8(s->block[i]); | |
1974 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1020 times.
|
1020 | if (v->rangeredfrm) |
1975 | ✗ | for (j = 0; j < 64; j++) | |
1976 | ✗ | s->block[i][j] *= 2; | |
1977 | 1020 | s->idsp.put_signed_pixels_clamped(s->block[i], | |
1978 | 1020 | s->dest[dst_idx] + off, | |
1979 |
2/2✓ Branch 0 taken 340 times.
✓ Branch 1 taken 680 times.
|
1020 | i & 4 ? s->uvlinesize |
1980 | : s->linesize); | ||
1981 |
2/2✓ Branch 0 taken 57465 times.
✓ Branch 1 taken 36627 times.
|
94092 | } else if (val) { |
1982 | 172395 | int pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, | |
1983 | 57465 | first_block, s->dest[dst_idx] + off, | |
1984 |
2/2✓ Branch 0 taken 10287 times.
✓ Branch 1 taken 47178 times.
|
57465 | (i & 4) ? s->uvlinesize : s->linesize, |
1985 | CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), NULL); | ||
1986 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 57465 times.
|
57465 | if (pat < 0) |
1987 | ✗ | return pat; | |
1988 |
3/4✓ Branch 0 taken 57465 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 54531 times.
✓ Branch 3 taken 2934 times.
|
57465 | if (!v->ttmbf && ttmb < 8) |
1989 | 54531 | ttmb = -1; | |
1990 | 57465 | first_block = 0; | |
1991 | } | ||
1992 | } | ||
1993 | 15852 | return 0; | |
1994 | } | ||
1995 | |||
1996 | /** Decode one B-frame MB (in interlaced field B picture) | ||
1997 | */ | ||
1998 | 51540 | static int vc1_decode_b_mb_intfi(VC1Context *v) | |
1999 | { | ||
2000 | 51540 | MpegEncContext *s = &v->s; | |
2001 | 51540 | GetBitContext *gb = &s->gb; | |
2002 | int i, j; | ||
2003 | 51540 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
2004 | 51540 | int cbp = 0; /* cbp decoding stuff */ | |
2005 | int mqdiff, mquant; /* MB quantization */ | ||
2006 | 51540 | int ttmb = v->ttfrm; /* MB Transform type */ | |
2007 | 51540 | int mb_has_coeffs = 0; /* last_flag */ | |
2008 | int val; /* temp value */ | ||
2009 | 51540 | int first_block = 1; | |
2010 | int dst_idx, off; | ||
2011 | int fwd; | ||
2012 | int dmv_x[2], dmv_y[2], pred_flag[2]; | ||
2013 | 51540 | int bmvtype = BMV_TYPE_BACKWARD; | |
2014 | 51540 | int block_cbp = 0, pat, block_tt = 0; | |
2015 | int idx_mbmode; | ||
2016 | int ret; | ||
2017 | |||
2018 | 51540 | mquant = v->pq; /* Lossy initialization */ | |
2019 | 51540 | s->mb_intra = 0; | |
2020 | |||
2021 | 51540 | idx_mbmode = get_vlc2(gb, v->mbmode_vlc, VC1_IF_MBMODE_VLC_BITS, 2); | |
2022 |
2/2✓ Branch 0 taken 48 times.
✓ Branch 1 taken 51492 times.
|
51540 | if (idx_mbmode <= 1) { // intra MB |
2023 | 48 | v->is_intra[s->mb_x] = 0x3f; // Set the bitfield to all 1. | |
2024 | 48 | s->mb_intra = 1; | |
2025 | 48 | s->cur_pic.motion_val[1][s->block_index[0]][0] = 0; | |
2026 | 48 | s->cur_pic.motion_val[1][s->block_index[0]][1] = 0; | |
2027 | 48 | s->cur_pic.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA; | |
2028 |
15/38✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 32 times.
✓ Branch 8 taken 16 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 48 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 48 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 48 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 48 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 48 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 48 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 48 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 48 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 48 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 40 taken 48 times.
|
48 | GET_MQUANT(); |
2029 | 48 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
2030 | /* Set DC scale - y and c use the same so we only set y */ | ||
2031 | 48 | s->y_dc_scale = ff_wmv3_dc_scale_table[FFABS(mquant)]; | |
2032 | 48 | v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb); | |
2033 | 48 | mb_has_coeffs = idx_mbmode & 1; | |
2034 |
2/2✓ Branch 0 taken 33 times.
✓ Branch 1 taken 15 times.
|
48 | if (mb_has_coeffs) |
2035 | 33 | cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_ICBPCY_VLC_BITS, 2); | |
2036 | 48 | dst_idx = 0; | |
2037 |
2/2✓ Branch 0 taken 288 times.
✓ Branch 1 taken 48 times.
|
336 | for (i = 0; i < 6; i++) { |
2038 | 288 | v->a_avail = v->c_avail = 0; | |
2039 | 288 | v->mb_type[0][s->block_index[i]] = 1; | |
2040 | 288 | s->dc_val[0][s->block_index[i]] = 0; | |
2041 | 288 | dst_idx += i >> 2; | |
2042 | 288 | val = ((cbp >> (5 - i)) & 1); | |
2043 |
5/6✓ Branch 0 taken 240 times.
✓ Branch 1 taken 48 times.
✓ Branch 2 taken 192 times.
✓ Branch 3 taken 48 times.
✓ Branch 4 taken 192 times.
✗ Branch 5 not taken.
|
288 | if (i == 2 || i == 3 || !s->first_slice_line) |
2044 | 288 | v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; | |
2045 |
6/6✓ Branch 0 taken 240 times.
✓ Branch 1 taken 48 times.
✓ Branch 2 taken 192 times.
✓ Branch 3 taken 48 times.
✓ Branch 4 taken 188 times.
✓ Branch 5 taken 4 times.
|
288 | if (i == 1 || i == 3 || s->mb_x) |
2046 | 284 | v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
2047 | |||
2048 | 288 | ret = vc1_decode_intra_block(v, s->block[i], i, val, mquant, | |
2049 |
2/2✓ Branch 0 taken 96 times.
✓ Branch 1 taken 192 times.
|
288 | (i & 4) ? v->codingset2 : v->codingset); |
2050 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 288 times.
|
288 | if (ret < 0) |
2051 | ✗ | return ret; | |
2052 | if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) | ||
2053 | continue; | ||
2054 | 288 | v->vc1dsp.vc1_inv_trans_8x8(s->block[i]); | |
2055 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 288 times.
|
288 | if (v->rangeredfrm) |
2056 | ✗ | for (j = 0; j < 64; j++) | |
2057 | ✗ | s->block[i][j] <<= 1; | |
2058 |
2/2✓ Branch 0 taken 192 times.
✓ Branch 1 taken 96 times.
|
288 | off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); |
2059 | 288 | s->idsp.put_signed_pixels_clamped(s->block[i], | |
2060 | 288 | s->dest[dst_idx] + off, | |
2061 |
2/2✓ Branch 0 taken 96 times.
✓ Branch 1 taken 192 times.
|
288 | (i & 4) ? s->uvlinesize |
2062 | : s->linesize); | ||
2063 | } | ||
2064 | } else { | ||
2065 | 51492 | s->mb_intra = v->is_intra[s->mb_x] = 0; | |
2066 | 51492 | s->cur_pic.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16; | |
2067 |
2/2✓ Branch 0 taken 308952 times.
✓ Branch 1 taken 51492 times.
|
360444 | for (i = 0; i < 6; i++) |
2068 | 308952 | v->mb_type[0][s->block_index[i]] = 0; | |
2069 |
2/2✓ Branch 0 taken 675 times.
✓ Branch 1 taken 50817 times.
|
51492 | if (v->fmb_is_raw) |
2070 | 675 | fwd = v->forward_mb_plane[mb_pos] = get_bits1(gb); | |
2071 | else | ||
2072 | 50817 | fwd = v->forward_mb_plane[mb_pos]; | |
2073 |
2/2✓ Branch 0 taken 42084 times.
✓ Branch 1 taken 9408 times.
|
51492 | if (idx_mbmode <= 5) { // 1-MV |
2074 | 42084 | int interpmvp = 0; | |
2075 | 42084 | dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0; | |
2076 | 42084 | pred_flag[0] = pred_flag[1] = 0; | |
2077 |
2/2✓ Branch 0 taken 15503 times.
✓ Branch 1 taken 26581 times.
|
42084 | if (fwd) |
2078 | 15503 | bmvtype = BMV_TYPE_FORWARD; | |
2079 | else { | ||
2080 | 26581 | bmvtype = decode012(gb); | |
2081 |
3/4✓ Branch 0 taken 13925 times.
✓ Branch 1 taken 6770 times.
✓ Branch 2 taken 5886 times.
✗ Branch 3 not taken.
|
26581 | switch (bmvtype) { |
2082 | 13925 | case 0: | |
2083 | 13925 | bmvtype = BMV_TYPE_BACKWARD; | |
2084 | 13925 | break; | |
2085 | 6770 | case 1: | |
2086 | 6770 | bmvtype = BMV_TYPE_DIRECT; | |
2087 | 6770 | break; | |
2088 | 5886 | case 2: | |
2089 | 5886 | bmvtype = BMV_TYPE_INTERPOLATED; | |
2090 | 5886 | interpmvp = get_bits1(gb); | |
2091 | } | ||
2092 | } | ||
2093 | 42084 | v->bmvtype = bmvtype; | |
2094 |
4/4✓ Branch 0 taken 35314 times.
✓ Branch 1 taken 6770 times.
✓ Branch 2 taken 20242 times.
✓ Branch 3 taken 15072 times.
|
42084 | if (bmvtype != BMV_TYPE_DIRECT && idx_mbmode & 1) { |
2095 | 20242 | get_mvdata_interlaced(v, &dmv_x[bmvtype == BMV_TYPE_BACKWARD], &dmv_y[bmvtype == BMV_TYPE_BACKWARD], &pred_flag[bmvtype == BMV_TYPE_BACKWARD]); | |
2096 | } | ||
2097 |
2/2✓ Branch 0 taken 4685 times.
✓ Branch 1 taken 37399 times.
|
42084 | if (interpmvp) { |
2098 | 4685 | get_mvdata_interlaced(v, &dmv_x[1], &dmv_y[1], &pred_flag[1]); | |
2099 | } | ||
2100 |
2/2✓ Branch 0 taken 6770 times.
✓ Branch 1 taken 35314 times.
|
42084 | if (bmvtype == BMV_TYPE_DIRECT) { |
2101 | 6770 | dmv_x[0] = dmv_y[0] = pred_flag[0] = 0; | |
2102 | 6770 | dmv_x[1] = dmv_y[1] = pred_flag[0] = 0; | |
2103 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6770 times.
|
6770 | if (!s->next_pic.ptr->field_picture) { |
2104 | ✗ | av_log(s->avctx, AV_LOG_ERROR, "Mixed field/frame direct mode not supported\n"); | |
2105 | ✗ | return AVERROR_INVALIDDATA; | |
2106 | } | ||
2107 | } | ||
2108 | 42084 | ff_vc1_pred_b_mv_intfi(v, 0, dmv_x, dmv_y, 1, pred_flag); | |
2109 | 42084 | vc1_b_mc(v, dmv_x, dmv_y, (bmvtype == BMV_TYPE_DIRECT), bmvtype); | |
2110 | 42084 | mb_has_coeffs = !(idx_mbmode & 2); | |
2111 | } else { // 4-MV | ||
2112 |
2/2✓ Branch 0 taken 4892 times.
✓ Branch 1 taken 4516 times.
|
9408 | if (fwd) |
2113 | 4892 | bmvtype = BMV_TYPE_FORWARD; | |
2114 | 9408 | v->bmvtype = bmvtype; | |
2115 | 9408 | v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); | |
2116 |
2/2✓ Branch 0 taken 37632 times.
✓ Branch 1 taken 9408 times.
|
47040 | for (i = 0; i < 4; i++) { |
2117 | 37632 | dmv_x[0] = dmv_y[0] = pred_flag[0] = 0; | |
2118 | 37632 | dmv_x[1] = dmv_y[1] = pred_flag[1] = 0; | |
2119 |
2/2✓ Branch 0 taken 10050 times.
✓ Branch 1 taken 27582 times.
|
37632 | if (v->fourmvbp & (8 >> i)) { |
2120 | 10050 | get_mvdata_interlaced(v, &dmv_x[bmvtype == BMV_TYPE_BACKWARD], | |
2121 | 10050 | &dmv_y[bmvtype == BMV_TYPE_BACKWARD], | |
2122 | 10050 | &pred_flag[bmvtype == BMV_TYPE_BACKWARD]); | |
2123 | } | ||
2124 | 37632 | ff_vc1_pred_b_mv_intfi(v, i, dmv_x, dmv_y, 0, pred_flag); | |
2125 | 37632 | ff_vc1_mc_4mv_luma(v, i, bmvtype == BMV_TYPE_BACKWARD, 0); | |
2126 | } | ||
2127 | 9408 | ff_vc1_mc_4mv_chroma(v, bmvtype == BMV_TYPE_BACKWARD); | |
2128 | 9408 | mb_has_coeffs = idx_mbmode & 1; | |
2129 | } | ||
2130 |
2/2✓ Branch 0 taken 30972 times.
✓ Branch 1 taken 20520 times.
|
51492 | if (mb_has_coeffs) |
2131 | 30972 | cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); | |
2132 |
2/2✓ Branch 0 taken 30972 times.
✓ Branch 1 taken 20520 times.
|
51492 | if (cbp) { |
2133 |
16/38✓ Branch 0 taken 23186 times.
✓ Branch 1 taken 7786 times.
✓ Branch 2 taken 23186 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 23186 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2960 times.
✓ Branch 8 taken 20226 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 23186 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 23186 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 23186 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 23186 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 23186 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 23186 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 23186 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 23186 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 23186 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 40 taken 23186 times.
|
30972 | GET_MQUANT(); |
2134 | } | ||
2135 | 51492 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
2136 |
3/4✓ Branch 0 taken 51492 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 30972 times.
✓ Branch 3 taken 20520 times.
|
51492 | if (!v->ttmbf && cbp) { |
2137 | 30972 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); | |
2138 | } | ||
2139 | 51492 | dst_idx = 0; | |
2140 |
2/2✓ Branch 0 taken 308952 times.
✓ Branch 1 taken 51492 times.
|
360444 | for (i = 0; i < 6; i++) { |
2141 | 308952 | s->dc_val[0][s->block_index[i]] = 0; | |
2142 | 308952 | dst_idx += i >> 2; | |
2143 | 308952 | val = ((cbp >> (5 - i)) & 1); | |
2144 |
2/2✓ Branch 0 taken 205968 times.
✓ Branch 1 taken 102984 times.
|
308952 | off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize; |
2145 |
2/2✓ Branch 0 taken 91470 times.
✓ Branch 1 taken 217482 times.
|
308952 | if (val) { |
2146 | 274410 | pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, | |
2147 | 91470 | first_block, s->dest[dst_idx] + off, | |
2148 |
2/2✓ Branch 0 taken 20546 times.
✓ Branch 1 taken 70924 times.
|
91470 | (i & 4) ? s->uvlinesize : s->linesize, |
2149 | CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt); | ||
2150 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 91470 times.
|
91470 | if (pat < 0) |
2151 | ✗ | return pat; | |
2152 | 91470 | block_cbp |= pat << (i << 2); | |
2153 |
3/4✓ Branch 0 taken 91470 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 69969 times.
✓ Branch 3 taken 21501 times.
|
91470 | if (!v->ttmbf && ttmb < 8) |
2154 | 69969 | ttmb = -1; | |
2155 | 91470 | first_block = 0; | |
2156 | } | ||
2157 | } | ||
2158 | } | ||
2159 | 51540 | v->cbp[s->mb_x] = block_cbp; | |
2160 | 51540 | v->ttblk[s->mb_x] = block_tt; | |
2161 | |||
2162 | 51540 | return 0; | |
2163 | } | ||
2164 | |||
2165 | /** Decode one B-frame MB (in interlaced frame B picture) | ||
2166 | */ | ||
2167 | 32640 | static int vc1_decode_b_mb_intfr(VC1Context *v) | |
2168 | { | ||
2169 | 32640 | MpegEncContext *s = &v->s; | |
2170 | 32640 | GetBitContext *gb = &s->gb; | |
2171 | int i, j; | ||
2172 | 32640 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
2173 | 32640 | int cbp = 0; /* cbp decoding stuff */ | |
2174 | int mqdiff, mquant; /* MB quantization */ | ||
2175 | 32640 | int ttmb = v->ttfrm; /* MB Transform type */ | |
2176 | 32640 | int mvsw = 0; /* motion vector switch */ | |
2177 | 32640 | int mb_has_coeffs = 1; /* last_flag */ | |
2178 | int dmv_x, dmv_y; /* Differential MV components */ | ||
2179 | int val; /* temp value */ | ||
2180 | 32640 | int first_block = 1; | |
2181 | int dst_idx, off; | ||
2182 | 32640 | int skipped, direct, twomv = 0; | |
2183 | 32640 | int block_cbp = 0, pat, block_tt = 0; | |
2184 | 32640 | int idx_mbmode = 0, mvbp; | |
2185 | int stride_y, fieldtx; | ||
2186 | 32640 | int bmvtype = BMV_TYPE_BACKWARD; | |
2187 | int dir, dir2; | ||
2188 | int ret; | ||
2189 | |||
2190 | 32640 | mquant = v->pq; /* Lossy initialization */ | |
2191 | 32640 | s->mb_intra = 0; | |
2192 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 32640 times.
|
32640 | if (v->skip_is_raw) |
2193 | ✗ | skipped = get_bits1(gb); | |
2194 | else | ||
2195 | 32640 | skipped = v->s.mbskip_table[mb_pos]; | |
2196 | |||
2197 |
2/2✓ Branch 0 taken 31098 times.
✓ Branch 1 taken 1542 times.
|
32640 | if (!skipped) { |
2198 | 31098 | idx_mbmode = get_vlc2(gb, v->mbmode_vlc, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); | |
2199 |
2/2✓ Branch 0 taken 17446 times.
✓ Branch 1 taken 13652 times.
|
31098 | if (ff_vc1_mbmode_intfrp[0][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) { |
2200 | 17446 | twomv = 1; | |
2201 | 17446 | v->blk_mv_type[s->block_index[0]] = 1; | |
2202 | 17446 | v->blk_mv_type[s->block_index[1]] = 1; | |
2203 | 17446 | v->blk_mv_type[s->block_index[2]] = 1; | |
2204 | 17446 | v->blk_mv_type[s->block_index[3]] = 1; | |
2205 | } else { | ||
2206 | 13652 | v->blk_mv_type[s->block_index[0]] = 0; | |
2207 | 13652 | v->blk_mv_type[s->block_index[1]] = 0; | |
2208 | 13652 | v->blk_mv_type[s->block_index[2]] = 0; | |
2209 | 13652 | v->blk_mv_type[s->block_index[3]] = 0; | |
2210 | } | ||
2211 | } | ||
2212 | |||
2213 |
2/2✓ Branch 0 taken 101 times.
✓ Branch 1 taken 32539 times.
|
32640 | if (ff_vc1_mbmode_intfrp[0][idx_mbmode][0] == MV_PMODE_INTFR_INTRA) { // intra MB |
2214 |
2/2✓ Branch 0 taken 404 times.
✓ Branch 1 taken 101 times.
|
505 | for (i = 0; i < 4; i++) { |
2215 | 404 | s->mv[0][i][0] = s->cur_pic.motion_val[0][s->block_index[i]][0] = 0; | |
2216 | 404 | s->mv[0][i][1] = s->cur_pic.motion_val[0][s->block_index[i]][1] = 0; | |
2217 | 404 | s->mv[1][i][0] = s->cur_pic.motion_val[1][s->block_index[i]][0] = 0; | |
2218 | 404 | s->mv[1][i][1] = s->cur_pic.motion_val[1][s->block_index[i]][1] = 0; | |
2219 | } | ||
2220 | 101 | v->is_intra[s->mb_x] = 0x3f; // Set the bitfield to all 1. | |
2221 | 101 | s->mb_intra = 1; | |
2222 | 101 | s->cur_pic.mb_type[mb_pos] = MB_TYPE_INTRA; | |
2223 | 101 | fieldtx = v->fieldtx_plane[mb_pos] = get_bits1(gb); | |
2224 | 101 | mb_has_coeffs = get_bits1(gb); | |
2225 |
1/2✓ Branch 0 taken 101 times.
✗ Branch 1 not taken.
|
101 | if (mb_has_coeffs) |
2226 | 101 | cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); | |
2227 | 101 | v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb); | |
2228 |
15/38✓ Branch 0 taken 101 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 101 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 101 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 12 times.
✓ Branch 8 taken 89 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 101 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 101 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 101 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 101 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 101 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 101 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 101 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 101 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 101 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 40 taken 101 times.
|
101 | GET_MQUANT(); |
2229 | 101 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
2230 | /* Set DC scale - y and c use the same so we only set y */ | ||
2231 | 101 | s->y_dc_scale = ff_wmv3_dc_scale_table[FFABS(mquant)]; | |
2232 | 101 | dst_idx = 0; | |
2233 |
2/2✓ Branch 0 taken 606 times.
✓ Branch 1 taken 101 times.
|
707 | for (i = 0; i < 6; i++) { |
2234 | 606 | v->a_avail = v->c_avail = 0; | |
2235 | 606 | v->mb_type[0][s->block_index[i]] = 1; | |
2236 | 606 | s->dc_val[0][s->block_index[i]] = 0; | |
2237 | 606 | dst_idx += i >> 2; | |
2238 | 606 | val = ((cbp >> (5 - i)) & 1); | |
2239 |
6/6✓ Branch 0 taken 505 times.
✓ Branch 1 taken 101 times.
✓ Branch 2 taken 404 times.
✓ Branch 3 taken 101 times.
✓ Branch 4 taken 372 times.
✓ Branch 5 taken 32 times.
|
606 | if (i == 2 || i == 3 || !s->first_slice_line) |
2240 | 574 | v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; | |
2241 |
6/6✓ Branch 0 taken 505 times.
✓ Branch 1 taken 101 times.
✓ Branch 2 taken 404 times.
✓ Branch 3 taken 101 times.
✓ Branch 4 taken 392 times.
✓ Branch 5 taken 12 times.
|
606 | if (i == 1 || i == 3 || s->mb_x) |
2242 | 594 | v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
2243 | |||
2244 | 606 | ret = vc1_decode_intra_block(v, s->block[i], i, val, mquant, | |
2245 |
2/2✓ Branch 0 taken 202 times.
✓ Branch 1 taken 404 times.
|
606 | (i & 4) ? v->codingset2 : v->codingset); |
2246 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 606 times.
|
606 | if (ret < 0) |
2247 | ✗ | return ret; | |
2248 | if (CONFIG_GRAY && i > 3 && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) | ||
2249 | continue; | ||
2250 | 606 | v->vc1dsp.vc1_inv_trans_8x8(s->block[i]); | |
2251 |
2/2✓ Branch 0 taken 404 times.
✓ Branch 1 taken 202 times.
|
606 | if (i < 4) { |
2252 | 404 | stride_y = s->linesize << fieldtx; | |
2253 |
2/2✓ Branch 0 taken 320 times.
✓ Branch 1 taken 84 times.
|
404 | off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize; |
2254 | } else { | ||
2255 | 202 | stride_y = s->uvlinesize; | |
2256 | 202 | off = 0; | |
2257 | } | ||
2258 | 606 | s->idsp.put_signed_pixels_clamped(s->block[i], | |
2259 | 606 | s->dest[dst_idx] + off, | |
2260 | stride_y); | ||
2261 | } | ||
2262 | } else { | ||
2263 | 32539 | s->mb_intra = v->is_intra[s->mb_x] = 0; | |
2264 | |||
2265 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 32539 times.
|
32539 | if (v->dmb_is_raw) |
2266 | ✗ | direct = get_bits1(gb); | |
2267 | else | ||
2268 | 32539 | direct = v->direct_mb_plane[mb_pos]; | |
2269 | |||
2270 |
2/2✓ Branch 0 taken 8474 times.
✓ Branch 1 taken 24065 times.
|
32539 | if (direct) { |
2271 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8474 times.
|
8474 | if (s->next_pic.ptr->field_picture) |
2272 | ✗ | av_log(s->avctx, AV_LOG_WARNING, "Mixed frame/field direct mode not supported\n"); | |
2273 | 8474 | s->mv[0][0][0] = s->cur_pic.motion_val[0][s->block_index[0]][0] = scale_mv(s->next_pic.motion_val[1][s->block_index[0]][0], v->bfraction, 0, s->quarter_sample); | |
2274 | 8474 | s->mv[0][0][1] = s->cur_pic.motion_val[0][s->block_index[0]][1] = scale_mv(s->next_pic.motion_val[1][s->block_index[0]][1], v->bfraction, 0, s->quarter_sample); | |
2275 | 8474 | s->mv[1][0][0] = s->cur_pic.motion_val[1][s->block_index[0]][0] = scale_mv(s->next_pic.motion_val[1][s->block_index[0]][0], v->bfraction, 1, s->quarter_sample); | |
2276 | 8474 | s->mv[1][0][1] = s->cur_pic.motion_val[1][s->block_index[0]][1] = scale_mv(s->next_pic.motion_val[1][s->block_index[0]][1], v->bfraction, 1, s->quarter_sample); | |
2277 | |||
2278 |
2/2✓ Branch 0 taken 4360 times.
✓ Branch 1 taken 4114 times.
|
8474 | if (twomv) { |
2279 | 4360 | s->mv[0][2][0] = s->cur_pic.motion_val[0][s->block_index[2]][0] = scale_mv(s->next_pic.motion_val[1][s->block_index[2]][0], v->bfraction, 0, s->quarter_sample); | |
2280 | 4360 | s->mv[0][2][1] = s->cur_pic.motion_val[0][s->block_index[2]][1] = scale_mv(s->next_pic.motion_val[1][s->block_index[2]][1], v->bfraction, 0, s->quarter_sample); | |
2281 | 4360 | s->mv[1][2][0] = s->cur_pic.motion_val[1][s->block_index[2]][0] = scale_mv(s->next_pic.motion_val[1][s->block_index[2]][0], v->bfraction, 1, s->quarter_sample); | |
2282 | 4360 | s->mv[1][2][1] = s->cur_pic.motion_val[1][s->block_index[2]][1] = scale_mv(s->next_pic.motion_val[1][s->block_index[2]][1], v->bfraction, 1, s->quarter_sample); | |
2283 | |||
2284 |
2/2✓ Branch 0 taken 8720 times.
✓ Branch 1 taken 4360 times.
|
13080 | for (i = 1; i < 4; i += 2) { |
2285 | 8720 | s->mv[0][i][0] = s->cur_pic.motion_val[0][s->block_index[i]][0] = s->mv[0][i-1][0]; | |
2286 | 8720 | s->mv[0][i][1] = s->cur_pic.motion_val[0][s->block_index[i]][1] = s->mv[0][i-1][1]; | |
2287 | 8720 | s->mv[1][i][0] = s->cur_pic.motion_val[1][s->block_index[i]][0] = s->mv[1][i-1][0]; | |
2288 | 8720 | s->mv[1][i][1] = s->cur_pic.motion_val[1][s->block_index[i]][1] = s->mv[1][i-1][1]; | |
2289 | } | ||
2290 | } else { | ||
2291 |
2/2✓ Branch 0 taken 12342 times.
✓ Branch 1 taken 4114 times.
|
16456 | for (i = 1; i < 4; i++) { |
2292 | 12342 | s->mv[0][i][0] = s->cur_pic.motion_val[0][s->block_index[i]][0] = s->mv[0][0][0]; | |
2293 | 12342 | s->mv[0][i][1] = s->cur_pic.motion_val[0][s->block_index[i]][1] = s->mv[0][0][1]; | |
2294 | 12342 | s->mv[1][i][0] = s->cur_pic.motion_val[1][s->block_index[i]][0] = s->mv[1][0][0]; | |
2295 | 12342 | s->mv[1][i][1] = s->cur_pic.motion_val[1][s->block_index[i]][1] = s->mv[1][0][1]; | |
2296 | } | ||
2297 | } | ||
2298 | } | ||
2299 | |||
2300 |
2/2✓ Branch 0 taken 24065 times.
✓ Branch 1 taken 8474 times.
|
32539 | if (!direct) { |
2301 |
3/4✓ Branch 0 taken 23850 times.
✓ Branch 1 taken 215 times.
✓ Branch 2 taken 23850 times.
✗ Branch 3 not taken.
|
24065 | if (skipped || !s->mb_intra) { |
2302 | 24065 | bmvtype = decode012(gb); | |
2303 |
3/4✓ Branch 0 taken 14341 times.
✓ Branch 1 taken 6232 times.
✓ Branch 2 taken 3492 times.
✗ Branch 3 not taken.
|
24065 | switch (bmvtype) { |
2304 | 14341 | case 0: | |
2305 | 14341 | bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD; | |
2306 | 14341 | break; | |
2307 | 6232 | case 1: | |
2308 | 6232 | bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD; | |
2309 | 6232 | break; | |
2310 | 3492 | case 2: | |
2311 | 3492 | bmvtype = BMV_TYPE_INTERPOLATED; | |
2312 | } | ||
2313 | } | ||
2314 | |||
2315 |
4/4✓ Branch 0 taken 13086 times.
✓ Branch 1 taken 10979 times.
✓ Branch 2 taken 12364 times.
✓ Branch 3 taken 722 times.
|
24065 | if (twomv && bmvtype != BMV_TYPE_INTERPOLATED) |
2316 | 12364 | mvsw = get_bits1(gb); | |
2317 | } | ||
2318 | |||
2319 |
2/2✓ Branch 0 taken 30997 times.
✓ Branch 1 taken 1542 times.
|
32539 | if (!skipped) { // inter MB |
2320 | 30997 | mb_has_coeffs = ff_vc1_mbmode_intfrp[0][idx_mbmode][3]; | |
2321 |
2/2✓ Branch 0 taken 26859 times.
✓ Branch 1 taken 4138 times.
|
30997 | if (mb_has_coeffs) |
2322 | 26859 | cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); | |
2323 |
2/2✓ Branch 0 taken 23850 times.
✓ Branch 1 taken 7147 times.
|
30997 | if (!direct) { |
2324 |
4/4✓ Branch 0 taken 3483 times.
✓ Branch 1 taken 20367 times.
✓ Branch 2 taken 722 times.
✓ Branch 3 taken 2761 times.
|
23850 | if (bmvtype == BMV_TYPE_INTERPOLATED && twomv) { |
2325 | 722 | v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); | |
2326 |
4/4✓ Branch 0 taken 20367 times.
✓ Branch 1 taken 2761 times.
✓ Branch 2 taken 12364 times.
✓ Branch 3 taken 8003 times.
|
23128 | } else if (bmvtype == BMV_TYPE_INTERPOLATED || twomv) { |
2327 | 15125 | v->twomvbp = get_vlc2(gb, v->twomvbp_vlc, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1); | |
2328 | } | ||
2329 | } | ||
2330 | |||
2331 |
2/2✓ Branch 0 taken 185982 times.
✓ Branch 1 taken 30997 times.
|
216979 | for (i = 0; i < 6; i++) |
2332 | 185982 | v->mb_type[0][s->block_index[i]] = 0; | |
2333 | 30997 | fieldtx = v->fieldtx_plane[mb_pos] = ff_vc1_mbmode_intfrp[0][idx_mbmode][1]; | |
2334 | /* for all motion vector read MVDATA and motion compensate each block */ | ||
2335 | 30997 | dst_idx = 0; | |
2336 |
2/2✓ Branch 0 taken 7147 times.
✓ Branch 1 taken 23850 times.
|
30997 | if (direct) { |
2337 |
2/2✓ Branch 0 taken 4360 times.
✓ Branch 1 taken 2787 times.
|
7147 | if (twomv) { |
2338 |
2/2✓ Branch 0 taken 17440 times.
✓ Branch 1 taken 4360 times.
|
21800 | for (i = 0; i < 4; i++) { |
2339 | 17440 | ff_vc1_mc_4mv_luma(v, i, 0, 0); | |
2340 | 17440 | ff_vc1_mc_4mv_luma(v, i, 1, 1); | |
2341 | } | ||
2342 | 4360 | ff_vc1_mc_4mv_chroma4(v, 0, 0, 0); | |
2343 | 4360 | ff_vc1_mc_4mv_chroma4(v, 1, 1, 1); | |
2344 | } else { | ||
2345 | 2787 | ff_vc1_mc_1mv(v, 0); | |
2346 | 2787 | ff_vc1_interp_mc(v); | |
2347 | } | ||
2348 |
4/4✓ Branch 0 taken 13086 times.
✓ Branch 1 taken 10764 times.
✓ Branch 2 taken 722 times.
✓ Branch 3 taken 12364 times.
|
23850 | } else if (twomv && bmvtype == BMV_TYPE_INTERPOLATED) { |
2349 | 722 | mvbp = v->fourmvbp; | |
2350 |
2/2✓ Branch 0 taken 2888 times.
✓ Branch 1 taken 722 times.
|
3610 | for (i = 0; i < 4; i++) { |
2351 |
4/4✓ Branch 0 taken 2166 times.
✓ Branch 1 taken 722 times.
✓ Branch 2 taken 722 times.
✓ Branch 3 taken 1444 times.
|
2888 | dir = i==1 || i==3; |
2352 | 2888 | dmv_x = dmv_y = 0; | |
2353 | 2888 | val = ((mvbp >> (3 - i)) & 1); | |
2354 |
2/2✓ Branch 0 taken 2477 times.
✓ Branch 1 taken 411 times.
|
2888 | if (val) |
2355 | 2477 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); | |
2356 |
2/2✓ Branch 0 taken 1444 times.
✓ Branch 1 taken 1444 times.
|
2888 | j = i > 1 ? 2 : 0; |
2357 | 2888 | ff_vc1_pred_mv_intfr(v, j, dmv_x, dmv_y, 2, v->range_x, v->range_y, dir); | |
2358 | 2888 | ff_vc1_mc_4mv_luma(v, j, dir, dir); | |
2359 | 2888 | ff_vc1_mc_4mv_luma(v, j+1, dir, dir); | |
2360 | } | ||
2361 | |||
2362 | 722 | ff_vc1_mc_4mv_chroma4(v, 0, 0, 0); | |
2363 | 722 | ff_vc1_mc_4mv_chroma4(v, 1, 1, 1); | |
2364 |
2/2✓ Branch 0 taken 2761 times.
✓ Branch 1 taken 20367 times.
|
23128 | } else if (bmvtype == BMV_TYPE_INTERPOLATED) { |
2365 | 2761 | mvbp = v->twomvbp; | |
2366 | 2761 | dmv_x = dmv_y = 0; | |
2367 |
2/2✓ Branch 0 taken 2691 times.
✓ Branch 1 taken 70 times.
|
2761 | if (mvbp & 2) |
2368 | 2691 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); | |
2369 | |||
2370 | 2761 | ff_vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, 0); | |
2371 | 2761 | ff_vc1_mc_1mv(v, 0); | |
2372 | |||
2373 | 2761 | dmv_x = dmv_y = 0; | |
2374 |
2/2✓ Branch 0 taken 2648 times.
✓ Branch 1 taken 113 times.
|
2761 | if (mvbp & 1) |
2375 | 2648 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); | |
2376 | |||
2377 | 2761 | ff_vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, 1); | |
2378 | 2761 | ff_vc1_interp_mc(v); | |
2379 |
2/2✓ Branch 0 taken 12364 times.
✓ Branch 1 taken 8003 times.
|
20367 | } else if (twomv) { |
2380 | 12364 | dir = bmvtype == BMV_TYPE_BACKWARD; | |
2381 | 12364 | dir2 = dir; | |
2382 |
2/2✓ Branch 0 taken 5853 times.
✓ Branch 1 taken 6511 times.
|
12364 | if (mvsw) |
2383 | 5853 | dir2 = !dir; | |
2384 | 12364 | mvbp = v->twomvbp; | |
2385 | 12364 | dmv_x = dmv_y = 0; | |
2386 |
2/2✓ Branch 0 taken 10627 times.
✓ Branch 1 taken 1737 times.
|
12364 | if (mvbp & 2) |
2387 | 10627 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); | |
2388 | 12364 | ff_vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 2, v->range_x, v->range_y, dir); | |
2389 | |||
2390 | 12364 | dmv_x = dmv_y = 0; | |
2391 |
2/2✓ Branch 0 taken 10929 times.
✓ Branch 1 taken 1435 times.
|
12364 | if (mvbp & 1) |
2392 | 10929 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); | |
2393 | 12364 | ff_vc1_pred_mv_intfr(v, 2, dmv_x, dmv_y, 2, v->range_x, v->range_y, dir2); | |
2394 | |||
2395 |
2/2✓ Branch 0 taken 5853 times.
✓ Branch 1 taken 6511 times.
|
12364 | if (mvsw) { |
2396 |
2/2✓ Branch 0 taken 11706 times.
✓ Branch 1 taken 5853 times.
|
17559 | for (i = 0; i < 2; i++) { |
2397 | 11706 | s->mv[dir][i+2][0] = s->mv[dir][i][0] = s->cur_pic.motion_val[dir][s->block_index[i+2]][0] = s->cur_pic.motion_val[dir][s->block_index[i]][0]; | |
2398 | 11706 | s->mv[dir][i+2][1] = s->mv[dir][i][1] = s->cur_pic.motion_val[dir][s->block_index[i+2]][1] = s->cur_pic.motion_val[dir][s->block_index[i]][1]; | |
2399 | 11706 | s->mv[dir2][i+2][0] = s->mv[dir2][i][0] = s->cur_pic.motion_val[dir2][s->block_index[i]][0] = s->cur_pic.motion_val[dir2][s->block_index[i+2]][0]; | |
2400 | 11706 | s->mv[dir2][i+2][1] = s->mv[dir2][i][1] = s->cur_pic.motion_val[dir2][s->block_index[i]][1] = s->cur_pic.motion_val[dir2][s->block_index[i+2]][1]; | |
2401 | } | ||
2402 | } else { | ||
2403 | 6511 | ff_vc1_pred_mv_intfr(v, 0, 0, 0, 2, v->range_x, v->range_y, !dir); | |
2404 | 6511 | ff_vc1_pred_mv_intfr(v, 2, 0, 0, 2, v->range_x, v->range_y, !dir); | |
2405 | } | ||
2406 | |||
2407 | 12364 | ff_vc1_mc_4mv_luma(v, 0, dir, 0); | |
2408 | 12364 | ff_vc1_mc_4mv_luma(v, 1, dir, 0); | |
2409 | 12364 | ff_vc1_mc_4mv_luma(v, 2, dir2, 0); | |
2410 | 12364 | ff_vc1_mc_4mv_luma(v, 3, dir2, 0); | |
2411 | 12364 | ff_vc1_mc_4mv_chroma4(v, dir, dir2, 0); | |
2412 | } else { | ||
2413 | 8003 | dir = bmvtype == BMV_TYPE_BACKWARD; | |
2414 | |||
2415 | 8003 | mvbp = ff_vc1_mbmode_intfrp[0][idx_mbmode][2]; | |
2416 | 8003 | dmv_x = dmv_y = 0; | |
2417 |
2/2✓ Branch 0 taken 7691 times.
✓ Branch 1 taken 312 times.
|
8003 | if (mvbp) |
2418 | 7691 | get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); | |
2419 | |||
2420 | 8003 | ff_vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, dir); | |
2421 | 8003 | v->blk_mv_type[s->block_index[0]] = 1; | |
2422 | 8003 | v->blk_mv_type[s->block_index[1]] = 1; | |
2423 | 8003 | v->blk_mv_type[s->block_index[2]] = 1; | |
2424 | 8003 | v->blk_mv_type[s->block_index[3]] = 1; | |
2425 | 8003 | ff_vc1_pred_mv_intfr(v, 0, 0, 0, 2, v->range_x, v->range_y, !dir); | |
2426 |
2/2✓ Branch 0 taken 16006 times.
✓ Branch 1 taken 8003 times.
|
24009 | for (i = 0; i < 2; i++) { |
2427 | 16006 | s->mv[!dir][i+2][0] = s->mv[!dir][i][0] = s->cur_pic.motion_val[!dir][s->block_index[i+2]][0] = s->cur_pic.motion_val[!dir][s->block_index[i]][0]; | |
2428 | 16006 | s->mv[!dir][i+2][1] = s->mv[!dir][i][1] = s->cur_pic.motion_val[!dir][s->block_index[i+2]][1] = s->cur_pic.motion_val[!dir][s->block_index[i]][1]; | |
2429 | } | ||
2430 | 8003 | ff_vc1_mc_1mv(v, dir); | |
2431 | } | ||
2432 | |||
2433 |
2/2✓ Branch 0 taken 26859 times.
✓ Branch 1 taken 4138 times.
|
30997 | if (cbp) |
2434 |
15/38✓ Branch 0 taken 26859 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 26859 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 26859 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4064 times.
✓ Branch 8 taken 22795 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 26859 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 26859 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 26859 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 26859 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 26859 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 26859 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 26859 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 26859 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 26859 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 40 taken 26859 times.
|
26859 | GET_MQUANT(); // p. 227 |
2435 | 30997 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
2436 |
3/4✓ Branch 0 taken 30997 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 26859 times.
✓ Branch 3 taken 4138 times.
|
30997 | if (!v->ttmbf && cbp) |
2437 | 26859 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); | |
2438 |
2/2✓ Branch 0 taken 185982 times.
✓ Branch 1 taken 30997 times.
|
216979 | for (i = 0; i < 6; i++) { |
2439 | 185982 | s->dc_val[0][s->block_index[i]] = 0; | |
2440 | 185982 | dst_idx += i >> 2; | |
2441 | 185982 | val = ((cbp >> (5 - i)) & 1); | |
2442 |
2/2✓ Branch 0 taken 84336 times.
✓ Branch 1 taken 101646 times.
|
185982 | if (!fieldtx) |
2443 |
2/2✓ Branch 0 taken 56224 times.
✓ Branch 1 taken 28112 times.
|
84336 | off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); |
2444 | else | ||
2445 |
2/2✓ Branch 0 taken 67764 times.
✓ Branch 1 taken 33882 times.
|
101646 | off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize)); |
2446 |
2/2✓ Branch 0 taken 115621 times.
✓ Branch 1 taken 70361 times.
|
185982 | if (val) { |
2447 | 346863 | pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, | |
2448 | 115621 | first_block, s->dest[dst_idx] + off, | |
2449 |
2/2✓ Branch 0 taken 27250 times.
✓ Branch 1 taken 88371 times.
|
115621 | (i & 4) ? s->uvlinesize : (s->linesize << fieldtx), |
2450 | CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt); | ||
2451 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 115621 times.
|
115621 | if (pat < 0) |
2452 | ✗ | return pat; | |
2453 | 115621 | block_cbp |= pat << (i << 2); | |
2454 |
3/4✓ Branch 0 taken 115621 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 92324 times.
✓ Branch 3 taken 23297 times.
|
115621 | if (!v->ttmbf && ttmb < 8) |
2455 | 92324 | ttmb = -1; | |
2456 | 115621 | first_block = 0; | |
2457 | } | ||
2458 | } | ||
2459 | |||
2460 | } else { // skipped | ||
2461 | 1542 | dir = 0; | |
2462 |
2/2✓ Branch 0 taken 9252 times.
✓ Branch 1 taken 1542 times.
|
10794 | for (i = 0; i < 6; i++) { |
2463 | 9252 | v->mb_type[0][s->block_index[i]] = 0; | |
2464 | 9252 | s->dc_val[0][s->block_index[i]] = 0; | |
2465 | } | ||
2466 | 1542 | s->cur_pic.mb_type[mb_pos] = MB_TYPE_SKIP; | |
2467 | 1542 | s->cur_pic.qscale_table[mb_pos] = 0; | |
2468 | 1542 | v->blk_mv_type[s->block_index[0]] = 0; | |
2469 | 1542 | v->blk_mv_type[s->block_index[1]] = 0; | |
2470 | 1542 | v->blk_mv_type[s->block_index[2]] = 0; | |
2471 | 1542 | v->blk_mv_type[s->block_index[3]] = 0; | |
2472 | |||
2473 |
2/2✓ Branch 0 taken 215 times.
✓ Branch 1 taken 1327 times.
|
1542 | if (!direct) { |
2474 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 206 times.
|
215 | if (bmvtype == BMV_TYPE_INTERPOLATED) { |
2475 | 9 | ff_vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, 0); | |
2476 | 9 | ff_vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, 1); | |
2477 | } else { | ||
2478 | 206 | dir = bmvtype == BMV_TYPE_BACKWARD; | |
2479 | 206 | ff_vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, dir); | |
2480 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 206 times.
|
206 | if (mvsw) { |
2481 | ✗ | int dir2 = dir; | |
2482 | ✗ | if (mvsw) | |
2483 | ✗ | dir2 = !dir; | |
2484 | ✗ | for (i = 0; i < 2; i++) { | |
2485 | ✗ | s->mv[dir][i+2][0] = s->mv[dir][i][0] = s->cur_pic.motion_val[dir][s->block_index[i+2]][0] = s->cur_pic.motion_val[dir][s->block_index[i]][0]; | |
2486 | ✗ | s->mv[dir][i+2][1] = s->mv[dir][i][1] = s->cur_pic.motion_val[dir][s->block_index[i+2]][1] = s->cur_pic.motion_val[dir][s->block_index[i]][1]; | |
2487 | ✗ | s->mv[dir2][i+2][0] = s->mv[dir2][i][0] = s->cur_pic.motion_val[dir2][s->block_index[i]][0] = s->cur_pic.motion_val[dir2][s->block_index[i+2]][0]; | |
2488 | ✗ | s->mv[dir2][i+2][1] = s->mv[dir2][i][1] = s->cur_pic.motion_val[dir2][s->block_index[i]][1] = s->cur_pic.motion_val[dir2][s->block_index[i+2]][1]; | |
2489 | } | ||
2490 | } else { | ||
2491 | 206 | v->blk_mv_type[s->block_index[0]] = 1; | |
2492 | 206 | v->blk_mv_type[s->block_index[1]] = 1; | |
2493 | 206 | v->blk_mv_type[s->block_index[2]] = 1; | |
2494 | 206 | v->blk_mv_type[s->block_index[3]] = 1; | |
2495 | 206 | ff_vc1_pred_mv_intfr(v, 0, 0, 0, 2, v->range_x, v->range_y, !dir); | |
2496 |
2/2✓ Branch 0 taken 412 times.
✓ Branch 1 taken 206 times.
|
618 | for (i = 0; i < 2; i++) { |
2497 | 412 | s->mv[!dir][i+2][0] = s->mv[!dir][i][0] = s->cur_pic.motion_val[!dir][s->block_index[i+2]][0] = s->cur_pic.motion_val[!dir][s->block_index[i]][0]; | |
2498 | 412 | s->mv[!dir][i+2][1] = s->mv[!dir][i][1] = s->cur_pic.motion_val[!dir][s->block_index[i+2]][1] = s->cur_pic.motion_val[!dir][s->block_index[i]][1]; | |
2499 | } | ||
2500 | } | ||
2501 | } | ||
2502 | } | ||
2503 | |||
2504 | 1542 | ff_vc1_mc_1mv(v, dir); | |
2505 |
4/4✓ Branch 0 taken 215 times.
✓ Branch 1 taken 1327 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 206 times.
|
1542 | if (direct || bmvtype == BMV_TYPE_INTERPOLATED) { |
2506 | 1336 | ff_vc1_interp_mc(v); | |
2507 | } | ||
2508 | 1542 | v->fieldtx_plane[mb_pos] = 0; | |
2509 | } | ||
2510 | } | ||
2511 | 32640 | v->cbp[s->mb_x] = block_cbp; | |
2512 | 32640 | v->ttblk[s->mb_x] = block_tt; | |
2513 | |||
2514 | 32640 | return 0; | |
2515 | } | ||
2516 | |||
2517 | /** Decode blocks of I-frame | ||
2518 | */ | ||
2519 | 90 | static void vc1_decode_i_blocks(VC1Context *v) | |
2520 | { | ||
2521 | int k, j; | ||
2522 | 90 | MpegEncContext *s = &v->s; | |
2523 | int cbp, val; | ||
2524 | uint8_t *coded_val; | ||
2525 | int mb_pos; | ||
2526 | |||
2527 | /* select coding mode used for VLC tables selection */ | ||
2528 |
3/4✓ Branch 0 taken 11 times.
✓ Branch 1 taken 71 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
|
90 | switch (v->y_ac_table_index) { |
2529 | 11 | case 0: | |
2530 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 2 times.
|
11 | v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA; |
2531 | 11 | break; | |
2532 | 71 | case 1: | |
2533 | 71 | v->codingset = CS_HIGH_MOT_INTRA; | |
2534 | 71 | break; | |
2535 | 8 | case 2: | |
2536 | 8 | v->codingset = CS_MID_RATE_INTRA; | |
2537 | 8 | break; | |
2538 | } | ||
2539 | |||
2540 |
3/4✓ Branch 0 taken 84 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
90 | switch (v->c_ac_table_index) { |
2541 | 84 | case 0: | |
2542 |
2/2✓ Branch 0 taken 15 times.
✓ Branch 1 taken 69 times.
|
84 | v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER; |
2543 | 84 | break; | |
2544 | 5 | case 1: | |
2545 | 5 | v->codingset2 = CS_HIGH_MOT_INTER; | |
2546 | 5 | break; | |
2547 | 1 | case 2: | |
2548 | 1 | v->codingset2 = CS_MID_RATE_INTER; | |
2549 | 1 | break; | |
2550 | } | ||
2551 | |||
2552 | /* Set DC scale - y and c use the same so we only set y */ | ||
2553 | 90 | s->y_dc_scale = ff_wmv3_dc_scale_table[v->pq]; | |
2554 | |||
2555 | //do frame decode | ||
2556 | 90 | s->mb_x = s->mb_y = 0; | |
2557 | 90 | s->mb_intra = 1; | |
2558 | 90 | s->first_slice_line = 1; | |
2559 |
2/2✓ Branch 0 taken 1014 times.
✓ Branch 1 taken 90 times.
|
1104 | for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) { |
2560 | 1014 | s->mb_x = 0; | |
2561 | 1014 | init_block_index(v); | |
2562 |
2/2✓ Branch 0 taken 19100 times.
✓ Branch 1 taken 1014 times.
|
20114 | for (; s->mb_x < v->end_mb_x; s->mb_x++) { |
2563 | 19100 | update_block_index(s); | |
2564 | 19100 | s->bdsp.clear_blocks(v->block[v->cur_blk_idx][0]); | |
2565 | 19100 | mb_pos = s->mb_x + s->mb_y * s->mb_width; | |
2566 | 19100 | s->cur_pic.mb_type[mb_pos] = MB_TYPE_INTRA; | |
2567 | 19100 | s->cur_pic.qscale_table[mb_pos] = v->pq; | |
2568 |
2/2✓ Branch 0 taken 76400 times.
✓ Branch 1 taken 19100 times.
|
95500 | for (int i = 0; i < 4; i++) { |
2569 | 76400 | s->cur_pic.motion_val[1][s->block_index[i]][0] = 0; | |
2570 | 76400 | s->cur_pic.motion_val[1][s->block_index[i]][1] = 0; | |
2571 | } | ||
2572 | |||
2573 | // do actual MB decoding and displaying | ||
2574 | 19100 | cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc, | |
2575 | MSMP4_MB_INTRA_VLC_BITS, 2); | ||
2576 | 19100 | v->s.ac_pred = get_bits1(&v->s.gb); | |
2577 | |||
2578 |
2/2✓ Branch 0 taken 114600 times.
✓ Branch 1 taken 19100 times.
|
133700 | for (k = 0; k < 6; k++) { |
2579 | 114600 | v->mb_type[0][s->block_index[k]] = 1; | |
2580 | |||
2581 | 114600 | val = ((cbp >> (5 - k)) & 1); | |
2582 | |||
2583 |
2/2✓ Branch 0 taken 76400 times.
✓ Branch 1 taken 38200 times.
|
114600 | if (k < 4) { |
2584 | 76400 | int pred = vc1_coded_block_pred(&v->s, k, &coded_val); | |
2585 | 76400 | val = val ^ pred; | |
2586 | 76400 | *coded_val = val; | |
2587 | } | ||
2588 | 114600 | cbp |= val << (5 - k); | |
2589 | |||
2590 |
2/2✓ Branch 0 taken 76400 times.
✓ Branch 1 taken 38200 times.
|
114600 | vc1_decode_i_block(v, v->block[v->cur_blk_idx][block_map[k]], k, val, (k < 4) ? v->codingset : v->codingset2); |
2591 | |||
2592 | if (CONFIG_GRAY && k > 3 && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) | ||
2593 | continue; | ||
2594 | 114600 | v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[k]]); | |
2595 | } | ||
2596 | |||
2597 |
3/4✓ Branch 0 taken 3580 times.
✓ Branch 1 taken 15520 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3580 times.
|
19100 | if (v->overlap && v->pq >= 9) { |
2598 | ✗ | ff_vc1_i_overlap_filter(v); | |
2599 | ✗ | if (v->rangeredfrm) | |
2600 | ✗ | for (k = 0; k < 6; k++) | |
2601 | ✗ | for (j = 0; j < 64; j++) | |
2602 | ✗ | v->block[v->cur_blk_idx][block_map[k]][j] *= 2; | |
2603 | ✗ | vc1_put_blocks_clamped(v, 1); | |
2604 | } else { | ||
2605 |
2/2✓ Branch 0 taken 4320 times.
✓ Branch 1 taken 14780 times.
|
19100 | if (v->rangeredfrm) |
2606 |
2/2✓ Branch 0 taken 25920 times.
✓ Branch 1 taken 4320 times.
|
30240 | for (k = 0; k < 6; k++) |
2607 |
2/2✓ Branch 0 taken 1658880 times.
✓ Branch 1 taken 25920 times.
|
1684800 | for (j = 0; j < 64; j++) |
2608 | 1658880 | v->block[v->cur_blk_idx][block_map[k]][j] = (v->block[v->cur_blk_idx][block_map[k]][j] - 64) * 2; | |
2609 | 19100 | vc1_put_blocks_clamped(v, 0); | |
2610 | } | ||
2611 | |||
2612 |
2/2✓ Branch 0 taken 13160 times.
✓ Branch 1 taken 5940 times.
|
19100 | if (v->s.loop_filter) |
2613 | 13160 | ff_vc1_i_loop_filter(v); | |
2614 | |||
2615 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 19100 times.
|
19100 | if (get_bits_left(&s->gb) < 0) { |
2616 | ✗ | ff_er_add_slice(&s->er, 0, 0, s->mb_x, s->mb_y, ER_MB_ERROR); | |
2617 | ✗ | av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", | |
2618 | ✗ | get_bits_count(&s->gb), s->gb.size_in_bits); | |
2619 | ✗ | return; | |
2620 | } | ||
2621 | |||
2622 | 19100 | v->topleft_blk_idx = (v->topleft_blk_idx + 1) % (v->end_mb_x + 2); | |
2623 | 19100 | v->top_blk_idx = (v->top_blk_idx + 1) % (v->end_mb_x + 2); | |
2624 | 19100 | v->left_blk_idx = (v->left_blk_idx + 1) % (v->end_mb_x + 2); | |
2625 | 19100 | v->cur_blk_idx = (v->cur_blk_idx + 1) % (v->end_mb_x + 2); | |
2626 | } | ||
2627 | |||
2628 | 1014 | s->first_slice_line = 0; | |
2629 | } | ||
2630 | |||
2631 | /* This is intentionally mb_height and not end_mb_y - unlike in advanced | ||
2632 | * profile, these only differ are when decoding MSS2 rectangles. */ | ||
2633 | 90 | ff_er_add_slice(&s->er, 0, 0, s->mb_width - 1, s->mb_height - 1, ER_MB_END); | |
2634 | } | ||
2635 | |||
2636 | /** Decode blocks of I-frame for advanced profile | ||
2637 | */ | ||
2638 | 28 | static int vc1_decode_i_blocks_adv(VC1Context *v) | |
2639 | { | ||
2640 | int k; | ||
2641 | 28 | MpegEncContext *s = &v->s; | |
2642 | int cbp, val; | ||
2643 | uint8_t *coded_val; | ||
2644 | int mb_pos; | ||
2645 | int mquant; | ||
2646 | int mqdiff; | ||
2647 | 28 | GetBitContext *gb = &s->gb; | |
2648 | |||
2649 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 28 times.
|
28 | if (get_bits_left(gb) <= 1) |
2650 | ✗ | return AVERROR_INVALIDDATA; | |
2651 | |||
2652 | /* select coding mode used for VLC tables selection */ | ||
2653 |
3/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 21 times.
✗ Branch 3 not taken.
|
28 | switch (v->y_ac_table_index) { |
2654 | 2 | case 0: | |
2655 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2 | v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA; |
2656 | 2 | break; | |
2657 | 5 | case 1: | |
2658 | 5 | v->codingset = CS_HIGH_MOT_INTRA; | |
2659 | 5 | break; | |
2660 | 21 | case 2: | |
2661 | 21 | v->codingset = CS_MID_RATE_INTRA; | |
2662 | 21 | break; | |
2663 | } | ||
2664 | |||
2665 |
2/4✓ Branch 0 taken 23 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
|
28 | switch (v->c_ac_table_index) { |
2666 | 23 | case 0: | |
2667 |
1/2✓ Branch 0 taken 23 times.
✗ Branch 1 not taken.
|
23 | v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER; |
2668 | 23 | break; | |
2669 | ✗ | case 1: | |
2670 | ✗ | v->codingset2 = CS_HIGH_MOT_INTER; | |
2671 | ✗ | break; | |
2672 | 5 | case 2: | |
2673 | 5 | v->codingset2 = CS_MID_RATE_INTER; | |
2674 | 5 | break; | |
2675 | } | ||
2676 | |||
2677 | // do frame decode | ||
2678 | 28 | s->mb_intra = 1; | |
2679 | 28 | s->first_slice_line = 1; | |
2680 | 28 | s->mb_x = 0; | |
2681 | 28 | s->mb_y = s->start_mb_y; | |
2682 |
2/2✓ Branch 0 taken 12 times.
✓ Branch 1 taken 16 times.
|
28 | if (s->start_mb_y) { |
2683 | 12 | memset(&s->coded_block[(2 * s->mb_y - 1) * s->b8_stride - 2], 0, | |
2684 | 12 | (1 + s->b8_stride) * sizeof(*s->coded_block)); | |
2685 | } | ||
2686 |
2/2✓ Branch 0 taken 362 times.
✓ Branch 1 taken 28 times.
|
390 | for (; s->mb_y < s->end_mb_y; s->mb_y++) { |
2687 | 362 | s->mb_x = 0; | |
2688 | 362 | init_block_index(v); | |
2689 |
2/2✓ Branch 0 taken 24228 times.
✓ Branch 1 taken 362 times.
|
24590 | for (;s->mb_x < s->mb_width; s->mb_x++) { |
2690 | 24228 | mquant = v->pq; | |
2691 | 24228 | update_block_index(s); | |
2692 | 24228 | s->bdsp.clear_blocks(v->block[v->cur_blk_idx][0]); | |
2693 | 24228 | mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
2694 | 24228 | s->cur_pic.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA; | |
2695 |
2/2✓ Branch 0 taken 96912 times.
✓ Branch 1 taken 24228 times.
|
121140 | for (int i = 0; i < 4; i++) { |
2696 | 96912 | s->cur_pic.motion_val[1][s->block_index[i] + v->blocks_off][0] = 0; | |
2697 | 96912 | s->cur_pic.motion_val[1][s->block_index[i] + v->blocks_off][1] = 0; | |
2698 | } | ||
2699 | |||
2700 | // do actual MB decoding and displaying | ||
2701 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 24228 times.
|
24228 | if (v->fieldtx_is_raw) |
2702 | ✗ | v->fieldtx_plane[mb_pos] = get_bits1(&v->s.gb); | |
2703 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 24228 times.
|
24228 | if (get_bits_left(&v->s.gb) <= 1) { |
2704 | ✗ | ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR); | |
2705 | ✗ | return 0; | |
2706 | } | ||
2707 | |||
2708 | 24228 | cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc, | |
2709 | MSMP4_MB_INTRA_VLC_BITS, 2); | ||
2710 |
2/2✓ Branch 0 taken 5340 times.
✓ Branch 1 taken 18888 times.
|
24228 | if (v->acpred_is_raw) |
2711 | 5340 | v->s.ac_pred = get_bits1(&v->s.gb); | |
2712 | else | ||
2713 | 18888 | v->s.ac_pred = v->acpred_plane[mb_pos]; | |
2714 | |||
2715 |
3/4✓ Branch 0 taken 798 times.
✓ Branch 1 taken 23430 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 798 times.
|
24228 | if (v->condover == CONDOVER_SELECT && v->overflg_is_raw) |
2716 | ✗ | v->over_flags_plane[mb_pos] = get_bits1(&v->s.gb); | |
2717 | |||
2718 |
16/38✓ Branch 0 taken 16320 times.
✓ Branch 1 taken 7908 times.
✓ Branch 2 taken 16320 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 16320 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 10 taken 12220 times.
✓ Branch 11 taken 4100 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 16320 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 16320 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 16320 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 16320 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 16320 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 16320 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 16320 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 16320 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 16320 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 40 taken 16320 times.
|
24228 | GET_MQUANT(); |
2719 | |||
2720 | 24228 | s->cur_pic.qscale_table[mb_pos] = mquant; | |
2721 | /* Set DC scale - y and c use the same so we only set y */ | ||
2722 | 24228 | s->y_dc_scale = ff_wmv3_dc_scale_table[FFABS(mquant)]; | |
2723 | |||
2724 |
2/2✓ Branch 0 taken 145368 times.
✓ Branch 1 taken 24228 times.
|
169596 | for (k = 0; k < 6; k++) { |
2725 | 145368 | v->mb_type[0][s->block_index[k]] = 1; | |
2726 | |||
2727 | 145368 | val = ((cbp >> (5 - k)) & 1); | |
2728 | |||
2729 |
2/2✓ Branch 0 taken 96912 times.
✓ Branch 1 taken 48456 times.
|
145368 | if (k < 4) { |
2730 | 96912 | int pred = vc1_coded_block_pred(&v->s, k, &coded_val); | |
2731 | 96912 | val = val ^ pred; | |
2732 | 96912 | *coded_val = val; | |
2733 | } | ||
2734 | 145368 | cbp |= val << (5 - k); | |
2735 | |||
2736 |
6/6✓ Branch 0 taken 6984 times.
✓ Branch 1 taken 138384 times.
✓ Branch 2 taken 5820 times.
✓ Branch 3 taken 1164 times.
✓ Branch 4 taken 1164 times.
✓ Branch 5 taken 4656 times.
|
145368 | v->a_avail = !s->first_slice_line || (k == 2 || k == 3); |
2737 |
6/6✓ Branch 0 taken 2172 times.
✓ Branch 1 taken 143196 times.
✓ Branch 2 taken 1810 times.
✓ Branch 3 taken 362 times.
✓ Branch 4 taken 362 times.
✓ Branch 5 taken 1448 times.
|
145368 | v->c_avail = !!s->mb_x || (k == 1 || k == 3); |
2738 | |||
2739 |
2/2✓ Branch 0 taken 96912 times.
✓ Branch 1 taken 48456 times.
|
145368 | vc1_decode_i_block_adv(v, v->block[v->cur_blk_idx][block_map[k]], k, val, |
2740 | (k < 4) ? v->codingset : v->codingset2, mquant); | ||
2741 | |||
2742 | if (CONFIG_GRAY && k > 3 && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) | ||
2743 | continue; | ||
2744 | 145368 | v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[k]]); | |
2745 | } | ||
2746 | |||
2747 |
5/6✓ Branch 0 taken 7488 times.
✓ Branch 1 taken 16740 times.
✓ Branch 2 taken 7488 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 798 times.
✓ Branch 5 taken 6690 times.
|
24228 | if (v->overlap && (v->pq >= 9 || v->condover != CONDOVER_NONE)) |
2748 | 798 | ff_vc1_i_overlap_filter(v); | |
2749 | 24228 | vc1_put_blocks_clamped(v, 1); | |
2750 |
2/2✓ Branch 0 taken 23628 times.
✓ Branch 1 taken 600 times.
|
24228 | if (v->s.loop_filter) |
2751 | 23628 | ff_vc1_i_loop_filter(v); | |
2752 | |||
2753 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 24228 times.
|
24228 | if (get_bits_left(&s->gb) < 0) { |
2754 | // TODO: may need modification to handle slice coding | ||
2755 | ✗ | ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR); | |
2756 | ✗ | av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", | |
2757 | ✗ | get_bits_count(&s->gb), s->gb.size_in_bits); | |
2758 | ✗ | return 0; | |
2759 | } | ||
2760 |
2/2✓ Branch 0 taken 328 times.
✓ Branch 1 taken 23900 times.
|
24228 | inc_blk_idx(v->topleft_blk_idx); |
2761 |
2/2✓ Branch 0 taken 332 times.
✓ Branch 1 taken 23896 times.
|
24228 | inc_blk_idx(v->top_blk_idx); |
2762 |
2/2✓ Branch 0 taken 328 times.
✓ Branch 1 taken 23900 times.
|
24228 | inc_blk_idx(v->left_blk_idx); |
2763 |
2/2✓ Branch 0 taken 328 times.
✓ Branch 1 taken 23900 times.
|
24228 | inc_blk_idx(v->cur_blk_idx); |
2764 | } | ||
2765 | 362 | s->first_slice_line = 0; | |
2766 | } | ||
2767 | |||
2768 | 28 | ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1, | |
2769 | 28 | (s->end_mb_y << v->field_mode) - 1, ER_MB_END); | |
2770 | 28 | return 0; | |
2771 | } | ||
2772 | |||
2773 | 917 | static void vc1_decode_p_blocks(VC1Context *v) | |
2774 | { | ||
2775 | 917 | MpegEncContext *s = &v->s; | |
2776 | int apply_loop_filter; | ||
2777 | int ret; | ||
2778 | |||
2779 | /* select coding mode used for VLC tables selection */ | ||
2780 |
3/4✓ Branch 0 taken 270 times.
✓ Branch 1 taken 391 times.
✓ Branch 2 taken 256 times.
✗ Branch 3 not taken.
|
917 | switch (v->c_ac_table_index) { |
2781 | 270 | case 0: | |
2782 |
2/2✓ Branch 0 taken 250 times.
✓ Branch 1 taken 20 times.
|
270 | v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA; |
2783 | 270 | break; | |
2784 | 391 | case 1: | |
2785 | 391 | v->codingset = CS_HIGH_MOT_INTRA; | |
2786 | 391 | break; | |
2787 | 256 | case 2: | |
2788 | 256 | v->codingset = CS_MID_RATE_INTRA; | |
2789 | 256 | break; | |
2790 | } | ||
2791 | |||
2792 |
3/4✓ Branch 0 taken 270 times.
✓ Branch 1 taken 391 times.
✓ Branch 2 taken 256 times.
✗ Branch 3 not taken.
|
917 | switch (v->c_ac_table_index) { |
2793 | 270 | case 0: | |
2794 |
2/2✓ Branch 0 taken 250 times.
✓ Branch 1 taken 20 times.
|
270 | v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER; |
2795 | 270 | break; | |
2796 | 391 | case 1: | |
2797 | 391 | v->codingset2 = CS_HIGH_MOT_INTER; | |
2798 | 391 | break; | |
2799 | 256 | case 2: | |
2800 | 256 | v->codingset2 = CS_MID_RATE_INTER; | |
2801 | 256 | break; | |
2802 | } | ||
2803 | |||
2804 |
3/4✓ Branch 0 taken 867 times.
✓ Branch 1 taken 50 times.
✓ Branch 2 taken 867 times.
✗ Branch 3 not taken.
|
917 | apply_loop_filter = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY); |
2805 | 917 | s->first_slice_line = 1; | |
2806 | 917 | memset(v->cbp_base, 0, sizeof(v->cbp_base[0]) * 3 * s->mb_stride); | |
2807 |
2/2✓ Branch 0 taken 5379 times.
✓ Branch 1 taken 916 times.
|
6295 | for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) { |
2808 | 5379 | s->mb_x = 0; | |
2809 | 5379 | init_block_index(v); | |
2810 |
2/2✓ Branch 0 taken 206848 times.
✓ Branch 1 taken 5378 times.
|
212226 | for (; s->mb_x < s->mb_width; s->mb_x++) { |
2811 | 206848 | update_block_index(s); | |
2812 | |||
2813 |
7/8✓ Branch 0 taken 168928 times.
✓ Branch 1 taken 37920 times.
✓ Branch 2 taken 152608 times.
✓ Branch 3 taken 16320 times.
✓ Branch 4 taken 93838 times.
✓ Branch 5 taken 58770 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 110158 times.
|
206848 | if (v->fcm == ILACE_FIELD || (v->fcm == PROGRESSIVE && v->mv_type_is_raw) || v->skip_is_raw) |
2814 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 96690 times.
|
96690 | if (get_bits_left(&v->s.gb) <= 1) { |
2815 | ✗ | ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR); | |
2816 | ✗ | return; | |
2817 | } | ||
2818 | |||
2819 |
2/2✓ Branch 0 taken 37920 times.
✓ Branch 1 taken 168928 times.
|
206848 | if (v->fcm == ILACE_FIELD) { |
2820 | 37920 | ret = vc1_decode_p_mb_intfi(v); | |
2821 |
1/2✓ Branch 0 taken 37920 times.
✗ Branch 1 not taken.
|
37920 | if (apply_loop_filter) |
2822 | 37920 | ff_vc1_p_loop_filter(v); | |
2823 |
2/2✓ Branch 0 taken 16320 times.
✓ Branch 1 taken 152608 times.
|
168928 | } else if (v->fcm == ILACE_FRAME) { |
2824 | 16320 | ret = vc1_decode_p_mb_intfr(v); | |
2825 |
1/2✓ Branch 0 taken 16320 times.
✗ Branch 1 not taken.
|
16320 | if (apply_loop_filter) |
2826 | 16320 | ff_vc1_p_intfr_loop_filter(v); | |
2827 | } else { | ||
2828 | 152608 | ret = vc1_decode_p_mb(v); | |
2829 |
2/2✓ Branch 0 taken 93328 times.
✓ Branch 1 taken 59280 times.
|
152608 | if (apply_loop_filter) |
2830 | 93328 | ff_vc1_p_loop_filter(v); | |
2831 | } | ||
2832 |
4/6✓ Branch 0 taken 206848 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 206847 times.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 206847 times.
|
206848 | if (ret < 0 || get_bits_left(&s->gb) < 0 || get_bits_count(&s->gb) < 0) { |
2833 | // TODO: may need modification to handle slice coding | ||
2834 | 1 | ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR); | |
2835 | 1 | av_log(s->avctx, AV_LOG_ERROR, "Error or Bits overconsumption: %i > %i at %ix%i\n", | |
2836 | 1 | get_bits_count(&s->gb), s->gb.size_in_bits, s->mb_x, s->mb_y); | |
2837 | 1 | return; | |
2838 | } | ||
2839 |
2/2✓ Branch 0 taken 4398 times.
✓ Branch 1 taken 202449 times.
|
206847 | inc_blk_idx(v->topleft_blk_idx); |
2840 |
2/2✓ Branch 0 taken 4830 times.
✓ Branch 1 taken 202017 times.
|
206847 | inc_blk_idx(v->top_blk_idx); |
2841 |
2/2✓ Branch 0 taken 4271 times.
✓ Branch 1 taken 202576 times.
|
206847 | inc_blk_idx(v->left_blk_idx); |
2842 |
2/2✓ Branch 0 taken 4398 times.
✓ Branch 1 taken 202449 times.
|
206847 | inc_blk_idx(v->cur_blk_idx); |
2843 | } | ||
2844 | 5378 | memmove(v->cbp_base, | |
2845 | 5378 | v->cbp - s->mb_stride, | |
2846 | 5378 | sizeof(v->cbp_base[0]) * 2 * s->mb_stride); | |
2847 | 5378 | memmove(v->ttblk_base, | |
2848 | 5378 | v->ttblk - s->mb_stride, | |
2849 | 5378 | sizeof(v->ttblk_base[0]) * 2 * s->mb_stride); | |
2850 | 5378 | memmove(v->is_intra_base, | |
2851 | 5378 | v->is_intra - s->mb_stride, | |
2852 | 5378 | sizeof(v->is_intra_base[0]) * 2 * s->mb_stride); | |
2853 | 5378 | memmove(v->luma_mv_base, | |
2854 | 5378 | v->luma_mv - s->mb_stride, | |
2855 | 5378 | sizeof(v->luma_mv_base[0]) * 2 * s->mb_stride); | |
2856 | 5378 | s->first_slice_line = 0; | |
2857 | } | ||
2858 | 916 | ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1, | |
2859 | 916 | (s->end_mb_y << v->field_mode) - 1, ER_MB_END); | |
2860 | } | ||
2861 | |||
2862 | 109 | static void vc1_decode_b_blocks(VC1Context *v) | |
2863 | { | ||
2864 | 109 | MpegEncContext *s = &v->s; | |
2865 | |||
2866 | /* select coding mode used for VLC tables selection */ | ||
2867 |
3/4✓ Branch 0 taken 14 times.
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 79 times.
✗ Branch 3 not taken.
|
109 | switch (v->c_ac_table_index) { |
2868 | 14 | case 0: | |
2869 |
1/2✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
|
14 | v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA; |
2870 | 14 | break; | |
2871 | 16 | case 1: | |
2872 | 16 | v->codingset = CS_HIGH_MOT_INTRA; | |
2873 | 16 | break; | |
2874 | 79 | case 2: | |
2875 | 79 | v->codingset = CS_MID_RATE_INTRA; | |
2876 | 79 | break; | |
2877 | } | ||
2878 | |||
2879 |
3/4✓ Branch 0 taken 14 times.
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 79 times.
✗ Branch 3 not taken.
|
109 | switch (v->c_ac_table_index) { |
2880 | 14 | case 0: | |
2881 |
1/2✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
|
14 | v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER; |
2882 | 14 | break; | |
2883 | 16 | case 1: | |
2884 | 16 | v->codingset2 = CS_HIGH_MOT_INTER; | |
2885 | 16 | break; | |
2886 | 79 | case 2: | |
2887 | 79 | v->codingset2 = CS_MID_RATE_INTER; | |
2888 | 79 | break; | |
2889 | } | ||
2890 | |||
2891 | 109 | s->first_slice_line = 1; | |
2892 |
2/2✓ Branch 0 taken 1700 times.
✓ Branch 1 taken 109 times.
|
1809 | for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) { |
2893 | 1700 | s->mb_x = 0; | |
2894 | 1700 | init_block_index(v); | |
2895 |
2/2✓ Branch 0 taken 105120 times.
✓ Branch 1 taken 1700 times.
|
106820 | for (; s->mb_x < s->mb_width; s->mb_x++) { |
2896 | 105120 | update_block_index(s); | |
2897 | |||
2898 |
4/6✓ Branch 0 taken 53580 times.
✓ Branch 1 taken 51540 times.
✓ Branch 2 taken 53580 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 53580 times.
|
105120 | if (v->fcm == ILACE_FIELD || v->skip_is_raw || v->dmb_is_raw) |
2899 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 51540 times.
|
51540 | if (get_bits_left(&v->s.gb) <= 1) { |
2900 | ✗ | ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR); | |
2901 | ✗ | return; | |
2902 | } | ||
2903 | |||
2904 |
2/2✓ Branch 0 taken 51540 times.
✓ Branch 1 taken 53580 times.
|
105120 | if (v->fcm == ILACE_FIELD) { |
2905 | 51540 | vc1_decode_b_mb_intfi(v); | |
2906 |
1/2✓ Branch 0 taken 51540 times.
✗ Branch 1 not taken.
|
51540 | if (v->s.loop_filter) |
2907 | 51540 | ff_vc1_b_intfi_loop_filter(v); | |
2908 |
2/2✓ Branch 0 taken 32640 times.
✓ Branch 1 taken 20940 times.
|
53580 | } else if (v->fcm == ILACE_FRAME) { |
2909 | 32640 | vc1_decode_b_mb_intfr(v); | |
2910 |
1/2✓ Branch 0 taken 32640 times.
✗ Branch 1 not taken.
|
32640 | if (v->s.loop_filter) |
2911 | 32640 | ff_vc1_p_intfr_loop_filter(v); | |
2912 | } else { | ||
2913 | 20940 | vc1_decode_b_mb(v); | |
2914 |
2/2✓ Branch 0 taken 6090 times.
✓ Branch 1 taken 14850 times.
|
20940 | if (v->s.loop_filter) |
2915 | 6090 | ff_vc1_i_loop_filter(v); | |
2916 | } | ||
2917 |
2/4✓ Branch 1 taken 105120 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 105120 times.
|
105120 | if (get_bits_left(&s->gb) < 0 || get_bits_count(&s->gb) < 0) { |
2918 | // TODO: may need modification to handle slice coding | ||
2919 | ✗ | ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR); | |
2920 | ✗ | av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", | |
2921 | ✗ | get_bits_count(&s->gb), s->gb.size_in_bits, s->mb_x, s->mb_y); | |
2922 | ✗ | return; | |
2923 | } | ||
2924 | } | ||
2925 | 1700 | memmove(v->cbp_base, | |
2926 | 1700 | v->cbp - s->mb_stride, | |
2927 | 1700 | sizeof(v->cbp_base[0]) * 2 * s->mb_stride); | |
2928 | 1700 | memmove(v->ttblk_base, | |
2929 | 1700 | v->ttblk - s->mb_stride, | |
2930 | 1700 | sizeof(v->ttblk_base[0]) * 2 * s->mb_stride); | |
2931 | 1700 | memmove(v->is_intra_base, | |
2932 | 1700 | v->is_intra - s->mb_stride, | |
2933 | 1700 | sizeof(v->is_intra_base[0]) * 2 * s->mb_stride); | |
2934 | 1700 | s->first_slice_line = 0; | |
2935 | } | ||
2936 | 109 | ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1, | |
2937 | 109 | (s->end_mb_y << v->field_mode) - 1, ER_MB_END); | |
2938 | } | ||
2939 | |||
2940 | 67 | static void vc1_decode_skip_blocks(VC1Context *v) | |
2941 | { | ||
2942 | 67 | MpegEncContext *s = &v->s; | |
2943 | |||
2944 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
|
67 | if (!v->s.last_pic.data[0]) |
2945 | ✗ | return; | |
2946 | |||
2947 | 67 | ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_width - 1, s->end_mb_y - 1, ER_MB_END); | |
2948 | 67 | s->first_slice_line = 1; | |
2949 |
2/2✓ Branch 0 taken 1617 times.
✓ Branch 1 taken 67 times.
|
1684 | for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) { |
2950 | 1617 | s->mb_x = 0; | |
2951 | 1617 | init_block_index(v); | |
2952 | 1617 | update_block_index(s); | |
2953 | 1617 | memcpy(s->dest[0], s->last_pic.data[0] + s->mb_y * 16 * s->linesize, s->linesize * 16); | |
2954 | 1617 | memcpy(s->dest[1], s->last_pic.data[1] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8); | |
2955 | 1617 | memcpy(s->dest[2], s->last_pic.data[2] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8); | |
2956 | 1617 | s->first_slice_line = 0; | |
2957 | } | ||
2958 | } | ||
2959 | |||
2960 | 1211 | void ff_vc1_decode_blocks(VC1Context *v) | |
2961 | { | ||
2962 | |||
2963 | 1211 | v->s.esc3_level_length = 0; | |
2964 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1211 times.
|
1211 | if (v->x8_type) { |
2965 | ✗ | ff_intrax8_decode_picture(&v->x8, v->s.cur_pic.ptr, | |
2966 | &v->s.gb, &v->s.mb_x, &v->s.mb_y, | ||
2967 | ✗ | 2 * v->pq + v->halfpq, v->pq * !v->pquantizer, | |
2968 | v->s.loop_filter, v->s.low_delay); | ||
2969 | |||
2970 | ✗ | ff_er_add_slice(&v->s.er, 0, 0, | |
2971 | ✗ | (v->s.mb_x >> 1) - 1, (v->s.mb_y >> 1) - 1, | |
2972 | ER_MB_END); | ||
2973 | } else { | ||
2974 | 1211 | v->cur_blk_idx = 0; | |
2975 | 1211 | v->left_blk_idx = -1; | |
2976 | 1211 | v->topleft_blk_idx = 1; | |
2977 | 1211 | v->top_blk_idx = 2; | |
2978 |
3/4✓ Branch 0 taken 118 times.
✓ Branch 1 taken 984 times.
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
|
1211 | switch (v->s.pict_type) { |
2979 | 118 | case AV_PICTURE_TYPE_I: | |
2980 |
2/2✓ Branch 0 taken 28 times.
✓ Branch 1 taken 90 times.
|
118 | if (v->profile == PROFILE_ADVANCED) |
2981 | 28 | vc1_decode_i_blocks_adv(v); | |
2982 | else | ||
2983 | 90 | vc1_decode_i_blocks(v); | |
2984 | 118 | break; | |
2985 | 984 | case AV_PICTURE_TYPE_P: | |
2986 |
2/2✓ Branch 0 taken 67 times.
✓ Branch 1 taken 917 times.
|
984 | if (v->p_frame_skipped) |
2987 | 67 | vc1_decode_skip_blocks(v); | |
2988 | else | ||
2989 | 917 | vc1_decode_p_blocks(v); | |
2990 | 984 | break; | |
2991 | 109 | case AV_PICTURE_TYPE_B: | |
2992 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 109 times.
|
109 | if (v->bi_type) { |
2993 | ✗ | if (v->profile == PROFILE_ADVANCED) | |
2994 | ✗ | vc1_decode_i_blocks_adv(v); | |
2995 | else | ||
2996 | ✗ | vc1_decode_i_blocks(v); | |
2997 | } else | ||
2998 | 109 | vc1_decode_b_blocks(v); | |
2999 | 109 | break; | |
3000 | } | ||
3001 | } | ||
3002 | 1211 | } | |
3003 |