diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c index c9fa41b65d..b3ed3675a6 100644 --- a/libavcodec/mpeg12enc.c +++ b/libavcodec/mpeg12enc.c @@ -299,13 +299,8 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s) time_code = s->current_picture_ptr->f.coded_picture_number + s->avctx->timecode_frame_start; s->gop_picture_number = s->current_picture_ptr->f.coded_picture_number; - if (s->tc.drop) { - /* only works for NTSC 29.97 */ - int d = time_code / 17982; - int m = time_code % 17982; - //if (m < 2) m += 2; /* not needed since -2,-1 / 1798 in C returns 0 */ - time_code += 18 * d + 2 * ((m - 2) / 1798); - } + if (s->tc.drop) + time_code = ff_framenum_to_drop_timecode(time_code); put_bits(&s->pb, 5, (uint32_t)((time_code / (fps * 3600)) % 24)); put_bits(&s->pb, 6, (uint32_t)((time_code / (fps * 60)) % 60)); put_bits(&s->pb, 1, 1); diff --git a/libavcodec/timecode.c b/libavcodec/timecode.c index d9c3f7d8d2..434b3cb03a 100644 --- a/libavcodec/timecode.c +++ b/libavcodec/timecode.c @@ -28,6 +28,15 @@ #include "timecode.h" #include "libavutil/log.h" +int ff_framenum_to_drop_timecode(int frame_num) +{ + /* only works for NTSC 29.97 */ + int d = frame_num / 17982; + int m = frame_num % 17982; + //if (m < 2) m += 2; /* not needed since -2,-1 / 1798 in C returns 0 */ + return frame_num + 18 * d + 2 * ((m - 2) / 1798); +} + int ff_init_smtpe_timecode(void *avcl, struct ff_timecode *tc) { int hh, mm, ss, ff, fps; diff --git a/libavcodec/timecode.h b/libavcodec/timecode.h index d2f66065d9..bf4116b28a 100644 --- a/libavcodec/timecode.h +++ b/libavcodec/timecode.h @@ -43,6 +43,14 @@ struct ff_timecode { AVRational rate; ///< Frame rate in rationnal form }; +/** + * @brief Adjust frame number for NTSC drop frame time code + * @param frame_num Actual frame number to adjust + * @return Adjusted frame number + * @warning Adjustment is only valid in NTSC 29.97 + */ +int ff_framenum_to_drop_timecode(int frame_num); + /** * Parse SMTPE 12M time representation (hh:mm:ss[:;.]ff). str and rate fields * from tc struct must be set.