pub struct ImageDecoder { /* private fields */ }Expand description
Reusable image decoder with internal scratch buffers.
Create one ImageDecoder at program initialisation and pass it to
ImageLoad::load_image in the hot loop.
The scratch buffers grow to the high-water mark and are reused across calls
— no per-frame allocations after the first few frames.
By default the decoder produces the source’s native format and configures
the destination tensor’s dimensions + pixel format accordingly (JPEG →
Nv12/Nv16/Nv24/Grey, PNG → Rgb/Rgba/Grey).
set_output_format opts a JPEG decode into a
fused Rgb or Nv12 output, where the colour conversion or chroma
downsample happens at the MCU write stage instead of in a second pass. The
decoder never rotates or resizes; use ImageProcessor::convert() for that.
§Example
use edgefirst_codec::{ImageDecoder, ImageLoad};
use edgefirst_tensor::{CpuAccess, Tensor, TensorTrait, TensorMemory, PixelFormat};
let mut decoder = ImageDecoder::new();
// Allocate a buffer large enough for the biggest expected image. The
// decoder CPU-writes the pixels, so declare `CpuAccess::Write`.
let mut tensor = Tensor::<u8>::image(1920, 1080, PixelFormat::Nv12, Some(TensorMemory::Mem),
CpuAccess::Write)
.expect("alloc");
for _ in 0..100 {
let frame = std::fs::read("frame.jpg").unwrap();
let _info = tensor.load_image(&mut decoder, &frame);
}Implementations§
Source§impl ImageDecoder
impl ImageDecoder
Sourcepub fn set_output_format(&mut self, format: Option<PixelFormat>)
pub fn set_output_format(&mut self, format: Option<PixelFormat>)
Request a fused decode output format instead of the source’s native format (JPEG only; PNG is unaffected).
This is a pure CPU, single-pass path inside the software JPEG decoder — colour conversion / chroma downsample happens at the MCU write stage. It is not a GPU hybrid or nvJPEG path; V4L2/nvJPEG are bypassed whenever the resolved output differs from native.
Some(Rgb): 4:4:4 colour JPEGs decode straight to interleaved RGB. Other sources fall back to native.Some(Nv12): colour JPEGs decode to NV12, downsampling chroma at the write stage (2×2 average for 4:4:4, vertical for 4:2:2).None(default): native format (Nv12/Nv16/Nv24/Grey).
Callers still run ImageProcessor::convert() on the result for
model-input preprocessing (letterbox, resize, EXIF orientation). With
fused RGB that convert step is typically a pure resize.
Sourcepub fn set_dct_method(&mut self, method: DctMethod)
pub fn set_dct_method(&mut self, method: DctMethod)
Select the software JPEG IDCT kernel class — see DctMethod.
Off (Accurate) by default; EDGEFIRST_CODEC_DCT=fast in the
environment flips a new decoder’s default for A/B runs.
Sourcepub fn decode_into<T: ImagePixel>(
&mut self,
data: &[u8],
dst: &mut Tensor<T>,
) -> Result<ImageInfo>
pub fn decode_into<T: ImagePixel>( &mut self, data: &[u8], dst: &mut Tensor<T>, ) -> Result<ImageInfo>
Decode image data into a typed tensor, configuring its dimensions and
pixel format to the decoded output format — the source’s native format
unless set_output_format selected a fused
one.
Detects the image format (JPEG or PNG) from magic bytes.
§Errors
CodecError::InsufficientCapacityif the image is larger than the tensor’s allocationCodecError::UnsupportedDtypeifTis not valid for the output format (JPEG NV12/NV16/NV24/RGB/GREY requireu8)CodecError::InvalidDataif the data is not a valid JPEG or PNG, including a JPEG whose entropy-coded scan is truncated
Sourcepub fn decode_into_dyn(
&mut self,
data: &[u8],
dst: &mut TensorDyn,
) -> Result<ImageInfo>
pub fn decode_into_dyn( &mut self, data: &[u8], dst: &mut TensorDyn, ) -> Result<ImageInfo>
Decode image data into a type-erased tensor.
Sourcepub fn decode_from_reader<T: ImagePixel, R: Read>(
&mut self,
reader: R,
dst: &mut Tensor<T>,
) -> Result<ImageInfo>
pub fn decode_from_reader<T: ImagePixel, R: Read>( &mut self, reader: R, dst: &mut Tensor<T>, ) -> Result<ImageInfo>
Read all bytes from a Read source into the internal input buffer, then
decode. The input buffer is reused across calls.
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for ImageDecoder
impl !Send for ImageDecoder
impl !Sync for ImageDecoder
impl !UnwindSafe for ImageDecoder
impl Freeze for ImageDecoder
impl Unpin for ImageDecoder
impl UnsafeUnpin for ImageDecoder
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more