@@ -1344,6 +1344,7 @@ typedef struct AVCodecContext {
#define FF_DEBUG_THREADS 0x00010000
#define FF_DEBUG_GREEN_MD 0x00800000
#define FF_DEBUG_NOMC 0x01000000
+#define FF_DEBUG_MOTION_VEC 0x02000000
/**
* Error recognition; may misdetect some more or less valid parts as errors.
@@ -246,8 +246,11 @@ void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict,
return;
- if (avctx->debug & (FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)) {
+ if (avctx->debug & (FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE | FF_DEBUG_MOTION_VEC)) {
int x,y;
+ 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);
av_log(avctx, AV_LOG_DEBUG, "New frame, type: %c\n",
av_get_picture_type_char(pict->pict_type));
@@ -271,6 +274,46 @@ void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict,
get_segmentation_char(mb_type),
get_interlacement_char(mb_type));
}
+ if (avctx->debug & FF_DEBUG_MOTION_VEC) {
+ int i, direction, mb_type = mbtype_table[x + y * mb_stride];
+ if (IS_8X8(mb_type)) {
+ for (i = 0; i < 4; i++) {
+ int xy = (x * 2 + (i & 1) +
+ (y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
+ int mx = motion_val[direction][xy][0];
+ int my = motion_val[direction][xy][1];
+ av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+ }
+ } else if (IS_16X8(mb_type)) {
+ for (i = 0; i < 2; i++) {
+ int xy = (x * 2 + (y * 2 + i) * mv_stride) << (mv_sample_log2 - 1);
+ int mx = motion_val[direction][xy][0];
+ int my = motion_val[direction][xy][1];
+ if (IS_INTERLACED(mb_type))
+ my *= 2;
+ av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+ av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+ }
+ } else if (IS_8X16(mb_type)) {
+ for (i = 0; i < 2; i++) {
+ int xy = (x * 2 + i + y * 2 * mv_stride) << (mv_sample_log2 - 1);
+ int mx = motion_val[direction][xy][0];
+ int my = motion_val[direction][xy][1];
+ if (IS_INTERLACED(mb_type))
+ my *= 2;
+ av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+ av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+ }
+ } else {
+ int xy = (x + y * mv_stride) << mv_sample_log2;
+ int mx = motion_val[direction][xy][0];
+ int my = motion_val[direction][xy][1];
+ av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+ av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+ av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+ av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+ }
+ }
}
av_log(avctx, AV_LOG_DEBUG, "\n");
}
@@ -198,6 +198,7 @@ static const AVOption avcodec_options[] = {
{"startcode", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_STARTCODE }, INT_MIN, INT_MAX, V|D, "debug"},
{"er", "error recognition", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_ER }, INT_MIN, INT_MAX, V|D, "debug"},
{"mmco", "memory management control operations (H.264)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_MMCO }, INT_MIN, INT_MAX, V|D, "debug"},
+{"motion_vec", "macroblock (MB) motion vector values", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_MOTION_VEC }, INT_MIN, INT_MAX, V|D, "debug"},
{"bugs", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_BUGS }, INT_MIN, INT_MAX, V|D, "debug"},
{"buffers", "picture buffer allocations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_BUFFERS }, INT_MIN, INT_MAX, V|D, "debug"},
{"thread_ops", "threading operations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_THREADS }, INT_MIN, INT_MAX, V|A|D, "debug"},