Skip to main content

Video processing library using JAX.

Project description

JaxVidFlow

Video processing pipeline using JAX. Especially suitable for experimenting with custom video processing operations.

Why?

  • FFmpeg has done great things for the community over the past decades, and has been the go-to for automated video processing, but -
    • It's really hard to extend with filters. Writing high performance C code is hard, and very hardware-dependent
    • Only a handful of filters have GPU implementations, and generally using them requires very messy command line options
    • Every new CPU or GPU architecture requires new code
    • Floating point formats not supported, requiring carefully choosing pixel formats to minimize quality loss for multi-stage processing, and different filters support different formats.
  • JAX is a high performance and very user-friendly array computing library.
    • Write simple Numpy expressions, get well-optimised native code performance on CPU/GPU/TPU
    • Very easy to implement most custom operations. As long as you can express it as matrix operations, you are 80% of the way there!
    • Code generation for:
      • CPUs (compiled into Eigen operations with good vectorization for x86, ARM, and other architectures)
      • GPU (NVIDIA CUDA is best supported, AMD ROCm experimental, Intel oneAPI also experimental, Apple Metal Performance Shaders Graph on all Apple GPUs also experimental)
      • Google TPUs
      • Future architectures as they come out, without having to change our code (in theory)
    • We can do everything in floating point. FP is the state of the art for minimal-loss multi-stage video processing, and we can do it very fast with GPUs (and CPUs with SIMD).

Current Status

You can run benchmarks.py to see how fast things are, but it doesn't really have a UI yet (not even a CLI). It's just a library. See examples/process_dive_video.py for a typical pipeline setup for filtering a video.

Implemented functions

  • Decode / encode pipeline using FFmpeg (through PyAV)
    • Reasonably optimised - only about 10% slower than using FFmpeg directly for a straight transcode with hardware encoding
      • If you just want to do a straight transcode, I would recommend using FFmpeg instead.
    • Supports hardware encoders (hardware decoders are not supported due to PyAV limitation, but software decoders are very fast anyways)

Transforms

  • YUV to RGB and back, including chroma subsampling/supersampling
  • Rec709 to linear and back
  • 3D LUT application with trilinear filtering
  • Resizing with Lanczos interpolation (ok, this is really just a one line call to jax.image.resize())
  • Denoising using NL-Means (both pixelwise and blockwise variants implemented)
    • ~50 fps at 4K on my NVIDIA RTX 3060 Ti, compared to ~2 fps with FFmpeg's CPU implementation (I wasn't able to get the OpenCL version to work)

Installation Instructions

Linux (Debian/Ubuntu) or Windows (with WSL2, in an Ubuntu VM)

# Install dependencies.
sudo apt install pkg-config python3 libavformat-dev libavcodec-dev libavdevice-dev \
  libavutil-dev libswscale-dev libswresample-dev libavfilter-dev

# Setup a virtual environment (optional).
python3 -m venv venv

# Activate the virtual environment (optional).
source venv/bin/activate

# Install PyAV from source (this links against system ffmpeg libraries, which is necessary to get hardware-accelerated encoders).
pip3 install av --no-binary av

# Install JAX (with NVIDIA GPU support).
pip3 install jax[cuda12]

# Or, install CPU-only JAX.
pip3 install jax

# See Jax documentation for installing JAX with experimental backends (eg. AMD ROCm):
# https://jax.readthedocs.io/en/latest/installation.html

Mac (with experimental JAX METAL support)

# Install homebrew (https://brew.sh/) and Python
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install python3

# Install ffmpeg.
brew install ffmpeg pkg-config

# Setup a virtual environment (optional).
python3 -m venv venv

# Activate the virtual environment (optional).
source venv/bin/activate

# Install PyAV from source (this links against system ffmpeg libraries, which is necessary to get hardware-accelerated encoders).
pip3 install av --no-binary av

# Install JAX with the experimental METAL backend.
pip3 install jax-metal

Common

# Install other dependencies.
pip3 install tqdm pytest

Acknowledgements

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jaxvidflow-0.0.6.tar.gz (18.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jaxvidflow-0.0.6-py3-none-any.whl (25.5 kB view details)

Uploaded Python 3

File details

Details for the file jaxvidflow-0.0.6.tar.gz.

File metadata

  • Download URL: jaxvidflow-0.0.6.tar.gz
  • Upload date:
  • Size: 18.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.13.0

File hashes

Hashes for jaxvidflow-0.0.6.tar.gz
Algorithm Hash digest
SHA256 a19f52f6cd6b8d2e8cb2c5b91a4a8f5e84c11b9d8b99d5666a9c835054fcda5d
MD5 8006eae87485e07d8335c44adc433abf
BLAKE2b-256 615be2004da4df47b65394884491a04c4cb7d267d388316c0844e208830fc3db

See more details on using hashes here.

File details

Details for the file jaxvidflow-0.0.6-py3-none-any.whl.

File metadata

  • Download URL: jaxvidflow-0.0.6-py3-none-any.whl
  • Upload date:
  • Size: 25.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.13.0

File hashes

Hashes for jaxvidflow-0.0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 9b591e0b00fa8f3f58d342b490d41a9ced263f1f8389833f4f756a874d4c8d88
MD5 37c8190e865580b8cca76278b27c6392
BLAKE2b-256 0ba17bbf2fd68d59b80dec49601f5a08a575481cbf98e12ad65f42f78233d926

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page