This is based on the original work by Baptiste Coudurier.tags/n0.9
| @@ -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; | 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; | 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, 5, (uint32_t)((time_code / (fps * 3600)) % 24)); | ||||
| put_bits(&s->pb, 6, (uint32_t)((time_code / (fps * 60)) % 60)); | put_bits(&s->pb, 6, (uint32_t)((time_code / (fps * 60)) % 60)); | ||||
| put_bits(&s->pb, 1, 1); | put_bits(&s->pb, 1, 1); | ||||
| @@ -28,6 +28,15 @@ | |||||
| #include "timecode.h" | #include "timecode.h" | ||||
| #include "libavutil/log.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 ff_init_smtpe_timecode(void *avcl, struct ff_timecode *tc) | ||||
| { | { | ||||
| int hh, mm, ss, ff, fps; | int hh, mm, ss, ff, fps; | ||||
| @@ -43,6 +43,14 @@ struct ff_timecode { | |||||
| AVRational rate; ///< Frame rate in rationnal form | 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 | * Parse SMTPE 12M time representation (hh:mm:ss[:;.]ff). str and rate fields | ||||
| * from tc struct must be set. | * from tc struct must be set. | ||||