avutil/motion_vector: export subpel motion information

FATE test changes because of the switch from shift to division.
pull/134/merge
Clément Bœsch 9 years ago committed by Clément Bœsch
parent c7b9338853
commit 56bdf61baa
  1. 34
      libavcodec/mpegvideo.c
  2. 7
      libavcodec/snowdec.c
  3. 7
      libavutil/motion_vector.h
  4. 2
      libavutil/version.h
  5. 36
      tests/ref/fate/filter-codecview-mvs

@ -1557,15 +1557,18 @@ static void draw_arrow(uint8_t *buf, int sx, int sy, int ex,
static int add_mb(AVMotionVector *mb, uint32_t mb_type,
int dst_x, int dst_y,
int src_x, int src_y,
int motion_x, int motion_y, int motion_scale,
int direction)
{
mb->w = IS_8X8(mb_type) || IS_8X16(mb_type) ? 8 : 16;
mb->h = IS_8X8(mb_type) || IS_16X8(mb_type) ? 8 : 16;
mb->src_x = src_x;
mb->src_y = src_y;
mb->motion_x = motion_x;
mb->motion_y = motion_y;
mb->motion_scale = motion_scale;
mb->dst_x = dst_x;
mb->dst_y = dst_y;
mb->src_x = dst_x + motion_x / motion_scale;
mb->src_y = dst_y + motion_y / motion_scale;
mb->source = direction ? 1 : -1;
mb->flags = 0; // XXX: does mb_type contain extra information that could be exported here?
return 1;
@ -1581,6 +1584,7 @@ void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict, uint8_t *mbskip_
{
if ((avctx->flags2 & AV_CODEC_FLAG2_EXPORT_MVS) && mbtype_table && motion_val[0]) {
const int shift = 1 + quarter_sample;
const int scale = 1 << shift;
const int mv_sample_log2 = avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_SVQ3 ? 2 : 1;
const int mv_stride = (mb_width << mv_sample_log2) +
(avctx->codec->id == AV_CODEC_ID_H264 ? 0 : 1);
@ -1604,43 +1608,43 @@ void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict, uint8_t *mbskip_
int sy = mb_y * 16 + 4 + 8 * (i >> 1);
int xy = (mb_x * 2 + (i & 1) +
(mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
int mx = (motion_val[direction][xy][0] >> shift) + sx;
int my = (motion_val[direction][xy][1] >> shift) + sy;
mbcount += add_mb(mvs + mbcount, mb_type, sx, sy, mx, my, direction);
int mx = motion_val[direction][xy][0];
int my = motion_val[direction][xy][1];
mbcount += add_mb(mvs + mbcount, mb_type, sx, sy, mx, my, scale, direction);
}
} else if (IS_16X8(mb_type)) {
for (i = 0; i < 2; i++) {
int sx = mb_x * 16 + 8;
int sy = mb_y * 16 + 4 + 8 * i;
int xy = (mb_x * 2 + (mb_y * 2 + i) * mv_stride) << (mv_sample_log2 - 1);
int mx = (motion_val[direction][xy][0] >> shift);
int my = (motion_val[direction][xy][1] >> shift);
int mx = motion_val[direction][xy][0];
int my = motion_val[direction][xy][1];
if (IS_INTERLACED(mb_type))
my *= 2;
mbcount += add_mb(mvs + mbcount, mb_type, sx, sy, mx + sx, my + sy, direction);
mbcount += add_mb(mvs + mbcount, mb_type, sx, sy, mx, my, scale, direction);
}
} else if (IS_8X16(mb_type)) {
for (i = 0; i < 2; i++) {
int sx = mb_x * 16 + 4 + 8 * i;
int sy = mb_y * 16 + 8;
int xy = (mb_x * 2 + i + mb_y * 2 * mv_stride) << (mv_sample_log2 - 1);
int mx = motion_val[direction][xy][0] >> shift;
int my = motion_val[direction][xy][1] >> shift;
int mx = motion_val[direction][xy][0];
int my = motion_val[direction][xy][1];
if (IS_INTERLACED(mb_type))
my *= 2;
mbcount += add_mb(mvs + mbcount, mb_type, sx, sy, mx + sx, my + sy, direction);
mbcount += add_mb(mvs + mbcount, mb_type, sx, sy, mx, my, scale, direction);
}
} else {
int sx = mb_x * 16 + 8;
int sy = mb_y * 16 + 8;
int xy = (mb_x + mb_y * mv_stride) << mv_sample_log2;
int mx = (motion_val[direction][xy][0]>>shift) + sx;
int my = (motion_val[direction][xy][1]>>shift) + sy;
mbcount += add_mb(mvs + mbcount, mb_type, sx, sy, mx, my, direction);
int mx = motion_val[direction][xy][0];
int my = motion_val[direction][xy][1];
mbcount += add_mb(mvs + mbcount, mb_type, sx, sy, mx, my, scale, direction);
}
}
}

@ -104,8 +104,11 @@ static av_always_inline void predict_slice_buffered(SnowContext *s, slice_buffer
avmv->h = block_h;
avmv->dst_x = block_w*mb_x - block_w/2;
avmv->dst_y = block_h*mb_y - block_h/2;
avmv->src_x = avmv->dst_x + (bn->mx * s->mv_scale)/8;
avmv->src_y = avmv->dst_y + (bn->my * s->mv_scale)/8;
avmv->motion_scale = 8;
avmv->motion_x = bn->mx * s->mv_scale;
avmv->motion_y = bn->my * s->mv_scale;
avmv->src_x = avmv->dst_x + avmv->motion_x / 8;
avmv->src_y = avmv->dst_y + avmv->motion_y / 8;
avmv->source= -1 - bn->ref;
avmv->flags = 0;
}

@ -45,6 +45,13 @@ typedef struct AVMotionVector {
* Currently unused.
*/
uint64_t flags;
/**
* Motion vector
* src_x = dst_x + motion_x / motion_scale
* src_y = dst_y + motion_y / motion_scale
*/
int32_t motion_x, motion_y;
uint16_t motion_scale;
} AVMotionVector;
#endif /* AVUTIL_MOTION_VECTOR_H */

@ -56,7 +56,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 55
#define LIBAVUTIL_VERSION_MINOR 8
#define LIBAVUTIL_VERSION_MINOR 9
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \

@ -39,23 +39,23 @@
0, 37, 37, 1, 276480, 0x5ce39368
0, 38, 38, 1, 276480, 0x4ec1e418
0, 39, 39, 1, 276480, 0x23c418ae
0, 40, 40, 1, 276480, 0x499c55d6
0, 41, 41, 1, 276480, 0x166ef020
0, 42, 42, 1, 276480, 0xaa0614ab
0, 43, 43, 1, 276480, 0x8bc2fa2b
0, 44, 44, 1, 276480, 0xc9c873f7
0, 45, 45, 1, 276480, 0x99838153
0, 46, 46, 1, 276480, 0x32e5f45b
0, 40, 40, 1, 276480, 0x036a5515
0, 41, 41, 1, 276480, 0x7946efbd
0, 42, 42, 1, 276480, 0xd9aa1382
0, 43, 43, 1, 276480, 0x3863f9c8
0, 44, 44, 1, 276480, 0x33e47330
0, 45, 45, 1, 276480, 0xff6e8038
0, 46, 46, 1, 276480, 0xed3ff087
0, 47, 47, 1, 276480, 0xe7834514
0, 48, 48, 1, 276480, 0x454c99c8
0, 49, 49, 1, 276480, 0xe29bacc8
0, 50, 50, 1, 276480, 0x6b79c3d3
0, 51, 51, 1, 276480, 0x284d358e
0, 52, 52, 1, 276480, 0x17552cd4
0, 48, 48, 1, 276480, 0x4d5d909d
0, 49, 49, 1, 276480, 0x82eea962
0, 50, 50, 1, 276480, 0x8075bca3
0, 51, 51, 1, 276480, 0xd5dc3185
0, 52, 52, 1, 276480, 0x859e0490
0, 53, 53, 1, 276480, 0x6ceebf3e
0, 54, 54, 1, 276480, 0x7ac8de3c
0, 55, 55, 1, 276480, 0x14d6768c
0, 56, 56, 1, 276480, 0x59891e5f
0, 57, 57, 1, 276480, 0xed3053ea
0, 58, 58, 1, 276480, 0x9b0182c3
0, 59, 59, 1, 276480, 0xf849eb88
0, 54, 54, 1, 276480, 0xada5d62d
0, 55, 55, 1, 276480, 0x991a7628
0, 56, 56, 1, 276480, 0xe169042a
0, 57, 57, 1, 276480, 0x226e52c4
0, 58, 58, 1, 276480, 0xa3fe775c
0, 59, 59, 1, 276480, 0x6b80e99f

Loading…
Cancel
Save