use super::CodecTranscodeEncodeHooks;
use crate::{
CapacityError,
Codec,
CodecEncodeError,
TranscodeEncodeEngine,
TranscodeEncoder,
TranscodeError,
TranscodeProgress,
Transcoder,
};
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct CodecTranscodeEncoder<C> {
engine: TranscodeEncodeEngine<C, CodecTranscodeEncodeHooks>,
}
impl<C> CodecTranscodeEncoder<C>
where
C: Codec,
{
#[must_use]
#[inline]
pub fn new(codec: C) -> Self {
Self {
engine: TranscodeEncodeEngine::new(
codec,
CodecTranscodeEncodeHooks,
),
}
}
}
impl<C> Transcoder<C::Value, C::Unit> for CodecTranscodeEncoder<C>
where
C: Codec,
{
type Error = CodecEncodeError<C::EncodeError>;
#[inline(always)]
fn max_output_len(&self, input_len: usize) -> Result<usize, CapacityError> {
self.engine.max_output_len(input_len)
}
#[inline(always)]
fn max_reset_output_len(&self) -> Result<usize, CapacityError> {
Ok(self.engine.max_reset_output_len())
}
#[inline(always)]
fn max_finish_output_len(&self) -> Result<usize, CapacityError> {
Ok(self.engine.max_finish_output_len())
}
#[inline(always)]
fn reset(
&mut self,
output: &mut [C::Unit],
output_index: usize,
) -> Result<usize, TranscodeError<Self::Error>> {
self.engine.reset(output, output_index)
}
#[inline(always)]
fn transcode(
&mut self,
input: &[C::Value],
input_index: usize,
output: &mut [C::Unit],
output_index: usize,
) -> Result<TranscodeProgress, TranscodeError<Self::Error>> {
self.engine
.transcode(input, input_index, output, output_index)
}
#[inline(always)]
fn finish(
&mut self,
output: &mut [C::Unit],
output_index: usize,
) -> Result<usize, TranscodeError<Self::Error>> {
self.engine.finish(output, output_index)
}
}
impl<C> TranscodeEncoder<C::Value, C::Unit> for CodecTranscodeEncoder<C>
where
C: Codec,
{
}
impl<C> Default for CodecTranscodeEncoder<C>
where
C: Codec + Default,
{
#[inline(always)]
fn default() -> Self {
Self::new(C::default())
}
}