use crate::adapter::fast_packet::cache::shared_allocation::checked_live_bytes;
use crate::adapter::fast_packet::cache::{
JpegCachedPlan, JpegCachedPlanBuildError, SharedJpegInput,
};
use crate::decoder::{Decoder, JpegView};
impl JpegCachedPlan {
pub fn build(input: SharedJpegInput) -> Result<Self, JpegCachedPlanBuildError> {
let parse_owner = input.clone();
let input_live_bytes = input.retained_cache_bytes()?;
let view = JpegView::parse_with_external_live(parse_owner.as_bytes(), input_live_bytes)?;
let (plan, decoder) = Self::build_shared_from_view_with_decoder(input, view, 0)?;
drop(decoder);
Ok(plan)
}
#[doc(hidden)]
pub fn build_with_decoder(
input: &[u8],
external_live_bytes: usize,
) -> Result<(Self, Decoder<'_>), JpegCachedPlanBuildError> {
let view = JpegView::parse_with_external_live(input, external_live_bytes)?;
Self::build_from_view_with_decoder(view, external_live_bytes)
}
#[doc(hidden)]
pub fn build_from_view_with_decoder(
view: JpegView<'_>,
external_live_bytes: usize,
) -> Result<(Self, Decoder<'_>), JpegCachedPlanBuildError> {
let parsed_bytes = view.parsed_header().retained_allocation_bytes()?;
let copy_live_bytes = checked_live_bytes(
"external and parsed JPEG owners before shared input copy",
external_live_bytes,
parsed_bytes,
j2k_core::DEFAULT_MAX_HOST_ALLOCATION_BYTES,
)?;
let input =
SharedJpegInput::try_copy_from_slice_with_external_live(view.bytes(), copy_live_bytes)?;
Self::build_shared_from_view_with_decoder(input, view, external_live_bytes)
}
}