[FFmpeg-cvslog] avcodec/dpx: Read SMPTE timecode from DPX

Harry Mallon git at videolan.org
Thu Dec 17 14:05:27 EET 2020


ffmpeg | branch: master | Harry Mallon <harry.mallon at codex.online> | Mon Dec  7 10:32:11 2020 +0000| [a041c0a0315f0941ddc2b3258c74edf40f86c8f5] | committer: Paul B Mahol

avcodec/dpx: Read SMPTE timecode from DPX

Signed-off-by: Harry Mallon <harry.mallon at codex.online>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=a041c0a0315f0941ddc2b3258c74edf40f86c8f5
---

 libavcodec/dpx.c         | 29 +++++++++++++++++++++++++++++
 tests/ref/fate/dpx-probe |  7 +++++++
 2 files changed, 36 insertions(+)

diff --git a/libavcodec/dpx.c b/libavcodec/dpx.c
index 7e3ac0af2e..51428459ef 100644
--- a/libavcodec/dpx.c
+++ b/libavcodec/dpx.c
@@ -23,6 +23,7 @@
 #include "libavutil/intreadwrite.h"
 #include "libavutil/intfloat.h"
 #include "libavutil/imgutils.h"
+#include "libavutil/timecode.h"
 #include "bytestream.h"
 #include "avcodec.h"
 #include "internal.h"
@@ -239,6 +240,34 @@ static int decode_frame(AVCodecContext *avctx,
         }
     }
 
+    /* SMPTE TC from television header */
+    if (offset >= 1920 + 4) {
+        uint32_t tc;
+        uint32_t *tc_sd;
+        char tcbuf[AV_TIMECODE_STR_SIZE];
+
+        buf = avpkt->data + 1920;
+        // read32 to native endian, av_bswap32 to opposite of native for
+        // compatibility with av_timecode_make_smpte_tc_string2 etc
+        tc = av_bswap32(read32(&buf, endian));
+
+        if (i != 0xFFFFFFFF) {
+            AVFrameSideData *tcside =
+                av_frame_new_side_data(p, AV_FRAME_DATA_S12M_TIMECODE,
+                                       sizeof(uint32_t) * 4);
+            if (!tcside)
+                return AVERROR(ENOMEM);
+
+            tc_sd = (uint32_t*)tcside->data;
+            tc_sd[0] = 1;
+            tc_sd[1] = tc;
+
+            av_timecode_make_smpte_tc_string2(tcbuf, avctx->framerate,
+                                              tc_sd[1], 0, 0);
+            av_dict_set(&p->metadata, "timecode", tcbuf, 0);
+        }
+    }
+
     switch (descriptor) {
     case 6:  // Y
         elements = 1;
diff --git a/tests/ref/fate/dpx-probe b/tests/ref/fate/dpx-probe
index c5d049d038..419cd06799 100644
--- a/tests/ref/fate/dpx-probe
+++ b/tests/ref/fate/dpx-probe
@@ -4,6 +4,13 @@ color_range=unknown
 color_space=unknown
 color_primaries=unknown
 color_transfer=unknown
+TAG:timecode=00:00:01:18
 TAG:Creator=Apple Compressor
 TAG:Input Device=
+[SIDE_DATA]
+side_data_type=SMPTE 12-1 timecode
+[TIMECODE]
+value=00:00:01:18
+[/TIMECODE]
+[/SIDE_DATA]
 [/FRAME]



More information about the ffmpeg-cvslog mailing list