#ifndef __SD_PIPELINE_GENERATION_H__ #define __SD_PIPELINE_GENERATION_H__ #include "conditioning/conditioner.hpp" #include "json.hpp" #include "stable-diffusion.h" class StableDiffusionGGML; static inline bool sd_version_supports_animatediff(SDVersion version) { return version == VERSION_SD1 || version == VERSION_SD1_INPAINT || version == VERSION_SD1_PIX2PIX; } namespace sd::pipeline { struct ImageGenerationLatents { sd::Tensor init_latent; sd::Tensor concat_latent; sd::Tensor img_uncond_concat_latent; sd::Tensor audio_latent; sd::Tensor video_positions; sd::Tensor control_image; std::vector> ref_images; std::vector> ref_latents; std::vector> reference_audio_latents; std::vector minimax_reference_blocks; std::vector minimax_presentation_refs; std::vector keyframe_indices; sd::Tensor denoise_mask; sd::Tensor clip_vision_output; sd::Tensor vace_context; sd::Tensor s2v_audio_embed; int64_t ref_image_num = 0; int64_t video_conditioning_frame_count = 0; int64_t video_target_frame_count = 0; int audio_length = 0; }; struct ImageGenerationEmbeds { SDCondition cond; SDCondition uncond; SDCondition img_uncond; }; struct ConditionerRunnerEndOnExit { Conditioner* conditioner = nullptr; ~ConditionerRunnerEndOnExit() { if (conditioner != nullptr) { conditioner->runner_end(); } } }; // Callers hold ExecutionScope; AnimateDiff reuses the image path within the same scope. bool generate_image(StableDiffusionGGML* sd, const sd_img_gen_params_t* sd_img_gen_params, sd_image_t** images_out, int* num_images_out, std::vector* infos_out = nullptr); bool generate_video(StableDiffusionGGML* sd, const sd_vid_gen_params_t* sd_vid_gen_params, sd_image_t** frames_out, int* num_frames_out, sd_audio_t** audio_out, int* fps_out, nlohmann::json* info_out = nullptr); sd::Tensor upscale_ltx_spatial_video_latent(StableDiffusionGGML* sd, const char* model_path, const sd::Tensor& packed_latent, int audio_length); sd::Tensor ensure_image_tensor_channels(sd::Tensor image, int channels); } // namespace sd::pipeline #endif // __SD_PIPELINE_GENERATION_H__