use super::CodecTranscodeEncodeHooks;
use crate::{
CapacityError,
Codec,
CodecEncodeError,
TranscodeEncodeEngine,
TranscodeEncodeEngineError,
TranscodeEncoder,
TranscodeError,
TranscodeProgress,
Transcoder,
};
#[derive(Debug)]
pub struct CodecTranscodeEncoder<C> {
engine: TranscodeEncodeEngine<C, CodecTranscodeEncodeHooks>,
}
impl<C> CodecTranscodeEncoder<C>
where
C: Codec,
{
#[inline]
#[must_use]
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> {
self.engine.max_reset_output_len()
}
#[inline(always)]
fn max_finish_output_len(&self) -> Result<usize, CapacityError> {
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)
.map_err(|error| error.map_domain(flatten_encode_engine_error))
}
#[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)
.map_err(|error| error.map_domain(flatten_encode_engine_error))
}
#[inline(always)]
fn finish(
&mut self,
output: &mut [C::Unit],
output_index: usize,
) -> Result<usize, TranscodeError<Self::Error>> {
self.engine
.finish(output, output_index)
.map_err(|error| error.map_domain(flatten_encode_engine_error))
}
}
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())
}
}
#[inline(always)]
fn flatten_encode_engine_error<E>(
error: TranscodeEncodeEngineError<E, CodecEncodeError<E>>,
) -> CodecEncodeError<E> {
match error {
TranscodeEncodeEngineError::Codec(error)
| TranscodeEncodeEngineError::Hook(error) => error,
}
}