diff options
author | Marton Balint <cus@passwd.hu> | 2020-09-05 22:45:52 +0200 |
---|---|---|
committer | Marton Balint <cus@passwd.hu> | 2020-12-03 18:32:13 +0100 |
commit | 2d90d51c561c2e4c36a00d1ba666adee5028663c (patch) | |
tree | c0b92dfa56d9d47f2bdf1aaf0e8f40bc890645bc | |
parent | 53b4550bddfcef65d770ec81cc86a1a6ba12c830 (diff) | |
download | ffmpeg-2d90d51c561c2e4c36a00d1ba666adee5028663c.tar.gz |
avutil/timecode: allow drop frame timecodes for multiples of 30000/1001 fps
Signed-off-by: Marton Balint <cus@passwd.hu>
-rw-r--r-- | libavutil/timecode.c | 17 | ||||
-rw-r--r-- | libavutil/timecode.h | 4 |
2 files changed, 9 insertions, 12 deletions
diff --git a/libavutil/timecode.c b/libavutil/timecode.c index f2db21c52c..7caa6c64f5 100644 --- a/libavutil/timecode.c +++ b/libavutil/timecode.c @@ -33,16 +33,13 @@ int av_timecode_adjust_ntsc_framenum2(int framenum, int fps) { - /* only works for NTSC 29.97 and 59.94 */ + /* only works for multiples of NTSC 29.97 */ int drop_frames = 0; int d, m, frames_per_10mins; - if (fps == 30) { - drop_frames = 2; - frames_per_10mins = 17982; - } else if (fps == 60) { - drop_frames = 4; - frames_per_10mins = 35964; + if (fps && fps % 30 == 0) { + drop_frames = fps / 30 * 2; + frames_per_10mins = fps / 30 * 17982; } else return framenum; @@ -196,8 +193,8 @@ static int check_timecode(void *log_ctx, AVTimecode *tc) av_log(log_ctx, AV_LOG_ERROR, "Valid timecode frame rate must be specified. Minimum value is 1\n"); return AVERROR(EINVAL); } - if ((tc->flags & AV_TIMECODE_FLAG_DROPFRAME) && tc->fps != 30 && tc->fps != 60) { - av_log(log_ctx, AV_LOG_ERROR, "Drop frame is only allowed with 30000/1001 or 60000/1001 FPS\n"); + if ((tc->flags & AV_TIMECODE_FLAG_DROPFRAME) && tc->fps % 30 != 0) { + av_log(log_ctx, AV_LOG_ERROR, "Drop frame is only allowed with multiples of 30000/1001 FPS\n"); return AVERROR(EINVAL); } if (check_fps(tc->fps) < 0) { @@ -252,7 +249,7 @@ int av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *st tc->start = (hh*3600 + mm*60 + ss) * tc->fps + ff; if (tc->flags & AV_TIMECODE_FLAG_DROPFRAME) { /* adjust frame number */ int tmins = 60*hh + mm; - tc->start -= (tc->fps == 30 ? 2 : 4) * (tmins - tmins/10); + tc->start -= (tc->fps / 30 * 2) * (tmins - tmins/10); } return 0; } diff --git a/libavutil/timecode.h b/libavutil/timecode.h index f9471a6e38..697e61180b 100644 --- a/libavutil/timecode.h +++ b/libavutil/timecode.h @@ -49,9 +49,9 @@ typedef struct { * Adjust frame number for NTSC drop frame time code. * * @param framenum frame number to adjust - * @param fps frame per second, 30 or 60 + * @param fps frame per second, multiples of 30 * @return adjusted frame number - * @warning adjustment is only valid in NTSC 29.97 and 59.94 + * @warning adjustment is only valid for multiples of NTSC 29.97 */ int av_timecode_adjust_ntsc_framenum2(int framenum, int fps); |