1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-02-04 06:08:26 +02:00

avutil/timecode: allow drop frame timecodes for multiples of 30000/1001 fps

Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
Marton Balint 2020-09-05 22:45:52 +02:00
parent 53b4550bdd
commit 2d90d51c56
2 changed files with 9 additions and 12 deletions

View File

@ -33,16 +33,13 @@
int av_timecode_adjust_ntsc_framenum2(int framenum, int fps) 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 drop_frames = 0;
int d, m, frames_per_10mins; int d, m, frames_per_10mins;
if (fps == 30) { if (fps && fps % 30 == 0) {
drop_frames = 2; drop_frames = fps / 30 * 2;
frames_per_10mins = 17982; frames_per_10mins = fps / 30 * 17982;
} else if (fps == 60) {
drop_frames = 4;
frames_per_10mins = 35964;
} else } else
return framenum; 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"); av_log(log_ctx, AV_LOG_ERROR, "Valid timecode frame rate must be specified. Minimum value is 1\n");
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
if ((tc->flags & AV_TIMECODE_FLAG_DROPFRAME) && tc->fps != 30 && tc->fps != 60) { if ((tc->flags & AV_TIMECODE_FLAG_DROPFRAME) && tc->fps % 30 != 0) {
av_log(log_ctx, AV_LOG_ERROR, "Drop frame is only allowed with 30000/1001 or 60000/1001 FPS\n"); av_log(log_ctx, AV_LOG_ERROR, "Drop frame is only allowed with multiples of 30000/1001 FPS\n");
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
if (check_fps(tc->fps) < 0) { 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; tc->start = (hh*3600 + mm*60 + ss) * tc->fps + ff;
if (tc->flags & AV_TIMECODE_FLAG_DROPFRAME) { /* adjust frame number */ if (tc->flags & AV_TIMECODE_FLAG_DROPFRAME) { /* adjust frame number */
int tmins = 60*hh + mm; 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; return 0;
} }

View File

@ -49,9 +49,9 @@ typedef struct {
* Adjust frame number for NTSC drop frame time code. * Adjust frame number for NTSC drop frame time code.
* *
* @param framenum frame number to adjust * @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 * @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); int av_timecode_adjust_ntsc_framenum2(int framenum, int fps);