How to Apply Reverse Pullup with FFmpeg Pullup Filter
This guide explains how to perform a reverse 3:2 pulldown—commonly
known as inverse telecine (IVTC)—using FFmpeg's native
pullup filter. You will learn the mechanics behind the
pullup filter, how to combine it with rate-dropping filters
to restore original 23.976 progressive frames from 29.97 fps telecined
video, and how to fine-tune edge parameters to prevent telecine
artifacts.
Understanding the Pullup Filter
Telecine converts 24 fps (or 23.976 fps) film to 29.97 fps interlaced
video by repeating fields in a 3:2 pattern. FFmpeg's pullup
filter matches these complementary fields back together into complete
progressive frames.
Because pullup is an adaptive, field-matching filter
rather than a blind deinterlacer, it does not discard half of your
vertical resolution or cause blurriness. However, matching fields alone
leaves duplicate frames in the stream; you must pair pullup
with a frame-rate reduction filter to drop the duplicates and restore
the correct timing.
Basic Reverse Pullup Command
To reverse standard NTSC 3:2 pulldown and restore the film's native
23.976 fps, combine pullup with the fps
filter:
ffmpeg -i input_telecined.mp4 -vf "pullup,fps=24000/1001" -c:v libx264 -crf 18 -c:a copy output_progressive.mp4In this command:
pullup: Analyzes interlaced fields and reconstructs full progressive frames.fps=24000/1001: Sets the output frame rate to 23.976 fps, cleanly dropping the duplicate frames created by the field-matching stage.-c:v libx264 -crf 18: Encodes the progressive output using high-quality H.264 compression.-c:a copy: Copies the audio stream without re-encoding to preserve quality and sync.
Alternative: Using Pullup with Decimate
In cases where frame drops appear uneven using fixed frame rates, use
the decimate filter directly after pullup:
ffmpeg -i input_telecined.mp4 -vf "pullup,decimate" -c:v libx264 -crf 18 -c:a copy output_progressive.mp4The decimate filter automatically drops 1 frame in every
5 frames, which matches the standard 3:2 telecine pattern (turning 5
frames of 60i video into 4 frames of 24p).
Fine-Tuning with Junk Margins
Analog captures, VHS transfers, and broadcast recordings often have
head-switching noise or blank lines at the top and bottom of the frame.
If the pullup filter analyzes this noise, it can fail to
detect matching fields.
You can ignore these borders using junk margin parameters:
jl(junk left)jr(junk right)jt(junk top)jb(junk bottom)
Values represent the number of pixels to ignore during field-matching analysis:
ffmpeg -i input_telecined.mp4 -vf "pullup=jt=8:jb=8,fps=24000/1001" -c:v libx264 -crf 18 -c:a copy output_progressive.mp4This configuration ignores the top 8 and bottom 8 pixels when comparing fields, preventing head-switching artifacts from disrupting the IVTC process.
Strict Matching Mode
If your source material has frequent cadence breaks or alternating progressive and interlaced sections, enable strict matching to prevent comb artifacts:
ffmpeg -i input_telecined.mp4 -vf "pullup=strict=1,fps=24000/1001" -c:v libx264 -crf 18 -c:a copy output_progressive.mp4Setting strict=1 forces the filter to reject matches
that carry even a minor risk of combing, ensuring the output remains
clean and artifact-free.