From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id B5F72441B6 for ; Thu, 1 Sep 2022 00:22:54 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1912468B9CA; Thu, 1 Sep 2022 03:22:53 +0300 (EEST) Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 20CB668B4DC for ; Thu, 1 Sep 2022 03:22:47 +0300 (EEST) Received: by mail-pf1-f181.google.com with SMTP id 145so15638329pfw.4 for ; Wed, 31 Aug 2022 17:22:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc; bh=5uy5r/sjAtQIaAtN+LIrViV2A6k16J8uGWOYMGhji/Y=; b=hl7vkmivlmiDNdsGu8A8QgnTFAKzAxatSkNrEmS1SolyfVpVlFXjc4cAT6a/Dto0Fm Md0kuuihbaprXXQpqA8L3JmMO8+hPzBuRvmhb3Ugg3u4ZElogevJKZpmTgCXWyWbkOUs yYjzHjjj/dSbMX9uCH8SZYDQHwKBEz/0KPt8ckRJMy9idlHCJdNm5clD3eXGCXMok4Ky eGCidpmGJMaPpnzKJt3Dnqu+HH7/igJC10GOmUfDVIUoc0Ga/f7V83VbCVH6YWSth364 GGR9MOCtE1ADiJAQ675Fk5x7a3d9Sx4kTT0Qie9NwpGYJcDJS7nIb5qXRed23shGBf42 FE+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc; bh=5uy5r/sjAtQIaAtN+LIrViV2A6k16J8uGWOYMGhji/Y=; b=28qex3dRbi4UtSTfRQyE7PzbeKKd97VrAxKZxFwLyyF9QAObdyQeJlfOMY6ozU90+o QumtRy7RBzIduwOxGwsimgLGeLlPfO1GOTr4nyBY562mG6NtVOR5xndiPaWQdhjyTWHK 4J1hDnyNfhuIFNIcQOW8ijHTyOWfaG4aA2jK8+YdTpHOE/QEqwsT/RAZNhvBzrzHnYn2 rwW3sRsMR5VQhOoGLtR8elfJqJq6UHGQGtKE74TuOQF6pCsn0CyoV6wB4pbrxZswnZcn gXgBxLcxmtSv4VUhYbzCV0Szc9S3+N7dQos1SRifdEOAjbN1BGwYnL8/JfaD+vU7wfKO vJEQ== X-Gm-Message-State: ACgBeo12PLmoH8sTd9ZgoxsPENwYwuQ8YM5m+bu32ns02Yc+d5y2Lm5f kE18+U8C0KQ7w1bdpyW3eBDQ5Zfwkn8= X-Google-Smtp-Source: AA6agR5iCyrGsOPx4KeJbQ7cOsdNNYBLXq8hJemSuA0qmm2TDC+OiLf8Oso7wS9HChwgWHSMF90S4A== X-Received: by 2002:a05:6a00:1353:b0:53a:80d6:6f72 with SMTP id k19-20020a056a00135300b0053a80d66f72mr8984883pfu.32.1661991764880; Wed, 31 Aug 2022 17:22:44 -0700 (PDT) Received: from wilferico.thefacebook.com ([2620:10d:c090:400::5:62d5]) by smtp.gmail.com with ESMTPSA id u18-20020a170902e5d200b00172eb493487sm4845877plf.167.2022.08.31.17.22.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 31 Aug 2022 17:22:43 -0700 (PDT) From: Chema Gonzalez To: ffmpeg-devel@ffmpeg.org Date: Wed, 31 Aug 2022 17:22:40 -0700 Message-Id: <20220901002240.1761597-1-chemag@gmail.com> X-Mailer: git-send-email 2.37.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/1] avcodec/mpegutils: add motion_vec debug mode X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Chema Gonzalez Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Add a new debug mode ("motion_vec") that prints the values of the motion vectors (MV). Note that, in order to give the same weight to MV from bigger blocks, we may print each MV pair more than once. Tested: ``` $ ./ffprobe -v quiet -show_frames -debug motion_vec /tmp/in.264 2>&1 >/dev/null ... [h264 @ 0x2d0d700] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2 [h264 @ 0x2d0d700] New frame, type: I [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2 [h264 @ 0x2d0d700] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 0 [h264 @ 0x2d0d700] New frame, type: B [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... [h264 @ 0x2d0d700] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 0 ... ``` --- libavcodec/avcodec.h | 1 + libavcodec/mpegutils.c | 45 +++++++++++++++++++++++++++++++++++++- libavcodec/options_table.h | 1 + 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 65c8535359..4287555a31 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -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. diff --git a/libavcodec/mpegutils.c b/libavcodec/mpegutils.c index ff9418232b..d0a94784fb 100644 --- a/libavcodec/mpegutils.c +++ b/libavcodec/mpegutils.c @@ -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"); } diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h index cd02f5096f..0d100069e1 100644 --- a/libavcodec/options_table.h +++ b/libavcodec/options_table.h @@ -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"}, -- 2.37.2 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".