Enable OpenCL Acceleration for FFmpeg Video Filters

Using hardware acceleration in FFmpeg can drastically reduce video processing times by offloading intensive tasks to your GPU. This article provides a direct, step-by-step guide on how to enable and use OpenCL acceleration for specific video filters in FFmpeg, covering device initialization, frame uploading, and the correct command-line syntax for execution.

Prerequisites

To use OpenCL filters, your FFmpeg build must be compiled with OpenCL support. You can verify this by running the following command in your terminal:

ffmpeg -protocols | grep opencl

Additionally, check which OpenCL filters are available in your FFmpeg installation:

ffmpeg -filters | grep opencl

Common OpenCL-accelerated filters include scale_opencl, unsharp_opencl, overlay_opencl, and tonemap_opencl.

Step 1: Initialize the OpenCL Device

Before applying any OpenCL filters, you must initialize your GPU as an OpenCL hardware device within the FFmpeg command. This is done using the -init_hw_device option.

-init_hw_device opencl=gpu

If you have multiple GPUs, you can specify the platform and device index (e.g., opencl=gpu:0.0 or opencl=gpu:1.0).

Step 2: Set the Filter Hardware Device

You must explicitly tell the FFmpeg filtergraph which hardware device to use for the processing pipeline. Use the -filter_hw_device option and point it to the device initialized in the previous step.

-filter_hw_device gpu

Step 3: Format and Upload Frames to the GPU

OpenCL filters cannot process standard system memory frames directly. You must upload the video frames to GPU memory using the hwupload filter. Because OpenCL filters usually expect a specific pixel format, you must format the video beforehand.

The standard pipeline structure is: 1. Convert to a compatible format (like nv12 or yuv420p). 2. Upload to the GPU using hwupload. 3. Apply the OpenCL filter. 4. Download the frames back to system memory using hwdownload. 5. Convert back to a software pixel format for encoding.

Complete Command Example

The following command demonstrates how to use the unsharp_opencl filter to sharpen a video using GPU acceleration:

ffmpeg -init_hw_device opencl=gpu -filter_hw_device gpu \
-i input.mp4 \
-filter_complex "format=yuv420p,hwupload,unsharp_opencl=luma_msize_x=5:luma_msize_y=5:luma_amount=1.5,hwdownload,format=yuv420p" \
-c:v libx264 -c:a copy output.mp4

Scaling Video with OpenCL

To scale a video using the GPU, swap the unsharp filter with scale_opencl. You can specify the desired width and height:

ffmpeg -init_hw_device opencl=gpu -filter_hw_device gpu \
-i input.mp4 \
-filter_complex "format=yuv420p,hwupload,scale_opencl=1920:1080,hwdownload,format=yuv420p" \
-c:v libx264 -c:a copy output.mp4