From patchwork Thu Aug 13 22:17:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yongle Lin X-Patchwork-Id: 21643 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 73DCD44A0C2 for ; Fri, 14 Aug 2020 01:26:01 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3C70568ACE4; Fri, 14 Aug 2020 01:26:01 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f66.google.com (mail-pj1-f66.google.com [209.85.216.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CF6AE68973B for ; Fri, 14 Aug 2020 01:25:54 +0300 (EEST) Received: by mail-pj1-f66.google.com with SMTP id e4so3461951pjd.0 for ; Thu, 13 Aug 2020 15:25:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=qLGtDlztloL5oupoR98NXViIQ4SjVrTWQJaQVYowcv8=; b=CLZZx/20ISWrapomrBsvpvKOxdzLfL1mZZYjp7sQxdbPBeDMQwk8IAoFBZhR7T9i2t LCzlj112vLWeh4kEcSqywcnMyV2gZ8qw8tTMt6XCYASXsEVN7Ky4I5T/LIoeKLv3JRgX W/eUCLFld4r7pBnQ204nxLI1FhIpnpc0LrZyaf5oLlfVHr7C33DaBtWpRYNsPmPooaJb WjDQRvbw5QS2032/Dqpn5yOG3jJioWq91tZg6vt93w04N14RvFZIqkD+vtEk7Bmd2a0s h0QTt3R9ajv2oPsxnOb/8EWEYW57tACDdNQzX3rcdg3Tyx5YownMSJs16I1iIL0KC+zu z5bQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=qLGtDlztloL5oupoR98NXViIQ4SjVrTWQJaQVYowcv8=; b=cZ8xLcNnws9WqRXJQjO8WpuXBQR2lq4jtJLhJM3x31x8cX/u7ig9ew5vIUkUnQHxPf MOrIjamUfGlnECpk2zuEAzZOEr2kCIysHSIhJLCBoeaoan9WWeLdFCRAKwucrKkj405f 2G6wmKRLFlMpxslxTCxpL3C+1vt+zbOg2OgdzdiD+kV9Wdqt+ScQsWJsozOfnv7mYHMk B65Rmdi+mv7rlLx58bHV2j0k+9nhZdjK1og/+cxDW0A6cI7A8j2hu3xgFGUqYNxbzkfQ a/mpy7xv7qQ+Zi/UuIHl9kSlcyOhtqTcgZjzo/yWBuiUEOyj+v6BX/GZOWfLa0otA9C/ 52GA== X-Gm-Message-State: AOAM533DJxKqlKaQ/Jvr5g0JQBkKRY9MvtbXexzAOJLuFgcBNOUH4ie1 kgz3KnwF0vVrK0HlgiYhz8vrAd6J X-Google-Smtp-Source: ABdhPJzPxaPqnUnhnsJJPGCNMQ1gPZC/PDn1crDpMv2+V+lUanZ/QOX33teCyzNw7QZ1mflcexj3Uw== X-Received: by 2002:a17:902:d902:: with SMTP id c2mr5415988plz.71.1597357091929; Thu, 13 Aug 2020 15:18:11 -0700 (PDT) Received: from yonglel.c.googlers.com.com (219.29.83.34.bc.googleusercontent.com. [34.83.29.219]) by smtp.gmail.com with ESMTPSA id c27sm6243833pgn.86.2020.08.13.15.18.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2020 15:18:11 -0700 (PDT) From: Yongle Lin X-Google-Original-From: Yongle Lin To: ffmpeg-devel@ffmpeg.org Date: Thu, 13 Aug 2020 22:17:46 +0000 Message-Id: <20200813221746.292989-1-yonglel@google.com> X-Mailer: git-send-email 2.28.0.220.ged08abb693-goog MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] fftools/ffprobe: export venc params side data X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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: Yongle Lin Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Printing venc params in ffprobe makes it easier for program to parse the data via ffprobe json output --- fftools/ffprobe.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c index 5515e1b31b..b20bddc897 100644 --- a/fftools/ffprobe.c +++ b/fftools/ffprobe.c @@ -47,6 +47,7 @@ #include "libavutil/parseutils.h" #include "libavutil/timecode.h" #include "libavutil/timestamp.h" +#include "libavutil/video_enc_params.h" #include "libavdevice/avdevice.h" #include "libswscale/swscale.h" #include "libswresample/swresample.h" @@ -166,6 +167,8 @@ typedef enum { SECTION_ID_FRAME_TAGS, SECTION_ID_FRAME_SIDE_DATA_LIST, SECTION_ID_FRAME_SIDE_DATA, + SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA_LIST, + SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA, SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST, SECTION_ID_FRAME_SIDE_DATA_TIMECODE, SECTION_ID_FRAME_LOG, @@ -213,6 +216,8 @@ static struct section sections[] = { [SECTION_ID_FRAME_TAGS] = { SECTION_ID_FRAME_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "frame_tags" }, [SECTION_ID_FRAME_SIDE_DATA_LIST] ={ SECTION_ID_FRAME_SIDE_DATA_LIST, "side_data_list", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME_SIDE_DATA, -1 }, .element_name = "side_data", .unique_name = "frame_side_data_list" }, [SECTION_ID_FRAME_SIDE_DATA] = { SECTION_ID_FRAME_SIDE_DATA, "side_data", 0, { SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST, -1 } }, + [SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA_LIST] ={ SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA_LIST, "block_data_list", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA, -1 }, .element_name = "block_data", .unique_name = "frame_block_data_list"}, + [SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA] = { SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA, "block_data", 0, { -1 }, .show_all_entries = 1 }, [SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST] = { SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST, "timecodes", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME_SIDE_DATA_TIMECODE, -1 } }, [SECTION_ID_FRAME_SIDE_DATA_TIMECODE] = { SECTION_ID_FRAME_SIDE_DATA_TIMECODE, "timecode", 0, { -1 } }, [SECTION_ID_FRAME_LOGS] = { SECTION_ID_FRAME_LOGS, "logs", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME_LOG, -1 } }, @@ -2259,6 +2264,34 @@ static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream, if (tag) print_str(tag->key, tag->value); print_int("size", sd->size); + } else if (sd->type == AV_FRAME_DATA_VIDEO_ENC_PARAMS) { + AVVideoEncParams *par = (AVVideoEncParams *) sd->data; + print_int("type", par->type); + print_int("qp", par->qp); + for (int plane = 0; plane < FF_ARRAY_ELEMS(par->delta_qp); plane++) + for (int acdc = 0; acdc < FF_ARRAY_ELEMS(par->delta_qp[plane]); acdc++) { + int delta_qp = par->delta_qp[plane][acdc]; + if (delta_qp) { + char buf[16]; + snprintf(buf, sizeof(buf), "delta_qp[%d][%d]", plane, acdc); + print_int(buf, delta_qp); + } + } + if (par->nb_blocks) { + print_int("nb_blocks", par->nb_blocks); + writer_print_section_header(w, SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA_LIST); + for (int i = 0; i < par->nb_blocks; i++) { + AVVideoBlockParams *b = av_video_enc_params_block(par, i); + writer_print_section_header(w, SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA); + print_int("src_x", b->src_x); + print_int("src_y", b->src_y); + print_int("width", b->w); + print_int("height", b->h); + print_int("delta_qp", b->delta_qp); + writer_print_section_footer(w); + } + writer_print_section_footer(w); + } } writer_print_section_footer(w); }