1pub mod codec;
31pub mod det_math;
32pub mod stego;
33
34pub use codec::jpeg as jpeg;
36
37pub use codec::jpeg::error::{JpegError, Result as JpegResult};
38pub use codec::jpeg::dct::{DctGrid, QuantTable};
39pub use codec::jpeg::frame::FrameInfo;
40pub use codec::jpeg::JpegImage;
41pub 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};
42pub use stego::{ghost_encode_with_quality, ghost_encode_with_files_quality, ghost_encode_si_with_quality, ghost_encode_si_with_files_quality};
43pub 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};
44pub use stego::{ghost_encode_with_shadows_quality, ghost_encode_si_with_shadows_quality};
45pub use stego::{armor_encode, armor_encode_with_quality, armor_decode, armor_capacity, armor_capacity_info, smart_decode, DecodeQuality, ArmorCapacityInfo};
46pub use stego::EncodeQuality;
47pub use stego::{validate_encode_dimensions, MAX_DIMENSION, MAX_PIXELS, MIN_ENCODE_DIMENSION, ARMOR_TARGET_DIMENSION};
48pub use stego::{PayloadData, FileEntry, compressed_payload_size};
49pub use stego::progress;
50pub use stego::{optimize_cover, OptimizerConfig, OptimizerMode};
51
52#[cfg(feature = "video")]
54pub use stego::video::{
55 h264_ghost_encode, h264_ghost_encode_inplace,
56 h264_ghost_decode, h264_ghost_capacity, h264_ghost_capacity_max,
57 h264_ghost_encode_path, h264_ghost_decode_path,
58 h264_ghost_capacity_path, h264_ghost_capacity_max_path,
59 is_mp4,
60};
61
62#[cfg(feature = "h264-encoder")]
68pub use codec::h264::encoder::baseline_transcode::{
69 BaselineTranscodeConfig, StreamingEncoder, transcode_yuv_to_baseline_cavlc_h264,
70};
71
72#[cfg(feature = "cabac-stego")]
78pub use codec::h264::stego::encode_pixels::{
79 h264_stego_encode_i_frames_only, h264_stego_encode_i_then_p_frames,
80 h264_stego_encode_i_then_p_frames_4domain,
81 h264_stego_encode_i_then_p_frames_4domain_multigop,
82 h264_stego_encode_yuv_string, h264_stego_encode_yuv_string_4domain,
83 h264_stego_encode_yuv_string_4domain_multigop,
84 h264_stego_encode_yuv_string_4domain_multigop_streaming,
85 h264_stego_encode_yuv_string_4domain_multigop_streaming_v2,
86 h264_stego_encode_yuv_string_4domain_multigop_with_pattern,
87 h264_stego_encode_yuv_string_i_then_p,
88 h264_stego_encode_yuv_string_with_n_shadows,
89 h264_stego_encode_yuv_string_with_n_shadows_with_pattern,
90 h264_stego_encode_yuv_string_with_shadow,
91 h264_stego_encode_yuv_string_with_shadow_with_pattern,
92 h264_stego_shadow_capacity, H264ShadowCapacityInfo,
93 h264_stego_capacity_4domain, H264StegoCapacityInfo,
95 h264_stego_encode_yuv_string_4domain_multigop_streaming_v2_with_files,
97 h264_stego_encode_yuv_string_with_n_shadows_with_pattern_and_files,
98};
99#[cfg(feature = "cabac-stego")]
100pub use codec::h264::stego::gop_pattern::{FrameType, GopPattern};
101
102#[cfg(feature = "cabac-stego")]
108pub use codec::h264::stego::decode_pixels::{
109 h264_stego_decode_yuv_string, h264_stego_decode_yuv_string_4domain,
110 h264_stego_shadow_decode, h264_stego_smart_decode_video,
111 h264_stego_smart_decode_video_with_payload,
114};
115
116#[cfg(feature = "video")]
125#[derive(Debug, Clone, Copy, PartialEq, Eq)]
126pub enum VideoCodec {
127 H264,
129 Hevc,
132 Unknown,
134}
135
136#[cfg(feature = "video")]
139pub fn detect_video_codec(mp4_bytes: &[u8]) -> VideoCodec {
140 if !is_mp4(mp4_bytes) {
141 return VideoCodec::Unknown;
142 }
143 let Ok(file) = codec::mp4::demux::demux(mp4_bytes) else {
144 return VideoCodec::Unknown;
145 };
146 let Some(idx) = file.video_track_idx else {
147 return VideoCodec::Unknown;
148 };
149 let track = &file.tracks[idx];
150 if track.is_h264() {
151 VideoCodec::H264
152 } else if track.is_hevc() {
153 VideoCodec::Hevc
154 } else {
155 VideoCodec::Unknown
156 }
157}