avcodec/dpx: Read SMPTE timecode from DPX

Signed-off-by: Harry Mallon <harry.mallon@codex.online>
This commit is contained in:
Harry Mallon 2020-12-07 10:32:11 +00:00 committed by Paul B Mahol
parent 6623421454
commit a041c0a031
2 changed files with 36 additions and 0 deletions

View File

@ -23,6 +23,7 @@
#include "libavutil/intreadwrite.h" #include "libavutil/intreadwrite.h"
#include "libavutil/intfloat.h" #include "libavutil/intfloat.h"
#include "libavutil/imgutils.h" #include "libavutil/imgutils.h"
#include "libavutil/timecode.h"
#include "bytestream.h" #include "bytestream.h"
#include "avcodec.h" #include "avcodec.h"
#include "internal.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) { switch (descriptor) {
case 6: // Y case 6: // Y
elements = 1; elements = 1;

View File

@ -4,6 +4,13 @@ color_range=unknown
color_space=unknown color_space=unknown
color_primaries=unknown color_primaries=unknown
color_transfer=unknown color_transfer=unknown
TAG:timecode=00:00:01:18
TAG:Creator=Apple Compressor TAG:Creator=Apple Compressor
TAG:Input Device= TAG:Input Device=
[SIDE_DATA]
side_data_type=SMPTE 12-1 timecode
[TIMECODE]
value=00:00:01:18
[/TIMECODE]
[/SIDE_DATA]
[/FRAME] [/FRAME]