use super::super::engine::TranscodeEncodeEngine;
use super::CodecTranscodeEncodeHooks;
use crate::CapacityError;
use crate::Codec;
use crate::TranscodeEncodeErrorOf;
use crate::TranscodeEncoder;
use crate::TranscodeProgress;
use crate::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),
}
}
#[inline]
#[must_use]
pub fn codec(&self) -> &C {
self.engine.codec()
}
#[inline]
#[must_use]
pub fn codec_mut(&mut self) -> &mut C {
self.engine.codec_mut()
}
#[inline]
#[must_use]
pub fn into_codec(self) -> C {
let (codec, _) = self.engine.into_parts();
codec
}
}
impl<C> Transcoder for CodecTranscodeEncoder<C>
where
C: Codec,
{
type Input = C::Value;
type Output = C::Unit;
type Error = TranscodeEncodeErrorOf<C>;
#[inline]
fn max_transcode_output_len(&self, input_len: usize) -> Result<usize, CapacityError> {
self.engine.max_transcode_output_len(input_len)
}
#[inline]
fn max_reset_output_len(&self) -> Result<usize, CapacityError> {
self.engine.max_reset_output_len()
}
#[inline]
fn max_finish_output_len(&self) -> Result<usize, CapacityError> {
self.engine.max_finish_output_len()
}
#[inline]
fn reset(&mut self, output: &mut [C::Unit], output_index: usize) -> Result<usize, TranscodeEncodeErrorOf<C>> {
self.engine.reset(output, output_index)
}
#[inline]
fn transcode(
&mut self,
input: &[C::Value],
input_index: usize,
output: &mut [C::Unit],
output_index: usize,
) -> Result<TranscodeProgress, TranscodeEncodeErrorOf<C>> {
self.engine.transcode(input, input_index, output, output_index)
}
#[inline]
fn finish(&mut self, output: &mut [C::Unit], output_index: usize) -> Result<usize, TranscodeEncodeErrorOf<C>> {
self.engine.finish(output, output_index)
}
}
impl<C> TranscodeEncoder for CodecTranscodeEncoder<C>
where
C: Codec,
{
type EncodeError = C::EncodeError;
}
impl<C> Default for CodecTranscodeEncoder<C>
where
C: Codec + Default,
{
#[inline]
fn default() -> Self {
Self::new(C::default())
}
}