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 B6079463DB for ; Sat, 14 Oct 2023 19:50:36 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BC2FB68C7BB; Sat, 14 Oct 2023 22:50:33 +0300 (EEST) Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DE66E68B9BF for ; Sat, 14 Oct 2023 22:50:26 +0300 (EEST) Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-32d80ae19f8so2607706f8f.2 for ; Sat, 14 Oct 2023 12:50:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1697313026; x=1697917826; darn=ffmpeg.org; h=user-agent:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:mail-followup-to :message-id:subject:to:from:date:from:to:cc:subject:date:message-id :reply-to; bh=E2LtNQYYsvE+bRec7N+OYfamtfsgVnaap91EU/AiOX0=; b=EVbUFW3964HxOKAer84mBo9H4F6QUu5BtcmzhT3DHJ06aeBwMrw7did9nvwHa6YMtY 5pgtd7zcFAhCf/LRBhfcEMiCx51DrBIJ+6uROK5TgjfMBqNQn/gWW/AklXmaT8nlXjxC SyibZjvDXObVvZEIJ0LtlqRy8O2mFFuJB+BgM9GUQWDuVE4fwQ7hkoI+4ShOysrrFUrE 2Z/+QcXT5i21b9IFmvN9GmDoo6weuMTIJ+Pr3c9geYD3PX9ls5BXUMS+Ouq9DMOiWjfe ZI3pKrjrF4OYqjgDikUj/NtKriRBSA6GSY5vKm9ejbTlSrJuhqSqYkLk+jLGFaaG+0rl E2qA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697313026; x=1697917826; h=user-agent:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:mail-followup-to :message-id:subject:to:from:date:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=E2LtNQYYsvE+bRec7N+OYfamtfsgVnaap91EU/AiOX0=; b=TNJL+f3dHObFDCHWTMg/1sd3r06eErKwnwRKXj5jpgkU0WCkoMiLpq1qgUMEAdX8Y8 eX+LCxJpd9+os73t5apU848X89uKq9dBBrjxujIK+iJWYGB6KhmkcNoRzl+X0KYJv+vh BvG9wGkFvbPJrE+LhWYM5f4SNXudgvjOoq3TzMgcBAgVEF7YacSiJ8XlWPSYS613mZIx 7r8/CvXRQmpcHIlXKGQnIxXhj6BS51neq6fqBccvKswToBrBsl23389fNVpLyz8fyMr8 1KmPbqUg/CInj8ZVRpKkOx9d4rVwoDplY4+NTKkLLWBg34UoYY+KQVfFPYo6529/rjm+ eBkg== X-Gm-Message-State: AOJu0YzTOIFyB2cRUKUxi1zVPym+Chfy9J0+4b3VqETbexxjVZGh9LXe 3FI9XYC/gjBeVrHVhMbtMGiF31qdH8KNRTyS X-Google-Smtp-Source: AGHT+IEa5lvvvu7zkwUmKfgfkX5kAddOw/igW6+2dqkhx2XxROwzODd1PZdMu3YksJWWvXoamORKiw== X-Received: by 2002:a05:6000:257:b0:32d:acf6:bb2e with SMTP id m23-20020a056000025700b0032dacf6bb2emr132260wrz.70.1697313025599; Sat, 14 Oct 2023 12:50:25 -0700 (PDT) Received: from mariano (dynamic-adsl-84-220-189-10.clienti.tiscali.it. [84.220.189.10]) by smtp.gmail.com with ESMTPSA id a1-20020a056000100100b0032d9efeccd8sm3915116wrx.51.2023.10.14.12.50.24 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 14 Oct 2023 12:50:25 -0700 (PDT) Received: by mariano (Postfix, from userid 1000) id 213DBBFCDA; Sat, 14 Oct 2023 21:50:24 +0200 (CEST) Date: Sat, 14 Oct 2023 21:50:24 +0200 From: Stefano Sabatini To: FFmpeg development discussions and patches Message-ID: Mail-Followup-To: FFmpeg development discussions and patches References: <20231014172428.382368-1-stefasab@gmail.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="6uURs3Aat9QQ48M/" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20231014172428.382368-1-stefasab@gmail.com> User-Agent: Mutt/2.1.4 (2021-12-11) Subject: Re: [FFmpeg-devel] [PATCH] ffprobe: fix XML rendering, review XML layout 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: --6uURs3Aat9QQ48M/ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On date Saturday 2023-10-14 19:24:28 +0200, Stefano Sabatini wrote: > Fix rendering of int values within a side data element, which was > broken since commit d2d3a83ad93, where the side data element was > correctly marked as a variable fields element. Logic to render a > string variable was implemented already, but it was not implemented > for the int fields path, which was enabled by that commit. [...] V2 with schema fixes. I'd like to include the fixed version with 6.1 (will probably push in a few days if I see no comments). --6uURs3Aat9QQ48M/ Content-Type: text/x-diff; charset=utf-8 Content-Disposition: attachment; filename="0001-ffprobe-fix-XML-rendering-review-XML-layout.patch" Content-Transfer-Encoding: 8bit >From 1a22ba50c19eacdd2e1427cf4feeae4f10781233 Mon Sep 17 00:00:00 2001 From: Stefano Sabatini Date: Fri, 13 Oct 2023 02:06:21 +0200 Subject: [PATCH] ffprobe: fix XML rendering, review XML layout Fix rendering of int values within a side data element, which was broken since commit d2d3a83ad93, where the side data element was correctly marked as a variable fields element. Logic to render a string variable was implemented already, but it was not implemented for the int fields path, which was enabled by that commit. Also, code and schema is changed in order to account for multiple variable-fields elements - such as side data, contained within the same parent. Previously it was assumed that a single variable-fields element was contained within the parent, which was the case for tags, but is not the case for side-data. Previously data was rendered as: Now as: Now variable-fields elements are rendered with a containing element containing generic key/values elements, enabling use of strict XML schema. Fix trac issue: https://trac.ffmpeg.org/ticket/10613 --- Changelog | 2 ++ doc/ffprobe.xsd | 31 +++++++++++++++++------- fftools/ffprobe.c | 49 ++++++++++++++++++++++++++++---------- tests/ref/fate/ffprobe_xml | 26 +++++++++++++------- 4 files changed, 78 insertions(+), 30 deletions(-) diff --git a/Changelog b/Changelog index 0c73f66546..259180e190 100644 --- a/Changelog +++ b/Changelog @@ -35,6 +35,8 @@ version : - CRI USM demuxer - ffmpeg CLI '-top' option deprecated in favor of the setfield filter - VAAPI AV1 encoder +- ffprobe XML output schema changed to account for multiple + variable-fields elements within the same parent element version 6.0: diff --git a/doc/ffprobe.xsd b/doc/ffprobe.xsd index 87ca265d63..aa2e870f70 100644 --- a/doc/ffprobe.xsd +++ b/doc/ffprobe.xsd @@ -43,9 +43,15 @@ - + + + + + + + @@ -69,14 +75,23 @@ + - - + + + + + + + + + + - + @@ -209,7 +224,7 @@ - + @@ -270,7 +285,7 @@ - + @@ -283,7 +298,7 @@ - + @@ -325,7 +340,7 @@ - + diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c index 40bb3f46e1..e490a9a9b2 100644 --- a/fftools/ffprobe.c +++ b/fftools/ffprobe.c @@ -269,7 +269,7 @@ static struct section sections[] = { [SECTION_ID_PACKET] = { SECTION_ID_PACKET, "packet", 0, { SECTION_ID_PACKET_TAGS, SECTION_ID_PACKET_SIDE_DATA_LIST, -1 } }, [SECTION_ID_PACKET_TAGS] = { SECTION_ID_PACKET_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "packet_tags" }, [SECTION_ID_PACKET_SIDE_DATA_LIST] ={ SECTION_ID_PACKET_SIDE_DATA_LIST, "side_data_list", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PACKET_SIDE_DATA, -1 }, .element_name = "side_data", .unique_name = "packet_side_data_list" }, - [SECTION_ID_PACKET_SIDE_DATA] = { SECTION_ID_PACKET_SIDE_DATA, "side_data", SECTION_FLAG_HAS_VARIABLE_FIELDS|SECTION_FLAG_HAS_TYPE, { -1 }, .unique_name = "packet_side_data", .get_type = get_packet_side_data_type }, + [SECTION_ID_PACKET_SIDE_DATA] = { SECTION_ID_PACKET_SIDE_DATA, "side_data", SECTION_FLAG_HAS_VARIABLE_FIELDS|SECTION_FLAG_HAS_TYPE, { -1 }, .unique_name = "packet_side_data", .element_name = "side_datum", .get_type = get_packet_side_data_type }, [SECTION_ID_PIXEL_FORMATS] = { SECTION_ID_PIXEL_FORMATS, "pixel_formats", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PIXEL_FORMAT, -1 } }, [SECTION_ID_PIXEL_FORMAT] = { SECTION_ID_PIXEL_FORMAT, "pixel_format", 0, { SECTION_ID_PIXEL_FORMAT_FLAGS, SECTION_ID_PIXEL_FORMAT_COMPONENTS, -1 } }, [SECTION_ID_PIXEL_FORMAT_FLAGS] = { SECTION_ID_PIXEL_FORMAT_FLAGS, "flags", 0, { -1 }, .unique_name = "pixel_format_flags" }, @@ -292,7 +292,7 @@ static struct section sections[] = { [SECTION_ID_STREAM_DISPOSITION] = { SECTION_ID_STREAM_DISPOSITION, "disposition", 0, { -1 }, .unique_name = "stream_disposition" }, [SECTION_ID_STREAM_TAGS] = { SECTION_ID_STREAM_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "stream_tags" }, [SECTION_ID_STREAM_SIDE_DATA_LIST] ={ SECTION_ID_STREAM_SIDE_DATA_LIST, "side_data_list", SECTION_FLAG_IS_ARRAY, { SECTION_ID_STREAM_SIDE_DATA, -1 }, .element_name = "side_data", .unique_name = "stream_side_data_list" }, - [SECTION_ID_STREAM_SIDE_DATA] = { SECTION_ID_STREAM_SIDE_DATA, "side_data", SECTION_FLAG_HAS_TYPE|SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .unique_name = "stream_side_data", .get_type = get_packet_side_data_type }, + [SECTION_ID_STREAM_SIDE_DATA] = { SECTION_ID_STREAM_SIDE_DATA, "side_data", SECTION_FLAG_HAS_TYPE|SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .unique_name = "stream_side_data", .element_name = "side_datum", .get_type = get_packet_side_data_type }, [SECTION_ID_SUBTITLE] = { SECTION_ID_SUBTITLE, "subtitle", 0, { -1 } }, }; @@ -1818,21 +1818,27 @@ static void xml_print_section_header(WriterContext *wctx, void *data) xml->within_tag = 0; writer_put_str(wctx, ">\n"); } - if (section->flags & SECTION_FLAG_HAS_VARIABLE_FIELDS) { - xml->indent_level++; - } else { + if (parent_section && (parent_section->flags & SECTION_FLAG_IS_WRAPPER) && wctx->level && wctx->nb_item[wctx->level-1]) writer_w8(wctx, '\n'); xml->indent_level++; - if (section->flags & SECTION_FLAG_IS_ARRAY) { - XML_INDENT(); writer_printf(wctx, "<%s>\n", section->name); + if (section->flags & (SECTION_FLAG_IS_ARRAY|SECTION_FLAG_HAS_VARIABLE_FIELDS)) { + XML_INDENT(); writer_printf(wctx, "<%s", section->name); + + if (section->flags & SECTION_FLAG_HAS_TYPE) { + AVBPrint buf; + av_bprint_init(&buf, 1, AV_BPRINT_SIZE_UNLIMITED); + av_bprint_escape(&buf, section->get_type(data), NULL, + AV_ESCAPE_MODE_XML, AV_ESCAPE_FLAG_XML_DOUBLE_QUOTES); + writer_printf(wctx, " type=\"%s\"", buf.str); + } + writer_printf(wctx, ">\n", section->name); } else { XML_INDENT(); writer_printf(wctx, "<%s ", section->name); xml->within_tag = 1; } - } } static void xml_print_section_footer(WriterContext *wctx) @@ -1846,8 +1852,6 @@ static void xml_print_section_footer(WriterContext *wctx) xml->within_tag = 0; writer_put_str(wctx, "/>\n"); xml->indent_level--; - } else if (section->flags & SECTION_FLAG_HAS_VARIABLE_FIELDS) { - xml->indent_level--; } else { XML_INDENT(); writer_printf(wctx, "\n", section->name); xml->indent_level--; @@ -1863,6 +1867,7 @@ static void xml_print_str(WriterContext *wctx, const char *key, const char *valu av_bprint_init(&buf, 1, AV_BPRINT_SIZE_UNLIMITED); if (section->flags & SECTION_FLAG_HAS_VARIABLE_FIELDS) { + xml->indent_level++; XML_INDENT(); av_bprint_escape(&buf, key, NULL, AV_ESCAPE_MODE_XML, AV_ESCAPE_FLAG_XML_DOUBLE_QUOTES); @@ -1873,6 +1878,7 @@ static void xml_print_str(WriterContext *wctx, const char *key, const char *valu av_bprint_escape(&buf, value, NULL, AV_ESCAPE_MODE_XML, AV_ESCAPE_FLAG_XML_DOUBLE_QUOTES); writer_printf(wctx, " value=\"%s\"/>\n", buf.str); + xml->indent_level--; } else { if (wctx->nb_item[wctx->level]) writer_w8(wctx, ' '); @@ -1887,9 +1893,26 @@ static void xml_print_str(WriterContext *wctx, const char *key, const char *valu static void xml_print_int(WriterContext *wctx, const char *key, long long int value) { - if (wctx->nb_item[wctx->level]) - writer_w8(wctx, ' '); - writer_printf(wctx, "%s=\"%lld\"", key, value); + XMLContext *xml = wctx->priv; + const struct section *section = wctx->section[wctx->level]; + + if (section->flags & SECTION_FLAG_HAS_VARIABLE_FIELDS) { + AVBPrint buf; + av_bprint_init(&buf, 1, AV_BPRINT_SIZE_UNLIMITED); + + xml->indent_level++; + XML_INDENT(); + av_bprint_escape(&buf, key, NULL, + AV_ESCAPE_MODE_XML, AV_ESCAPE_FLAG_XML_DOUBLE_QUOTES); + writer_printf(wctx, "<%s key=\"%s\"", + section->element_name, buf.str); + writer_printf(wctx, " value=\"%lld\"/>\n", value); + xml->indent_level--; + } else { + if (wctx->nb_item[wctx->level]) + writer_w8(wctx, ' '); + writer_printf(wctx, "%s=\"%lld\"", key, value); + } } static Writer xml_writer = { diff --git a/tests/ref/fate/ffprobe_xml b/tests/ref/fate/ffprobe_xml index 4e893edaa9..42abb08ea4 100644 --- a/tests/ref/fate/ffprobe_xml +++ b/tests/ref/fate/ffprobe_xml @@ -34,24 +34,32 @@ - - + + + + - - - + + + + + - + + + - - - + + + + + -- 2.34.1 --6uURs3Aat9QQ48M/ Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ 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". --6uURs3Aat9QQ48M/--