diff mbox

[FFmpeg-devel,DEVEL,v6] fftools/ffprobe: Add S12M Timecode output as side data (such as SEI TC)

Message ID alpine.LSU.2.20.1905250024240.9210@iq
State New
Headers show

Commit Message

Marton Balint May 24, 2019, 10:27 p.m. UTC
On Fri, 24 May 2019, Antonin Gouzer wrote:

> ---
> Add S12M Timecode output with the show_frame option
> Multiple timecodes (3) for one frame support
> Control side date Size to 16
> Correct ffrpobe.xsd to allow multiple timecodes in side_data element
> ---
> doc/ffprobe.xsd   |  8 ++++++++
> fftools/ffprobe.c | 14 +++++++++++++-
> 2 files changed, 21 insertions(+), 1 deletion(-)

I almost committed this, but found another issue: the JSON output 
contained the "timecode" key multiple times. Apparently in order for the 
JSON output to work, we need a separate section for arrays.

I managed to make those changes (see the attached patch), it affected the 
XML output slightly as well. Please let me know if this is satisfactory to 
you.

Thanks,
Marton

Comments

Antonin Gouzer May 25, 2019, 8:15 p.m. UTC | #1
Hello,
Shame on me, I didn't test the patch with the json format, only xml and flat.
It's ok now.
ok for XML too.

Thanks!


Le sam. 25 mai 2019 à 00:27, Marton Balint <cus@passwd.hu> a écrit :
>
>
>
> On Fri, 24 May 2019, Antonin Gouzer wrote:
>
> > ---
> > Add S12M Timecode output with the show_frame option
> > Multiple timecodes (3) for one frame support
> > Control side date Size to 16
> > Correct ffrpobe.xsd to allow multiple timecodes in side_data element
> > ---
> > doc/ffprobe.xsd   |  8 ++++++++
> > fftools/ffprobe.c | 14 +++++++++++++-
> > 2 files changed, 21 insertions(+), 1 deletion(-)
>
> I almost committed this, but found another issue: the JSON output
> contained the "timecode" key multiple times. Apparently in order for the
> JSON output to work, we need a separate section for arrays.
>
> I managed to make those changes (see the attached patch), it affected the
> XML output slightly as well. Please let me know if this is satisfactory to
> you.
>
> Thanks,
> Marton_______________________________________________
> 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".
Marton Balint May 26, 2019, 10:35 p.m. UTC | #2
On Sat, 25 May 2019, Antonin Gouzer wrote:

> Hello,
> Shame on me, I didn't test the patch with the json format, only xml and flat.
> It's ok now.
> ok for XML too.
>
> Thanks!

Thanks, applied.

Regards,
Marton

>
>
> Le sam. 25 mai 2019 à 00:27, Marton Balint <cus@passwd.hu> a écrit :
>>
>>
>>
>> On Fri, 24 May 2019, Antonin Gouzer wrote:
>>
>> > ---
>> > Add S12M Timecode output with the show_frame option
>> > Multiple timecodes (3) for one frame support
>> > Control side date Size to 16
>> > Correct ffrpobe.xsd to allow multiple timecodes in side_data element
>> > ---
>> > doc/ffprobe.xsd   |  8 ++++++++
>> > fftools/ffprobe.c | 14 +++++++++++++-
>> > 2 files changed, 21 insertions(+), 1 deletion(-)
>>
>> I almost committed this, but found another issue: the JSON output
>> contained the "timecode" key multiple times. Apparently in order for the
>> JSON output to work, we need a separate section for arrays.
>>
>> I managed to make those changes (see the attached patch), it affected the
>> XML output slightly as well. Please let me know if this is satisfactory to
>> you.
>>
>> Thanks,
>> Marton_______________________________________________
>> 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".
> _______________________________________________
> 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".
Antonin Gouzer May 29, 2019, 6:31 p.m. UTC | #3
Thank you very much!

Le lun. 27 mai 2019 à 00:35, Marton Balint <cus@passwd.hu> a écrit :

>
>
> On Sat, 25 May 2019, Antonin Gouzer wrote:
>
> > Hello,
> > Shame on me, I didn't test the patch with the json format, only xml and
> flat.
> > It's ok now.
> > ok for XML too.
> >
> > Thanks!
>
> Thanks, applied.
>
> Regards,
> Marton
>
> >
> >
> > Le sam. 25 mai 2019 à 00:27, Marton Balint <cus@passwd.hu> a écrit :
> >>
> >>
> >>
> >> On Fri, 24 May 2019, Antonin Gouzer wrote:
> >>
> >> > ---
> >> > Add S12M Timecode output with the show_frame option
> >> > Multiple timecodes (3) for one frame support
> >> > Control side date Size to 16
> >> > Correct ffrpobe.xsd to allow multiple timecodes in side_data element
> >> > ---
> >> > doc/ffprobe.xsd   |  8 ++++++++
> >> > fftools/ffprobe.c | 14 +++++++++++++-
> >> > 2 files changed, 21 insertions(+), 1 deletion(-)
> >>
> >> I almost committed this, but found another issue: the JSON output
> >> contained the "timecode" key multiple times. Apparently in order for the
> >> JSON output to work, we need a separate section for arrays.
> >>
> >> I managed to make those changes (see the attached patch), it affected
> the
> >> XML output slightly as well. Please let me know if this is satisfactory
> to
> >> you.
> >>
> >> Thanks,
> >> Marton_______________________________________________
> >> 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".
> > _______________________________________________
> > 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".
> _______________________________________________
> 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".
diff mbox

Patch

From 3e1274d2250fca79acb5eb7b636ee924c6be2640 Mon Sep 17 00:00:00 2001
From: Antonin Gouzer <antonin.gouzer@gmail.com>
Date: Fri, 24 May 2019 09:46:50 +0200
Subject: [PATCH] fftools/ffprobe: Add S12M Timecode output as side data (such
 as SEI TC)

Slightly modified by Marton Balint to produce valid json as well.

Signed-off-by: Marton Balint <cus@passwd.hu>
---
 doc/ffprobe.xsd   | 14 ++++++++++++++
 fftools/ffprobe.c | 18 +++++++++++++++++-
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/doc/ffprobe.xsd b/doc/ffprobe.xsd
index 3e58da0f46..97dc67def6 100644
--- a/doc/ffprobe.xsd
+++ b/doc/ffprobe.xsd
@@ -147,11 +147,25 @@ 
         </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="frameSideDataType">
+        <xsd:sequence>
+            <xsd:element name="timecodes" type="ffprobe:frameSideDataTimecodeList" minOccurs="0" maxOccurs="1"/>
+        </xsd:sequence>
+
         <xsd:attribute name="side_data_type"              type="xsd:string"/>
         <xsd:attribute name="side_data_size"              type="xsd:int"   />
         <xsd:attribute name="timecode"                    type="xsd:string"/>
     </xsd:complexType>
 
+    <xsd:complexType name="frameSideDataTimecodeList">
+        <xsd:sequence>
+            <xsd:element name="timecode" type="ffprobe:frameSideDataTimecodeType" minOccurs="0" maxOccurs="unbounded"/>
+        </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="frameSideDataTimecodeType">
+        <xsd:attribute name="value"              type="xsd:string"/>
+    </xsd:complexType>
+
     <xsd:complexType name="subtitleType">
       <xsd:attribute name="media_type"         type="xsd:string" fixed="subtitle" use="required"/>
       <xsd:attribute name="pts"                type="xsd:long" />
diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c
index dea489d02e..3becb6330e 100644
--- a/fftools/ffprobe.c
+++ b/fftools/ffprobe.c
@@ -165,6 +165,8 @@  typedef enum {
     SECTION_ID_FRAME_TAGS,
     SECTION_ID_FRAME_SIDE_DATA_LIST,
     SECTION_ID_FRAME_SIDE_DATA,
+    SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST,
+    SECTION_ID_FRAME_SIDE_DATA_TIMECODE,
     SECTION_ID_FRAME_LOG,
     SECTION_ID_FRAME_LOGS,
     SECTION_ID_LIBRARY_VERSION,
@@ -209,7 +211,9 @@  static struct section sections[] = {
     [SECTION_ID_FRAME] =              { SECTION_ID_FRAME, "frame", 0, { SECTION_ID_FRAME_TAGS, SECTION_ID_FRAME_SIDE_DATA_LIST, SECTION_ID_FRAME_LOGS, -1 } },
     [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, { -1 } },
+    [SECTION_ID_FRAME_SIDE_DATA] =     { SECTION_ID_FRAME_SIDE_DATA, "side_data", 0, { SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST, -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 } },
     [SECTION_ID_FRAME_LOG] =          { SECTION_ID_FRAME_LOG, "log", 0, { -1 },  },
     [SECTION_ID_LIBRARY_VERSIONS] =   { SECTION_ID_LIBRARY_VERSIONS, "library_versions", SECTION_FLAG_IS_ARRAY, { SECTION_ID_LIBRARY_VERSION, -1 } },
@@ -2199,6 +2203,18 @@  static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream,
                 char tcbuf[AV_TIMECODE_STR_SIZE];
                 av_timecode_make_mpeg_tc_string(tcbuf, *(int64_t *)(sd->data));
                 print_str("timecode", tcbuf);
+            } else if (sd->type == AV_FRAME_DATA_S12M_TIMECODE && sd->size == 16) {
+                uint32_t *tc = (uint32_t*)sd->data;
+                int m = FFMIN(tc[0],3);
+                writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST);
+                for (int j = 1; j <= m ; j++) {
+                    char tcbuf[AV_TIMECODE_STR_SIZE];
+                    av_timecode_make_smpte_tc_string(tcbuf, tc[j], 0);
+                    writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_TIMECODE);
+                    print_str("value", tcbuf);
+                    writer_print_section_footer(w);
+                }
+                writer_print_section_footer(w);
             } else if (sd->type == AV_FRAME_DATA_MASTERING_DISPLAY_METADATA) {
                 AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)sd->data;
 
-- 
2.16.4