summaryrefslogtreecommitdiff
path: root/libavcodec/dpx.c
diff options
context:
space:
mode:
authorHarry Mallon <harry.mallon@codex.online>2020-12-07 10:32:11 +0000
committerPaul B Mahol <onemda@gmail.com>2020-12-17 13:02:49 +0100
commita041c0a0315f0941ddc2b3258c74edf40f86c8f5 (patch)
tree8ba652ff4364287952d64838bc166a60b0272a41 /libavcodec/dpx.c
parent6623421454c55890a720b8dd818bb9304e9ff529 (diff)
avcodec/dpx: Read SMPTE timecode from DPX
Signed-off-by: Harry Mallon <harry.mallon@codex.online>
Diffstat (limited to 'libavcodec/dpx.c')
-rw-r--r--libavcodec/dpx.c29
1 files changed, 29 insertions, 0 deletions
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;