mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Merge remote-tracking branch 'qatar/master'
* qatar/master: mpegvideo: Move 8x8 in a separate function Conflicts: libavcodec/mpegvideo_motion.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
4d41a25d39
@ -747,6 +747,81 @@ static inline void apply_obmc(MpegEncContext *s,
|
|||||||
mx, my);
|
mx, my);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void apply_8x8(MpegEncContext *s,
|
||||||
|
uint8_t *dest_y,
|
||||||
|
uint8_t *dest_cb,
|
||||||
|
uint8_t *dest_cr,
|
||||||
|
int dir,
|
||||||
|
uint8_t **ref_picture,
|
||||||
|
qpel_mc_func (*qpix_op)[16],
|
||||||
|
op_pixels_func (*pix_op)[4])
|
||||||
|
{
|
||||||
|
int dxy, mx, my, src_x, src_y;
|
||||||
|
int i;
|
||||||
|
int mb_x = s->mb_x;
|
||||||
|
int mb_y = s->mb_y;
|
||||||
|
uint8_t *ptr, *dest;
|
||||||
|
|
||||||
|
mx = 0;
|
||||||
|
my = 0;
|
||||||
|
if (s->quarter_sample) {
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
int motion_x = s->mv[dir][i][0];
|
||||||
|
int motion_y = s->mv[dir][i][1];
|
||||||
|
|
||||||
|
dxy = ((motion_y & 3) << 2) | (motion_x & 3);
|
||||||
|
src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
|
||||||
|
src_y = mb_y * 16 + (motion_y >> 2) + (i >> 1) * 8;
|
||||||
|
|
||||||
|
/* WARNING: do no forget half pels */
|
||||||
|
src_x = av_clip(src_x, -16, s->width);
|
||||||
|
if (src_x == s->width)
|
||||||
|
dxy &= ~3;
|
||||||
|
src_y = av_clip(src_y, -16, s->height);
|
||||||
|
if (src_y == s->height)
|
||||||
|
dxy &= ~12;
|
||||||
|
|
||||||
|
ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
|
||||||
|
if (s->flags & CODEC_FLAG_EMU_EDGE) {
|
||||||
|
if ((unsigned)src_x > FFMAX(s->h_edge_pos - (motion_x & 3) - 8, 0) ||
|
||||||
|
(unsigned)src_y > FFMAX(s->v_edge_pos - (motion_y & 3) - 8, 0)) {
|
||||||
|
s->vdsp.emulated_edge_mc(s->edge_emu_buffer,
|
||||||
|
s->linesize, ptr,
|
||||||
|
s->linesize,
|
||||||
|
9, 9,
|
||||||
|
src_x, src_y,
|
||||||
|
s->h_edge_pos,
|
||||||
|
s->v_edge_pos);
|
||||||
|
ptr = s->edge_emu_buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
|
||||||
|
qpix_op[1][dxy](dest, ptr, s->linesize);
|
||||||
|
|
||||||
|
mx += s->mv[dir][i][0] / 2;
|
||||||
|
my += s->mv[dir][i][1] / 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
hpel_motion(s,
|
||||||
|
dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
|
||||||
|
ref_picture[0],
|
||||||
|
mb_x * 16 + (i & 1) * 8,
|
||||||
|
mb_y * 16 + (i >> 1) * 8,
|
||||||
|
pix_op[1],
|
||||||
|
s->mv[dir][i][0],
|
||||||
|
s->mv[dir][i][1]);
|
||||||
|
|
||||||
|
mx += s->mv[dir][i][0];
|
||||||
|
my += s->mv[dir][i][1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY))
|
||||||
|
chroma_4mv_motion(s, dest_cb, dest_cr,
|
||||||
|
ref_picture, pix_op[1], mx, my);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* motion compensation of a single macroblock
|
* motion compensation of a single macroblock
|
||||||
* @param s context
|
* @param s context
|
||||||
@ -769,12 +844,8 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
|
|||||||
qpel_mc_func (*qpix_op)[16],
|
qpel_mc_func (*qpix_op)[16],
|
||||||
int is_mpeg12)
|
int is_mpeg12)
|
||||||
{
|
{
|
||||||
int dxy, mx, my, src_x, src_y, motion_x, motion_y;
|
int i;
|
||||||
int mb_x, mb_y, i;
|
int mb_y = s->mb_y;
|
||||||
uint8_t *ptr, *dest;
|
|
||||||
|
|
||||||
mb_x = s->mb_x;
|
|
||||||
mb_y = s->mb_y;
|
|
||||||
|
|
||||||
prefetch_motion(s, ref_picture, dir);
|
prefetch_motion(s, ref_picture, dir);
|
||||||
|
|
||||||
@ -810,66 +881,9 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MV_TYPE_8X8:
|
case MV_TYPE_8X8:
|
||||||
if (!is_mpeg12) {
|
if (!is_mpeg12)
|
||||||
mx = 0;
|
apply_8x8(s, dest_y, dest_cb, dest_cr,
|
||||||
my = 0;
|
dir, ref_picture, qpix_op, pix_op);
|
||||||
if (s->quarter_sample) {
|
|
||||||
for (i = 0; i < 4; i++) {
|
|
||||||
motion_x = s->mv[dir][i][0];
|
|
||||||
motion_y = s->mv[dir][i][1];
|
|
||||||
|
|
||||||
dxy = ((motion_y & 3) << 2) | (motion_x & 3);
|
|
||||||
src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
|
|
||||||
src_y = mb_y * 16 + (motion_y >> 2) + (i >> 1) * 8;
|
|
||||||
|
|
||||||
/* WARNING: do no forget half pels */
|
|
||||||
src_x = av_clip(src_x, -16, s->width);
|
|
||||||
if (src_x == s->width)
|
|
||||||
dxy &= ~3;
|
|
||||||
src_y = av_clip(src_y, -16, s->height);
|
|
||||||
if (src_y == s->height)
|
|
||||||
dxy &= ~12;
|
|
||||||
|
|
||||||
ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
|
|
||||||
if (s->flags & CODEC_FLAG_EMU_EDGE) {
|
|
||||||
if ((unsigned)src_x > FFMAX(s->h_edge_pos - (motion_x & 3) - 8, 0) ||
|
|
||||||
(unsigned)src_y > FFMAX(s->v_edge_pos - (motion_y & 3) - 8, 0)) {
|
|
||||||
s->vdsp.emulated_edge_mc(s->edge_emu_buffer,
|
|
||||||
s->linesize, ptr,
|
|
||||||
s->linesize,
|
|
||||||
9, 9,
|
|
||||||
src_x, src_y,
|
|
||||||
s->h_edge_pos,
|
|
||||||
s->v_edge_pos);
|
|
||||||
ptr = s->edge_emu_buffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
|
|
||||||
qpix_op[1][dxy](dest, ptr, s->linesize);
|
|
||||||
|
|
||||||
mx += s->mv[dir][i][0] / 2;
|
|
||||||
my += s->mv[dir][i][1] / 2;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (i = 0; i < 4; i++) {
|
|
||||||
hpel_motion(s,
|
|
||||||
dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
|
|
||||||
ref_picture[0],
|
|
||||||
mb_x * 16 + (i & 1) * 8,
|
|
||||||
mb_y * 16 + (i >> 1) * 8,
|
|
||||||
pix_op[1],
|
|
||||||
s->mv[dir][i][0],
|
|
||||||
s->mv[dir][i][1]);
|
|
||||||
|
|
||||||
mx += s->mv[dir][i][0];
|
|
||||||
my += s->mv[dir][i][1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY))
|
|
||||||
chroma_4mv_motion(s, dest_cb, dest_cr,
|
|
||||||
ref_picture, pix_op[1], mx, my);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case MV_TYPE_FIELD:
|
case MV_TYPE_FIELD:
|
||||||
if (s->picture_structure == PICT_FRAME) {
|
if (s->picture_structure == PICT_FRAME) {
|
||||||
|
Loading…
Reference in New Issue
Block a user