|
|
|
@@ -179,12 +179,17 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) |
|
|
|
int i; |
|
|
|
uint8_t (*luty)[256], (*lutuv)[256]; |
|
|
|
int use_ic; |
|
|
|
int interlace; |
|
|
|
int linesize, uvlinesize; |
|
|
|
|
|
|
|
if ((!v->field_mode || |
|
|
|
(v->ref_field_type[dir] == 1 && v->cur_field_type == 1)) && |
|
|
|
!v->s.last_picture.f->data[0]) |
|
|
|
return; |
|
|
|
|
|
|
|
linesize = s->current_picture_ptr->f->linesize[0]; |
|
|
|
uvlinesize = s->current_picture_ptr->f->linesize[1]; |
|
|
|
|
|
|
|
mx = s->mv[dir][0][0]; |
|
|
|
my = s->mv[dir][0][1]; |
|
|
|
|
|
|
|
@@ -220,6 +225,7 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) |
|
|
|
luty = v->curr_luty; |
|
|
|
lutuv = v->curr_lutuv; |
|
|
|
use_ic = *v->curr_use_ic; |
|
|
|
interlace = 1; |
|
|
|
} else { |
|
|
|
srcY = s->last_picture.f->data[0]; |
|
|
|
srcU = s->last_picture.f->data[1]; |
|
|
|
@@ -227,6 +233,7 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) |
|
|
|
luty = v->last_luty; |
|
|
|
lutuv = v->last_lutuv; |
|
|
|
use_ic = v->last_use_ic; |
|
|
|
interlace = s->last_picture.f->interlaced_frame; |
|
|
|
} |
|
|
|
} else { |
|
|
|
srcY = s->next_picture.f->data[0]; |
|
|
|
@@ -235,6 +242,7 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) |
|
|
|
luty = v->next_luty; |
|
|
|
lutuv = v->next_lutuv; |
|
|
|
use_ic = v->next_use_ic; |
|
|
|
interlace = s->next_picture.f->interlaced_frame; |
|
|
|
} |
|
|
|
|
|
|
|
if (!srcY || !srcU) { |
|
|
|
@@ -269,9 +277,9 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) |
|
|
|
srcV += uvsrc_y * s->uvlinesize + uvsrc_x; |
|
|
|
|
|
|
|
if (v->field_mode && v->ref_field_type[dir]) { |
|
|
|
srcY += s->current_picture_ptr->f->linesize[0]; |
|
|
|
srcU += s->current_picture_ptr->f->linesize[1]; |
|
|
|
srcV += s->current_picture_ptr->f->linesize[2]; |
|
|
|
srcY += linesize; |
|
|
|
srcU += uvlinesize; |
|
|
|
srcV += uvlinesize; |
|
|
|
} |
|
|
|
|
|
|
|
/* for grayscale we should not try to read from unknown area */ |
|
|
|
@@ -289,112 +297,105 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) |
|
|
|
const int k = 17 + s->mspel * 2; |
|
|
|
|
|
|
|
srcY -= s->mspel * (1 + s->linesize); |
|
|
|
if (v->fcm == ILACE_FRAME) { |
|
|
|
if (src_y - s->mspel & 1) { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, |
|
|
|
srcY, |
|
|
|
2 * s->linesize, |
|
|
|
2 * s->linesize, |
|
|
|
k, |
|
|
|
k + 1 >> 1, |
|
|
|
src_x - s->mspel, |
|
|
|
src_y - s->mspel >> 1, |
|
|
|
s->h_edge_pos, |
|
|
|
v_edge_pos + 1 >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + s->linesize, |
|
|
|
srcY + s->linesize, |
|
|
|
2 * s->linesize, |
|
|
|
2 * s->linesize, |
|
|
|
k, |
|
|
|
k >> 1, |
|
|
|
src_x - s->mspel, |
|
|
|
src_y - s->mspel + 1 >> 1, |
|
|
|
s->h_edge_pos, |
|
|
|
v_edge_pos >> 1); |
|
|
|
} else { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, |
|
|
|
srcY, |
|
|
|
2 * s->linesize, |
|
|
|
2 * s->linesize, |
|
|
|
k, |
|
|
|
k + 1 >> 1, |
|
|
|
src_x - s->mspel, |
|
|
|
src_y - s->mspel >> 1, |
|
|
|
s->h_edge_pos, |
|
|
|
v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + s->linesize, |
|
|
|
srcY + s->linesize, |
|
|
|
2 * s->linesize, |
|
|
|
2 * s->linesize, |
|
|
|
if (interlace) { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, |
|
|
|
srcY, |
|
|
|
linesize << 1, |
|
|
|
linesize << 1, |
|
|
|
k, |
|
|
|
v->field_mode ? k : k + 1 >> 1, |
|
|
|
src_x - s->mspel, |
|
|
|
src_y - s->mspel >> !v->field_mode, |
|
|
|
s->h_edge_pos, |
|
|
|
s->v_edge_pos >> 1); |
|
|
|
if (!v->field_mode) |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + linesize, |
|
|
|
srcY + linesize, |
|
|
|
linesize << 1, |
|
|
|
linesize << 1, |
|
|
|
k, |
|
|
|
k >> 1, |
|
|
|
src_x - s->mspel, |
|
|
|
src_y - s->mspel + 1 >> 1, |
|
|
|
s->h_edge_pos, |
|
|
|
v_edge_pos + 1 >> 1); |
|
|
|
} |
|
|
|
s->v_edge_pos >> 1); |
|
|
|
} else |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, srcY, |
|
|
|
s->linesize, s->linesize, |
|
|
|
k, k, |
|
|
|
src_x - s->mspel, src_y - s->mspel, |
|
|
|
s->h_edge_pos, v_edge_pos); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, |
|
|
|
srcY, |
|
|
|
linesize, |
|
|
|
linesize, |
|
|
|
k, |
|
|
|
v->field_mode ? (k << 1) - 1 : k, |
|
|
|
src_x - s->mspel, |
|
|
|
v->field_mode ? 2 * (src_y - s->mspel) + v->ref_field_type[dir] : |
|
|
|
src_y - s->mspel, |
|
|
|
s->h_edge_pos, |
|
|
|
s->v_edge_pos); |
|
|
|
srcY = s->sc.edge_emu_buffer; |
|
|
|
if (v->fcm == ILACE_FRAME) { |
|
|
|
if (uvsrc_y & 1) { |
|
|
|
s->vdsp.emulated_edge_mc(ubuf, srcU, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 5, |
|
|
|
uvsrc_x, uvsrc_y >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) + 1 >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(ubuf + s->uvlinesize, srcU + s->uvlinesize, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 4, |
|
|
|
uvsrc_x, uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf, srcV, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 5, |
|
|
|
uvsrc_x, uvsrc_y >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) + 1 >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf + s->uvlinesize, srcV + s->uvlinesize, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 4, |
|
|
|
uvsrc_x, uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) >> 1); |
|
|
|
} else { |
|
|
|
s->vdsp.emulated_edge_mc(ubuf, srcU, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 5, |
|
|
|
uvsrc_x, uvsrc_y >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(ubuf + s->uvlinesize, srcU + s->uvlinesize, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 4, |
|
|
|
uvsrc_x, uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) + 1 >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf, srcV, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 5, |
|
|
|
uvsrc_x, uvsrc_y >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf + s->uvlinesize, srcV + s->uvlinesize, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 4, |
|
|
|
uvsrc_x, uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) + 1 >> 1); |
|
|
|
if (interlace) { |
|
|
|
s->vdsp.emulated_edge_mc(ubuf, |
|
|
|
srcU, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
9, |
|
|
|
v->field_mode ? 9 : 5, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y >> !v->field_mode, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf, |
|
|
|
srcV, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
9, |
|
|
|
v->field_mode ? 9 : 5, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y >> !v->field_mode, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
if (!v->field_mode) { |
|
|
|
s->vdsp.emulated_edge_mc(ubuf + uvlinesize, |
|
|
|
srcU + uvlinesize, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
9, |
|
|
|
4, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf + uvlinesize, |
|
|
|
srcV + uvlinesize, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
9, |
|
|
|
4, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
} |
|
|
|
} else { |
|
|
|
s->vdsp.emulated_edge_mc(ubuf, srcU, |
|
|
|
s->uvlinesize, s->uvlinesize, |
|
|
|
8 + 1, 8 + 1, |
|
|
|
uvsrc_x, uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf, srcV, |
|
|
|
s->uvlinesize, s->uvlinesize, |
|
|
|
8 + 1, 8 + 1, |
|
|
|
uvsrc_x, uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(ubuf, |
|
|
|
srcU, |
|
|
|
uvlinesize, |
|
|
|
uvlinesize, |
|
|
|
9, |
|
|
|
v->field_mode ? 17 : 9, |
|
|
|
uvsrc_x, |
|
|
|
v->field_mode ? 2 * uvsrc_y + v->ref_field_type[dir] : uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf, |
|
|
|
srcV, |
|
|
|
uvlinesize, |
|
|
|
uvlinesize, |
|
|
|
9, |
|
|
|
v->field_mode ? 17 : 9, |
|
|
|
uvsrc_x, |
|
|
|
v->field_mode ? 2 * uvsrc_y + v->ref_field_type[dir] : uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 1); |
|
|
|
} |
|
|
|
srcU = ubuf; |
|
|
|
srcV = vbuf; |
|
|
|
@@ -458,12 +459,16 @@ void ff_vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg) |
|
|
|
int v_edge_pos = s->v_edge_pos >> v->field_mode; |
|
|
|
uint8_t (*luty)[256]; |
|
|
|
int use_ic; |
|
|
|
int interlace; |
|
|
|
int linesize; |
|
|
|
|
|
|
|
if ((!v->field_mode || |
|
|
|
(v->ref_field_type[dir] == 1 && v->cur_field_type == 1)) && |
|
|
|
!v->s.last_picture.f->data[0]) |
|
|
|
return; |
|
|
|
|
|
|
|
linesize = s->current_picture_ptr->f->linesize[0]; |
|
|
|
|
|
|
|
mx = s->mv[dir][n][0]; |
|
|
|
my = s->mv[dir][n][1]; |
|
|
|
|
|
|
|
@@ -472,15 +477,18 @@ void ff_vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg) |
|
|
|
srcY = s->current_picture.f->data[0]; |
|
|
|
luty = v->curr_luty; |
|
|
|
use_ic = *v->curr_use_ic; |
|
|
|
interlace = 1; |
|
|
|
} else { |
|
|
|
srcY = s->last_picture.f->data[0]; |
|
|
|
luty = v->last_luty; |
|
|
|
use_ic = v->last_use_ic; |
|
|
|
interlace = s->last_picture.f->interlaced_frame; |
|
|
|
} |
|
|
|
} else { |
|
|
|
srcY = s->next_picture.f->data[0]; |
|
|
|
luty = v->next_luty; |
|
|
|
use_ic = v->next_use_ic; |
|
|
|
interlace = s->next_picture.f->interlaced_frame; |
|
|
|
} |
|
|
|
|
|
|
|
if (!srcY) { |
|
|
|
@@ -547,7 +555,7 @@ void ff_vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg) |
|
|
|
|
|
|
|
srcY += src_y * s->linesize + src_x; |
|
|
|
if (v->field_mode && v->ref_field_type[dir]) |
|
|
|
srcY += s->current_picture_ptr->f->linesize[0]; |
|
|
|
srcY += linesize; |
|
|
|
|
|
|
|
if (v->rangeredfrm || use_ic |
|
|
|
|| s->h_edge_pos < 13 || v_edge_pos < 23 |
|
|
|
@@ -557,36 +565,40 @@ void ff_vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg) |
|
|
|
|
|
|
|
srcY -= s->mspel * (1 + (s->linesize << fieldmv)); |
|
|
|
/* check emulate edge stride and offset */ |
|
|
|
if (v->fcm == ILACE_FRAME) { |
|
|
|
if (src_y - (s->mspel << fieldmv) & 1) { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, srcY, |
|
|
|
2 * s->linesize, 2 * s->linesize, |
|
|
|
k, (k << fieldmv) + 1 >> 1, |
|
|
|
src_x - s->mspel, src_y - (s->mspel << fieldmv) >> 1, |
|
|
|
s->h_edge_pos, v_edge_pos + 1 >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + s->linesize, srcY + s->linesize, |
|
|
|
2 * s->linesize, 2 * s->linesize, |
|
|
|
k, (k << fieldmv) >> 1, |
|
|
|
src_x - s->mspel, src_y - (s->mspel << fieldmv) + 1 >> 1, |
|
|
|
s->h_edge_pos, v_edge_pos >> 1); |
|
|
|
} else { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, srcY, |
|
|
|
2 * s->linesize, 2 * s->linesize, |
|
|
|
k, (k << fieldmv) + 1 >> 1, |
|
|
|
src_x - s->mspel, src_y - (s->mspel << fieldmv) >> 1, |
|
|
|
s->h_edge_pos, v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + s->linesize, srcY + s->linesize, |
|
|
|
2 * s->linesize, 2 * s->linesize, |
|
|
|
k, (k << fieldmv) >> 1, |
|
|
|
src_x - s->mspel, src_y - (s->mspel << fieldmv) + 1 >> 1, |
|
|
|
s->h_edge_pos, v_edge_pos + 1 >> 1); |
|
|
|
} |
|
|
|
if (interlace) { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, |
|
|
|
srcY, |
|
|
|
linesize << 1, |
|
|
|
linesize << 1, |
|
|
|
k, |
|
|
|
v->field_mode ? k : (k << fieldmv) + 1 >> 1, |
|
|
|
src_x - s->mspel, |
|
|
|
src_y - (s->mspel << fieldmv) >> !v->field_mode, |
|
|
|
s->h_edge_pos, |
|
|
|
s->v_edge_pos >> 1); |
|
|
|
if (!v->field_mode && !fieldmv) |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + linesize, |
|
|
|
srcY + linesize, |
|
|
|
linesize << 1, |
|
|
|
linesize << 1, |
|
|
|
k, |
|
|
|
k >> 1, |
|
|
|
src_x - s->mspel, |
|
|
|
src_y - s->mspel + 1 >> 1, |
|
|
|
s->h_edge_pos, |
|
|
|
s->v_edge_pos >> 1); |
|
|
|
} else |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, srcY, |
|
|
|
s->linesize, s->linesize, |
|
|
|
k, k, |
|
|
|
src_x - s->mspel, src_y - s->mspel, |
|
|
|
s->h_edge_pos, v_edge_pos); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, |
|
|
|
srcY, |
|
|
|
linesize, |
|
|
|
linesize, |
|
|
|
k, |
|
|
|
v->field_mode ? (k << 1) - 1 : k << fieldmv, |
|
|
|
src_x - s->mspel, |
|
|
|
v->field_mode ? 2 * (src_y - s->mspel) + v->ref_field_type[dir] : |
|
|
|
src_y - (s->mspel << fieldmv), |
|
|
|
s->h_edge_pos, |
|
|
|
s->v_edge_pos); |
|
|
|
srcY = s->sc.edge_emu_buffer; |
|
|
|
/* if we deal with range reduction we need to scale source blocks */ |
|
|
|
if (v->rangeredfrm) { |
|
|
|
@@ -630,6 +642,8 @@ void ff_vc1_mc_4mv_chroma(VC1Context *v, int dir) |
|
|
|
int v_edge_pos = s->v_edge_pos >> v->field_mode; |
|
|
|
uint8_t (*lutuv)[256]; |
|
|
|
int use_ic; |
|
|
|
int interlace; |
|
|
|
int uvlinesize; |
|
|
|
|
|
|
|
if (!v->field_mode && !v->s.last_picture.f->data[0]) |
|
|
|
return; |
|
|
|
@@ -654,6 +668,9 @@ void ff_vc1_mc_4mv_chroma(VC1Context *v, int dir) |
|
|
|
return; |
|
|
|
s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][0] = tx; |
|
|
|
s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][1] = ty; |
|
|
|
|
|
|
|
uvlinesize = s->current_picture_ptr->f->linesize[1]; |
|
|
|
|
|
|
|
uvmx = (tx + ((tx & 3) == 3)) >> 1; |
|
|
|
uvmy = (ty + ((ty & 3) == 3)) >> 1; |
|
|
|
|
|
|
|
@@ -685,17 +702,20 @@ void ff_vc1_mc_4mv_chroma(VC1Context *v, int dir) |
|
|
|
srcV = s->current_picture.f->data[2]; |
|
|
|
lutuv = v->curr_lutuv; |
|
|
|
use_ic = *v->curr_use_ic; |
|
|
|
interlace = 1; |
|
|
|
} else { |
|
|
|
srcU = s->last_picture.f->data[1]; |
|
|
|
srcV = s->last_picture.f->data[2]; |
|
|
|
lutuv = v->last_lutuv; |
|
|
|
use_ic = v->last_use_ic; |
|
|
|
interlace = s->last_picture.f->interlaced_frame; |
|
|
|
} |
|
|
|
} else { |
|
|
|
srcU = s->next_picture.f->data[1]; |
|
|
|
srcV = s->next_picture.f->data[2]; |
|
|
|
lutuv = v->next_lutuv; |
|
|
|
use_ic = v->next_use_ic; |
|
|
|
interlace = s->next_picture.f->interlaced_frame; |
|
|
|
} |
|
|
|
|
|
|
|
if (!srcU) { |
|
|
|
@@ -708,8 +728,8 @@ void ff_vc1_mc_4mv_chroma(VC1Context *v, int dir) |
|
|
|
|
|
|
|
if (v->field_mode) { |
|
|
|
if (chroma_ref_type) { |
|
|
|
srcU += s->current_picture_ptr->f->linesize[1]; |
|
|
|
srcV += s->current_picture_ptr->f->linesize[2]; |
|
|
|
srcU += uvlinesize; |
|
|
|
srcV += uvlinesize; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@@ -717,14 +737,71 @@ void ff_vc1_mc_4mv_chroma(VC1Context *v, int dir) |
|
|
|
|| s->h_edge_pos < 18 || v_edge_pos < 18 |
|
|
|
|| (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9 |
|
|
|
|| (unsigned)uvsrc_y > (v_edge_pos >> 1) - 9) { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, srcU, |
|
|
|
s->uvlinesize, s->uvlinesize, |
|
|
|
8 + 1, 8 + 1, uvsrc_x, uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16, srcV, |
|
|
|
s->uvlinesize, s->uvlinesize, |
|
|
|
8 + 1, 8 + 1, uvsrc_x, uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos >> 1); |
|
|
|
if (interlace) { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, |
|
|
|
srcU, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
9, |
|
|
|
v->field_mode ? 9 : 5, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y >> !v->field_mode, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16, |
|
|
|
srcV, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
9, |
|
|
|
v->field_mode ? 9 : 5, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y >> !v->field_mode, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
if (!v->field_mode) { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + uvlinesize, |
|
|
|
srcU + uvlinesize, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
9, |
|
|
|
4, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16 + uvlinesize, |
|
|
|
srcV + uvlinesize, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
9, |
|
|
|
4, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
} |
|
|
|
} else { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, |
|
|
|
srcU, |
|
|
|
uvlinesize, |
|
|
|
uvlinesize, |
|
|
|
9, |
|
|
|
v->field_mode ? 17 : 9, |
|
|
|
uvsrc_x, |
|
|
|
v->field_mode ? 2 * uvsrc_y + chroma_ref_type : uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16, |
|
|
|
srcV, |
|
|
|
uvlinesize, |
|
|
|
uvlinesize, |
|
|
|
9, |
|
|
|
v->field_mode ? 17 : 9, |
|
|
|
uvsrc_x, |
|
|
|
v->field_mode ? 2 * uvsrc_y + chroma_ref_type : uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 1); |
|
|
|
} |
|
|
|
srcU = s->sc.edge_emu_buffer; |
|
|
|
srcV = s->sc.edge_emu_buffer + 16; |
|
|
|
|
|
|
|
@@ -772,11 +849,15 @@ void ff_vc1_mc_4mv_chroma4(VC1Context *v, int dir, int dir2, int avg) |
|
|
|
int v_dist = fieldmv ? 1 : 4; // vertical offset for lower sub-blocks |
|
|
|
int v_edge_pos = s->v_edge_pos >> 1; |
|
|
|
int use_ic; |
|
|
|
int interlace; |
|
|
|
int uvlinesize; |
|
|
|
uint8_t (*lutuv)[256]; |
|
|
|
|
|
|
|
if (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY) |
|
|
|
return; |
|
|
|
|
|
|
|
uvlinesize = s->current_picture_ptr->f->linesize[1]; |
|
|
|
|
|
|
|
for (i = 0; i < 4; i++) { |
|
|
|
int d = i < 2 ? dir: dir2; |
|
|
|
tx = s->mv[d][i][0]; |
|
|
|
@@ -803,11 +884,13 @@ void ff_vc1_mc_4mv_chroma4(VC1Context *v, int dir, int dir2, int avg) |
|
|
|
srcV = s->next_picture.f->data[2]; |
|
|
|
lutuv = v->next_lutuv; |
|
|
|
use_ic = v->next_use_ic; |
|
|
|
interlace = s->next_picture.f->interlaced_frame; |
|
|
|
} else { |
|
|
|
srcU = s->last_picture.f->data[1]; |
|
|
|
srcV = s->last_picture.f->data[2]; |
|
|
|
lutuv = v->last_lutuv; |
|
|
|
use_ic = v->last_use_ic; |
|
|
|
interlace = s->last_picture.f->interlaced_frame; |
|
|
|
} |
|
|
|
if (!srcU) |
|
|
|
return; |
|
|
|
@@ -820,51 +903,70 @@ void ff_vc1_mc_4mv_chroma4(VC1Context *v, int dir, int dir2, int avg) |
|
|
|
|| s->h_edge_pos < 10 || v_edge_pos < (5 << fieldmv) |
|
|
|
|| (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 5 |
|
|
|
|| (unsigned)uvsrc_y > v_edge_pos - (5 << fieldmv)) { |
|
|
|
if (v->fcm == ILACE_FRAME) { |
|
|
|
if (uvsrc_y & 1) { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, srcU, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
5, (5 << fieldmv) + 1 >> 1, uvsrc_x, uvsrc_y >> 1, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos + 1 >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + s->uvlinesize, srcU + s->uvlinesize, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
5, (5 << fieldmv) >> 1, uvsrc_x, uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16, srcV, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
5, (5 << fieldmv) + 1 >> 1, uvsrc_x, uvsrc_y >> 1, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos + 1 >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16 + s->uvlinesize, srcV + s->uvlinesize, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
5, (5 << fieldmv) >> 1, uvsrc_x, uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos >> 1); |
|
|
|
} else { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, srcU, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
5, (5 << fieldmv) + 1 >> 1, uvsrc_x, uvsrc_y >> 1, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + s->uvlinesize, srcU + s->uvlinesize, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
5, (5 << fieldmv) >> 1, uvsrc_x, uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos + 1 >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16, srcV, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
5, (5 << fieldmv) + 1 >> 1, uvsrc_x, uvsrc_y >> 1, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16 + s->uvlinesize, srcV + s->uvlinesize, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
5, (5 << fieldmv) + 1, uvsrc_x, uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos + 1 >> 1); |
|
|
|
if (interlace) { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, |
|
|
|
srcU, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
5, |
|
|
|
(5 << fieldmv) + 1 >> 1, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y >> 1, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16, |
|
|
|
srcV, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
5, |
|
|
|
(5 << fieldmv) + 1 >> 1, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y >> 1, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
if (!fieldmv) { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + uvlinesize, |
|
|
|
srcU + uvlinesize, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
5, |
|
|
|
2, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16 + uvlinesize, |
|
|
|
srcV + uvlinesize, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
5, |
|
|
|
2, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
} |
|
|
|
} else { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, srcU, |
|
|
|
s->uvlinesize, s->uvlinesize, |
|
|
|
5, 5, uvsrc_x, uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16, srcV, |
|
|
|
s->uvlinesize, s->uvlinesize, |
|
|
|
5, 5, uvsrc_x, uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, |
|
|
|
srcU, |
|
|
|
uvlinesize, |
|
|
|
uvlinesize, |
|
|
|
5, |
|
|
|
5 << fieldmv, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16, |
|
|
|
srcV, |
|
|
|
uvlinesize, |
|
|
|
uvlinesize, |
|
|
|
5, |
|
|
|
5 << fieldmv, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 1); |
|
|
|
} |
|
|
|
srcU = s->sc.edge_emu_buffer; |
|
|
|
srcV = s->sc.edge_emu_buffer + 16; |
|
|
|
@@ -907,10 +1009,15 @@ void ff_vc1_interp_mc(VC1Context *v) |
|
|
|
int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y; |
|
|
|
int v_edge_pos = s->v_edge_pos >> v->field_mode; |
|
|
|
int use_ic = v->next_use_ic; |
|
|
|
int interlace; |
|
|
|
int linesize, uvlinesize; |
|
|
|
|
|
|
|
if (!v->field_mode && !v->s.next_picture.f->data[0]) |
|
|
|
return; |
|
|
|
|
|
|
|
linesize = s->current_picture_ptr->f->linesize[0]; |
|
|
|
uvlinesize = s->current_picture_ptr->f->linesize[1]; |
|
|
|
|
|
|
|
mx = s->mv[1][0][0]; |
|
|
|
my = s->mv[1][0][1]; |
|
|
|
uvmx = (mx + ((mx & 3) == 3)) >> 1; |
|
|
|
@@ -927,6 +1034,8 @@ void ff_vc1_interp_mc(VC1Context *v) |
|
|
|
srcU = s->next_picture.f->data[1]; |
|
|
|
srcV = s->next_picture.f->data[2]; |
|
|
|
|
|
|
|
interlace = s->next_picture.f->interlaced_frame; |
|
|
|
|
|
|
|
src_x = s->mb_x * 16 + (mx >> 2); |
|
|
|
src_y = s->mb_y * 16 + (my >> 2); |
|
|
|
uvsrc_x = s->mb_x * 8 + (uvmx >> 2); |
|
|
|
@@ -954,9 +1063,9 @@ void ff_vc1_interp_mc(VC1Context *v) |
|
|
|
srcV += uvsrc_y * s->uvlinesize + uvsrc_x; |
|
|
|
|
|
|
|
if (v->field_mode && v->ref_field_type[1]) { |
|
|
|
srcY += s->current_picture_ptr->f->linesize[0]; |
|
|
|
srcU += s->current_picture_ptr->f->linesize[1]; |
|
|
|
srcV += s->current_picture_ptr->f->linesize[2]; |
|
|
|
srcY += linesize; |
|
|
|
srcU += uvlinesize; |
|
|
|
srcV += uvlinesize; |
|
|
|
} |
|
|
|
|
|
|
|
/* for grayscale we should not try to read from unknown area */ |
|
|
|
@@ -973,112 +1082,105 @@ void ff_vc1_interp_mc(VC1Context *v) |
|
|
|
const int k = 17 + s->mspel * 2; |
|
|
|
|
|
|
|
srcY -= s->mspel * (1 + s->linesize); |
|
|
|
if (v->fcm == ILACE_FRAME) { |
|
|
|
if (src_y - s->mspel & 1) { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, |
|
|
|
srcY, |
|
|
|
2 * s->linesize, |
|
|
|
2 * s->linesize, |
|
|
|
k, |
|
|
|
k + 1 >> 1, |
|
|
|
src_x - s->mspel, |
|
|
|
src_y - s->mspel >> 1, |
|
|
|
s->h_edge_pos, |
|
|
|
v_edge_pos + 1 >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + s->linesize, |
|
|
|
srcY + s->linesize, |
|
|
|
2 * s->linesize, |
|
|
|
2 * s->linesize, |
|
|
|
if (interlace) { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, |
|
|
|
srcY, |
|
|
|
linesize << 1, |
|
|
|
linesize << 1, |
|
|
|
k, |
|
|
|
v->field_mode ? k : (k + 1 >> 1), |
|
|
|
src_x - s->mspel, |
|
|
|
src_y - s->mspel >> !v->field_mode, |
|
|
|
s->h_edge_pos, |
|
|
|
s->v_edge_pos >> 1); |
|
|
|
if (!v->field_mode) |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + linesize, |
|
|
|
srcY + linesize, |
|
|
|
linesize << 1, |
|
|
|
linesize << 1, |
|
|
|
k, |
|
|
|
k >> 1, |
|
|
|
src_x - s->mspel, |
|
|
|
src_y - s->mspel + 1 >> 1, |
|
|
|
s->h_edge_pos, |
|
|
|
v_edge_pos >> 1); |
|
|
|
} else { |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, |
|
|
|
srcY, |
|
|
|
2 * s->linesize, |
|
|
|
2 * s->linesize, |
|
|
|
k, |
|
|
|
k + 1 >> 1, |
|
|
|
src_x - s->mspel, |
|
|
|
src_y - s->mspel >> 1, |
|
|
|
s->h_edge_pos, |
|
|
|
v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + s->linesize, |
|
|
|
srcY + s->linesize, |
|
|
|
2 * s->linesize, |
|
|
|
2 * s->linesize, |
|
|
|
k, |
|
|
|
k >> 1, |
|
|
|
src_x - s->mspel, |
|
|
|
src_y - s->mspel + 1 >> 1, |
|
|
|
s->h_edge_pos, |
|
|
|
v_edge_pos + 1 >> 1); |
|
|
|
} |
|
|
|
s->v_edge_pos >> 1); |
|
|
|
} else |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, srcY, |
|
|
|
s->linesize, s->linesize, |
|
|
|
k, k, |
|
|
|
src_x - s->mspel, src_y - s->mspel, |
|
|
|
s->h_edge_pos, v_edge_pos); |
|
|
|
s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, |
|
|
|
srcY, |
|
|
|
linesize, |
|
|
|
linesize, |
|
|
|
k, |
|
|
|
v->field_mode ? (k << 1) - 1 : k, |
|
|
|
src_x - s->mspel, |
|
|
|
v->field_mode ? 2 * (src_y - s->mspel) + v->ref_field_type[1] : |
|
|
|
src_y - s->mspel, |
|
|
|
s->h_edge_pos, |
|
|
|
s->v_edge_pos); |
|
|
|
srcY = s->sc.edge_emu_buffer; |
|
|
|
if (v->fcm == ILACE_FRAME) { |
|
|
|
if (uvsrc_y & 1) { |
|
|
|
s->vdsp.emulated_edge_mc(ubuf, srcU, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 5, |
|
|
|
uvsrc_x, uvsrc_y >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) + 1 >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(ubuf + s->uvlinesize, srcU + s->uvlinesize, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 4, |
|
|
|
uvsrc_x, uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf, srcV, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 5, |
|
|
|
uvsrc_x, uvsrc_y >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) + 1 >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf + s->uvlinesize, srcV + s->uvlinesize, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 4, |
|
|
|
uvsrc_x, uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) >> 1); |
|
|
|
} else { |
|
|
|
s->vdsp.emulated_edge_mc(ubuf, srcU, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 5, |
|
|
|
uvsrc_x, uvsrc_y >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(ubuf + s->uvlinesize, srcU + s->uvlinesize, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 4, |
|
|
|
uvsrc_x, uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) + 1 >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf, srcV, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 5, |
|
|
|
uvsrc_x, uvsrc_y >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf + s->uvlinesize, srcV + s->uvlinesize, |
|
|
|
2 * s->uvlinesize, 2 * s->uvlinesize, |
|
|
|
8 + 1, 4, |
|
|
|
uvsrc_x, uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, (v_edge_pos >> 1) + 1 >> 1); |
|
|
|
if (interlace) { |
|
|
|
s->vdsp.emulated_edge_mc(ubuf, |
|
|
|
srcU, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
9, |
|
|
|
v->field_mode ? 9 : 5, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y >> !v->field_mode, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf, |
|
|
|
srcV, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
9, |
|
|
|
v->field_mode ? 9 : 5, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y >> !v->field_mode, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
if (!v->field_mode) { |
|
|
|
s->vdsp.emulated_edge_mc(ubuf + uvlinesize, |
|
|
|
srcU + uvlinesize, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
9, |
|
|
|
4, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf + uvlinesize, |
|
|
|
srcV + uvlinesize, |
|
|
|
uvlinesize << 1, |
|
|
|
uvlinesize << 1, |
|
|
|
9, |
|
|
|
4, |
|
|
|
uvsrc_x, |
|
|
|
uvsrc_y + 1 >> 1, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 2); |
|
|
|
} |
|
|
|
} else { |
|
|
|
s->vdsp.emulated_edge_mc(ubuf, srcU, |
|
|
|
s->uvlinesize, s->uvlinesize, |
|
|
|
8 + 1, 8 + 1, |
|
|
|
uvsrc_x, uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf, srcV, |
|
|
|
s->uvlinesize, s->uvlinesize, |
|
|
|
8 + 1, 8 + 1, |
|
|
|
uvsrc_x, uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(ubuf, |
|
|
|
srcU, |
|
|
|
uvlinesize, |
|
|
|
uvlinesize, |
|
|
|
9, |
|
|
|
v->field_mode ? 17 : 9, |
|
|
|
uvsrc_x, |
|
|
|
v->field_mode ? 2 * uvsrc_y + v->ref_field_type[1] : uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 1); |
|
|
|
s->vdsp.emulated_edge_mc(vbuf, |
|
|
|
srcV, |
|
|
|
uvlinesize, |
|
|
|
uvlinesize, |
|
|
|
9, |
|
|
|
v->field_mode ? 17 : 9, |
|
|
|
uvsrc_x, |
|
|
|
v->field_mode ? 2 * uvsrc_y + v->ref_field_type[1] : uvsrc_y, |
|
|
|
s->h_edge_pos >> 1, |
|
|
|
s->v_edge_pos >> 1); |
|
|
|
} |
|
|
|
srcU = ubuf; |
|
|
|
srcV = vbuf; |
|
|
|
|