diff --git a/embd_res/kcpp_sdui.embd b/embd_res/kcpp_sdui.embd index ff3e5bf93..6b3b82e30 100644 --- a/embd_res/kcpp_sdui.embd +++ b/embd_res/kcpp_sdui.embd @@ -5,18 +5,18 @@ Stable UI for KoboldCpp - - diff --git a/expose.h b/expose.h index 42808612e..c40fad970 100644 --- a/expose.h +++ b/expose.h @@ -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 diff --git a/koboldcpp.py b/koboldcpp.py index bd1e5904f..6ad0ecd01 100755 --- a/koboldcpp.py +++ b/koboldcpp.py @@ -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
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
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') diff --git a/otherarch/sdcpp/sdtype_adapter.cpp b/otherarch/sdcpp/sdtype_adapter.cpp index 0490bde5d..7cba5b045 100644 --- a/otherarch/sdcpp/sdtype_adapter.cpp +++ b/otherarch/sdcpp/sdtype_adapter.cpp @@ -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 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;