support for downloading AVI from sdui

This commit is contained in:
Concedo
2025-12-24 18:40:10 +08:00
parent 737b6721bc
commit 26d89bf589
4 changed files with 104 additions and 84 deletions
+58 -58
View File
File diff suppressed because one or more lines are too long
+2 -1
View File
@@ -213,7 +213,7 @@ struct sd_generation_inputs
const char * scheduler = nullptr;
const int clip_skip = -1;
const int vid_req_frames = 1;
const int vid_req_avi = 0;
const int video_output_type = 0; //0=gif, 1=avi, 2=both
const bool remove_limits = false;
};
struct sd_generation_outputs
@@ -221,6 +221,7 @@ struct sd_generation_outputs
int status = -1;
int animated = 0;
const char * data = "";
const char * data_extra = "";
};
struct whisper_load_model_inputs
+12 -8
View File
@@ -334,13 +334,14 @@ class sd_generation_inputs(ctypes.Structure):
("scheduler", ctypes.c_char_p),
("clip_skip", ctypes.c_int),
("vid_req_frames", ctypes.c_int),
("vid_req_avi", ctypes.c_int),
("video_output_type", ctypes.c_int),
("remove_limits", ctypes.c_bool)]
class sd_generation_outputs(ctypes.Structure):
_fields_ = [("status", ctypes.c_int),
("animated", ctypes.c_int),
("data", ctypes.c_char_p)]
("data", ctypes.c_char_p),
("data_extra", ctypes.c_char_p)]
class whisper_load_model_inputs(ctypes.Structure):
_fields_ = [("model_filename", ctypes.c_char_p),
@@ -1977,7 +1978,7 @@ def sd_generate(genparams):
clip_skip = tryparseint(genparams.get("clip_skip", -1),-1)
vid_req_frames = tryparseint(genparams.get("frames", 1),1)
vid_req_frames = 1 if (not vid_req_frames or vid_req_frames < 1) else vid_req_frames
vid_req_avi = 1 if genparams.get("avi_video", False) else 0
video_output_type = genparams.get("video_output_type", 0)
extra_images_arr = genparams.get("extra_images", [])
extra_images_arr = ([] if not extra_images_arr else extra_images_arr)
extra_images_arr = [img for img in extra_images_arr if img not in (None, "")]
@@ -2020,15 +2021,17 @@ def sd_generate(genparams):
inputs.scheduler = scheduler.encode("UTF-8")
inputs.clip_skip = clip_skip
inputs.vid_req_frames = vid_req_frames
inputs.vid_req_avi = vid_req_avi
inputs.video_output_type = video_output_type
inputs.remove_limits = allow_remove_limits
ret = handle.sd_generate(inputs)
outstr = ""
data_main = ""
data_extra = ""
animated = False
if ret.status==1:
outstr = ret.data.decode("UTF-8","ignore")
data_main = ret.data.decode("UTF-8","ignore")
data_extra = ret.data_extra.decode("UTF-8","ignore")
animated = True if ret.animated else False
return {"animated": animated, "data":outstr}
return {"animated": animated, "data":data_main, "data_extra":data_extra}
def whisper_load_model(model_filename):
@@ -4642,6 +4645,7 @@ Change Mode<br>
gen = sd_generate(genparams)
gendat = gen["data"]
genanim = gen["animated"]
gendatextra = gen["data_extra"]
genresp = None
if is_comfyui_imggen:
if gendat:
@@ -4652,7 +4656,7 @@ Change Mode<br>
elif is_oai_imggen:
genresp = (json.dumps({"created":int(time.time()),"data":[{"b64_json":gendat}],"background":"opaque","output_format":"png","size":"1024x1024","quality":"medium"}).encode())
else:
genresp = (json.dumps({"images":[gendat],"parameters":{},"info":"","animated":genanim}).encode())
genresp = (json.dumps({"images":[gendat],"parameters":{},"info":"","animated":genanim,"extra_data":gendatextra}).encode())
self.send_response(200)
self.send_header('content-length', str(len(genresp)))
self.end_headers(content_type='application/json')
+32 -17
View File
@@ -99,6 +99,7 @@ static SDParams * sd_params = nullptr;
static sd_ctx_t * sd_ctx = nullptr;
static int sddebugmode = 0;
static std::string recent_data = "";
static std::string recent_data2 = ""; //for cases when we have 2 outputs
static uint8_t * input_image_buffer = NULL;
static uint8_t * input_mask_buffer = NULL;
static std::vector<uint8_t *> input_extraimage_buffers;
@@ -736,6 +737,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
{
printf("\nWarning: KCPP image generation not initialized!\n");
output.data = "";
output.data_extra = "";
output.animated = 0;
output.status = 0;
return output;
@@ -999,7 +1001,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
//the below params are only used in video models. May move into standalone object in future
int vid_req_frames = inputs.vid_req_frames;
int vid_req_avi = inputs.vid_req_avi;
int video_output_type = inputs.video_output_type;
int generated_num_results = 1;
remove_limits = inputs.remove_limits;
@@ -1082,6 +1084,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
if (params.width <= 0 || params.width % 64 != 0 || params.height <= 0 || params.height % 64 != 0) {
printf("\nKCPP SD: bad request image dimensions!\n");
output.data = "";
output.data_extra = "";
output.animated = 0;
output.status = 0;
return output;
@@ -1098,6 +1101,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
if (!input_image_buffer) {
printf("\nKCPP SD: load image from memory failed!\n");
output.data = "";
output.data_extra = "";
output.animated = 0;
output.status = 0;
return output;
@@ -1165,6 +1169,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
if (results == NULL) {
printf("\nKCPP SD generate failed!\n");
output.data = "";
output.data_extra = "";
output.animated = 0;
output.status = 0;
return output;
@@ -1182,42 +1187,50 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
{
if(!sd_is_quiet && sddebugmode==1)
{
printf("\nSaving video buffer, AVI=%d...",vid_req_avi);
printf("\nSaving video buffer, VIDEO_OUTPUT_TYPE=%d...",video_output_type);
}
uint8_t * out_data = nullptr;
uint8_t * out_data2 = nullptr;
size_t out_len = 0;
size_t out_len2 = 0;
int status = 0;
int status2 = 0;
wasanim = true;
if(vid_req_avi==1)
if(video_output_type==0 || video_output_type==2)
{
status = create_mjpg_avi_membuf_from_sd_images(results, generated_num_results, 16, 40, &out_data,&out_len);
}
else
{
status = create_gif_buf_from_sd_images_msf(results, generated_num_results, 16, &out_data,&out_len);
if(!sd_is_quiet && sddebugmode==1)
{
printf("Video Output Size: %zu\n",out_len);
}
}
if(video_output_type==1 || video_output_type==2)
{
status2 = create_mjpg_avi_membuf_from_sd_images(results, generated_num_results, 16, 40, &out_data2,&out_len2);
}
if(!sd_is_quiet && sddebugmode==1)
{
if(status==0)
printf("Video Output Sizes: GIF=%zu AVI=%zu\n",out_len,out_len2);
if(status==0 && status2==0)
{
printf("Video Saved (Len %zu)!\n",out_len);
}else{
printf("Video(s) Saved (Len %zu)!\n",out_len);
} else {
printf("Save Failed!\n");
}
}
if(status==0)
recent_data = "";
recent_data2 = "";
if(status==0 && out_len>0)
{
recent_data = kcpp_base64_encode(out_data, out_len);
free(out_data);
}
if (status2 == 0 && out_len2 > 0) {
if (recent_data == "") {
recent_data = kcpp_base64_encode(out_data2, out_len2);
} else {
recent_data2 = kcpp_base64_encode(out_data2, out_len2);
}
free(out_data2);
}
}
else
{
@@ -1226,6 +1239,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
if (png != NULL)
{
recent_data = kcpp_base64_encode(png,out_data_len);
recent_data2 = "";
free(png);
}
}
@@ -1236,6 +1250,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
free(results);
output.data = recent_data.c_str();
output.data_extra = recent_data2.c_str();
output.animated = (wasanim?1:0);
output.status = 1;
total_img_gens += 1;