pub mod codec;
pub mod det_math;
pub mod stego;
pub use codec::jpeg as jpeg;
pub use codec::jpeg::error::{JpegError, Result as JpegResult};
pub use codec::jpeg::dct::{DctGrid, QuantTable};
pub use codec::jpeg::frame::FrameInfo;
pub use codec::jpeg::JpegImage;
pub use stego::{ghost_encode, ghost_decode, ghost_encode_with_files, ghost_encode_si, ghost_encode_si_with_files, ghost_capacity, ghost_capacity_si, StegoError, GHOST_DECODE_STEPS, GHOST_ENCODE_STEPS};
pub use stego::{ghost_encode_with_quality, ghost_encode_with_files_quality, ghost_encode_si_with_quality, ghost_encode_si_with_files_quality};
pub use stego::{ghost_encode_with_shadows, ghost_encode_si_with_shadows, ghost_shadow_decode, ShadowLayer, GHOST_ENCODE_WITH_SHADOWS_STEPS, shadow_capacity, estimate_shadow_capacity, ghost_capacity_with_shadows};
pub use stego::{ghost_encode_with_shadows_quality, ghost_encode_si_with_shadows_quality};
pub use stego::{armor_encode, armor_encode_with_quality, armor_decode, armor_capacity, armor_capacity_info, smart_decode, DecodeQuality, ArmorCapacityInfo};
pub use stego::EncodeQuality;
pub use stego::{validate_encode_dimensions, MAX_DIMENSION, MAX_PIXELS, MIN_ENCODE_DIMENSION, ARMOR_TARGET_DIMENSION};
pub use stego::{PayloadData, FileEntry, compressed_payload_size};
pub use stego::progress;
pub use stego::{optimize_cover, OptimizerConfig, OptimizerMode};
#[cfg(feature = "video")]
pub use stego::video::{
h264_ghost_encode, h264_ghost_encode_inplace,
h264_ghost_decode, h264_ghost_capacity, h264_ghost_capacity_max,
h264_ghost_encode_path, h264_ghost_decode_path,
h264_ghost_capacity_path, h264_ghost_capacity_max_path,
is_mp4,
};
#[cfg(feature = "h264-encoder")]
pub use codec::h264::encoder::baseline_transcode::{
BaselineTranscodeConfig, StreamingEncoder, transcode_yuv_to_baseline_cavlc_h264,
};
#[cfg(feature = "cabac-stego")]
pub use codec::h264::stego::encode_pixels::{
h264_stego_encode_i_frames_only, h264_stego_encode_i_then_p_frames,
h264_stego_encode_i_then_p_frames_4domain,
h264_stego_encode_i_then_p_frames_4domain_multigop,
h264_stego_encode_yuv_string, h264_stego_encode_yuv_string_4domain,
h264_stego_encode_yuv_string_4domain_multigop,
h264_stego_encode_yuv_string_4domain_multigop_streaming,
h264_stego_encode_yuv_string_4domain_multigop_streaming_v2,
h264_stego_encode_yuv_string_4domain_multigop_with_pattern,
h264_stego_encode_yuv_string_i_then_p,
h264_stego_encode_yuv_string_with_n_shadows,
h264_stego_encode_yuv_string_with_n_shadows_with_pattern,
h264_stego_encode_yuv_string_with_shadow,
h264_stego_encode_yuv_string_with_shadow_with_pattern,
h264_stego_shadow_capacity, H264ShadowCapacityInfo,
};
#[cfg(feature = "cabac-stego")]
pub use codec::h264::stego::gop_pattern::{FrameType, GopPattern};
#[cfg(feature = "cabac-stego")]
pub use codec::h264::stego::decode_pixels::{
h264_stego_decode_yuv_string, h264_stego_decode_yuv_string_4domain,
h264_stego_shadow_decode, h264_stego_smart_decode_video,
};
#[cfg(feature = "video")]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum VideoCodec {
H264,
Hevc,
Unknown,
}
#[cfg(feature = "video")]
pub fn detect_video_codec(mp4_bytes: &[u8]) -> VideoCodec {
if !is_mp4(mp4_bytes) {
return VideoCodec::Unknown;
}
let Ok(file) = codec::mp4::demux::demux(mp4_bytes) else {
return VideoCodec::Unknown;
};
let Some(idx) = file.video_track_idx else {
return VideoCodec::Unknown;
};
let track = &file.tracks[idx];
if track.is_h264() {
VideoCodec::H264
} else if track.is_hevc() {
VideoCodec::Hevc
} else {
VideoCodec::Unknown
}
}