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 "mathops.h" | ||
30 | #include "mpegutils.h" | ||
31 | #include "mpegvideo.h" | ||
32 | #include "vc1.h" | ||
33 | #include "vc1_pred.h" | ||
34 | #include "vc1data.h" | ||
35 | |||
36 | 34909 | static av_always_inline int scaleforsame_x(const VC1Context *v, int n /* MV */, int dir) | |
37 | { | ||
38 | int scaledvalue, refdist; | ||
39 | int scalesame1, scalesame2; | ||
40 | int scalezone1_x, zone1offset_x; | ||
41 | 34909 | int table_index = dir ^ v->second_field; | |
42 | |||
43 |
2/2✓ Branch 0 taken 14268 times.
✓ Branch 1 taken 20641 times.
|
34909 | if (v->s.pict_type != AV_PICTURE_TYPE_B) |
44 | 14268 | refdist = v->refdist; | |
45 | else | ||
46 |
2/2✓ Branch 0 taken 7214 times.
✓ Branch 1 taken 13427 times.
|
20641 | refdist = dir ? v->brfd : v->frfd; |
47 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 34909 times.
|
34909 | if (refdist > 3) |
48 | ✗ | refdist = 3; | |
49 | 34909 | scalesame1 = ff_vc1_field_mvpred_scales[table_index][1][refdist]; | |
50 | 34909 | scalesame2 = ff_vc1_field_mvpred_scales[table_index][2][refdist]; | |
51 | 34909 | scalezone1_x = ff_vc1_field_mvpred_scales[table_index][3][refdist]; | |
52 | 34909 | zone1offset_x = ff_vc1_field_mvpred_scales[table_index][5][refdist]; | |
53 | |||
54 |
2/2✓ Branch 0 taken 13 times.
✓ Branch 1 taken 34896 times.
|
34909 | if (FFABS(n) > 255) |
55 | 13 | scaledvalue = n; | |
56 | else { | ||
57 |
2/2✓ Branch 0 taken 25948 times.
✓ Branch 1 taken 8948 times.
|
34896 | if (FFABS(n) < scalezone1_x) |
58 | 25948 | scaledvalue = (n * scalesame1) >> 8; | |
59 | else { | ||
60 |
2/2✓ Branch 0 taken 4487 times.
✓ Branch 1 taken 4461 times.
|
8948 | if (n < 0) |
61 | 4487 | scaledvalue = ((n * scalesame2) >> 8) - zone1offset_x; | |
62 | else | ||
63 | 4461 | scaledvalue = ((n * scalesame2) >> 8) + zone1offset_x; | |
64 | } | ||
65 | } | ||
66 | 34909 | return av_clip(scaledvalue, -v->range_x, v->range_x - 1); | |
67 | } | ||
68 | |||
69 | 34909 | static av_always_inline int scaleforsame_y(const VC1Context *v, int n /* MV */, int dir) | |
70 | { | ||
71 | int scaledvalue, refdist; | ||
72 | int scalesame1, scalesame2; | ||
73 | int scalezone1_y, zone1offset_y; | ||
74 | 34909 | int table_index = dir ^ v->second_field; | |
75 | |||
76 |
2/2✓ Branch 0 taken 14268 times.
✓ Branch 1 taken 20641 times.
|
34909 | if (v->s.pict_type != AV_PICTURE_TYPE_B) |
77 | 14268 | refdist = v->refdist; | |
78 | else | ||
79 |
2/2✓ Branch 0 taken 7214 times.
✓ Branch 1 taken 13427 times.
|
20641 | refdist = dir ? v->brfd : v->frfd; |
80 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 34909 times.
|
34909 | if (refdist > 3) |
81 | ✗ | refdist = 3; | |
82 | 34909 | scalesame1 = ff_vc1_field_mvpred_scales[table_index][1][refdist]; | |
83 | 34909 | scalesame2 = ff_vc1_field_mvpred_scales[table_index][2][refdist]; | |
84 | 34909 | scalezone1_y = ff_vc1_field_mvpred_scales[table_index][4][refdist]; | |
85 | 34909 | zone1offset_y = ff_vc1_field_mvpred_scales[table_index][6][refdist]; | |
86 | |||
87 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 34909 times.
|
34909 | if (FFABS(n) > 63) |
88 | ✗ | scaledvalue = n; | |
89 | else { | ||
90 |
2/2✓ Branch 0 taken 27772 times.
✓ Branch 1 taken 7137 times.
|
34909 | if (FFABS(n) < scalezone1_y) |
91 | 27772 | scaledvalue = (n * scalesame1) >> 8; | |
92 | else { | ||
93 |
2/2✓ Branch 0 taken 3231 times.
✓ Branch 1 taken 3906 times.
|
7137 | if (n < 0) |
94 | 3231 | scaledvalue = ((n * scalesame2) >> 8) - zone1offset_y; | |
95 | else | ||
96 | 3906 | scaledvalue = ((n * scalesame2) >> 8) + zone1offset_y; | |
97 | } | ||
98 | } | ||
99 | |||
100 |
3/4✓ Branch 0 taken 18863 times.
✓ Branch 1 taken 16046 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18863 times.
|
34909 | if (v->cur_field_type && !v->ref_field_type[dir]) |
101 | ✗ | return av_clip(scaledvalue, -v->range_y / 2 + 1, v->range_y / 2); | |
102 | else | ||
103 | 34909 | return av_clip(scaledvalue, -v->range_y / 2, v->range_y / 2 - 1); | |
104 | } | ||
105 | |||
106 | 8428 | static av_always_inline int scaleforopp_x(const VC1Context *v, int n /* MV */) | |
107 | { | ||
108 | int scalezone1_x, zone1offset_x; | ||
109 | int scaleopp1, scaleopp2, brfd; | ||
110 | int scaledvalue; | ||
111 | |||
112 | 8428 | brfd = FFMIN(v->brfd, 3); | |
113 | 8428 | scalezone1_x = ff_vc1_b_field_mvpred_scales[3][brfd]; | |
114 | 8428 | zone1offset_x = ff_vc1_b_field_mvpred_scales[5][brfd]; | |
115 | 8428 | scaleopp1 = ff_vc1_b_field_mvpred_scales[1][brfd]; | |
116 | 8428 | scaleopp2 = ff_vc1_b_field_mvpred_scales[2][brfd]; | |
117 | |||
118 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8428 times.
|
8428 | if (FFABS(n) > 255) |
119 | ✗ | scaledvalue = n; | |
120 | else { | ||
121 |
2/2✓ Branch 0 taken 6150 times.
✓ Branch 1 taken 2278 times.
|
8428 | if (FFABS(n) < scalezone1_x) |
122 | 6150 | scaledvalue = (n * scaleopp1) >> 8; | |
123 | else { | ||
124 |
2/2✓ Branch 0 taken 1151 times.
✓ Branch 1 taken 1127 times.
|
2278 | if (n < 0) |
125 | 1151 | scaledvalue = ((n * scaleopp2) >> 8) - zone1offset_x; | |
126 | else | ||
127 | 1127 | scaledvalue = ((n * scaleopp2) >> 8) + zone1offset_x; | |
128 | } | ||
129 | } | ||
130 | 8428 | return av_clip(scaledvalue, -v->range_x, v->range_x - 1); | |
131 | } | ||
132 | |||
133 | 8428 | static av_always_inline int scaleforopp_y(const VC1Context *v, int n /* MV */, int dir) | |
134 | { | ||
135 | int scalezone1_y, zone1offset_y; | ||
136 | int scaleopp1, scaleopp2, brfd; | ||
137 | int scaledvalue; | ||
138 | |||
139 | 8428 | brfd = FFMIN(v->brfd, 3); | |
140 | 8428 | scalezone1_y = ff_vc1_b_field_mvpred_scales[4][brfd]; | |
141 | 8428 | zone1offset_y = ff_vc1_b_field_mvpred_scales[6][brfd]; | |
142 | 8428 | scaleopp1 = ff_vc1_b_field_mvpred_scales[1][brfd]; | |
143 | 8428 | scaleopp2 = ff_vc1_b_field_mvpred_scales[2][brfd]; | |
144 | |||
145 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8428 times.
|
8428 | if (FFABS(n) > 63) |
146 | ✗ | scaledvalue = n; | |
147 | else { | ||
148 |
2/2✓ Branch 0 taken 6961 times.
✓ Branch 1 taken 1467 times.
|
8428 | if (FFABS(n) < scalezone1_y) |
149 | 6961 | scaledvalue = (n * scaleopp1) >> 8; | |
150 | else { | ||
151 |
2/2✓ Branch 0 taken 803 times.
✓ Branch 1 taken 664 times.
|
1467 | if (n < 0) |
152 | 803 | scaledvalue = ((n * scaleopp2) >> 8) - zone1offset_y; | |
153 | else | ||
154 | 664 | scaledvalue = ((n * scaleopp2) >> 8) + zone1offset_y; | |
155 | } | ||
156 | } | ||
157 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8428 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
8428 | if (v->cur_field_type && !v->ref_field_type[dir]) { |
158 | ✗ | return av_clip(scaledvalue, -v->range_y / 2 + 1, v->range_y / 2); | |
159 | } else { | ||
160 | 8428 | return av_clip(scaledvalue, -v->range_y / 2, v->range_y / 2 - 1); | |
161 | } | ||
162 | } | ||
163 | |||
164 | 86724 | static av_always_inline int scaleforsame(const VC1Context *v, int n /* MV */, | |
165 | int dim, int dir) | ||
166 | { | ||
167 | int brfd, scalesame; | ||
168 | 86724 | int hpel = 1 - v->s.quarter_sample; | |
169 | |||
170 | 86724 | n >>= hpel; | |
171 |
6/6✓ Branch 0 taken 58188 times.
✓ Branch 1 taken 28536 times.
✓ Branch 2 taken 32076 times.
✓ Branch 3 taken 26112 times.
✓ Branch 4 taken 15170 times.
✓ Branch 5 taken 16906 times.
|
86724 | if (v->s.pict_type != AV_PICTURE_TYPE_B || v->second_field || !dir) { |
172 |
2/2✓ Branch 0 taken 34909 times.
✓ Branch 1 taken 34909 times.
|
69818 | if (dim) |
173 | 34909 | n = scaleforsame_y(v, n, dir) * (1 << hpel); | |
174 | else | ||
175 | 34909 | n = scaleforsame_x(v, n, dir) * (1 << hpel); | |
176 | 69818 | return n; | |
177 | } | ||
178 | 16906 | brfd = FFMIN(v->brfd, 3); | |
179 | 16906 | scalesame = ff_vc1_b_field_mvpred_scales[0][brfd]; | |
180 | |||
181 | 16906 | n = (n * scalesame >> 8) * (1 << hpel); | |
182 | 16906 | return n; | |
183 | } | ||
184 | |||
185 | 86000 | static av_always_inline int scaleforopp(const VC1Context *v, int n /* MV */, | |
186 | int dim, int dir) | ||
187 | { | ||
188 | int refdist, scaleopp; | ||
189 | 86000 | int hpel = 1 - v->s.quarter_sample; | |
190 | |||
191 | 86000 | n >>= hpel; | |
192 |
6/6✓ Branch 0 taken 59182 times.
✓ Branch 1 taken 26818 times.
✓ Branch 2 taken 31814 times.
✓ Branch 3 taken 27368 times.
✓ Branch 4 taken 16856 times.
✓ Branch 5 taken 14958 times.
|
86000 | if (v->s.pict_type == AV_PICTURE_TYPE_B && !v->second_field && dir == 1) { |
193 |
2/2✓ Branch 0 taken 8428 times.
✓ Branch 1 taken 8428 times.
|
16856 | if (dim) |
194 | 8428 | n = scaleforopp_y(v, n, dir) * (1 << hpel); | |
195 | else | ||
196 | 8428 | n = scaleforopp_x(v, n) * (1 << hpel); | |
197 | 16856 | return n; | |
198 | } | ||
199 |
2/2✓ Branch 0 taken 26818 times.
✓ Branch 1 taken 42326 times.
|
69144 | if (v->s.pict_type != AV_PICTURE_TYPE_B) |
200 | 26818 | refdist = v->refdist; | |
201 | else | ||
202 |
2/2✓ Branch 0 taken 13008 times.
✓ Branch 1 taken 29318 times.
|
42326 | refdist = dir ? v->brfd : v->frfd; |
203 | 69144 | refdist = FFMIN(refdist, 3); | |
204 | 69144 | scaleopp = ff_vc1_field_mvpred_scales[dir ^ v->second_field][0][refdist]; | |
205 | |||
206 | 69144 | n = (n * scaleopp >> 8) * (1 << hpel); | |
207 | 69144 | return n; | |
208 | } | ||
209 | |||
210 | /** Predict and set motion vector | ||
211 | */ | ||
212 | 398903 | void ff_vc1_pred_mv(VC1Context *v, int n, int dmv_x, int dmv_y, | |
213 | int mv1, int r_x, int r_y, uint8_t* is_intra, | ||
214 | int pred_flag, int dir) | ||
215 | { | ||
216 | 398903 | MpegEncContext *s = &v->s; | |
217 | 398903 | int xy, wrap, off = 0; | |
218 | int px, py; | ||
219 | int sum; | ||
220 | 398903 | int mixedmv_pic, num_samefield = 0, num_oppfield = 0; | |
221 | int opposite, a_f, b_f, c_f; | ||
222 | int16_t field_predA[2]; | ||
223 | int16_t field_predB[2]; | ||
224 | int16_t field_predC[2]; | ||
225 | int a_valid, b_valid, c_valid; | ||
226 | 398903 | int hybridmv_thresh, y_bias = 0; | |
227 | |||
228 |
2/2✓ Branch 0 taken 147596 times.
✓ Branch 1 taken 251307 times.
|
398903 | if (v->mv_mode == MV_PMODE_MIXED_MV || |
229 |
3/4✓ Branch 0 taken 4620 times.
✓ Branch 1 taken 142976 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4620 times.
|
147596 | ((v->mv_mode == MV_PMODE_INTENSITY_COMP) && (v->mv_mode2 == MV_PMODE_MIXED_MV))) |
230 | 251307 | mixedmv_pic = 1; | |
231 | else | ||
232 | 147596 | mixedmv_pic = 0; | |
233 | /* scale MV difference to be quad-pel */ | ||
234 |
2/2✓ Branch 0 taken 115752 times.
✓ Branch 1 taken 283151 times.
|
398903 | if (!s->quarter_sample) { |
235 | 115752 | dmv_x *= 2; | |
236 | 115752 | dmv_y *= 2; | |
237 | } | ||
238 | |||
239 | 398903 | wrap = s->b8_stride; | |
240 | 398903 | xy = s->block_index[n]; | |
241 | |||
242 |
2/2✓ Branch 0 taken 35551 times.
✓ Branch 1 taken 363352 times.
|
398903 | if (s->mb_intra) { |
243 | 35551 | s->mv[0][n][0] = s->cur_pic.motion_val[0][xy + v->blocks_off][0] = 0; | |
244 | 35551 | s->mv[0][n][1] = s->cur_pic.motion_val[0][xy + v->blocks_off][1] = 0; | |
245 | 35551 | s->cur_pic.motion_val[1][xy + v->blocks_off][0] = 0; | |
246 | 35551 | s->cur_pic.motion_val[1][xy + v->blocks_off][1] = 0; | |
247 |
2/2✓ Branch 0 taken 24987 times.
✓ Branch 1 taken 10564 times.
|
35551 | if (mv1) { /* duplicate motion data for 1-MV block */ |
248 | 24987 | s->cur_pic.motion_val[0][xy + 1 + v->blocks_off][0] = 0; | |
249 | 24987 | s->cur_pic.motion_val[0][xy + 1 + v->blocks_off][1] = 0; | |
250 | 24987 | s->cur_pic.motion_val[0][xy + wrap + v->blocks_off][0] = 0; | |
251 | 24987 | s->cur_pic.motion_val[0][xy + wrap + v->blocks_off][1] = 0; | |
252 | 24987 | s->cur_pic.motion_val[0][xy + wrap + 1 + v->blocks_off][0] = 0; | |
253 | 24987 | s->cur_pic.motion_val[0][xy + wrap + 1 + v->blocks_off][1] = 0; | |
254 | 24987 | v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0; | |
255 | 24987 | s->cur_pic.motion_val[1][xy + 1 + v->blocks_off][0] = 0; | |
256 | 24987 | s->cur_pic.motion_val[1][xy + 1 + v->blocks_off][1] = 0; | |
257 | 24987 | s->cur_pic.motion_val[1][xy + wrap + v->blocks_off][0] = 0; | |
258 | 24987 | s->cur_pic.motion_val[1][xy + wrap + v->blocks_off][1] = 0; | |
259 | 24987 | s->cur_pic.motion_val[1][xy + wrap + 1 + v->blocks_off][0] = 0; | |
260 | 24987 | s->cur_pic.motion_val[1][xy + wrap + 1 + v->blocks_off][1] = 0; | |
261 | } | ||
262 | 35551 | return; | |
263 | } | ||
264 | |||
265 |
6/6✓ Branch 0 taken 56538 times.
✓ Branch 1 taken 306814 times.
✓ Branch 2 taken 46881 times.
✓ Branch 3 taken 9657 times.
✓ Branch 4 taken 9674 times.
✓ Branch 5 taken 37207 times.
|
363352 | a_valid = !s->first_slice_line || (n == 2 || n == 3); |
266 | 363352 | b_valid = a_valid; | |
267 |
6/6✓ Branch 0 taken 8510 times.
✓ Branch 1 taken 354842 times.
✓ Branch 2 taken 7475 times.
✓ Branch 3 taken 1035 times.
✓ Branch 4 taken 1029 times.
✓ Branch 5 taken 6446 times.
|
363352 | c_valid = s->mb_x || (n == 1 || n == 3); |
268 |
2/2✓ Branch 0 taken 201708 times.
✓ Branch 1 taken 161644 times.
|
363352 | if (mv1) { |
269 |
4/4✓ Branch 0 taken 100663 times.
✓ Branch 1 taken 101045 times.
✓ Branch 2 taken 26211 times.
✓ Branch 3 taken 74452 times.
|
201708 | if (v->field_mode && mixedmv_pic) |
270 |
2/2✓ Branch 0 taken 470 times.
✓ Branch 1 taken 25741 times.
|
26211 | off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2; |
271 | else | ||
272 |
2/2✓ Branch 0 taken 3853 times.
✓ Branch 1 taken 171644 times.
|
175497 | off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2; |
273 |
3/4✓ Branch 0 taken 183816 times.
✓ Branch 1 taken 17892 times.
✓ Branch 2 taken 183816 times.
✗ Branch 3 not taken.
|
201708 | b_valid = b_valid && s->mb_width > 1; |
274 | } else { | ||
275 | //in 4-MV mode different blocks have different B predictor position | ||
276 |
4/5✓ Branch 0 taken 40502 times.
✓ Branch 1 taken 40397 times.
✓ Branch 2 taken 40382 times.
✓ Branch 3 taken 40363 times.
✗ Branch 4 not taken.
|
161644 | switch (n) { |
277 | 40502 | case 0: | |
278 |
1/2✓ Branch 0 taken 40502 times.
✗ Branch 1 not taken.
|
40502 | if (v->res_rtm_flag) |
279 |
2/2✓ Branch 0 taken 39495 times.
✓ Branch 1 taken 1007 times.
|
40502 | off = s->mb_x ? -1 : 1; |
280 | else | ||
281 | ✗ | off = s->mb_x ? -1 : 2 * s->mb_width - wrap - 1; | |
282 | 40502 | break; | |
283 | 40397 | case 1: | |
284 |
2/2✓ Branch 0 taken 913 times.
✓ Branch 1 taken 39484 times.
|
40397 | off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1; |
285 | 40397 | break; | |
286 | 40382 | case 2: | |
287 | 40382 | off = 1; | |
288 | 40382 | break; | |
289 | 40363 | case 3: | |
290 | 40363 | off = -1; | |
291 | } | ||
292 |
3/4✓ Branch 0 taken 65904 times.
✓ Branch 1 taken 95740 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 65904 times.
|
161644 | if (v->field_mode && s->mb_width == 1) |
293 | ✗ | b_valid = b_valid && c_valid; | |
294 | } | ||
295 | |||
296 |
2/2✓ Branch 0 taken 166567 times.
✓ Branch 1 taken 196785 times.
|
363352 | if (v->field_mode) { |
297 |
4/4✓ Branch 0 taken 160625 times.
✓ Branch 1 taken 5942 times.
✓ Branch 2 taken 153049 times.
✓ Branch 3 taken 7576 times.
|
166567 | a_valid = a_valid && !is_intra[xy - wrap]; |
298 |
4/4✓ Branch 0 taken 160625 times.
✓ Branch 1 taken 5942 times.
✓ Branch 2 taken 152892 times.
✓ Branch 3 taken 7733 times.
|
166567 | b_valid = b_valid && !is_intra[xy - wrap + off]; |
299 |
4/4✓ Branch 0 taken 164660 times.
✓ Branch 1 taken 1907 times.
✓ Branch 2 taken 156923 times.
✓ Branch 3 taken 7737 times.
|
166567 | c_valid = c_valid && !is_intra[xy - 1]; |
300 | } | ||
301 | |||
302 |
2/2✓ Branch 0 taken 318569 times.
✓ Branch 1 taken 44783 times.
|
363352 | if (a_valid) { |
303 | 318569 | const int16_t *A = s->cur_pic.motion_val[dir][xy - wrap + v->blocks_off]; | |
304 | 318569 | a_f = v->mv_f[dir][xy - wrap + v->blocks_off]; | |
305 | 318569 | num_oppfield += a_f; | |
306 | 318569 | num_samefield += 1 - a_f; | |
307 | 318569 | field_predA[0] = A[0]; | |
308 | 318569 | field_predA[1] = A[1]; | |
309 | } else { | ||
310 | 44783 | field_predA[0] = field_predA[1] = 0; | |
311 | 44783 | a_f = 0; | |
312 | } | ||
313 |
2/2✓ Branch 0 taken 318412 times.
✓ Branch 1 taken 44940 times.
|
363352 | if (b_valid) { |
314 | 318412 | const int16_t *B = s->cur_pic.motion_val[dir][xy - wrap + off + v->blocks_off]; | |
315 | 318412 | b_f = v->mv_f[dir][xy - wrap + off + v->blocks_off]; | |
316 | 318412 | num_oppfield += b_f; | |
317 | 318412 | num_samefield += 1 - b_f; | |
318 | 318412 | field_predB[0] = B[0]; | |
319 | 318412 | field_predB[1] = B[1]; | |
320 | } else { | ||
321 | 44940 | field_predB[0] = field_predB[1] = 0; | |
322 | 44940 | b_f = 0; | |
323 | } | ||
324 |
2/2✓ Branch 0 taken 349169 times.
✓ Branch 1 taken 14183 times.
|
363352 | if (c_valid) { |
325 | 349169 | const int16_t *C = s->cur_pic.motion_val[dir][xy - 1 + v->blocks_off]; | |
326 | 349169 | c_f = v->mv_f[dir][xy - 1 + v->blocks_off]; | |
327 | 349169 | num_oppfield += c_f; | |
328 | 349169 | num_samefield += 1 - c_f; | |
329 | 349169 | field_predC[0] = C[0]; | |
330 | 349169 | field_predC[1] = C[1]; | |
331 | } else { | ||
332 | 14183 | field_predC[0] = field_predC[1] = 0; | |
333 | 14183 | c_f = 0; | |
334 | } | ||
335 | |||
336 |
2/2✓ Branch 0 taken 166567 times.
✓ Branch 1 taken 196785 times.
|
363352 | if (v->field_mode) { |
337 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 166567 times.
|
166567 | if (!v->numref) |
338 | // REFFIELD determines if the last field or the second-last field is | ||
339 | // to be used as reference | ||
340 | ✗ | opposite = 1 - v->reffield; | |
341 | else { | ||
342 |
2/2✓ Branch 0 taken 91071 times.
✓ Branch 1 taken 75496 times.
|
166567 | if (num_samefield <= num_oppfield) |
343 | 91071 | opposite = 1 - pred_flag; | |
344 | else | ||
345 | 75496 | opposite = pred_flag; | |
346 | } | ||
347 | } else | ||
348 | 196785 | opposite = 0; | |
349 |
2/2✓ Branch 0 taken 89197 times.
✓ Branch 1 taken 274155 times.
|
363352 | if (opposite) { |
350 | 89197 | v->mv_f[dir][xy + v->blocks_off] = 1; | |
351 | 89197 | v->ref_field_type[dir] = !v->cur_field_type; | |
352 |
4/4✓ Branch 0 taken 81172 times.
✓ Branch 1 taken 8025 times.
✓ Branch 2 taken 13504 times.
✓ Branch 3 taken 67668 times.
|
89197 | if (a_valid && !a_f) { |
353 | 13504 | field_predA[0] = scaleforopp(v, field_predA[0], 0, dir); | |
354 | 13504 | field_predA[1] = scaleforopp(v, field_predA[1], 1, dir); | |
355 | } | ||
356 |
4/4✓ Branch 0 taken 81065 times.
✓ Branch 1 taken 8132 times.
✓ Branch 2 taken 15275 times.
✓ Branch 3 taken 65790 times.
|
89197 | if (b_valid && !b_f) { |
357 | 15275 | field_predB[0] = scaleforopp(v, field_predB[0], 0, dir); | |
358 | 15275 | field_predB[1] = scaleforopp(v, field_predB[1], 1, dir); | |
359 | } | ||
360 |
4/4✓ Branch 0 taken 83263 times.
✓ Branch 1 taken 5934 times.
✓ Branch 2 taken 14221 times.
✓ Branch 3 taken 69042 times.
|
89197 | if (c_valid && !c_f) { |
361 | 14221 | field_predC[0] = scaleforopp(v, field_predC[0], 0, dir); | |
362 | 14221 | field_predC[1] = scaleforopp(v, field_predC[1], 1, dir); | |
363 | } | ||
364 | } else { | ||
365 | 274155 | v->mv_f[dir][xy + v->blocks_off] = 0; | |
366 | 274155 | v->ref_field_type[dir] = v->cur_field_type; | |
367 |
4/4✓ Branch 0 taken 237397 times.
✓ Branch 1 taken 36758 times.
✓ Branch 2 taken 13995 times.
✓ Branch 3 taken 223402 times.
|
274155 | if (a_valid && a_f) { |
368 | 13995 | field_predA[0] = scaleforsame(v, field_predA[0], 0, dir); | |
369 | 13995 | field_predA[1] = scaleforsame(v, field_predA[1], 1, dir); | |
370 | } | ||
371 |
4/4✓ Branch 0 taken 237347 times.
✓ Branch 1 taken 36808 times.
✓ Branch 2 taken 15661 times.
✓ Branch 3 taken 221686 times.
|
274155 | if (b_valid && b_f) { |
372 | 15661 | field_predB[0] = scaleforsame(v, field_predB[0], 0, dir); | |
373 | 15661 | field_predB[1] = scaleforsame(v, field_predB[1], 1, dir); | |
374 | } | ||
375 |
4/4✓ Branch 0 taken 265906 times.
✓ Branch 1 taken 8249 times.
✓ Branch 2 taken 13706 times.
✓ Branch 3 taken 252200 times.
|
274155 | if (c_valid && c_f) { |
376 | 13706 | field_predC[0] = scaleforsame(v, field_predC[0], 0, dir); | |
377 | 13706 | field_predC[1] = scaleforsame(v, field_predC[1], 1, dir); | |
378 | } | ||
379 | } | ||
380 | |||
381 |
2/2✓ Branch 0 taken 318569 times.
✓ Branch 1 taken 44783 times.
|
363352 | if (a_valid) { |
382 | 318569 | px = field_predA[0]; | |
383 | 318569 | py = field_predA[1]; | |
384 |
2/2✓ Branch 0 taken 41920 times.
✓ Branch 1 taken 2863 times.
|
44783 | } else if (c_valid) { |
385 | 41920 | px = field_predC[0]; | |
386 | 41920 | py = field_predC[1]; | |
387 |
2/2✓ Branch 0 taken 1143 times.
✓ Branch 1 taken 1720 times.
|
2863 | } else if (b_valid) { |
388 | 1143 | px = field_predB[0]; | |
389 | 1143 | py = field_predB[1]; | |
390 | } else { | ||
391 | 1720 | px = 0; | |
392 | 1720 | py = 0; | |
393 | } | ||
394 | |||
395 |
2/2✓ Branch 0 taken 321003 times.
✓ Branch 1 taken 42349 times.
|
363352 | if (num_samefield + num_oppfield > 1) { |
396 | 321003 | px = mid_pred(field_predA[0], field_predB[0], field_predC[0]); | |
397 | 321003 | py = mid_pred(field_predA[1], field_predB[1], field_predC[1]); | |
398 | } | ||
399 | |||
400 | /* Pullback MV as specified in 8.3.5.3.4 */ | ||
401 |
2/2✓ Branch 0 taken 196785 times.
✓ Branch 1 taken 166567 times.
|
363352 | if (!v->field_mode) { |
402 | int qx, qy, X, Y; | ||
403 |
2/2✓ Branch 0 taken 101045 times.
✓ Branch 1 taken 95740 times.
|
196785 | int MV = mv1 ? -60 : -28; |
404 |
4/4✓ Branch 0 taken 172864 times.
✓ Branch 1 taken 23921 times.
✓ Branch 2 taken 23887 times.
✓ Branch 3 taken 148977 times.
|
196785 | qx = (s->mb_x << 6) + ((n == 1 || n == 3) ? 32 : 0); |
405 |
4/4✓ Branch 0 taken 172879 times.
✓ Branch 1 taken 23906 times.
✓ Branch 2 taken 23887 times.
✓ Branch 3 taken 148992 times.
|
196785 | qy = (s->mb_y << 6) + ((n == 2 || n == 3) ? 32 : 0); |
406 | 196785 | X = (s->mb_width << 6) - 4; | |
407 | 196785 | Y = (s->mb_height << 6) - 4; | |
408 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 196784 times.
|
196785 | if (qx + px < MV) px = MV - qx; |
409 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 196776 times.
|
196785 | if (qy + py < MV) py = MV - qy; |
410 |
2/2✓ Branch 0 taken 341 times.
✓ Branch 1 taken 196444 times.
|
196785 | if (qx + px > X) px = X - qx; |
411 |
2/2✓ Branch 0 taken 51 times.
✓ Branch 1 taken 196734 times.
|
196785 | if (qy + py > Y) py = Y - qy; |
412 | } | ||
413 | |||
414 |
4/4✓ Branch 0 taken 166567 times.
✓ Branch 1 taken 196785 times.
✓ Branch 2 taken 48899 times.
✓ Branch 3 taken 117668 times.
|
363352 | if (!v->field_mode || s->pict_type != AV_PICTURE_TYPE_B) { |
415 | /* Calculate hybrid prediction as specified in 8.3.5.3.5 (also 10.3.5.4.3.5) */ | ||
416 | 245684 | hybridmv_thresh = 32; | |
417 |
4/4✓ Branch 0 taken 205159 times.
✓ Branch 1 taken 40525 times.
✓ Branch 2 taken 195137 times.
✓ Branch 3 taken 10022 times.
|
245684 | if (a_valid && c_valid) { |
418 |
2/2✓ Branch 0 taken 16134 times.
✓ Branch 1 taken 179003 times.
|
195137 | if (is_intra[xy - wrap]) |
419 | 16134 | sum = FFABS(px) + FFABS(py); | |
420 | else | ||
421 | 179003 | sum = FFABS(px - field_predA[0]) + FFABS(py - field_predA[1]); | |
422 |
2/2✓ Branch 0 taken 12499 times.
✓ Branch 1 taken 182638 times.
|
195137 | if (sum > hybridmv_thresh) { |
423 |
2/2✓ Branch 1 taken 5136 times.
✓ Branch 2 taken 7363 times.
|
12499 | if (get_bits1(&s->gb)) { // read HYBRIDPRED bit |
424 | 5136 | px = field_predA[0]; | |
425 | 5136 | py = field_predA[1]; | |
426 | } else { | ||
427 | 7363 | px = field_predC[0]; | |
428 | 7363 | py = field_predC[1]; | |
429 | } | ||
430 | } else { | ||
431 |
2/2✓ Branch 0 taken 16322 times.
✓ Branch 1 taken 166316 times.
|
182638 | if (is_intra[xy - 1]) |
432 | 16322 | sum = FFABS(px) + FFABS(py); | |
433 | else | ||
434 | 166316 | sum = FFABS(px - field_predC[0]) + FFABS(py - field_predC[1]); | |
435 |
2/2✓ Branch 0 taken 16743 times.
✓ Branch 1 taken 165895 times.
|
182638 | if (sum > hybridmv_thresh) { |
436 |
2/2✓ Branch 1 taken 8856 times.
✓ Branch 2 taken 7887 times.
|
16743 | if (get_bits1(&s->gb)) { |
437 | 8856 | px = field_predA[0]; | |
438 | 8856 | py = field_predA[1]; | |
439 | } else { | ||
440 | 7887 | px = field_predC[0]; | |
441 | 7887 | py = field_predC[1]; | |
442 | } | ||
443 | } | ||
444 | } | ||
445 | } | ||
446 | } | ||
447 | |||
448 |
3/4✓ Branch 0 taken 166567 times.
✓ Branch 1 taken 196785 times.
✓ Branch 2 taken 166567 times.
✗ Branch 3 not taken.
|
363352 | if (v->field_mode && v->numref) |
449 | 166567 | r_y >>= 1; | |
450 |
6/6✓ Branch 0 taken 166567 times.
✓ Branch 1 taken 196785 times.
✓ Branch 2 taken 84551 times.
✓ Branch 3 taken 82016 times.
✓ Branch 4 taken 59202 times.
✓ Branch 5 taken 25349 times.
|
363352 | if (v->field_mode && v->cur_field_type && v->ref_field_type[dir] == 0) |
451 | 59202 | y_bias = 1; | |
452 | /* store MV using signed modulus of MV range defined in 4.11 */ | ||
453 | 363352 | s->mv[dir][n][0] = s->cur_pic.motion_val[dir][xy + v->blocks_off][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x; | |
454 | 363352 | s->mv[dir][n][1] = s->cur_pic.motion_val[dir][xy + v->blocks_off][1] = ((py + dmv_y + r_y - y_bias) & ((r_y << 1) - 1)) - r_y + y_bias; | |
455 |
2/2✓ Branch 0 taken 201708 times.
✓ Branch 1 taken 161644 times.
|
363352 | if (mv1) { /* duplicate motion data for 1-MV block */ |
456 | 201708 | s->cur_pic.motion_val[dir][xy + 1 + v->blocks_off][0] = s->cur_pic.motion_val[dir][xy + v->blocks_off][0]; | |
457 | 201708 | s->cur_pic.motion_val[dir][xy + 1 + v->blocks_off][1] = s->cur_pic.motion_val[dir][xy + v->blocks_off][1]; | |
458 | 201708 | s->cur_pic.motion_val[dir][xy + wrap + v->blocks_off][0] = s->cur_pic.motion_val[dir][xy + v->blocks_off][0]; | |
459 | 201708 | s->cur_pic.motion_val[dir][xy + wrap + v->blocks_off][1] = s->cur_pic.motion_val[dir][xy + v->blocks_off][1]; | |
460 | 201708 | s->cur_pic.motion_val[dir][xy + wrap + 1 + v->blocks_off][0] = s->cur_pic.motion_val[dir][xy + v->blocks_off][0]; | |
461 | 201708 | s->cur_pic.motion_val[dir][xy + wrap + 1 + v->blocks_off][1] = s->cur_pic.motion_val[dir][xy + v->blocks_off][1]; | |
462 | 201708 | v->mv_f[dir][xy + 1 + v->blocks_off] = v->mv_f[dir][xy + v->blocks_off]; | |
463 | 201708 | v->mv_f[dir][xy + wrap + v->blocks_off] = v->mv_f[dir][xy + wrap + 1 + v->blocks_off] = v->mv_f[dir][xy + v->blocks_off]; | |
464 | } | ||
465 | } | ||
466 | |||
467 | /** Predict and set motion vector for interlaced frame picture MBs | ||
468 | */ | ||
469 | 87401 | void ff_vc1_pred_mv_intfr(VC1Context *v, int n, int dmv_x, int dmv_y, | |
470 | int mvn, int r_x, int r_y, int dir) | ||
471 | { | ||
472 | 87401 | MpegEncContext *s = &v->s; | |
473 | 87401 | int xy, wrap, off = 0; | |
474 | int A[2], B[2], C[2]; | ||
475 | 87401 | int px = 0, py = 0; | |
476 | 87401 | int a_valid = 0, b_valid = 0, c_valid = 0; | |
477 | int field_a, field_b, field_c; // 0: same, 1: opposite | ||
478 | int total_valid, num_samefield, num_oppfield; | ||
479 | int pos_c, pos_b, n_adj; | ||
480 | |||
481 | 87401 | wrap = s->b8_stride; | |
482 | 87401 | xy = s->block_index[n]; | |
483 | |||
484 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 87401 times.
|
87401 | if (s->mb_intra) { |
485 | ✗ | s->mv[0][n][0] = s->cur_pic.motion_val[0][xy][0] = 0; | |
486 | ✗ | s->mv[0][n][1] = s->cur_pic.motion_val[0][xy][1] = 0; | |
487 | ✗ | s->cur_pic.motion_val[1][xy][0] = 0; | |
488 | ✗ | s->cur_pic.motion_val[1][xy][1] = 0; | |
489 | ✗ | if (mvn == 1) { /* duplicate motion data for 1-MV block */ | |
490 | ✗ | s->cur_pic.motion_val[0][xy + 1][0] = 0; | |
491 | ✗ | s->cur_pic.motion_val[0][xy + 1][1] = 0; | |
492 | ✗ | s->cur_pic.motion_val[0][xy + wrap][0] = 0; | |
493 | ✗ | s->cur_pic.motion_val[0][xy + wrap][1] = 0; | |
494 | ✗ | s->cur_pic.motion_val[0][xy + wrap + 1][0] = 0; | |
495 | ✗ | s->cur_pic.motion_val[0][xy + wrap + 1][1] = 0; | |
496 | ✗ | v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0; | |
497 | ✗ | s->cur_pic.motion_val[1][xy + 1][0] = 0; | |
498 | ✗ | s->cur_pic.motion_val[1][xy + 1][1] = 0; | |
499 | ✗ | s->cur_pic.motion_val[1][xy + wrap][0] = 0; | |
500 | ✗ | s->cur_pic.motion_val[1][xy + wrap][1] = 0; | |
501 | ✗ | s->cur_pic.motion_val[1][xy + wrap + 1][0] = 0; | |
502 | ✗ | s->cur_pic.motion_val[1][xy + wrap + 1][1] = 0; | |
503 | } | ||
504 | ✗ | return; | |
505 | } | ||
506 | |||
507 |
4/4✓ Branch 0 taken 30480 times.
✓ Branch 1 taken 56921 times.
✓ Branch 2 taken 1788 times.
✓ Branch 3 taken 28692 times.
|
87401 | off = ((n == 0) || (n == 1)) ? 1 : -1; |
508 | /* predict A */ | ||
509 |
6/6✓ Branch 0 taken 832 times.
✓ Branch 1 taken 86569 times.
✓ Branch 2 taken 823 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 814 times.
|
87401 | if (s->mb_x || (n == 1) || (n == 3)) { |
510 |
2/2✓ Branch 0 taken 24418 times.
✓ Branch 1 taken 62169 times.
|
86587 | if ((v->blk_mv_type[xy]) // current block (MB) has a field MV |
511 |
3/4✓ Branch 0 taken 24418 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 11588 times.
✓ Branch 3 taken 12830 times.
|
24418 | || (!v->blk_mv_type[xy] && !v->blk_mv_type[xy - 1])) { // or both have frame MV |
512 | 73757 | A[0] = s->cur_pic.motion_val[dir][xy - 1][0]; | |
513 | 73757 | A[1] = s->cur_pic.motion_val[dir][xy - 1][1]; | |
514 | 73757 | a_valid = 1; | |
515 | } else { // current block has frame mv and cand. has field MV (so average) | ||
516 | 12830 | A[0] = (s->cur_pic.motion_val[dir][xy - 1][0] | |
517 | 12830 | + s->cur_pic.motion_val[dir][xy - 1 + off * wrap][0] + 1) >> 1; | |
518 | 12830 | A[1] = (s->cur_pic.motion_val[dir][xy - 1][1] | |
519 | 12830 | + s->cur_pic.motion_val[dir][xy - 1 + off * wrap][1] + 1) >> 1; | |
520 | 12830 | a_valid = 1; | |
521 | } | ||
522 |
4/4✓ Branch 0 taken 83011 times.
✓ Branch 1 taken 3576 times.
✓ Branch 2 taken 830 times.
✓ Branch 3 taken 82181 times.
|
86587 | if (!(n & 1) && v->is_intra[s->mb_x - 1]) { |
523 | 830 | a_valid = 0; | |
524 | 830 | A[0] = A[1] = 0; | |
525 | } | ||
526 | } else | ||
527 | 814 | A[0] = A[1] = 0; | |
528 | /* Predict B and C */ | ||
529 | 87401 | B[0] = B[1] = C[0] = C[1] = 0; | |
530 |
6/6✓ Branch 0 taken 30480 times.
✓ Branch 1 taken 56921 times.
✓ Branch 2 taken 28692 times.
✓ Branch 3 taken 1788 times.
✓ Branch 4 taken 27284 times.
✓ Branch 5 taken 1408 times.
|
87401 | if (n == 0 || n == 1 || v->blk_mv_type[xy]) { |
531 |
2/2✓ Branch 0 taken 84676 times.
✓ Branch 1 taken 1317 times.
|
85993 | if (!s->first_slice_line) { |
532 |
2/2✓ Branch 0 taken 83692 times.
✓ Branch 1 taken 984 times.
|
84676 | if (!v->is_intra[s->mb_x - s->mb_stride]) { |
533 | 83692 | b_valid = 1; | |
534 | 83692 | n_adj = n | 2; | |
535 | 83692 | pos_b = s->block_index[n_adj] - 2 * wrap; | |
536 |
4/4✓ Branch 0 taken 61316 times.
✓ Branch 1 taken 22376 times.
✓ Branch 2 taken 48511 times.
✓ Branch 3 taken 12805 times.
|
83692 | if (v->blk_mv_type[pos_b] && v->blk_mv_type[xy]) { |
537 | 48511 | n_adj = (n & 2) | (n & 1); | |
538 | } | ||
539 | 83692 | B[0] = s->cur_pic.motion_val[dir][s->block_index[n_adj] - 2 * wrap][0]; | |
540 | 83692 | B[1] = s->cur_pic.motion_val[dir][s->block_index[n_adj] - 2 * wrap][1]; | |
541 |
4/4✓ Branch 0 taken 61316 times.
✓ Branch 1 taken 22376 times.
✓ Branch 2 taken 12805 times.
✓ Branch 3 taken 48511 times.
|
83692 | if (v->blk_mv_type[pos_b] && !v->blk_mv_type[xy]) { |
542 | 12805 | B[0] = (B[0] + s->cur_pic.motion_val[dir][s->block_index[n_adj ^ 2] - 2 * wrap][0] + 1) >> 1; | |
543 | 12805 | B[1] = (B[1] + s->cur_pic.motion_val[dir][s->block_index[n_adj ^ 2] - 2 * wrap][1] + 1) >> 1; | |
544 | } | ||
545 | } | ||
546 |
1/2✓ Branch 0 taken 84676 times.
✗ Branch 1 not taken.
|
84676 | if (s->mb_width > 1) { |
547 |
2/2✓ Branch 0 taken 83548 times.
✓ Branch 1 taken 1128 times.
|
84676 | if (!v->is_intra[s->mb_x - s->mb_stride + 1]) { |
548 | 83548 | c_valid = 1; | |
549 | 83548 | n_adj = 2; | |
550 | 83548 | pos_c = s->block_index[2] - 2 * wrap + 2; | |
551 |
4/4✓ Branch 0 taken 60020 times.
✓ Branch 1 taken 23528 times.
✓ Branch 2 taken 47104 times.
✓ Branch 3 taken 12916 times.
|
83548 | if (v->blk_mv_type[pos_c] && v->blk_mv_type[xy]) { |
552 | 47104 | n_adj = n & 2; | |
553 | } | ||
554 | 83548 | C[0] = s->cur_pic.motion_val[dir][s->block_index[n_adj] - 2 * wrap + 2][0]; | |
555 | 83548 | C[1] = s->cur_pic.motion_val[dir][s->block_index[n_adj] - 2 * wrap + 2][1]; | |
556 |
4/4✓ Branch 0 taken 60020 times.
✓ Branch 1 taken 23528 times.
✓ Branch 2 taken 12916 times.
✓ Branch 3 taken 47104 times.
|
83548 | if (v->blk_mv_type[pos_c] && !v->blk_mv_type[xy]) { |
557 | 12916 | C[0] = (1 + C[0] + (s->cur_pic.motion_val[dir][s->block_index[n_adj ^ 2] - 2 * wrap + 2][0])) >> 1; | |
558 | 12916 | C[1] = (1 + C[1] + (s->cur_pic.motion_val[dir][s->block_index[n_adj ^ 2] - 2 * wrap + 2][1])) >> 1; | |
559 | } | ||
560 |
2/2✓ Branch 0 taken 802 times.
✓ Branch 1 taken 82746 times.
|
83548 | if (s->mb_x == s->mb_width - 1) { |
561 |
2/2✓ Branch 0 taken 782 times.
✓ Branch 1 taken 20 times.
|
802 | if (!v->is_intra[s->mb_x - s->mb_stride - 1]) { |
562 | 782 | c_valid = 1; | |
563 | 782 | n_adj = 3; | |
564 | 782 | pos_c = s->block_index[3] - 2 * wrap - 2; | |
565 |
4/4✓ Branch 0 taken 643 times.
✓ Branch 1 taken 139 times.
✓ Branch 2 taken 551 times.
✓ Branch 3 taken 92 times.
|
782 | if (v->blk_mv_type[pos_c] && v->blk_mv_type[xy]) { |
566 | 551 | n_adj = n | 1; | |
567 | } | ||
568 | 782 | C[0] = s->cur_pic.motion_val[dir][s->block_index[n_adj] - 2 * wrap - 2][0]; | |
569 | 782 | C[1] = s->cur_pic.motion_val[dir][s->block_index[n_adj] - 2 * wrap - 2][1]; | |
570 |
4/4✓ Branch 0 taken 643 times.
✓ Branch 1 taken 139 times.
✓ Branch 2 taken 92 times.
✓ Branch 3 taken 551 times.
|
782 | if (v->blk_mv_type[pos_c] && !v->blk_mv_type[xy]) { |
571 | 92 | C[0] = (1 + C[0] + s->cur_pic.motion_val[dir][s->block_index[1] - 2 * wrap - 2][0]) >> 1; | |
572 | 92 | C[1] = (1 + C[1] + s->cur_pic.motion_val[dir][s->block_index[1] - 2 * wrap - 2][1]) >> 1; | |
573 | } | ||
574 | } else | ||
575 | 20 | c_valid = 0; | |
576 | } | ||
577 | } | ||
578 | } | ||
579 | } | ||
580 | } else { | ||
581 | 1408 | pos_b = s->block_index[1]; | |
582 | 1408 | b_valid = 1; | |
583 | 1408 | B[0] = s->cur_pic.motion_val[dir][pos_b][0]; | |
584 | 1408 | B[1] = s->cur_pic.motion_val[dir][pos_b][1]; | |
585 | 1408 | pos_c = s->block_index[0]; | |
586 | 1408 | c_valid = 1; | |
587 | 1408 | C[0] = s->cur_pic.motion_val[dir][pos_c][0]; | |
588 | 1408 | C[1] = s->cur_pic.motion_val[dir][pos_c][1]; | |
589 | } | ||
590 | |||
591 | 87401 | total_valid = a_valid + b_valid + c_valid; | |
592 | // check if predictor A is out of bounds | ||
593 |
6/6✓ Branch 0 taken 832 times.
✓ Branch 1 taken 86569 times.
✓ Branch 2 taken 823 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 814 times.
✓ Branch 5 taken 9 times.
|
87401 | if (!s->mb_x && !(n == 1 || n == 3)) { |
594 | 814 | A[0] = A[1] = 0; | |
595 | } | ||
596 | // check if predictor B is out of bounds | ||
597 |
8/8✓ Branch 0 taken 1329 times.
✓ Branch 1 taken 86072 times.
✓ Branch 2 taken 320 times.
✓ Branch 3 taken 1009 times.
✓ Branch 4 taken 320 times.
✓ Branch 5 taken 86072 times.
✓ Branch 6 taken 308 times.
✓ Branch 7 taken 12 times.
|
87401 | if ((s->first_slice_line && v->blk_mv_type[xy]) || (s->first_slice_line && !(n & 2))) { |
598 | 1317 | B[0] = B[1] = C[0] = C[1] = 0; | |
599 | } | ||
600 |
2/2✓ Branch 0 taken 24624 times.
✓ Branch 1 taken 62777 times.
|
87401 | if (!v->blk_mv_type[xy]) { |
601 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 24624 times.
|
24624 | if (s->mb_width == 1) { |
602 | ✗ | px = B[0]; | |
603 | ✗ | py = B[1]; | |
604 | } else { | ||
605 |
2/2✓ Branch 0 taken 24202 times.
✓ Branch 1 taken 422 times.
|
24624 | if (total_valid >= 2) { |
606 | 24202 | px = mid_pred(A[0], B[0], C[0]); | |
607 | 24202 | py = mid_pred(A[1], B[1], C[1]); | |
608 |
2/2✓ Branch 0 taken 395 times.
✓ Branch 1 taken 27 times.
|
422 | } else if (total_valid) { |
609 |
2/2✓ Branch 0 taken 356 times.
✓ Branch 1 taken 39 times.
|
395 | if (a_valid) { px = A[0]; py = A[1]; } |
610 |
2/2✓ Branch 0 taken 18 times.
✓ Branch 1 taken 21 times.
|
39 | else if (b_valid) { px = B[0]; py = B[1]; } |
611 | 21 | else { px = C[0]; py = C[1]; } | |
612 | } | ||
613 | } | ||
614 | } else { | ||
615 |
2/2✓ Branch 0 taken 61492 times.
✓ Branch 1 taken 1285 times.
|
62777 | if (a_valid) |
616 | 61492 | field_a = (A[1] & 4) ? 1 : 0; | |
617 | else | ||
618 | 1285 | field_a = 0; | |
619 |
2/2✓ Branch 0 taken 60944 times.
✓ Branch 1 taken 1833 times.
|
62777 | if (b_valid) |
620 | 60944 | field_b = (B[1] & 4) ? 1 : 0; | |
621 | else | ||
622 | 1833 | field_b = 0; | |
623 |
2/2✓ Branch 0 taken 60819 times.
✓ Branch 1 taken 1958 times.
|
62777 | if (c_valid) |
624 | 60819 | field_c = (C[1] & 4) ? 1 : 0; | |
625 | else | ||
626 | 1958 | field_c = 0; | |
627 | |||
628 | 62777 | num_oppfield = field_a + field_b + field_c; | |
629 | 62777 | num_samefield = total_valid - num_oppfield; | |
630 |
2/2✓ Branch 0 taken 59358 times.
✓ Branch 1 taken 3419 times.
|
62777 | if (total_valid == 3) { |
631 |
4/4✓ Branch 0 taken 45017 times.
✓ Branch 1 taken 14341 times.
✓ Branch 2 taken 13487 times.
✓ Branch 3 taken 31530 times.
|
59358 | if ((num_samefield == 3) || (num_oppfield == 3)) { |
632 | 27828 | px = mid_pred(A[0], B[0], C[0]); | |
633 | 27828 | py = mid_pred(A[1], B[1], C[1]); | |
634 |
2/2✓ Branch 0 taken 15698 times.
✓ Branch 1 taken 15832 times.
|
31530 | } else if (num_samefield >= num_oppfield) { |
635 | /* take one MV from same field set depending on priority | ||
636 | the check for B may not be necessary */ | ||
637 |
2/2✓ Branch 0 taken 9839 times.
✓ Branch 1 taken 5859 times.
|
15698 | px = !field_a ? A[0] : B[0]; |
638 |
2/2✓ Branch 0 taken 9839 times.
✓ Branch 1 taken 5859 times.
|
15698 | py = !field_a ? A[1] : B[1]; |
639 | } else { | ||
640 |
2/2✓ Branch 0 taken 9939 times.
✓ Branch 1 taken 5893 times.
|
15832 | px = field_a ? A[0] : B[0]; |
641 |
2/2✓ Branch 0 taken 9939 times.
✓ Branch 1 taken 5893 times.
|
15832 | py = field_a ? A[1] : B[1]; |
642 | } | ||
643 |
2/2✓ Branch 0 taken 1870 times.
✓ Branch 1 taken 1549 times.
|
3419 | } else if (total_valid == 2) { |
644 |
2/2✓ Branch 0 taken 1250 times.
✓ Branch 1 taken 620 times.
|
1870 | if (num_samefield >= num_oppfield) { |
645 |
4/4✓ Branch 0 taken 1167 times.
✓ Branch 1 taken 83 times.
✓ Branch 2 taken 455 times.
✓ Branch 3 taken 712 times.
|
1250 | if (!field_a && a_valid) { |
646 | 455 | px = A[0]; | |
647 | 455 | py = A[1]; | |
648 |
4/4✓ Branch 0 taken 646 times.
✓ Branch 1 taken 149 times.
✓ Branch 2 taken 605 times.
✓ Branch 3 taken 41 times.
|
795 | } else if (!field_b && b_valid) { |
649 | 605 | px = B[0]; | |
650 | 605 | py = B[1]; | |
651 | } else /*if (c_valid)*/ { | ||
652 | av_assert1(c_valid); | ||
653 | 190 | px = C[0]; | |
654 | 190 | py = C[1]; | |
655 | } | ||
656 | } else { | ||
657 |
3/4✓ Branch 0 taken 303 times.
✓ Branch 1 taken 317 times.
✓ Branch 2 taken 303 times.
✗ Branch 3 not taken.
|
620 | if (field_a && a_valid) { |
658 | 303 | px = A[0]; | |
659 | 303 | py = A[1]; | |
660 | } else /*if (field_b && b_valid)*/ { | ||
661 | av_assert1(field_b && b_valid); | ||
662 | 317 | px = B[0]; | |
663 | 317 | py = B[1]; | |
664 | } | ||
665 | } | ||
666 |
2/2✓ Branch 0 taken 1441 times.
✓ Branch 1 taken 108 times.
|
1549 | } else if (total_valid == 1) { |
667 |
4/4✓ Branch 0 taken 1293 times.
✓ Branch 1 taken 148 times.
✓ Branch 2 taken 58 times.
✓ Branch 3 taken 90 times.
|
1441 | px = (a_valid) ? A[0] : ((b_valid) ? B[0] : C[0]); |
668 |
4/4✓ Branch 0 taken 1293 times.
✓ Branch 1 taken 148 times.
✓ Branch 2 taken 58 times.
✓ Branch 3 taken 90 times.
|
1441 | py = (a_valid) ? A[1] : ((b_valid) ? B[1] : C[1]); |
669 | } | ||
670 | } | ||
671 | |||
672 | /* store MV using signed modulus of MV range defined in 4.11 */ | ||
673 | 87401 | s->mv[dir][n][0] = s->cur_pic.motion_val[dir][xy][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x; | |
674 | 87401 | s->mv[dir][n][1] = s->cur_pic.motion_val[dir][xy][1] = ((py + dmv_y + r_y) & ((r_y << 1) - 1)) - r_y; | |
675 |
2/2✓ Branch 0 taken 21808 times.
✓ Branch 1 taken 65593 times.
|
87401 | if (mvn == 1) { /* duplicate motion data for 1-MV block */ |
676 | 21808 | s->cur_pic.motion_val[dir][xy + 1 ][0] = s->cur_pic.motion_val[dir][xy][0]; | |
677 | 21808 | s->cur_pic.motion_val[dir][xy + 1 ][1] = s->cur_pic.motion_val[dir][xy][1]; | |
678 | 21808 | s->cur_pic.motion_val[dir][xy + wrap ][0] = s->cur_pic.motion_val[dir][xy][0]; | |
679 | 21808 | s->cur_pic.motion_val[dir][xy + wrap ][1] = s->cur_pic.motion_val[dir][xy][1]; | |
680 | 21808 | s->cur_pic.motion_val[dir][xy + wrap + 1][0] = s->cur_pic.motion_val[dir][xy][0]; | |
681 | 21808 | s->cur_pic.motion_val[dir][xy + wrap + 1][1] = s->cur_pic.motion_val[dir][xy][1]; | |
682 |
2/2✓ Branch 0 taken 58441 times.
✓ Branch 1 taken 7152 times.
|
65593 | } else if (mvn == 2) { /* duplicate motion data for 2-Field MV block */ |
683 | 58441 | s->cur_pic.motion_val[dir][xy + 1][0] = s->cur_pic.motion_val[dir][xy][0]; | |
684 | 58441 | s->cur_pic.motion_val[dir][xy + 1][1] = s->cur_pic.motion_val[dir][xy][1]; | |
685 | 58441 | s->mv[dir][n + 1][0] = s->mv[dir][n][0]; | |
686 | 58441 | s->mv[dir][n + 1][1] = s->mv[dir][n][1]; | |
687 | } | ||
688 | } | ||
689 | |||
690 | 20940 | void ff_vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2], | |
691 | int direct, int mvtype) | ||
692 | { | ||
693 | 20940 | MpegEncContext *s = &v->s; | |
694 | int xy, wrap; | ||
695 | int px, py; | ||
696 | int sum; | ||
697 | int r_x, r_y; | ||
698 | 20940 | const uint8_t *is_intra = v->mb_type[0]; | |
699 | |||
700 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 20940 times.
|
20940 | av_assert0(!v->field_mode); |
701 | |||
702 | 20940 | r_x = v->range_x; | |
703 | 20940 | r_y = v->range_y; | |
704 | /* scale MV difference to be quad-pel */ | ||
705 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 20940 times.
|
20940 | if (!s->quarter_sample) { |
706 | ✗ | dmv_x[0] *= 2; | |
707 | ✗ | dmv_y[0] *= 2; | |
708 | ✗ | dmv_x[1] *= 2; | |
709 | ✗ | dmv_y[1] *= 2; | |
710 | } | ||
711 | |||
712 | 20940 | wrap = s->b8_stride; | |
713 | 20940 | xy = s->block_index[0]; | |
714 | |||
715 |
2/2✓ Branch 0 taken 170 times.
✓ Branch 1 taken 20770 times.
|
20940 | if (s->mb_intra) { |
716 | 170 | s->cur_pic.motion_val[0][xy][0] = | |
717 | 170 | s->cur_pic.motion_val[0][xy][1] = | |
718 | 170 | s->cur_pic.motion_val[1][xy][0] = | |
719 | 170 | s->cur_pic.motion_val[1][xy][1] = 0; | |
720 | 170 | return; | |
721 | } | ||
722 |
3/4✓ Branch 0 taken 2569 times.
✓ Branch 1 taken 18201 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2569 times.
|
20770 | if (direct && s->next_pic.ptr->field_picture) |
723 | ✗ | av_log(s->avctx, AV_LOG_WARNING, "Mixed frame/field direct mode not supported\n"); | |
724 | |||
725 | 20770 | s->mv[0][0][0] = scale_mv(s->next_pic.motion_val[1][xy][0], v->bfraction, 0, s->quarter_sample); | |
726 | 20770 | s->mv[0][0][1] = scale_mv(s->next_pic.motion_val[1][xy][1], v->bfraction, 0, s->quarter_sample); | |
727 | 20770 | s->mv[1][0][0] = scale_mv(s->next_pic.motion_val[1][xy][0], v->bfraction, 1, s->quarter_sample); | |
728 | 20770 | s->mv[1][0][1] = scale_mv(s->next_pic.motion_val[1][xy][1], v->bfraction, 1, s->quarter_sample); | |
729 | |||
730 | /* Pullback predicted motion vectors as specified in 8.4.5.4 */ | ||
731 | 20770 | s->mv[0][0][0] = av_clip(s->mv[0][0][0], -60 - (s->mb_x << 6), (s->mb_width << 6) - 4 - (s->mb_x << 6)); | |
732 | 20770 | s->mv[0][0][1] = av_clip(s->mv[0][0][1], -60 - (s->mb_y << 6), (s->mb_height << 6) - 4 - (s->mb_y << 6)); | |
733 | 20770 | s->mv[1][0][0] = av_clip(s->mv[1][0][0], -60 - (s->mb_x << 6), (s->mb_width << 6) - 4 - (s->mb_x << 6)); | |
734 | 20770 | s->mv[1][0][1] = av_clip(s->mv[1][0][1], -60 - (s->mb_y << 6), (s->mb_height << 6) - 4 - (s->mb_y << 6)); | |
735 |
2/2✓ Branch 0 taken 2569 times.
✓ Branch 1 taken 18201 times.
|
20770 | if (direct) { |
736 | 2569 | s->cur_pic.motion_val[0][xy][0] = s->mv[0][0][0]; | |
737 | 2569 | s->cur_pic.motion_val[0][xy][1] = s->mv[0][0][1]; | |
738 | 2569 | s->cur_pic.motion_val[1][xy][0] = s->mv[1][0][0]; | |
739 | 2569 | s->cur_pic.motion_val[1][xy][1] = s->mv[1][0][1]; | |
740 | 2569 | return; | |
741 | } | ||
742 | |||
743 |
4/4✓ Branch 0 taken 14178 times.
✓ Branch 1 taken 4023 times.
✓ Branch 2 taken 6157 times.
✓ Branch 3 taken 8021 times.
|
18201 | if ((mvtype == BMV_TYPE_FORWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) { |
744 | 10180 | int16_t *C = s->cur_pic.motion_val[0][xy - 2]; | |
745 | 10180 | const int16_t *A = s->cur_pic.motion_val[0][xy - wrap * 2]; | |
746 |
2/2✓ Branch 0 taken 226 times.
✓ Branch 1 taken 9954 times.
|
10180 | int off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2; |
747 | 10180 | const int16_t *B = s->cur_pic.motion_val[0][xy - wrap * 2 + off]; | |
748 | |||
749 |
2/2✓ Branch 0 taken 319 times.
✓ Branch 1 taken 9861 times.
|
10180 | if (!s->mb_x) C[0] = C[1] = 0; |
750 |
2/2✓ Branch 0 taken 9675 times.
✓ Branch 1 taken 505 times.
|
10180 | if (!s->first_slice_line) { // predictor A is not out of bounds |
751 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 9675 times.
|
9675 | if (s->mb_width == 1) { |
752 | ✗ | px = A[0]; | |
753 | ✗ | py = A[1]; | |
754 | } else { | ||
755 | 9675 | px = mid_pred(A[0], B[0], C[0]); | |
756 | 9675 | py = mid_pred(A[1], B[1], C[1]); | |
757 | } | ||
758 |
2/2✓ Branch 0 taken 489 times.
✓ Branch 1 taken 16 times.
|
505 | } else if (s->mb_x) { // predictor C is not out of bounds |
759 | 489 | px = C[0]; | |
760 | 489 | py = C[1]; | |
761 | } else { | ||
762 | 16 | px = py = 0; | |
763 | } | ||
764 | /* Pullback MV as specified in 8.3.5.3.4 */ | ||
765 | { | ||
766 | int qx, qy, X, Y; | ||
767 |
2/2✓ Branch 0 taken 7513 times.
✓ Branch 1 taken 2667 times.
|
10180 | int sh = v->profile < PROFILE_ADVANCED ? 5 : 6; |
768 | 10180 | int MV = 4 - (1 << sh); | |
769 | 10180 | qx = (s->mb_x << sh); | |
770 | 10180 | qy = (s->mb_y << sh); | |
771 | 10180 | X = (s->mb_width << sh) - 4; | |
772 | 10180 | Y = (s->mb_height << sh) - 4; | |
773 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10180 times.
|
10180 | if (qx + px < MV) px = MV - qx; |
774 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10180 times.
|
10180 | if (qy + py < MV) py = MV - qy; |
775 |
2/2✓ Branch 0 taken 15 times.
✓ Branch 1 taken 10165 times.
|
10180 | if (qx + px > X) px = X - qx; |
776 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10180 times.
|
10180 | if (qy + py > Y) py = Y - qy; |
777 | } | ||
778 | /* Calculate hybrid prediction as specified in 8.3.5.3.5 */ | ||
779 | if (0 && !s->first_slice_line && s->mb_x) { | ||
780 | if (is_intra[xy - wrap]) | ||
781 | sum = FFABS(px) + FFABS(py); | ||
782 | else | ||
783 | sum = FFABS(px - A[0]) + FFABS(py - A[1]); | ||
784 | if (sum > 32) { | ||
785 | if (get_bits1(&s->gb)) { | ||
786 | px = A[0]; | ||
787 | py = A[1]; | ||
788 | } else { | ||
789 | px = C[0]; | ||
790 | py = C[1]; | ||
791 | } | ||
792 | } else { | ||
793 | if (is_intra[xy - 2]) | ||
794 | sum = FFABS(px) + FFABS(py); | ||
795 | else | ||
796 | sum = FFABS(px - C[0]) + FFABS(py - C[1]); | ||
797 | if (sum > 32) { | ||
798 | if (get_bits1(&s->gb)) { | ||
799 | px = A[0]; | ||
800 | py = A[1]; | ||
801 | } else { | ||
802 | px = C[0]; | ||
803 | py = C[1]; | ||
804 | } | ||
805 | } | ||
806 | } | ||
807 | } | ||
808 | /* store MV using signed modulus of MV range defined in 4.11 */ | ||
809 | 10180 | s->mv[0][0][0] = ((px + dmv_x[0] + r_x) & ((r_x << 1) - 1)) - r_x; | |
810 | 10180 | s->mv[0][0][1] = ((py + dmv_y[0] + r_y) & ((r_y << 1) - 1)) - r_y; | |
811 | } | ||
812 |
4/4✓ Branch 0 taken 10180 times.
✓ Branch 1 taken 8021 times.
✓ Branch 2 taken 6157 times.
✓ Branch 3 taken 4023 times.
|
18201 | if ((mvtype == BMV_TYPE_BACKWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) { |
813 | 14178 | int16_t *C = s->cur_pic.motion_val[1][xy - 2]; | |
814 | 14178 | const int16_t *A = s->cur_pic.motion_val[1][xy - wrap * 2]; | |
815 |
2/2✓ Branch 0 taken 549 times.
✓ Branch 1 taken 13629 times.
|
14178 | int off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2; |
816 | 14178 | const int16_t *B = s->cur_pic.motion_val[1][xy - wrap * 2 + off]; | |
817 | |||
818 |
2/2✓ Branch 0 taken 389 times.
✓ Branch 1 taken 13789 times.
|
14178 | if (!s->mb_x) |
819 | 389 | C[0] = C[1] = 0; | |
820 |
2/2✓ Branch 0 taken 13334 times.
✓ Branch 1 taken 844 times.
|
14178 | if (!s->first_slice_line) { // predictor A is not out of bounds |
821 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 13334 times.
|
13334 | if (s->mb_width == 1) { |
822 | ✗ | px = A[0]; | |
823 | ✗ | py = A[1]; | |
824 | } else { | ||
825 | 13334 | px = mid_pred(A[0], B[0], C[0]); | |
826 | 13334 | py = mid_pred(A[1], B[1], C[1]); | |
827 | } | ||
828 |
2/2✓ Branch 0 taken 813 times.
✓ Branch 1 taken 31 times.
|
844 | } else if (s->mb_x) { // predictor C is not out of bounds |
829 | 813 | px = C[0]; | |
830 | 813 | py = C[1]; | |
831 | } else { | ||
832 | 31 | px = py = 0; | |
833 | } | ||
834 | /* Pullback MV as specified in 8.3.5.3.4 */ | ||
835 | { | ||
836 | int qx, qy, X, Y; | ||
837 |
2/2✓ Branch 0 taken 10397 times.
✓ Branch 1 taken 3781 times.
|
14178 | int sh = v->profile < PROFILE_ADVANCED ? 5 : 6; |
838 | 14178 | int MV = 4 - (1 << sh); | |
839 | 14178 | qx = (s->mb_x << sh); | |
840 | 14178 | qy = (s->mb_y << sh); | |
841 | 14178 | X = (s->mb_width << sh) - 4; | |
842 | 14178 | Y = (s->mb_height << sh) - 4; | |
843 |
2/2✓ Branch 0 taken 23 times.
✓ Branch 1 taken 14155 times.
|
14178 | if (qx + px < MV) px = MV - qx; |
844 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 14174 times.
|
14178 | if (qy + py < MV) py = MV - qy; |
845 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 14178 times.
|
14178 | if (qx + px > X) px = X - qx; |
846 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 14172 times.
|
14178 | if (qy + py > Y) py = Y - qy; |
847 | } | ||
848 | /* Calculate hybrid prediction as specified in 8.3.5.3.5 */ | ||
849 | if (0 && !s->first_slice_line && s->mb_x) { | ||
850 | if (is_intra[xy - wrap]) | ||
851 | sum = FFABS(px) + FFABS(py); | ||
852 | else | ||
853 | sum = FFABS(px - A[0]) + FFABS(py - A[1]); | ||
854 | if (sum > 32) { | ||
855 | if (get_bits1(&s->gb)) { | ||
856 | px = A[0]; | ||
857 | py = A[1]; | ||
858 | } else { | ||
859 | px = C[0]; | ||
860 | py = C[1]; | ||
861 | } | ||
862 | } else { | ||
863 | if (is_intra[xy - 2]) | ||
864 | sum = FFABS(px) + FFABS(py); | ||
865 | else | ||
866 | sum = FFABS(px - C[0]) + FFABS(py - C[1]); | ||
867 | if (sum > 32) { | ||
868 | if (get_bits1(&s->gb)) { | ||
869 | px = A[0]; | ||
870 | py = A[1]; | ||
871 | } else { | ||
872 | px = C[0]; | ||
873 | py = C[1]; | ||
874 | } | ||
875 | } | ||
876 | } | ||
877 | } | ||
878 | /* store MV using signed modulus of MV range defined in 4.11 */ | ||
879 | |||
880 | 14178 | s->mv[1][0][0] = ((px + dmv_x[1] + r_x) & ((r_x << 1) - 1)) - r_x; | |
881 | 14178 | s->mv[1][0][1] = ((py + dmv_y[1] + r_y) & ((r_y << 1) - 1)) - r_y; | |
882 | } | ||
883 | 18201 | s->cur_pic.motion_val[0][xy][0] = s->mv[0][0][0]; | |
884 | 18201 | s->cur_pic.motion_val[0][xy][1] = s->mv[0][0][1]; | |
885 | 18201 | s->cur_pic.motion_val[1][xy][0] = s->mv[1][0][0]; | |
886 | 18201 | s->cur_pic.motion_val[1][xy][1] = s->mv[1][0][1]; | |
887 | } | ||
888 | |||
889 | 79716 | void ff_vc1_pred_b_mv_intfi(VC1Context *v, int n, int *dmv_x, int *dmv_y, | |
890 | int mv1, int *pred_flag) | ||
891 | { | ||
892 | 79716 | int dir = (v->bmvtype == BMV_TYPE_BACKWARD) ? 1 : 0; | |
893 | 79716 | MpegEncContext *s = &v->s; | |
894 | 79716 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
895 | |||
896 |
2/2✓ Branch 0 taken 6770 times.
✓ Branch 1 taken 72946 times.
|
79716 | if (v->bmvtype == BMV_TYPE_DIRECT) { |
897 | int total_opp, k, f; | ||
898 |
2/2✓ Branch 0 taken 4903 times.
✓ Branch 1 taken 1867 times.
|
6770 | if (s->next_pic.mb_type[mb_pos + v->mb_off] != MB_TYPE_INTRA) { |
899 | 9806 | s->mv[0][0][0] = scale_mv(s->next_pic.motion_val[1][s->block_index[0] + v->blocks_off][0], | |
900 | 4903 | v->bfraction, 0, s->quarter_sample); | |
901 | 9806 | s->mv[0][0][1] = scale_mv(s->next_pic.motion_val[1][s->block_index[0] + v->blocks_off][1], | |
902 | 4903 | v->bfraction, 0, s->quarter_sample); | |
903 | 9806 | s->mv[1][0][0] = scale_mv(s->next_pic.motion_val[1][s->block_index[0] + v->blocks_off][0], | |
904 | 4903 | v->bfraction, 1, s->quarter_sample); | |
905 | 9806 | s->mv[1][0][1] = scale_mv(s->next_pic.motion_val[1][s->block_index[0] + v->blocks_off][1], | |
906 | 4903 | v->bfraction, 1, s->quarter_sample); | |
907 | |||
908 | 4903 | total_opp = v->mv_f_next[0][s->block_index[0] + v->blocks_off] | |
909 | 4903 | + v->mv_f_next[0][s->block_index[1] + v->blocks_off] | |
910 | 4903 | + v->mv_f_next[0][s->block_index[2] + v->blocks_off] | |
911 | 4903 | + v->mv_f_next[0][s->block_index[3] + v->blocks_off]; | |
912 | 4903 | f = (total_opp > 2) ? 1 : 0; | |
913 | } else { | ||
914 | 1867 | s->mv[0][0][0] = s->mv[0][0][1] = 0; | |
915 | 1867 | s->mv[1][0][0] = s->mv[1][0][1] = 0; | |
916 | 1867 | f = 0; | |
917 | } | ||
918 | 6770 | v->ref_field_type[0] = v->ref_field_type[1] = v->cur_field_type ^ f; | |
919 |
2/2✓ Branch 0 taken 27080 times.
✓ Branch 1 taken 6770 times.
|
33850 | for (k = 0; k < 4; k++) { |
920 | 27080 | s->cur_pic.motion_val[0][s->block_index[k] + v->blocks_off][0] = s->mv[0][0][0]; | |
921 | 27080 | s->cur_pic.motion_val[0][s->block_index[k] + v->blocks_off][1] = s->mv[0][0][1]; | |
922 | 27080 | s->cur_pic.motion_val[1][s->block_index[k] + v->blocks_off][0] = s->mv[1][0][0]; | |
923 | 27080 | s->cur_pic.motion_val[1][s->block_index[k] + v->blocks_off][1] = s->mv[1][0][1]; | |
924 | 27080 | v->mv_f[0][s->block_index[k] + v->blocks_off] = f; | |
925 | 27080 | v->mv_f[1][s->block_index[k] + v->blocks_off] = f; | |
926 | } | ||
927 | 6770 | return; | |
928 | } | ||
929 |
2/2✓ Branch 0 taken 5886 times.
✓ Branch 1 taken 67060 times.
|
72946 | if (v->bmvtype == BMV_TYPE_INTERPOLATED) { |
930 | 5886 | ff_vc1_pred_mv(v, 0, dmv_x[0], dmv_y[0], 1, v->range_x, v->range_y, v->mb_type[0], pred_flag[0], 0); | |
931 | 5886 | ff_vc1_pred_mv(v, 0, dmv_x[1], dmv_y[1], 1, v->range_x, v->range_y, v->mb_type[0], pred_flag[1], 1); | |
932 | 5886 | return; | |
933 | } | ||
934 |
2/2✓ Branch 0 taken 31989 times.
✓ Branch 1 taken 35071 times.
|
67060 | if (dir) { // backward |
935 | 31989 | ff_vc1_pred_mv(v, n, dmv_x[1], dmv_y[1], mv1, v->range_x, v->range_y, v->mb_type[0], pred_flag[1], 1); | |
936 |
4/4✓ Branch 0 taken 27473 times.
✓ Branch 1 taken 4516 times.
✓ Branch 2 taken 13925 times.
✓ Branch 3 taken 13548 times.
|
31989 | if (n == 3 || mv1) { |
937 | 18441 | ff_vc1_pred_mv(v, 0, dmv_x[0], dmv_y[0], 1, v->range_x, v->range_y, v->mb_type[0], 0, 0); | |
938 | } | ||
939 | } else { // forward | ||
940 | 35071 | ff_vc1_pred_mv(v, n, dmv_x[0], dmv_y[0], mv1, v->range_x, v->range_y, v->mb_type[0], pred_flag[0], 0); | |
941 |
4/4✓ Branch 0 taken 30179 times.
✓ Branch 1 taken 4892 times.
✓ Branch 2 taken 15503 times.
✓ Branch 3 taken 14676 times.
|
35071 | if (n == 3 || mv1) { |
942 | 20395 | ff_vc1_pred_mv(v, 0, dmv_x[1], dmv_y[1], 1, v->range_x, v->range_y, v->mb_type[0], 0, 1); | |
943 | } | ||
944 | } | ||
945 | } | ||
946 |