This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

The following commit(s) were added to refs/heads/master by this push:
     new 3d4461e16d fftools/ffprobe: Show stream group side data
3d4461e16d is described below

commit 3d4461e16d084df2388d09c38710c33325041225
Author:     Jeremy James <[email protected]>
AuthorDate: Wed Mar 18 12:35:34 2026 +0000
Commit:     James Almer <[email protected]>
CommitDate: Fri Mar 20 12:45:44 2026 +0000

    fftools/ffprobe: Show stream group side data
    
    Specifically output side data from tile groups with -show_stream_groups
    which includes rotation information in HEIC images.
    
    Signed-off-by: Jeremy James <[email protected]>
---
 doc/ffprobe.xsd   |  1 +
 fftools/ffprobe.c | 24 +++++++++++++++++++-----
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/doc/ffprobe.xsd b/doc/ffprobe.xsd
index c870db7aa0..6ad8e3eb0a 100644
--- a/doc/ffprobe.xsd
+++ b/doc/ffprobe.xsd
@@ -357,6 +357,7 @@
   <xsd:complexType name="streamGroupComponentType">
     <xsd:sequence>
       <xsd:element name="subcomponents" 
type="ffprobe:streamGroupSubComponentList" minOccurs="0" maxOccurs="1"/>
+      <xsd:element name="side_data_list" type="ffprobe:packetSideDataListType" 
minOccurs="0" maxOccurs="1"/>
       <xsd:element name="component_entry" type="ffprobe:streamGroupEntryType" 
minOccurs="0" maxOccurs="unbounded"/>
     </xsd:sequence>
   </xsd:complexType>
diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c
index e2b58b70f7..49345d7b72 100644
--- a/fftools/ffprobe.c
+++ b/fftools/ffprobe.c
@@ -215,6 +215,8 @@ typedef enum {
     SECTION_ID_STREAM_GROUP_SUBPIECE,
     SECTION_ID_STREAM_GROUP_BLOCKS,
     SECTION_ID_STREAM_GROUP_BLOCK,
+    SECTION_ID_STREAM_GROUP_SIDE_DATA_LIST,
+    SECTION_ID_STREAM_GROUP_SIDE_DATA,
     SECTION_ID_STREAM_GROUP_STREAMS,
     SECTION_ID_STREAM_GROUP_STREAM,
     SECTION_ID_STREAM_GROUP_DISPOSITION,
@@ -298,7 +300,7 @@ static const AVTextFormatSection sections[] = {
     [SECTION_ID_STREAM_GROUP_STREAM_TAGS] =        { 
SECTION_ID_STREAM_GROUP_STREAM_TAGS, "tags", 
AV_TEXTFORMAT_SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", 
.unique_name = "stream_group_stream_tags" },
     [SECTION_ID_STREAM_GROUP] =                    { SECTION_ID_STREAM_GROUP, 
"stream_group", 0, { SECTION_ID_STREAM_GROUP_TAGS, 
SECTION_ID_STREAM_GROUP_DISPOSITION, SECTION_ID_STREAM_GROUP_COMPONENTS, 
SECTION_ID_STREAM_GROUP_STREAMS, -1 } },
     [SECTION_ID_STREAM_GROUP_COMPONENTS] =         { 
SECTION_ID_STREAM_GROUP_COMPONENTS, "components", 
AV_TEXTFORMAT_SECTION_FLAG_IS_ARRAY, { SECTION_ID_STREAM_GROUP_COMPONENT, -1 }, 
.element_name = "component", .unique_name = "stream_group_components" },
-    [SECTION_ID_STREAM_GROUP_COMPONENT] =          { 
SECTION_ID_STREAM_GROUP_COMPONENT, "component", 
AV_TEXTFORMAT_SECTION_FLAG_HAS_VARIABLE_FIELDS|AV_TEXTFORMAT_SECTION_FLAG_HAS_TYPE,
 { SECTION_ID_STREAM_GROUP_SUBCOMPONENTS, -1 }, .unique_name = 
"stream_group_component", .element_name = "component_entry", .get_type = 
get_stream_group_type },
+    [SECTION_ID_STREAM_GROUP_COMPONENT] =          { 
SECTION_ID_STREAM_GROUP_COMPONENT, "component", 
AV_TEXTFORMAT_SECTION_FLAG_HAS_VARIABLE_FIELDS|AV_TEXTFORMAT_SECTION_FLAG_HAS_TYPE,
 { SECTION_ID_STREAM_GROUP_SIDE_DATA_LIST, 
SECTION_ID_STREAM_GROUP_SUBCOMPONENTS, -1 }, .unique_name = 
"stream_group_component", .element_name = "component_entry", .get_type = 
get_stream_group_type },
     [SECTION_ID_STREAM_GROUP_SUBCOMPONENTS] =      { 
SECTION_ID_STREAM_GROUP_SUBCOMPONENTS, "subcomponents", 
AV_TEXTFORMAT_SECTION_FLAG_IS_ARRAY, { SECTION_ID_STREAM_GROUP_SUBCOMPONENT, -1 
}, .element_name = "component" },
     [SECTION_ID_STREAM_GROUP_SUBCOMPONENT] =       { 
SECTION_ID_STREAM_GROUP_SUBCOMPONENT, "subcomponent", 
AV_TEXTFORMAT_SECTION_FLAG_HAS_VARIABLE_FIELDS|AV_TEXTFORMAT_SECTION_FLAG_HAS_TYPE,
 { SECTION_ID_STREAM_GROUP_PIECES, -1 }, .element_name = "subcomponent_entry", 
.get_type = get_raw_string_type },
     [SECTION_ID_STREAM_GROUP_PIECES] =             { 
SECTION_ID_STREAM_GROUP_PIECES, "pieces", AV_TEXTFORMAT_SECTION_FLAG_IS_ARRAY, 
{ SECTION_ID_STREAM_GROUP_PIECE, -1 }, .element_name = "piece", .unique_name = 
"stream_group_pieces" },
@@ -307,6 +309,8 @@ static const AVTextFormatSection sections[] = {
     [SECTION_ID_STREAM_GROUP_SUBPIECE] =           { 
SECTION_ID_STREAM_GROUP_SUBPIECE, "subpiece", 
AV_TEXTFORMAT_SECTION_FLAG_HAS_VARIABLE_FIELDS|AV_TEXTFORMAT_SECTION_FLAG_HAS_TYPE,
 { SECTION_ID_STREAM_GROUP_BLOCKS, -1 }, .element_name = "subpiece_entry", 
.get_type = get_raw_string_type },
     [SECTION_ID_STREAM_GROUP_BLOCKS] =             { 
SECTION_ID_STREAM_GROUP_BLOCKS, "blocks", AV_TEXTFORMAT_SECTION_FLAG_IS_ARRAY, 
{ SECTION_ID_STREAM_GROUP_BLOCK, -1 }, .element_name = "block" },
     [SECTION_ID_STREAM_GROUP_BLOCK] =              { 
SECTION_ID_STREAM_GROUP_BLOCK, "block", 
AV_TEXTFORMAT_SECTION_FLAG_HAS_VARIABLE_FIELDS|AV_TEXTFORMAT_SECTION_FLAG_HAS_TYPE,
 { -1 }, .element_name = "block_entry", .get_type = get_raw_string_type },
+    [SECTION_ID_STREAM_GROUP_SIDE_DATA_LIST] =     { 
SECTION_ID_STREAM_GROUP_SIDE_DATA_LIST, "side_data_list", 
AV_TEXTFORMAT_SECTION_FLAG_IS_ARRAY, { SECTION_ID_STREAM_GROUP_SIDE_DATA, -1 }, 
.element_name = "side_data", .unique_name = "stream_group_side_data_list" },
+    [SECTION_ID_STREAM_GROUP_SIDE_DATA] =          { 
SECTION_ID_STREAM_GROUP_SIDE_DATA, "side_data", 
AV_TEXTFORMAT_SECTION_FLAG_HAS_TYPE|AV_TEXTFORMAT_SECTION_FLAG_HAS_VARIABLE_FIELDS,
 { -1 }, .unique_name = "stream_group_side_data", .element_name = "side_datum", 
.get_type = get_packet_side_data_type },
     [SECTION_ID_STREAM_GROUP_STREAMS] =            { 
SECTION_ID_STREAM_GROUP_STREAMS, "streams", 
AV_TEXTFORMAT_SECTION_FLAG_IS_ARRAY, { SECTION_ID_STREAM_GROUP_STREAM, -1 }, 
.unique_name = "stream_group_streams" },
     [SECTION_ID_STREAM_GROUP_STREAM] =             { 
SECTION_ID_STREAM_GROUP_STREAM, "stream", 0, { 
SECTION_ID_STREAM_GROUP_STREAM_DISPOSITION, 
SECTION_ID_STREAM_GROUP_STREAM_TAGS, -1 }, .unique_name = "stream_group_stream" 
},
     [SECTION_ID_STREAM_GROUP_DISPOSITION] =        { 
SECTION_ID_STREAM_GROUP_DISPOSITION, "disposition", 0, { -1 }, .unique_name = 
"stream_group_disposition" },
@@ -1008,7 +1012,8 @@ static void print_film_grain_params(AVTextFormatContext 
*tfc,
 }
 
 static void print_pkt_side_data(AVTextFormatContext *tfc,
-                                AVCodecParameters *par,
+                                int width,
+                                int height,
                                 const AVPacketSideData *sd,
                                 SectionID id_data)
 {
@@ -1034,7 +1039,7 @@ static void print_pkt_side_data(AVTextFormatContext *tfc,
             print_int("padding", spherical->padding);
         } else if (spherical->projection == AV_SPHERICAL_EQUIRECTANGULAR_TILE) 
{
             size_t l, t, r, b;
-            av_spherical_tile_bounds(spherical, par->width, par->height,
+            av_spherical_tile_bounds(spherical, width, height,
                                      &l, &t, &r, &b);
             print_int("bound_left", l);
             print_int("bound_top", t);
@@ -1305,7 +1310,7 @@ static void show_packet(AVTextFormatContext *tfc, 
InputFile *ifile, AVPacket *pk
 
         avtext_print_section_header(tfc, NULL, 
SECTION_ID_PACKET_SIDE_DATA_LIST);
         for (int i = 0; i < pkt->side_data_elems; i++) {
-            print_pkt_side_data(tfc, st->codecpar, &pkt->side_data[i],
+            print_pkt_side_data(tfc, st->codecpar->width, 
st->codecpar->height, &pkt->side_data[i],
                                 SECTION_ID_PACKET_SIDE_DATA);
             avtext_print_section_footer(tfc);
         }
@@ -1975,7 +1980,7 @@ static int show_stream(AVTextFormatContext *tfc, 
AVFormatContext *fmt_ctx, int s
     if (stream->codecpar->nb_coded_side_data) {
         avtext_print_section_header(tfc, NULL, 
SECTION_ID_STREAM_SIDE_DATA_LIST);
         for (int i = 0; i < stream->codecpar->nb_coded_side_data; i++) {
-            print_pkt_side_data(tfc, stream->codecpar, 
&stream->codecpar->coded_side_data[i],
+            print_pkt_side_data(tfc, stream->codecpar->width, 
stream->codecpar->height, &stream->codecpar->coded_side_data[i],
                                 SECTION_ID_STREAM_SIDE_DATA);
             avtext_print_section_footer(tfc);
         }
@@ -2075,6 +2080,15 @@ static void print_tile_grid_params(AVTextFormatContext 
*tfc, const AVStreamGroup
         avtext_print_section_footer(tfc);
     }
     avtext_print_section_footer(tfc);
+    if (tile_grid->nb_coded_side_data) {
+        avtext_print_section_header(tfc, NULL, 
SECTION_ID_STREAM_GROUP_SIDE_DATA_LIST);
+        for (int i = 0; i < tile_grid->nb_coded_side_data; i++) {
+            print_pkt_side_data(tfc, tile_grid->width, tile_grid->height, 
&tile_grid->coded_side_data[i],
+                                SECTION_ID_STREAM_GROUP_SIDE_DATA);
+            avtext_print_section_footer(tfc);
+        }
+        avtext_print_section_footer(tfc);
+    }
     avtext_print_section_footer(tfc);
 }
 

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to