Skip to main content

TensorCodec

CPU video/audio decoding with TorchCodec-style APIs and NumPy output.

CI PyPI Python Wheel download License: Apache-2.0

Quick start · Features · Package size · Compatibility

  • TorchCodec API without PyTorch. CPU video/audio decoder interfaces follow TorchCodec and return NumPy arrays.
  • Validated playback semantics. Frame selection, ordering, timestamps and audio ranges are checked against TorchCodec 0.17.0 and independently generated media.
  • Efficient batch decoding. Rust/PyO3 bindings to FFmpeg process frame batches in a single native call, avoiding per-frame Python calls. Closing a decoder releases its FFmpeg resources without waiting for Python's cyclic GC.
  • Lightweight installation. Linux wheels are 10.3–10.5 MiB (v0.1.4), including FFmpeg shared libraries. NumPy is the only Python dependency.

Quick start

uv pip install tensorcodec

Use an existing virtual environment, or create one with uv venv first. No separate FFmpeg installation is needed for the published Linux wheels.

from tensorcodec.decoders import VideoDecoder, AudioDecoder

with VideoDecoder("video.mp4") as video:
    frame = video[0]                                  # RGB array: (C, H, W)
    batch = video.get_frames_at([4, 0, 4])              # requested order, including duplicates
    clip = video.get_frames_played_in_range(0, 1, fps=8)

with AudioDecoder("audio.wav", sample_rate=16000, num_channels=1) as audio:
    samples = audio.get_samples_played_in_range(0, 1)
    waveform = samples.data                           # float32: (channels, samples)

Arrays keep their storage after the decoder closes. Paths, URLs, encoded bytes, 1-D uint8 arrays and seekable file objects are supported.

For time-based windows without an initial full packet scan (since v0.1.4):

with VideoDecoder("video.mkv", seek_mode="timestamp") as decoder:
    frames = decoder.get_frames_played_at([10.0, 10.1, 10.2])

Decoder transforms (since v0.1.5) resize and crop inside the decoder, as TorchCodec's do:

from tensorcodec.transforms import CenterCrop, Resize

with VideoDecoder("video.mp4", transforms=[Resize((256, 340)), CenterCrop((224, 224))]) as decoder:
    frames = decoder.get_frames_at([0, 10])  # (2, 3, 224, 224)

This TensorCodec extension selects by actual PTS and retries seeks that overshoot. It supports time queries, including ranges with explicit fps, but not frame indices, len(decoder), or get_all_frames(). See the contract.

Features

TensorCodec 0.1.5 relative to TorchCodec 0.17.0. ✓ supported · △ partial support · — not implemented.

Component TensorCodec TorchCodec 0.17.0
Video decoder △ CPU, SDR/HDR RGB ✓ CPU / CUDA
Audio decoder ✓ CPU ✓ CPU
Image decoders — ✓
Video / audio / image encoders — ✓
Clip samplers — ✓
Decoder transforms ✓ Resize, CenterCrop, RandomCrop ✓

FPS-based frame queries are supported; clip samplers are a separate API.

Decoder compatibility

Capability TensorCodec TorchCodec 0.17.0
Index / slice / batch selection ✓ ✓
Playback timestamp / range queries ✓ ✓
Request order and duplicate frames Preserved Preserved
Exact / approximate seeking ✓ Default: exact ✓
FPS queries / custom frame mappings ✓ ✓
CFR / VFR / offset PTS / B-frames ✓ Tested ✓
NCHW / NHWC RGB output ✓ ✓
uint8 / float32 / automatic dtype ✓ SDR and high-bit-depth video ✓
uint16 RGB output ✓ Full-range RGB48 —
Native grayscale/depth and packed RGB(A) ✓ Values preserved —
PQ / HLG decoding ✓ Transfer-encoded RGB ✓
Right-angle display rotation ✓ ✓
Audio ranges / resampling / channel mixing ✓ float32 ✓
Paths / URLs / bytes / seekable file objects ✓ ✓
Encoded array input 1-D uint8 NumPy array PyTorch tensor
Decoded output NumPy array; array interface / DLPack PyTorch tensor
CUDA decoding — ✓

For high-bit-depth video, use VideoDecoder(path, output_dtype="auto") to select float32 above 8 bits, or output_dtype="uint16" for full-range 16-bit RGB. HDR output retains PQ/HLG encoding without SDR tone mapping. Rotation is applied automatically, and metadata dimensions match the output.

For unmodified samples, use VideoDecoder(path, output_format="native"). Supported formats: gray, gray12le, gray16le/be, rgb24, rgba. Native output preserves channel count, integer values and pixel coordinates; expected_pixel_format optionally asserts the source format.

Package size

Linux CPU wheels, Python 3.12. Download / unpacked size in MiB.

Package x86_64 ARM64
TensorCodec 10.3 / 24.8 10.5 / 23.0
PyAV 33.4 / 125.5 31.2 / 90.4
TorchCodec + PyTorch (CPU) 196.7 / 704.7 160.3 / 585.7

TensorCodec and PyAV bundle FFmpeg; TorchCodec needs it separately. Other dependencies are excluded. Measurements.

Scope and compatibility

The supported CPU API is checked for frame selection, ordering, timestamps, durations, stream selection and metadata, both against TorchCodec 0.17.0 and independently generated media.

  • Pixel comparisons allow color-conversion rounding of at most 1 uint8 unit or 1/65535 for float32 in the tested cases.
  • Empty index lists are supported, including the case affected by the reference's empty-list dtype inference bug.
  • NumPy output preserves the decoder API structure; callers expecting torch.Tensor must adapt their array handling.

See the compatibility contract and playback rules for the tested behavior.

Current limits

  • Wheels: Linux x86_64 and ARM64 (aarch64), glibc 2.17+, CPython 3.10+. NumPy must also provide a compatible wheel; newer Python versions may require a newer glibc. macOS 14+ wheels support ARM64 and x86_64. Windows, musl/Alpine and free-threaded Python wheels are not provided.
  • Exact seeking: scans packet timestamps when opening the decoder. Incorrect container keyframe flags can produce corrupt frames; repaired input or corrected frame mappings are needed in that case.
  • Audio ranges: decode from the beginning, so late ranges can be expensive.
  • Video conversion: no HDR-to-SDR tone mapping or native YUV-plane output. Reflected and non-right-angle display matrices are unsupported.

See container behavior for seek limitations and benchmark tools for workload measurements.

Development and verification

Build from source and run tests

Source builds require Rust, Clang/libclang, pkg-config and FFmpeg 7 development headers/libraries. Python handles API and playback selection; Rust + PyO3 handles FFmpeg. Native decoding releases the GIL, allowing separate decoder instances to run concurrently across Python threads. Calls on the same instance are serialized. The default is one FFmpeg thread per decoder; use independent workers for concurrent windows and tune the total thread count to avoid oversubscription.

uv sync --group dev --group oracle

uv run --group oracle pytest tests/test_video_contract.py tests/test_audio_contract.py --backend torchcodec
uv run --group oracle pytest --compare

# Rebuild after changing Rust code.
uv run --group oracle maturin develop --locked --uv

Tests generate media with FFmpeg/ffprobe and Python's wave module. --compare requires the pinned oracle; differential tests otherwise skip.

Playback rules · Release guide · Dependency licenses

TensorCodec's own code is licensed under Apache-2.0. Versions through v0.1.4 were released under MIT.

Metadata

Release files for tensorcodec 0.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for tensorcodec 0.1.5
File Size Uploaded
tensorcodec-0.1.5.tar.gz 107.2 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for tensorcodec 0.1.5
File
tensorcodec-0.1.5-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 abi3 Linux glibc 2.17+ x86-64 Details
tensorcodec-0.1.5-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.10 abi3 Linux glibc 2.17+ ARM64 Details
tensorcodec-0.1.5-cp310-abi3-macosx_14_0_x86_64.whl CPython 3.10 abi3 macOS 14.0+ x86-64 Details
tensorcodec-0.1.5-cp310-abi3-macosx_14_0_arm64.whl CPython 3.10 abi3 macOS 14.0+ ARM64 Details

Total release size: 45.0 MB

Release files / tensorcodec-0.1.5.tar.gz

Download URL tensorcodec-0.1.5.tar.gz
Size 107.2 kB
Tags Source
SHA-256 checksum
How to use checksums
489abfed18011554a8aa055de28f700cd246da5c557cdfe92a99fcb24e913585
BLAKE2b-256 checksum
How to use checksums
d39dbe4507499a6c21d4833ad033c379aec71313fbe282bf1621942f849ed355
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release files / tensorcodec-0.1.5-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL tensorcodec-0.1.5-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 11.6 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
171a5bd50ba435589d6d9bd881af739cce2c5432cb44d249b5591c01c65a2e7d
BLAKE2b-256 checksum
How to use checksums
27840970458411d5ced71ea257414e58204d506d3cff0c7660c1245fe4bc22c3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release files / tensorcodec-0.1.5-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL tensorcodec-0.1.5-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 11.4 MB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
9c5a96f95e0c102383b06742c32f621bad90fbaf26325404bbaaaa26b4c282d2
BLAKE2b-256 checksum
How to use checksums
14ff824e0c6f70ce3486b051baf5b5f644b3edd9eeda07290bc8a3f405da1e1a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release files / tensorcodec-0.1.5-cp310-abi3-macosx_14_0_x86_64.whl

Download URL tensorcodec-0.1.5-cp310-abi3-macosx_14_0_x86_64.whl
Size 11.4 MB
Tags CPython 3.10 abi3 macOS 14.0+ x86-64
SHA-256 checksum
How to use checksums
6cdfcd3d64544874bc4de6f997d180d0bcb1a77083475c04191b020affcd3219
BLAKE2b-256 checksum
How to use checksums
03d421b12a6263e2e59eb2df4fe3cc8d291287563bdad451ed549288959b689a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release files / tensorcodec-0.1.5-cp310-abi3-macosx_14_0_arm64.whl

Download URL tensorcodec-0.1.5-cp310-abi3-macosx_14_0_arm64.whl
Size 10.5 MB
Tags CPython 3.10 abi3 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
be856db66789fa12e09ddaa2936f4bdd4b104ee7e14458ae0f53fdc974d4a464
BLAKE2b-256 checksum
How to use checksums
01d80febf8e0b97adec7aebbb77f1cb95e09409da5eb238e84d8f1496ac605af
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.5 This release

5 release files

0.1.4

5 release files

0.1.3

5 release files

0.1.2

3 release files

0.1.1

3 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page