|
|
|
@@ -943,6 +943,39 @@ static inline void vp8_mc(VP8Context *s, int luma, |
|
|
|
mc_func[my_idx][mx_idx](dst, linesize, src, linesize, block_h, mx, my); |
|
|
|
} |
|
|
|
|
|
|
|
static inline void vp8_mc_part(VP8Context *s, uint8_t *dst[3], |
|
|
|
AVFrame *ref_frame, int x_off, int y_off, |
|
|
|
int bx_off, int by_off, |
|
|
|
int block_w, int block_h, |
|
|
|
int width, int height, VP56mv *mv) |
|
|
|
{ |
|
|
|
VP56mv uvmv = *mv; |
|
|
|
|
|
|
|
/* Y */ |
|
|
|
vp8_mc(s, 1, dst[0] + by_off * s->linesize + bx_off, |
|
|
|
ref_frame->data[0], mv, x_off + bx_off, y_off + by_off, |
|
|
|
block_w, block_h, width, height, s->linesize, |
|
|
|
s->put_pixels_tab[block_w == 8]); |
|
|
|
|
|
|
|
/* U/V */ |
|
|
|
if (s->profile == 3) { |
|
|
|
uvmv.x &= ~7; |
|
|
|
uvmv.y &= ~7; |
|
|
|
} |
|
|
|
x_off >>= 1; y_off >>= 1; |
|
|
|
bx_off >>= 1; by_off >>= 1; |
|
|
|
width >>= 1; height >>= 1; |
|
|
|
block_w >>= 1; block_h >>= 1; |
|
|
|
vp8_mc(s, 0, dst[1] + by_off * s->uvlinesize + bx_off, |
|
|
|
ref_frame->data[1], &uvmv, x_off + bx_off, y_off + by_off, |
|
|
|
block_w, block_h, width, height, s->uvlinesize, |
|
|
|
s->put_pixels_tab[1 + (block_w == 4)]); |
|
|
|
vp8_mc(s, 0, dst[2] + by_off * s->uvlinesize + bx_off, |
|
|
|
ref_frame->data[2], &uvmv, x_off + bx_off, y_off + by_off, |
|
|
|
block_w, block_h, width, height, s->uvlinesize, |
|
|
|
s->put_pixels_tab[1 + (block_w == 4)]); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Apply motion vectors to prediction buffer, chapter 18. |
|
|
|
*/ |
|
|
|
@@ -951,29 +984,14 @@ static void inter_predict(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, |
|
|
|
{ |
|
|
|
int x_off = mb_x << 4, y_off = mb_y << 4; |
|
|
|
int width = 16*s->mb_width, height = 16*s->mb_height; |
|
|
|
VP56mv uvmv; |
|
|
|
|
|
|
|
if (mb->mode < VP8_MVMODE_SPLIT) { |
|
|
|
/* Y */ |
|
|
|
vp8_mc(s, 1, dst[0], s->framep[mb->ref_frame]->data[0], &mb->mv, |
|
|
|
x_off, y_off, 16, 16, width, height, s->linesize, |
|
|
|
s->put_pixels_tab[0]); |
|
|
|
|
|
|
|
/* U/V */ |
|
|
|
uvmv = mb->mv; |
|
|
|
if (s->profile == 3) { |
|
|
|
uvmv.x &= ~7; |
|
|
|
uvmv.y &= ~7; |
|
|
|
} |
|
|
|
x_off >>= 1; y_off >>= 1; width >>= 1; height >>= 1; |
|
|
|
vp8_mc(s, 0, dst[1], s->framep[mb->ref_frame]->data[1], &uvmv, |
|
|
|
x_off, y_off, 8, 8, width, height, s->uvlinesize, |
|
|
|
s->put_pixels_tab[1]); |
|
|
|
vp8_mc(s, 0, dst[2], s->framep[mb->ref_frame]->data[2], &uvmv, |
|
|
|
x_off, y_off, 8, 8, width, height, s->uvlinesize, |
|
|
|
s->put_pixels_tab[1]); |
|
|
|
} else { |
|
|
|
vp8_mc_part(s, dst, s->framep[mb->ref_frame], x_off, y_off, |
|
|
|
0, 0, 16, 16, width, height, &mb->mv); |
|
|
|
} else switch (mb->partitioning) { |
|
|
|
case VP8_SPLITMVMODE_4x4: { |
|
|
|
int x, y; |
|
|
|
VP56mv uvmv; |
|
|
|
|
|
|
|
/* Y */ |
|
|
|
for (y = 0; y < 4; y++) { |
|
|
|
@@ -1016,6 +1034,30 @@ static void inter_predict(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, |
|
|
|
s->put_pixels_tab[2]); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
case VP8_SPLITMVMODE_16x8: |
|
|
|
vp8_mc_part(s, dst, s->framep[mb->ref_frame], x_off, y_off, |
|
|
|
0, 0, 16, 8, width, height, &mb->bmv[0]); |
|
|
|
vp8_mc_part(s, dst, s->framep[mb->ref_frame], x_off, y_off, |
|
|
|
0, 8, 16, 8, width, height, &mb->bmv[8]); |
|
|
|
break; |
|
|
|
case VP8_SPLITMVMODE_8x16: |
|
|
|
vp8_mc_part(s, dst, s->framep[mb->ref_frame], x_off, y_off, |
|
|
|
0, 0, 8, 16, width, height, &mb->bmv[0]); |
|
|
|
vp8_mc_part(s, dst, s->framep[mb->ref_frame], x_off, y_off, |
|
|
|
8, 0, 8, 16, width, height, &mb->bmv[2]); |
|
|
|
break; |
|
|
|
case VP8_SPLITMVMODE_8x8: |
|
|
|
vp8_mc_part(s, dst, s->framep[mb->ref_frame], x_off, y_off, |
|
|
|
0, 0, 8, 8, width, height, &mb->bmv[0]); |
|
|
|
vp8_mc_part(s, dst, s->framep[mb->ref_frame], x_off, y_off, |
|
|
|
8, 0, 8, 8, width, height, &mb->bmv[2]); |
|
|
|
vp8_mc_part(s, dst, s->framep[mb->ref_frame], x_off, y_off, |
|
|
|
0, 8, 8, 8, width, height, &mb->bmv[8]); |
|
|
|
vp8_mc_part(s, dst, s->framep[mb->ref_frame], x_off, y_off, |
|
|
|
8, 8, 8, 8, width, height, &mb->bmv[10]); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|