use log::trace;
use vorbis_bitpack::BitpackReader;
use super::{
audio_packet_common::process_audio_packet, VorbisCommentData, VorbisIdentificationHeaderData,
VorbisOptimizerError, VorbisSetupData
};
use crate::vorbis::PacketType;
pub(super) struct AudioPacketAnalyze {
pub(super) comment_data: VorbisCommentData,
pub(super) codec_setup: VorbisSetupData
}
impl AudioPacketAnalyze {
pub(super) fn analyze_packet(
&mut self,
mut packet: &[u8],
identification_data: &VorbisIdentificationHeaderData
) -> Result<(Option<u16>, Option<Self>), VorbisOptimizerError> {
trace!("Analyzing Vorbis audio packet");
let packet_length = packet.len();
let mut bitpacker = BitpackReader::new(&mut packet);
let packet_type = PacketType::try_from(eval_on_eop!(
bitpack_packet_read!(bitpacker, read_unsigned_integer, packet_length, const 1, u8),
return Ok((None, None))
)?)?;
if packet_type != PacketType::Audio {
return Err(VorbisOptimizerError::UnexpectedPacketType {
expected_type: PacketType::Audio,
actual_type: packet_type
});
}
let (_, decode_blocksize) = process_audio_packet(
identification_data,
&self.codec_setup,
packet_length,
&mut bitpacker,
|_, _, _| Ok(()),
|_, _, _| Ok(()),
()
)?;
Ok((decode_blocksize, None))
}
}