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.mp4

In 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.mp4

The 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.mp4

This 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.mp4

Setting strict=1 forces the filter to reject matches that carry even a minor risk of combing, ensuring the output remains clean and artifact-free.