180 |
int32_t dx = (quarterpel ? mb->qmvs[0].x : mb->mvs[0].x); |
int32_t dx = (quarterpel ? mb->qmvs[0].x : mb->mvs[0].x); |
181 |
int32_t dy = (quarterpel ? mb->qmvs[0].y : mb->mvs[0].y); |
int32_t dy = (quarterpel ? mb->qmvs[0].y : mb->mvs[0].y); |
182 |
|
|
183 |
if ( (mb->mode == MODE_NOT_CODED) && (dx==0) && (dy==0) ) { /* quick copy */ |
if ( (!reduced_resolution) && (mb->mode == MODE_NOT_CODED) && (dx==0) && (dy==0) ) { /* quick copy */ |
184 |
transfer16x16_copy(cur->y + 16 * (i + j * edged_width), |
transfer16x16_copy(cur->y + 16 * (i + j * edged_width), |
185 |
ref->y + 16 * (i + j * edged_width), |
ref->y + 16 * (i + j * edged_width), |
186 |
edged_width); |
edged_width); |
214 |
dx = (dx >> 1) + roundtab_79[dx & 0x3]; |
dx = (dx >> 1) + roundtab_79[dx & 0x3]; |
215 |
dy = (dy >> 1) + roundtab_79[dy & 0x3]; |
dy = (dy >> 1) + roundtab_79[dy & 0x3]; |
216 |
|
|
217 |
/* uv-block-based compensation |
/* uv-block-based compensation */ |
|
XXX: rrv doesnt work with 16x16 block-based intepolation. |
|
|
we need to use 18x18-block interpolation */ |
|
218 |
if (reduced_resolution) |
if (reduced_resolution) |
219 |
{ |
{ |
220 |
const stride = edged_width/2; |
const stride = edged_width/2; |
222 |
|
|
223 |
current = cur->u + 16*j*stride + 16*i; |
current = cur->u + 16*j*stride + 16*i; |
224 |
reference = refv->u + 16*j*stride + 16*i; |
reference = refv->u + 16*j*stride + 16*i; |
|
//interpolate16x16_switch(refv->u, ref->u, 16*i, 16*j, dx, dy, stride, rounding); |
|
225 |
interpolate18x18_switch(refv->u, ref->u, 16*i, 16*j, dx, dy, stride, rounding); |
interpolate18x18_switch(refv->u, ref->u, 16*i, 16*j, dx, dy, stride, rounding); |
226 |
filter_18x18_to_8x8(dct_codes + 4*64, current, stride); |
filter_18x18_to_8x8(dct_codes + 4*64, current, stride); |
227 |
filter_diff_18x18_to_8x8(dct_codes + 4*64, reference, stride); |
filter_diff_18x18_to_8x8(dct_codes + 4*64, reference, stride); |
229 |
|
|
230 |
current = cur->v + 16*j*stride + 16*i; |
current = cur->v + 16*j*stride + 16*i; |
231 |
reference = refv->v + 16*j*stride + 16*i; |
reference = refv->v + 16*j*stride + 16*i; |
|
//interpolate16x16_switch(refv->v, ref->v, 16*i, 16*j, dx, dy, stride, rounding); |
|
232 |
interpolate18x18_switch(refv->v, ref->v, 16*i, 16*j, dx, dy, stride, rounding); |
interpolate18x18_switch(refv->v, ref->v, 16*i, 16*j, dx, dy, stride, rounding); |
233 |
filter_18x18_to_8x8(dct_codes + 5*64, current, stride); |
filter_18x18_to_8x8(dct_codes + 5*64, current, stride); |
234 |
filter_diff_18x18_to_8x8(dct_codes + 5*64, reference, stride); |
filter_diff_18x18_to_8x8(dct_codes + 5*64, reference, stride); |
248 |
} |
} |
249 |
|
|
250 |
} else { // mode == MODE_INTER4V |
} else { // mode == MODE_INTER4V |
251 |
int i; |
int k; |
252 |
int32_t sum, dx, dy; |
int32_t sum, dx, dy; |
253 |
VECTOR mvs[4]; |
VECTOR mvs[4]; |
254 |
|
|
255 |
if(quarterpel) |
if(quarterpel) |
256 |
for (i = 0; i < 4; i++) mvs[i] = mb->qmvs[i]; |
for (k = 0; k < 4; k++) mvs[k] = mb->qmvs[k]; |
257 |
else |
else |
258 |
for (i = 0; i < 4; i++) mvs[i] = mb->mvs[i]; |
for (k = 0; k < 4; k++) mvs[k] = mb->mvs[k]; |
259 |
|
|
260 |
if (reduced_resolution) |
if (reduced_resolution) |
261 |
{ |
{ |
262 |
for (i = 0; i < 4; i++) |
for (k = 0; k < 4; k++) |
263 |
{ |
{ |
264 |
mvs[i].x = RRV_MV_SCALEUP(mvs[i].x); |
mvs[k].x = RRV_MV_SCALEUP(mvs[k].x); |
265 |
mvs[i].y = RRV_MV_SCALEUP(mvs[i].y); |
mvs[k].y = RRV_MV_SCALEUP(mvs[k].y); |
266 |
} |
} |
267 |
} |
} |
268 |
|
|
294 |
dy = (sum >> 3) + roundtab_76[sum & 0xf]; |
dy = (sum >> 3) + roundtab_76[sum & 0xf]; |
295 |
|
|
296 |
|
|
297 |
/* uv-block-based compensation |
/* uv-block-based compensation */ |
|
XXX: rrv doesnt work with 16x16 block-based intepolation. |
|
|
we need to use 18x18-block interpolation */ |
|
298 |
if (reduced_resolution) |
if (reduced_resolution) |
299 |
{ |
{ |
300 |
const stride = edged_width/2; |
const stride = edged_width/2; |
302 |
|
|
303 |
current = cur->u + 16*j*stride + 16*i; |
current = cur->u + 16*j*stride + 16*i; |
304 |
reference = refv->u + 16*j*stride + 16*i; |
reference = refv->u + 16*j*stride + 16*i; |
305 |
interpolate16x16_switch(refv->u, ref->u, 16*i, 16*j, dx, dy, stride, rounding); |
interpolate18x18_switch(refv->u, ref->u, 16*i, 16*j, dx, dy, stride, rounding); |
306 |
filter_18x18_to_8x8(dct_codes + 4*64, current, stride); |
filter_18x18_to_8x8(dct_codes + 4*64, current, stride); |
307 |
filter_diff_18x18_to_8x8(dct_codes + 4*64, reference, stride); |
filter_diff_18x18_to_8x8(dct_codes + 4*64, reference, stride); |
308 |
transfer16x16_copy(current, reference, stride); |
transfer16x16_copy(current, reference, stride); |
309 |
|
|
310 |
current = cur->v + 16*j*stride + 16*i; |
current = cur->v + 16*j*stride + 16*i; |
311 |
reference = refv->v + 16*j*stride + 16*i; |
reference = refv->v + 16*j*stride + 16*i; |
312 |
interpolate16x16_switch(refv->v, ref->v, 16*i, 16*j, dx, dy, stride, rounding); |
interpolate18x18_switch(refv->v, ref->v, 16*i, 16*j, dx, dy, stride, rounding); |
313 |
filter_18x18_to_8x8(dct_codes + 5*64, current, stride); |
filter_18x18_to_8x8(dct_codes + 5*64, current, stride); |
314 |
filter_diff_18x18_to_8x8(dct_codes + 5*64, reference, stride); |
filter_diff_18x18_to_8x8(dct_codes + 5*64, reference, stride); |
315 |
transfer16x16_copy(current, reference, stride); |
transfer16x16_copy(current, reference, stride); |