diff options
author | Limin Wang <lance.lmwang@gmail.com> | 2020-06-24 13:59:34 +0800 |
---|---|---|
committer | Limin Wang <lance.lmwang@gmail.com> | 2020-06-28 21:00:52 +0800 |
commit | 79723c2a878b13110ce3e86db68c33f4f71f6da7 (patch) | |
tree | ec5d418d1a40786d450b89605fed710c3ddf5f96 | |
parent | 12c42c709ead42db288bb5ac978b505627ed39c5 (diff) | |
download | ffmpeg-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.c | 32 | ||||
-rw-r--r-- | libavutil/timecode.h | 13 |
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 |