pub struct Codec { /* private fields */ }Expand description
Reusable codec state for one worker.
Two things live here that must not be rebuilt per chunk:
- zstd contexts. A
CCtxowns the match tables — megabytes at level 3. The conveniencezstd::bulk::compress_to_bufferallocates and frees one on every call, which on 1 MiB chunks costs more than the compression itself. - A scratch buffer. zstd needs a destination sized to its worst case.
Growing a
Vecfor that means zeroing ~1 MiB per chunk that the codec is about to overwrite anyway. One long-lived buffer pays that once.
Implementations§
Source§impl Codec
impl Codec
pub fn new() -> Self
Sourcepub fn compress_into(
&mut self,
cfg: &CompressionConfig,
hint: FileHint,
input: &[u8],
out: &mut Vec<u8>,
) -> Result<Encoded>
pub fn compress_into( &mut self, cfg: &CompressionConfig, hint: FileHint, input: &[u8], out: &mut Vec<u8>, ) -> Result<Encoded>
Compress input, appending the result to out.
Returns the algorithm actually used, which may be None even when a
codec was requested: if the result did not beat min_gain, the raw bytes
are written instead. The caller must record the returned algorithm on the
wire.
Sourcepub fn compress_in_place(
&mut self,
cfg: &CompressionConfig,
hint: FileHint,
buf: &mut Vec<u8>,
prefix: usize,
) -> Result<Encoded>
pub fn compress_in_place( &mut self, cfg: &CompressionConfig, hint: FileHint, buf: &mut Vec<u8>, prefix: usize, ) -> Result<Encoded>
Compress the payload already sitting in buf after prefix header bytes.
The sender reads each chunk straight into its frame buffer, so the common
case — a chunk that will not be compressed, which is every chunk of a
.flac or .mp4 — costs zero copies. Only a chunk that actually wins
pays one, and then only of its compressed size.
Sourcepub fn decompress_into(
&mut self,
algo: Algorithm,
raw_len: usize,
input: &[u8],
out: &mut Vec<u8>,
) -> Result<()>
pub fn decompress_into( &mut self, algo: Algorithm, raw_len: usize, input: &[u8], out: &mut Vec<u8>, ) -> Result<()>
Decompress one chunk. raw_len comes from the frame header and is
validated against the decoded length, so a lying sender cannot make us
over-allocate beyond the frame limit the caller already enforced.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Codec
impl RefUnwindSafe for Codec
impl Send for Codec
impl Sync for Codec
impl Unpin for Codec
impl UnsafeUnpin for Codec
impl UnwindSafe for Codec
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
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