|
|
|
@ -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; |
|
|
|
|
} |
|
|
|
|