aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLimin Wang <lance.lmwang@gmail.com>2020-06-24 13:59:34 +0800
committerLimin Wang <lance.lmwang@gmail.com>2020-06-28 21:00:52 +0800
commit79723c2a878b13110ce3e86db68c33f4f71f6da7 (patch)
treeec5d418d1a40786d450b89605fed710c3ddf5f96
parent12c42c709ead42db288bb5ac978b505627ed39c5 (diff)
downloadffmpeg-79723c2a878b13110ce3e86db68c33f4f71f6da7.tar.gz
avutil/timecode: add function av_timecode_get_smpte()
Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
-rw-r--r--libavutil/timecode.c32
-rw-r--r--libavutil/timecode.h13
2 files changed, 45 insertions, 0 deletions
diff --git a/libavutil/timecode.c b/libavutil/timecode.c
index 60077ba0c0..cca53d73c4 100644
--- a/libavutil/timecode.c
+++ b/libavutil/timecode.c
@@ -81,6 +81,38 @@ uint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum)
(hh % 10); // units of hours
}
+uint32_t av_timecode_get_smpte(AVRational rate, int drop, int hh, int mm, int ss, int ff)
+{
+ uint32_t tc = 0;
+ uint32_t frames;
+
+ /* For SMPTE 12-M timecodes, frame count is a special case if > 30 FPS.
+ See SMPTE ST 12-1:2014 Sec 12.1 for more info. */
+ if (av_cmp_q(rate, (AVRational) {30, 1}) == 1) {
+ frames = ff / 2;
+ if (ff % 2 == 1) {
+ if (av_cmp_q(rate, (AVRational) {50, 1}) == 0)
+ tc |= (1 << 7);
+ else
+ tc |= (1 << 23);
+ }
+ } else {
+ frames = ff;
+ }
+
+ tc |= drop << 30;
+ tc |= (frames / 10) << 28;
+ tc |= (frames % 10) << 24;
+ tc |= (ss / 10) << 20;
+ tc |= (ss % 10) << 16;
+ tc |= (mm / 10) << 12;
+ tc |= (mm % 10) << 8;
+ tc |= (hh / 10) << 4;
+ tc |= (hh % 10);
+
+ return tc;
+}
+
char *av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum)
{
int fps = tc->fps;
diff --git a/libavutil/timecode.h b/libavutil/timecode.h
index 37c1361bc2..ab38e661f1 100644
--- a/libavutil/timecode.h
+++ b/libavutil/timecode.h
@@ -71,6 +71,19 @@ int av_timecode_adjust_ntsc_framenum2(int framenum, int fps);
uint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum);
/**
+ * Convert sei info to SMPTE 12M binary representation.
+ *
+ * @param rate frame rate in rational form
+ * @param drop drop flag
+ * @param hh hour
+ * @param mm minute
+ * @param ss second
+ * @param ff frame number
+ * @return the SMPTE binary representation
+ */
+uint32_t av_timecode_get_smpte(AVRational rate, int drop, int hh, int mm, int ss, int ff);
+
+/**
* Load timecode string in buf.
*
* @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long