use std::borrow::Cow;
use log::trace;
use super::comment_header_parse::VorbisCommentData;
use super::setup_header_parse::VorbisSetupData;
use super::setup_header_rewrite::SetupHeaderRewrite;
use super::VorbisOptimizerError;
pub(super) struct CommentHeaderCopy {
pub(super) comment_data: Option<VorbisCommentData>,
pub(super) codec_setup: Option<VorbisSetupData>
}
impl CommentHeaderCopy {
#[allow(clippy::type_complexity)]
pub(super) fn optimize_packet<'packet>(
&mut self,
mut packet: Cow<'packet, [u8]>
) -> Result<
(
Option<(Cow<'packet, [u8]>, Option<u16>)>,
Option<SetupHeaderRewrite>
),
VorbisOptimizerError
> {
trace!("Optimizing comment header Vorbis packet");
let comment_data = self.comment_data.as_ref().unwrap();
let packet_data = packet.to_mut();
packet_data.clear();
packet_data.push(3); packet_data.extend_from_slice(b"vorbis");
let empty_vec = vec![];
let vendor_string = comment_data.vendor_string.as_ref().unwrap_or(&empty_vec);
packet_data.extend_from_slice(&u32::try_from(vendor_string.len())?.to_le_bytes()[..]);
packet_data.extend_from_slice(vendor_string);
packet_data.extend_from_slice(&(comment_data.user_comments.len() as u32).to_le_bytes()[..]);
for comment in &comment_data.user_comments {
packet_data.extend_from_slice(&(comment.len() as u32).to_le_bytes()[..]);
packet_data.extend_from_slice(comment);
}
packet_data.push(1);
Ok((
Some((packet, None)),
Some(SetupHeaderRewrite {
codec_setup: self.codec_setup.take()
})
))
}
}