Message ID | 20190517123225.2224-1-antonin.gouzer@gmail.com |
---|---|
State | Superseded |
Headers | show |
On Fri, 17 May 2019, Antonin Gouzer wrote: > Thanks in advance. > --- > fftools/ffprobe.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c > index dea489d02e..4763ce6d98 100644 > --- a/fftools/ffprobe.c > +++ b/fftools/ffprobe.c > @@ -2199,6 +2199,14 @@ 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 >= 8) { > + uint32_t *tc = (uint32_t*)sd->data; > + for (int j = 1; j <= tc[0]; j++) { > + char tcbuf[AV_TIMECODE_STR_SIZE]; > + av_timecode_make_smpte_tc_string(tcbuf, tc[j], 0); > + print_str("timecode", tcbuf); > + } > + break; A frame can have GOP_TIMECODE and S12M_TIMECODE side data at the same time, a separate name (e.g. s12m_timecode) should be used and the ffprobe xsd should be extended accordingly. Regards, Marton
Thank you for your response, I don't have any example of such a file. I was thinking that GOP timecode was reserved to MPEG2 files and S12M to H265/H264 files ? In every writer the type of timecode is already an attribute: side_data_type. With the actual xsd the result should be, with the XML writer: <side_data_list> <side_data side_data_type="SMPTE 12-1 timecode" timecode="00:03:25:03"/> <side_data side_data_type="GOP timecode" timecode="00:03:25:03"/> </side_data_list> That should be ok don't you think ? Antonin Le sam. 18 mai 2019 à 18:20, Marton Balint <cus@passwd.hu> a écrit : > > > > On Fri, 17 May 2019, Antonin Gouzer wrote: > > > Thanks in advance. > > --- > > fftools/ffprobe.c | 8 ++++++++ > > 1 file changed, 8 insertions(+) > > > > diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c > > index dea489d02e..4763ce6d98 100644 > > --- a/fftools/ffprobe.c > > +++ b/fftools/ffprobe.c > > @@ -2199,6 +2199,14 @@ 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 >= 8) { > > + uint32_t *tc = (uint32_t*)sd->data; > > + for (int j = 1; j <= tc[0]; j++) { > > + char tcbuf[AV_TIMECODE_STR_SIZE]; > > + av_timecode_make_smpte_tc_string(tcbuf, tc[j], 0); > > + print_str("timecode", tcbuf); > > + } > > + break; > > A frame can have GOP_TIMECODE and S12M_TIMECODE side data at the same > time, a separate name (e.g. s12m_timecode) should be used and the ffprobe > xsd should be extended accordingly. > > Regards, > 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".
On Sat, 18 May 2019, Antonin Gouzer wrote: > Thank you for your response, > I don't have any example of such a file. > I was thinking that GOP timecode was reserved to MPEG2 files and S12M > to H265/H264 files ? > > In every writer the type of timecode is already an attribute: side_data_type. > With the actual xsd the result should be, with the XML writer: > > <side_data_list> > <side_data side_data_type="SMPTE 12-1 timecode" > timecode="00:03:25:03"/> > <side_data side_data_type="GOP timecode" > timecode="00:03:25:03"/> > </side_data_list> > > That should be ok don't you think ? Ah, OK then. I see another issue though: what if S12M side data has more than one timecode in it? Having the same attirbute multiple times in an XML tag is not valid. >> On Fri, 17 May 2019, Antonin Gouzer wrote: >> >> > Thanks in advance. >> > --- >> > fftools/ffprobe.c | 8 ++++++++ >> > 1 file changed, 8 insertions(+) >> > >> > diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c >> > index dea489d02e..4763ce6d98 100644 >> > --- a/fftools/ffprobe.c >> > +++ b/fftools/ffprobe.c >> > @@ -2199,6 +2199,14 @@ 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 >= 8) { >> > + uint32_t *tc = (uint32_t*)sd->data; An assert makes sense here to check if tc[0] <= 3. >> > + for (int j = 1; j <= tc[0]; j++) { >> > + char tcbuf[AV_TIMECODE_STR_SIZE]; >> > + av_timecode_make_smpte_tc_string(tcbuf, tc[j], 0); >> > + print_str("timecode", tcbuf); >> > + } >> > + break; Why the break? Regards, Marton
diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c index dea489d02e..4763ce6d98 100644 --- a/fftools/ffprobe.c +++ b/fftools/ffprobe.c @@ -2199,6 +2199,14 @@ 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 >= 8) { + uint32_t *tc = (uint32_t*)sd->data; + for (int j = 1; j <= tc[0]; j++) { + char tcbuf[AV_TIMECODE_STR_SIZE]; + av_timecode_make_smpte_tc_string(tcbuf, tc[j], 0); + print_str("timecode", tcbuf); + } + break; } else if (sd->type == AV_FRAME_DATA_MASTERING_DISPLAY_METADATA) { AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)sd->data;