From ffmpeg-master
Deinterlaces interlaced video (yadif, bwdif, w3fdif), removes telecine (pullup, fieldmatch), corrects field order, and detects interlace using FFmpeg. For broadcast, DVD/Blu-ray conversion with CUDA/Vulkan accel.
npx claudepluginhub josiahsiegel/claude-plugin-marketplace --plugin ffmpeg-masterThis skill uses the workspace's default tool permissions.
**MANDATORY: Always Use Backslashes on Windows for File Paths**
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
MANDATORY: Always Use Backslashes on Windows for File Paths
When using Edit or Write tools on Windows, you MUST use backslashes (\) in file paths, NOT forward slashes (/).
| Task | Filter | Command Pattern |
|---|---|---|
| Basic deinterlace | yadif | -vf yadif |
| High quality deinterlace | bwdif | -vf bwdif |
| CUDA deinterlace | yadif_cuda | -vf yadif_cuda |
| Inverse telecine | pullup | -vf pullup |
| Field order | fieldorder | -vf fieldorder=tff |
| Detect interlace | idet | -vf idet |
Use for interlaced and telecined content:
Comprehensive guide to deinterlacing, field processing, and telecine removal.
Interlaced video stores two half-resolution fields per frame:
Common interlaced formats:
# Use idet filter to detect interlacing
ffmpeg -i input.mp4 -vf "idet" -frames:v 500 -f null -
# Output shows field types:
# TFF = Top Field First
# BFF = Bottom Field First
# Progressive = Not interlaced
# Undetermined = Mixed or uncertain
The most widely used deinterlacing filter. Good balance of speed and quality.
# Basic deinterlacing (output same frame rate)
ffmpeg -i interlaced.mp4 -vf "yadif" output.mp4
# Double frame rate (output both fields as frames)
ffmpeg -i interlaced.mp4 -vf "yadif=1" output.mp4
# Specify field parity (auto-detect by default)
ffmpeg -i interlaced.mp4 -vf "yadif=0:0:0" output.mp4 # TFF
ffmpeg -i interlaced.mp4 -vf "yadif=0:1:0" output.mp4 # BFF
# Only deinterlace if detected as interlaced
ffmpeg -i input.mp4 -vf "yadif=deint=interlaced" output.mp4
Parameters:
| Parameter | Description | Values |
|---|---|---|
mode | Output mode | 0=same fps, 1=double fps |
parity | Field parity | -1=auto, 0=TFF, 1=BFF |
deint | Frames to deinterlace | 0=all, 1=interlaced only |
Mode options:
0 / send_frame - Output one frame per input frame1 / send_field - Output one frame per field (double fps)2 / send_frame_nospatial - Like 0, without spatial interlacing check3 / send_field_nospatial - Like 1, without spatial interlacing checkHigher quality than yadif, uses more frames for interpolation.
# Basic bwdif
ffmpeg -i interlaced.mp4 -vf "bwdif" output.mp4
# Double frame rate
ffmpeg -i interlaced.mp4 -vf "bwdif=1" output.mp4
# Specify parity
ffmpeg -i interlaced.mp4 -vf "bwdif=0:-1:1" output.mp4
Parameters: Same as yadif
Uses three fields for even higher quality interpolation.
# Simple filter (faster)
ffmpeg -i interlaced.mp4 -vf "w3fdif=filter=simple" output.mp4
# Complex filter (better quality)
ffmpeg -i interlaced.mp4 -vf "w3fdif=filter=complex" output.mp4
Parameters:
| Parameter | Description | Values |
|---|---|---|
filter | Filter coefficients | simple, complex |
deint | Frames to deinterlace | all, interlaced |
Adaptive kernel-based deinterlacing.
# Basic kerndeint
ffmpeg -i interlaced.mp4 -vf "kerndeint" output.mp4
# With threshold adjustment
ffmpeg -i interlaced.mp4 -vf "kerndeint=thresh=10:map=0:order=0:sharp=0:twoway=0" output.mp4
# Full GPU pipeline with CUDA deinterlacing
ffmpeg -hwaccel cuda -hwaccel_output_format cuda \
-i interlaced.mp4 \
-vf "yadif_cuda=0:-1:0" \
-c:v h264_nvenc output.mp4
# Double framerate with CUDA
ffmpeg -hwaccel cuda -hwaccel_output_format cuda \
-i interlaced.mp4 \
-vf "yadif_cuda=1" \
-c:v h264_nvenc output.mp4
# Higher quality CUDA deinterlacing
ffmpeg -hwaccel cuda -hwaccel_output_format cuda \
-i interlaced.mp4 \
-vf "bwdif_cuda" \
-c:v h264_nvenc output.mp4
Cross-platform GPU deinterlacing.
# Vulkan deinterlacing (works on AMD, Intel, NVIDIA)
ffmpeg -init_hw_device vulkan \
-hwaccel vulkan -hwaccel_output_format vulkan \
-i interlaced.mp4 \
-vf "bwdif_vulkan" \
-c:v h264_vulkan output.mp4
# VAAPI deinterlacing
ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 \
-hwaccel_output_format vaapi \
-i interlaced.mp4 \
-vf "deinterlace_vaapi" \
-c:v h264_vaapi output.mp4
# Specify deinterlace mode
ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 \
-hwaccel_output_format vaapi \
-i interlaced.mp4 \
-vf "deinterlace_vaapi=mode=motion_adaptive:rate=frame" \
-c:v h264_vaapi output.mp4
VAAPI deinterlace modes:
default - Use driver defaultbob - Simple bob (double rate)weave - Weave fields togethermotion_adaptive - Motion-adaptive (best quality)motion_compensated - Motion-compensated (highest quality)# QSV deinterlacing
ffmpeg -hwaccel qsv -hwaccel_output_format qsv \
-i interlaced.mp4 \
-vf "vpp_qsv=deinterlace=2" \
-c:v h264_qsv output.mp4
VPP_QSV deinterlace modes:
0 - Off1 - Bob2 - Advanced (motion adaptive)Telecine converts 24fps film to 30fps video by duplicating fields:
Film: A B C D
Video: AA AB BB BC CC CD DD DA
Removes 3:2 telecine by detecting and removing duplicate fields.
# Basic IVTC
ffmpeg -i telecined.mp4 -vf "pullup" -r 24000/1001 output.mp4
# With metric output
ffmpeg -i telecined.mp4 -vf "pullup=mp=y" -r 24000/1001 output.mp4
Parameters:
| Parameter | Description | Values |
|---|---|---|
jl, jr | Left/right junk pixels | 1-width |
jt, jb | Top/bottom junk pixels | 1-height |
sb | Strict breaks | 0 or 1 |
mp | Metric plane | y, u, v |
More advanced telecine removal with field matching.
# Basic field matching
ffmpeg -i telecined.mp4 -vf "fieldmatch" output.mp4
# Full IVTC pipeline with decimation
ffmpeg -i telecined.mp4 -vf "fieldmatch,decimate" output.mp4
# Specify field order
ffmpeg -i telecined.mp4 -vf "fieldmatch=order=tff,decimate" output.mp4
Combined IVTC workflow:
# Complete telecine removal pipeline
ffmpeg -i telecined.mp4 \
-vf "fieldmatch=order=auto:combmatch=full,decimate" \
-r 24000/1001 \
output.mp4
Removes duplicate frames (used after fieldmatch).
# Remove every 5th frame (30->24 fps)
ffmpeg -i input.mp4 -vf "decimate=cycle=5" output.mp4
# Detect duplicates
ffmpeg -i input.mp4 -vf "decimate=cycle=5:ppsrc=1" output.mp4
Transforms field order between TFF and BFF.
# Convert BFF to TFF
ffmpeg -i bff_input.mp4 -vf "fieldorder=tff" output.mp4
# Convert TFF to BFF
ffmpeg -i tff_input.mp4 -vf "fieldorder=bff" output.mp4
Splits each frame into two fields.
# Separate fields (doubles frame count, halves height)
ffmpeg -i interlaced.mp4 -vf "separatefields" output.mp4
Combines two consecutive frames into one interlaced frame.
# Weave fields (opposite of separatefields)
ffmpeg -i progressive.mp4 -vf "weave" interlaced.mp4
# Specify first field
ffmpeg -i progressive.mp4 -vf "weave=first_field=top" interlaced.mp4
Create interlaced output from progressive or modify interlaced content.
# Create interlaced from progressive (merge adjacent frames)
ffmpeg -i progressive.mp4 -vf "tinterlace=merge" interlaced.mp4
# Bob deinterlace (simple doubling)
ffmpeg -i interlaced.mp4 -vf "tinterlace=4" bobbed.mp4
# Create interlaced at half frame rate
ffmpeg -i progressive.mp4 -vf "tinterlace=interleave_top" interlaced.mp4
Modes:
| Mode | Description |
|---|---|
merge / 0 | Merge fields from consecutive frames |
drop_even / 1 | Drop even frames, interleave remaining |
drop_odd / 2 | Drop odd frames, interleave remaining |
pad / 3 | Pad alternating lines with black |
interleave_top / 4 | Interleave, TFF |
interleave_bottom / 5 | Interleave, BFF |
interlacex2 / 6 | Double rate interlacing |
mergex2 / 7 | Double rate field merge |
Low-level line interleaving.
# Swap luma and chroma lines
ffmpeg -i input.mp4 -vf "il=l=s:c=s" output.mp4
# Step 1: Detect interlacing
ffmpeg -i dvd_rip.vob -vf "idet" -frames:v 500 -f null -
# Step 2: Deinterlace (if interlaced)
ffmpeg -i dvd_rip.vob \
-vf "yadif=1:-1:1" \
-c:v libx264 -crf 18 \
-c:a aac -b:a 192k \
output.mp4
# For telecined content (film-based DVDs):
ffmpeg -i dvd_rip.vob \
-vf "fieldmatch,decimate" \
-r 24000/1001 \
-c:v libx264 -crf 18 \
output.mp4
# High quality deinterlacing
ffmpeg -i broadcast_1080i.ts \
-vf "bwdif=1:-1:0" \
-c:v libx264 -crf 18 -preset slow \
-c:a copy \
output_1080p.mp4
# With GPU acceleration
ffmpeg -hwaccel cuda -hwaccel_output_format cuda \
-i broadcast_1080i.ts \
-vf "bwdif_cuda=1" \
-c:v h264_nvenc -preset p4 \
-c:a copy \
output_1080p.mp4
#!/bin/bash
# Detect and process based on content type
INPUT="$1"
# Detect interlacing type
result=$(ffmpeg -i "$INPUT" -vf "idet" -frames:v 1000 -f null - 2>&1)
if echo "$result" | grep -q "Multi.*[1-9]"; then
echo "Interlaced content detected - applying bwdif"
ffmpeg -i "$INPUT" -vf "bwdif" -c:v libx264 -crf 18 output.mp4
elif echo "$result" | grep -q "Repeated.*[1-9]"; then
echo "Telecined content detected - applying IVTC"
ffmpeg -i "$INPUT" -vf "fieldmatch,decimate" -c:v libx264 -crf 18 output.mp4
else
echo "Progressive content - no deinterlacing needed"
ffmpeg -i "$INPUT" -c:v libx264 -crf 18 output.mp4
fi
| Filter | Quality | Speed | Best For |
|---|---|---|---|
yadif | Good | Fast | General use |
bwdif | Better | Medium | Quality-focused |
w3fdif | Best | Slow | Critical work |
yadif_cuda | Good | Very Fast | GPU systems |
bwdif_cuda | Better | Fast | GPU systems |
deinterlace_vaapi | Good | Very Fast | Linux/VAAPI |
idet to determine content typeThis guide covers deinterlacing and telecine for 2025. For hardware acceleration details, see ffmpeg-hardware-acceleration. For video analysis, see ffmpeg-video-analysis.