use core::fmt;
use super::super::engine::TranscodeConvertEngine;
use super::CodecTranscodeDecodeHooks;
use super::CodecTranscodeEncodeHooks;
use crate::CapacityError;
use crate::Codec;
use crate::TranscodeConvertErrorOf;
use crate::TranscodeConverter;
use crate::TranscodeProgress;
use crate::Transcoder;
#[must_use]
pub struct CodecTranscodeConverter<D, E>
where
D: Codec,
E: Codec<Value = D::Value>,
{
engine: TranscodeConvertEngine<D, E, CodecTranscodeDecodeHooks, CodecTranscodeEncodeHooks>,
}
impl<D, E> CodecTranscodeConverter<D, E>
where
D: Codec,
E: Codec<Value = D::Value>,
{
#[inline]
pub fn new(decoder: D, encoder: E) -> Self {
Self {
engine: TranscodeConvertEngine::new(decoder, encoder, CodecTranscodeDecodeHooks, CodecTranscodeEncodeHooks),
}
}
#[inline]
#[must_use]
pub fn source_codec(&self) -> &D {
self.engine.source_codec()
}
#[inline]
#[must_use]
pub fn source_codec_mut(&mut self) -> &mut D {
self.engine.source_codec_mut()
}
#[inline]
#[must_use]
pub fn target_codec(&self) -> &E {
self.engine.target_codec()
}
#[inline]
#[must_use]
pub fn target_codec_mut(&mut self) -> &mut E {
self.engine.target_codec_mut()
}
#[inline]
#[must_use]
pub fn into_codecs(self) -> (D, E) {
let (source, target, _, _) = self.engine.into_parts();
(source, target)
}
#[inline]
pub fn max_transcode_output_len(&self, input_len: usize) -> Result<usize, CapacityError> {
self.engine.max_transcode_output_len(input_len)
}
#[inline]
pub fn max_finish_output_len(&self) -> Result<usize, CapacityError> {
self.engine.max_finish_output_len()
}
#[inline]
pub fn max_reset_output_len(&self) -> Result<usize, CapacityError> {
self.engine.max_reset_output_len()
}
pub fn reset(&mut self, output: &mut [E::Unit], output_index: usize) -> Result<usize, TranscodeConvertErrorOf<D, E>>
where
D::Value: Default,
{
self.engine.reset(output, output_index)
}
pub fn transcode(
&mut self,
input: &[D::Unit],
input_index: usize,
output: &mut [E::Unit],
output_index: usize,
) -> Result<TranscodeProgress, TranscodeConvertErrorOf<D, E>> {
self.engine.transcode(input, input_index, output, output_index)
}
pub fn transcode_eof(
&mut self,
input: &[D::Unit],
input_index: usize,
output: &mut [E::Unit],
output_index: usize,
) -> Result<TranscodeProgress, TranscodeConvertErrorOf<D, E>> {
self.engine.transcode_eof(input, input_index, output, output_index)
}
pub fn finish(
&mut self,
output: &mut [E::Unit],
output_index: usize,
) -> Result<usize, TranscodeConvertErrorOf<D, E>>
where
D::Value: Default,
{
self.engine.finish(output, output_index)
}
}
impl<D, E> Transcoder for CodecTranscodeConverter<D, E>
where
D: Codec,
E: Codec<Value = D::Value>,
D::Value: Default,
{
type Input = D::Unit;
type Output = E::Unit;
type Error = TranscodeConvertErrorOf<D, E>;
#[inline]
fn max_transcode_output_len(&self, input_len: usize) -> Result<usize, CapacityError> {
CodecTranscodeConverter::max_transcode_output_len(self, input_len)
}
#[inline]
fn max_finish_output_len(&self) -> Result<usize, CapacityError> {
CodecTranscodeConverter::max_finish_output_len(self)
}
#[inline]
fn max_reset_output_len(&self) -> Result<usize, CapacityError> {
CodecTranscodeConverter::max_reset_output_len(self)
}
fn reset(&mut self, output: &mut [E::Unit], output_index: usize) -> Result<usize, TranscodeConvertErrorOf<D, E>> {
CodecTranscodeConverter::reset(self, output, output_index)
}
fn transcode(
&mut self,
input: &[D::Unit],
input_index: usize,
output: &mut [E::Unit],
output_index: usize,
) -> Result<TranscodeProgress, TranscodeConvertErrorOf<D, E>> {
CodecTranscodeConverter::transcode(self, input, input_index, output, output_index)
}
fn transcode_eof(
&mut self,
input: &[D::Unit],
input_index: usize,
output: &mut [E::Unit],
output_index: usize,
) -> Result<TranscodeProgress, TranscodeConvertErrorOf<D, E>> {
CodecTranscodeConverter::transcode_eof(self, input, input_index, output, output_index)
}
fn finish(&mut self, output: &mut [E::Unit], output_index: usize) -> Result<usize, TranscodeConvertErrorOf<D, E>> {
CodecTranscodeConverter::finish(self, output, output_index)
}
}
impl<D, E> TranscodeConverter for CodecTranscodeConverter<D, E>
where
D: Codec,
E: Codec<Value = D::Value>,
D::Value: Default,
{
type DecodeError = D::DecodeError;
type EncodeError = E::EncodeError;
type Value = D::Value;
}
impl<D, E> Default for CodecTranscodeConverter<D, E>
where
D: Codec,
E: Codec<Value = D::Value>,
TranscodeConvertEngine<D, E, CodecTranscodeDecodeHooks, CodecTranscodeEncodeHooks>: Default,
{
#[inline]
fn default() -> Self {
Self {
engine: TranscodeConvertEngine::default(),
}
}
}
impl<D, E> fmt::Debug for CodecTranscodeConverter<D, E>
where
D: Codec,
E: Codec<Value = D::Value>,
TranscodeConvertEngine<D, E, CodecTranscodeDecodeHooks, CodecTranscodeEncodeHooks>: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("CodecTranscodeConverter")
.field("engine", &self.engine)
.finish()
}
}