Drop-Frame vs Non-Drop-Frame Timecode
Updated
Why 29.97 fps video needs drop-frame timecode, exactly which frame numbers it skips, the arithmetic behind 17,982 frames per ten minutes, and how to tell DF from NDF.
- Timecode
- 29.97 fps
- Editorial
- Delivery
On this page
The short answer
29.97 fps video runs at 30000/1001 frames a second, a fraction slower than the 30 labels a second that timecode counts. Count every label (non-drop-frame, NDF) and the timecode falls behind the clock by 3.6 seconds an hour. Drop-frame (DF) timecode fixes that by skipping two frame numbers at the start of every minute, except every tenth minute. No picture is dropped: every frame is still there, and only the labels jump.
- • Skipped: ;00 and ;01 at second 00 of minutes 01–09, 11–19 and so on, 108 numbers an hour.
- • Result: 01:00:00;00 lands within 3.6 ms of one real hour; NDF lands 3.6 s late.
- • Written: with a semicolon before the frames, 01:00:00;00 (NDF keeps the colon).
- • Used at: 29.97 fps, and 59.94 fps (which skips four numbers). Never at 23.976, 24, 25 or 50.
Why 29.97 needs drop-frame
Timecode is a label, HH:MM:SS:FF, and at 29.97 fps the FF field still runs 00 to 29: 30 labels per timecode second. The video itself runs at 30000/1001 = 29.97003 frames per real second (the frame rates guide explains where the 1000/1001 comes from). So each timecode second takes 1.001 real seconds, and the error adds up:
Real time of 1 h of NDF = 108,000 frames × 1001 ÷ 30,000 = 3,603.6 s3.6 seconds late every hour, 86.4 seconds late over a 24-hour day. For a program that has to hit a broadcast slot to the second, that is too much.
Example: A 60-minute show timed in NDF
- Calculation:
- Out point 01:00:00:00 NDF = 3,603.6 s of real time
- Result:
- The show overruns its hour by 3.6 s
Which numbers drop-frame skips
The timecode standard, SMPTE ST 12-1, says it in one line: frame numbers 00 and 01 are omitted at the start of each minute, except minutes 00, 10, 20, 30, 40 and 50. Apple's timecode technote gives the example everyone remembers: the count goes from 00:00:59;29 straight to 00:01:00;02. The frames are consecutive; only the numbers jump.
| Timecode (DF) | Frame number | Note |
|---|---|---|
| 00:00:59;28 | 1,798 | |
| 00:00:59;29 | 1,799 | |
| 00:01:00;02 | 1,800 | 00:01:00;00 and ;01 do not exist |
| 00:01:00;03 | 1,801 | |
| 00:09:59;29 | 17,981 | |
| 00:10:00;00 | 17,982 | Tenth minute: nothing skipped |
| 00:10:00;01 | 17,983 |
The frame number counts from 00:00:00;00 = frame 0. Frame 1,800 is the 1,801st frame, exactly one minute of 30 labels later, but it carries the label 00:01:00;02.
The math: 17,982 frames per 10 minutes
The skip pattern repeats every ten minutes, and that ten-minute block is where the numbers come out right:
10 min × 1,800 labels − 9 minutes × 2 skipped = 18,000 − 18 = 17,982 framesReal video in ten minutes: 600 s × 30000/1001 = 17,982.018 frames. Drop-frame is short by 0.018 of a frame every ten minutes.
Where
- 1,800
- labels in one minute of 30-label timecode (60 × 30)
- 9 × 2
- two labels skipped in nine of every ten minutes
Scaled up to an hour and a day:
| Span | DF labels | Real 29.97 frames | Difference |
|---|---|---|---|
| 10 minutes | 17,982 | 17,982.018 | 0.018 frame |
| 1 hour | 107,892 | 107,892.108 | 0.108 frame (3.6 ms) |
| 24 hours | 2,589,408 | 2,589,410.59 | 2.59 frames (86.4 ms) |
Converting drop-frame timecode to frames and back
Edit decision lists, VFX pull sheets and scripts work in frame counts, so you often need to turn a DF label into a frame number. Count the labels as if nothing were skipped, then subtract the skips:
Total minutes M = 60 × HH + MM
Frame = (3,600 × HH + 60 × MM + SS) × 30 + FF − 2 × (M − ⌊M ÷ 10⌋)⌊M ÷ 10⌋ is the number of tenth minutes, which skip nothing. At 59.94 DF, use 60 instead of 30 and 4 instead of 2.
Example: 01:23:45;12 at 29.97 DF
- Calculation:
- M = 83; (3,600 + 1,380 + 45) × 30 + 12 − 2 × (83 − 8) = 150,762 − 150
- Result:
- Frame 150,612 (5,025.42 s, or 1 h 23 min 45.42 s of real time)
Going the other way, add the skipped labels back before splitting the count into hours, minutes, seconds and frames:
D = ⌊N ÷ 17,982⌋ R = N mod 17,982
If R > 2: N′ = N + 18 × D + 2 × ⌊(R − 2) ÷ 1,798⌋
Else: N′ = N + 18 × D
Then split N′ at 30 frames a second: FF = N′ mod 30, and so on17,982 is one ten-minute block; 1,798 is a minute with its two skipped labels removed. At 59.94 DF the constants become 35,964, 36 (4 × 9), 4 and 3,596.
Example: Frame 108,000
- Calculation:
- D = 6, R = 108; N′ = 108,000 + 108 + 0 = 108,108 → 3,603 s + 18 frames
- Result:
- 01:00:03;18
That last example is the same frame that NDF calls 01:00:00:00: the two labels sit 3 seconds and 18 frames apart after an hour. Both formulas were checked against every one of the 2,589,408 drop-frame labels in a day.
59.94, 23.976 and 25 fps
59.94 fps drop-frame
At 59.94 fps SMPTE ST 12-1 counts frames in pairs, and drop-frame omits the first two pair numbers each minute: four frames. Software that numbers every frame from 00 to 59 shows that as the first four frame numbers of the minute disappearing, except every tenth minute. That gives 215,784 frames per hour and 35,964 per ten minutes, double the 29.97 figures, and the same 3.6 ms per hour against the clock.
23.976 fps: always non-drop
23.976 (24000/1001) timecode counts 24 labels a second and the standard defines no drop-frame form for it, so one hour of 23.976 timecode lasts 3,603.6 real seconds. Scripted and film-style work accepts that, because what matters is the frame count of the cut, not where the hour hand is. If you need a runtime in real minutes from a 23.976 timeline, multiply the timecode duration by 1.001.
24, 25, 30, 50 and 60 fps
Whole-number rates have nothing to correct. 25 and 50 fps timecode matches the clock exactly, which is one reason post in 50 Hz countries never meets drop-frame.
How to tell DF from NDF
- • The separator. DF is shown with a semicolon before the frames: 01:00:00;00. NDF uses colons throughout. This is a display convention, so check the setting behind it as well.
- • The missing labels. Step a DF clip through a minute boundary: 00:00:59;29 is followed by 00:01:00;02. In NDF, 00:01:00:00 exists.
- • The flag in the file or signal. A QuickTime movie's timecode track has a drop-frame flag in its format description, and SMPTE LTC and VITC carry a drop-frame bit in every frame. Your NLE's clip properties show which one a clip has.
- • The arithmetic. If an hour-long program at 29.97 shows a duration of 01:00:03;18 in one tool and 01:00:00:00 in another, one of them is reading the timecode in the other format.
| Label | Frame if NDF | Frame if DF | Frames apart |
|---|---|---|---|
| 00:02:00:00 | 3,600 | 3,596 | 4 |
| 00:10:00:00 | 18,000 | 17,982 | 18 |
| 00:30:00:00 | 54,000 | 53,946 | 54 |
| 01:00:00:00 | 108,000 | 107,892 | 108 (3.6 s) |
When to use drop-frame, and when not to
- • Use DF for 29.97 and 59.94 work that is timed against the clock: broadcast programs and commercials in 60 Hz countries, live and as-live shows, and anything whose delivery spec asks for drop-frame. Read the spec: it decides, not habit.
- • Use NDF for 23.976 and 24 fps projects, for VFX and conform work where frame counts must be simple, and for 29.97 deliverables whose spec asks for non-drop.
- • Pick once, at the start. Set cameras, recorders and timeline to the same mode on day one. Converting later is easy in software but every EDL, marker list and VFX count made in the other mode has to be checked.
Mistakes that cost time
- • DF sources in an NDF timeline, or the reverse. Clips still play in sync, but their source timecode no longer matches the record timecode, which confuses EDL and XML exchanges.
- • Typing a DF label as NDF. The error is 2 frames per minute that is not a tenth minute: 18 frames at ten minutes, 108 frames at one hour. A VFX pull off by 18 frames is the giveaway.
- • Asking for a label that doesn't exist. 00:01:00;00 is not a valid DF timecode. Most tools jump to 00:01:00;02; some refuse it.
- • Assuming drop-frame shortens the program. It doesn't. The same frames play in the same time. Only the timecode reading at the end changes.
Drop-frame timecode questions
What is drop-frame timecode?
Drop-frame (DF) timecode is a way of numbering 29.97 fps video so the timecode matches the clock. It skips the frame numbers 00 and 01 at the start of every minute except minutes 00, 10, 20, 30, 40 and 50. No frames of picture are removed: only labels are skipped.
What is the difference between drop-frame and non-drop-frame timecode?
Both count 30 frame numbers a second. Non-drop-frame (NDF) uses every number, so at 29.97 fps one hour of NDF timecode takes 3,603.6 seconds of real time, 3.6 seconds longer than an hour. Drop-frame skips 108 numbers an hour, so 01:00:00;00 arrives 3.6 milliseconds before a real hour has passed.
Why is drop-frame timecode written with a semicolon?
By convention the last separator changes, 01:00:00;00 instead of 01:00:00:00, so you can see at a glance that the count skips numbers. Apple's film delivery spec, for one, requires the semicolon for drop-frame. The separator is only how the timecode is displayed: the file or signal carries a drop-frame flag.
Does 23.976 fps use drop-frame timecode?
No. 23.976 fps timecode is always non-drop and counts 24 frames per timecode second, so one hour of it lasts 3,603.6 real seconds. That is fine for editing and for film-style deliverables, which care about frame counts, not wall-clock time.
How many frames are in an hour of drop-frame timecode?
At 29.97 fps, 107,892 frames: 30 × 3,600 = 108,000 numbers, less 2 skipped in each of the 54 minutes that are not a multiple of ten. At 59.94 fps drop-frame, it is 215,784 frames: 216,000 less 4 skipped in each of those 54 minutes.
Next: see how drop-frame timecode gets onto the cameras and recorders in the first place, in timecode on set, or run your own numbers in the Timecode Calculator.
Calculators for this guide
- Timecode CalculatorAdd, subtract, multiply and divide timecode, and convert between timecode and frames.
- Target Length CalculatorThe exact retime percentage that fits a clip into a target duration.
- Speed Change CalculatorPlayback speed and running-time change when footage plays at a different frame rate.