Skip to main content

edgefirst-codec

JPEG and PNG decoding straight into pre-allocated tensors — no per-frame allocations, with optional hardware acceleration on Linux.

PyPI License

Part of the EdgeFirst HAL

edgefirst-codec is one of five Python packages built from the EdgeFirst Hardware Abstraction Layer.

The EdgeFirstAI/hal repository is the home for all of them — source, issue tracker, architecture documentation and release notes.

Package Provides
edgefirst-tensor Zero-copy tensor allocation and host/GPU/CUDA mapping
edgefirst-codec JPEG and PNG decoding directly into pre-allocated tensors (this package)
edgefirst-image GPU-accelerated colour conversion, resize, letterbox, tiling and drawing
edgefirst-decoder YOLO and ModelPack output decoding
edgefirst-tracker ByteTrack multi-object tracking

Installation

pip install edgefirst-codec

Requires Python 3.8 or newer; edgefirst-tensor and NumPy are installed automatically. Wheels are published for Linux (x86_64, aarch64), macOS (arm64), and Windows (x86_64), and are self-contained — there is no system JPEG library to install.

Packages install under the PEP 420 edgefirst.* namespace, so the import is edgefirst.codec.

Quick start

For maximum performance, decode straight into a tensor allocated by edgefirst.image's ImageProcessor.create_image() — DMA/PBO-backed and GPU-pitch-aligned — then hand it to ImageProcessor.convert() for colour conversion and resize. decode_file_into / decode_into are free functions rather than Tensor methods precisely so they can take a tensor from another edgefirst.* package:

import numpy as np
from edgefirst.codec import Tensor, decode_file_into
from edgefirst.image import Flip, ImageProcessor, PixelFormat, Rotation

processor = ImageProcessor()

# peek_image_info_file reads the header only — no pixels are decoded.
info = Tensor.peek_image_info_file("frame.jpg")
print(info.width, info.height, info.format)  # e.g. 1280 720 PixelFormat.Nv16

# Allocate once, outside the loop. The decoder reconfigures the tensor's
# dimensions and format within this allocation, so one tensor sized for the
# largest expected frame can receive smaller images without reallocating.
src = processor.create_image(
    info.width, info.height, PixelFormat.Nv12, "uint8", "readwrite"
)
dst = processor.create_image(640, 640, PixelFormat.Rgb, "uint8", "readwrite")

info = decode_file_into(src, "frame.jpg")  # or decode_into(src, jpeg_bytes)
# convert() performs colour conversion (native → RGB) and resize; the codec
# reports EXIF orientation in `info` but does not apply it, so pass it on.
rotation = Rotation.degrees_clockwise(info.rotation_degrees)
flip = Flip.Horizontal if info.flip_horizontal else Flip.NoFlip
processor.convert(src, dst, rotation, flip)

with dst.map() as view:
    data = np.frombuffer(view, dtype=np.uint8)

Same-package pipelines that never leave edgefirst.codec can use the equivalent Tensor.decode_image_file() method instead — tensor.decode_image_file("frame.jpg") — but decode_image_file is a method, and its self must literally be an edgefirst.codec.Tensor; a DMA/PBO-backed destination from edgefirst.image.ImageProcessor.create_image() is a different package's type and can never be that self, so it must go through the free functions decode_into / decode_file_into instead.

Images decode in their native pixel format and are never colour-converted, rotated or resized. A colour JPEG lands on the NV format matching its own chroma sampling (4:2:0 → Nv12, 4:2:2 → Nv16, 4:4:4 → Nv24), greyscale on Grey, and PNG on Rgb / Rgba / Grey. Nothing is resampled on the way out.

EXIF orientation is reported, never applied: info.rotation_degrees and info.flip_horizontal carry the transform your pipeline should apply downstream, and the reported dimensions are unrotated.

Tuning the decode

from edgefirst.codec import DctMethod, PixelFormat, set_dct_method, set_output_format

set_dct_method(DctMethod.Fast)  # faster IDCT, small bounded accuracy cost
set_output_format(PixelFormat.Rgb)  # fused colour conversion inside the decode

Both settings are thread-local — apply them on every thread that decodes. set_output_format fuses colour conversion into the decode's MCU write stage, which is a pure-CPU single-pass path; pass None to restore native output.

PixelFormat and the other value types (TensorMemory, Region, the colour axis enums) are accepted from any edgefirst.* package, not just this one — they compare and hash equal across packages by value, so ==, dict keys and set membership all work regardless of which package's copy you pass. Tensors, Decoder and ProtoData cross packages too, through the capsule protocols. Importing PixelFormat from edgefirst.codec when calling into this package is still good style for readability, not a requirement. See the Interoperability section below for the one thing that does not cross: isinstance against a concrete class.

What this package provides

API Purpose
Tensor.peek_image_info() / peek_image_info_file() Read dimensions, format and EXIF orientation from the header alone
Tensor.decode_image() / decode_image_file() Decode into a pre-allocated edgefirst.codec.Tensor
decode_into() / decode_file_into() Decode into a tensor from any edgefirst.* package (e.g. edgefirst.image.ImageProcessor.create_image())
ImageInfo Decoded dimensions, native format, row stride, EXIF orientation
set_dct_method() / DctMethod IDCT accuracy/speed selection
set_output_format() Fused Rgb / Nv12 decode output
is_v4l2_available() Whether a V4L2 hardware JPEG decoder is present

Hardware acceleration

On Linux the decoder transparently tries hardware backends before the software path and falls back without any API change:

  • V4L2 mem2mem — SoC JPEG blocks such as the i.MX mxc-jpeg. Discovery is capability-based, with no hardcoded device node. Opt out with EDGEFIRST_DISABLE_V4L2=1.
  • nvJPEG — CUDA GPU decode on NVIDIA platforms such as Jetson Orin. Loaded via dlopen, so there is no link-time CUDA dependency. Opt in with EDGEFIRST_ENABLE_NVJPEG=1.

Footprint

Adding edgefirst-codec to a project costs roughly 1.5 MB of downloads (this package plus edgefirst-tensor), excluding NumPy. That is roughly an order of magnitude smaller than Pillow or OpenCV, and a few times larger than a bare libjpeg-turbo binding — while bundling PNG, EXIF and the hardware backends, with no system libraries to install. See the Rust crate README for the comparison table.

Supported inputs

JPEG decoding covers baseline DCT, 8-bit precision, 1 or 3 components. Progressive, lossless, hierarchical and arithmetic-coded JPEG, CMYK/YCCK and non-8-bit precision are rejected with a typed error rather than mis-decoded. PNG goes through zune-png and supports 8-bit and 16-bit Luma / LumaA / RGB / RGBA. The Rust crate README documents the full matrix.

Interoperability

decode_into / decode_file_into accept a tensor from any edgefirst.* package because each extension module registers its own Tensor type object (PyO3 issue #1444isinstance across packages is always False, even for two objects wrapping the same Rust type). Acceptance goes through the __edgefirst_tensor__ capsule protocol every Tensor implements:

# CORRECT — works regardless of which edgefirst.* package produced obj
if hasattr(obj, "__edgefirst_tensor__"):
    ...

# WRONG — always False for a tensor from a sibling package
if isinstance(obj, edgefirst.image.Tensor):
    ...

edgefirst.tensor.EdgeFirstTensorExportable (re-exported here as edgefirst.codec.EdgeFirstTensorExportable) is a typing.Protocol you can annotate a cross-package parameter with. See crates/python-common/INTEROP.md for the full protocol.

Versioning and changelog

All four edgefirst-* packages are versioned and released together with the HAL itself, so a given version number refers to the same source tree in every language. Because of that there is no per-package changelog: release notes for every version live in the single CHANGELOG.md in the hal repository, which follows Keep a Changelog and Semantic Versioning.

Links

License

Apache-2.0

Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

edgefirst_codec-0.30.0-cp311-abi3-win_amd64.whl (709.0 kB view details)

Uploaded CPython 3.11+Windows x86-64

edgefirst_codec-0.30.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (811.7 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ x86-64

edgefirst_codec-0.30.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (789.4 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ ARM64

edgefirst_codec-0.30.0-cp311-abi3-macosx_11_0_arm64.whl (714.5 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

edgefirst_codec-0.30.0-cp38-abi3-win_amd64.whl (715.0 kB view details)

Uploaded CPython 3.8+Windows x86-64

edgefirst_codec-0.30.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (817.6 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ x86-64

edgefirst_codec-0.30.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (793.4 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

edgefirst_codec-0.30.0-cp38-abi3-macosx_11_0_arm64.whl (719.5 kB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

File details

Details for the file edgefirst_codec-0.30.0-cp311-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for edgefirst_codec-0.30.0-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 9fcc1228ac5f25fd606d913d04265072293f77b3afd74581fdf28916df947534
MD5 ded53426001de35c42541f8d0fffa48a
BLAKE2b-256 45395a37a6f607d26691d901dd2e460538ca59f8c4b8f3144b4185a5b939111a

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_codec-0.30.0-cp311-abi3-win_amd64.whl:

Publisher: release.yml on EdgeFirstAI/hal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file edgefirst_codec-0.30.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for edgefirst_codec-0.30.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e98d7211dfb0fb225d92573f4c20fbc60f0ee87283ba9e6c8ab6668aa8c2a8df
MD5 eef6b475fd6fbbcecee7014ef93e6d76
BLAKE2b-256 b90c06366db2fd70f12f6c4386ed016d4b0c65025bb5961c8c9a73e733f6f695

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_codec-0.30.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on EdgeFirstAI/hal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file edgefirst_codec-0.30.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for edgefirst_codec-0.30.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 128b97294338914b3dad170704a267a91b6909aadfe47e586f5f4deed6ed048b
MD5 9c3854ef53bdf9d6b6bae6a6f523a8f7
BLAKE2b-256 a824941672455157182f0ede9840d8562bb943184ea7ede27467177a305d831e

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_codec-0.30.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on EdgeFirstAI/hal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file edgefirst_codec-0.30.0-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for edgefirst_codec-0.30.0-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3147c434d0549fa2fe82d817fdfb428ab8ffa2887c376f07d879340ceca665a0
MD5 f56bda2cad35cd5f8935901b3bb46f40
BLAKE2b-256 1faf6a97cf41ab8cd97634af9f4d0690df87ac3d8829c3967630f1c8cb8f4e23

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_codec-0.30.0-cp311-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on EdgeFirstAI/hal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file edgefirst_codec-0.30.0-cp38-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for edgefirst_codec-0.30.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 e54c850eaf92843e1a11fa53cc66aee2027c3eac07e73dee9a422b69f7c0a763
MD5 96b6645ce9bb392e65b6a9ba776609f2
BLAKE2b-256 e8c3983f09c2ed3d59af8b147fbdcc2bcad2304979f4bd674d9af245f15ed458

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_codec-0.30.0-cp38-abi3-win_amd64.whl:

Publisher: release.yml on EdgeFirstAI/hal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file edgefirst_codec-0.30.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for edgefirst_codec-0.30.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2e7873c22f9fe7fd4ad411cf69e9af904657fdada174845ae2a6562b9302aa57
MD5 e06fe0e288bb727eaf2091be7b8b349d
BLAKE2b-256 a18a7cf9f8ef40f74f2bd29cfc8b7002c1f202e84897b406cb75bd059df5a9e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_codec-0.30.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on EdgeFirstAI/hal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file edgefirst_codec-0.30.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for edgefirst_codec-0.30.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a5ffefb430bc3c0d31417dd7bf20ddb311d42313e4b8940b83e352f1ccf65e9e
MD5 f43340b656b0794a9d3dd7915a0f64d9
BLAKE2b-256 0c1a9002d1de417b437b7361d203e3f1e20c06e68831fbf0f190ea32ce9f5aa1

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_codec-0.30.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on EdgeFirstAI/hal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file edgefirst_codec-0.30.0-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for edgefirst_codec-0.30.0-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 46a168077ff7a73173a56d03fc9fedfb05baca41bb0572f875d03df21e76f4b5
MD5 8407cd41802a4379dbe864f9d86a6928
BLAKE2b-256 4c17260e5dbf5886faf873946e27487ed3b1ea2344a4a0b03d1e9216706dc699

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_codec-0.30.0-cp38-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on EdgeFirstAI/hal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.30.0 This release

8 files

0.29.4

8 files

0.29.3

8 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