diff --git a/expose.h b/expose.h
index 9394bd3ad..1bdd5b9dc 100644
--- a/expose.h
+++ b/expose.h
@@ -256,6 +256,7 @@ struct sd_generation_outputs
int animated = 0;
const char * data = "";
const char * data_extra = "";
+ const char * final_frame = ""; //for videos to allow extend
const char * info = "";
};
struct sd_upscale_inputs
diff --git a/koboldcpp.py b/koboldcpp.py
index b0e3eb59c..ce9ecb961 100644
--- a/koboldcpp.py
+++ b/koboldcpp.py
@@ -438,6 +438,7 @@ class sd_generation_outputs(ctypes.Structure):
("animated", ctypes.c_int),
("data", ctypes.c_char_p),
("data_extra", ctypes.c_char_p),
+ ("final_frame", ctypes.c_char_p),
("info", ctypes.c_char_p)]
class sd_upscale_inputs(ctypes.Structure):
@@ -2859,15 +2860,17 @@ def sd_generate(genparams):
ret = handle.sd_generate(inputs)
data_main = ""
data_extra = ""
+ final_frame = ""
info = {}
animated = False
if ret.status==1:
data_main = ret.data.decode("UTF-8","ignore")
data_extra = ret.data_extra.decode("UTF-8","ignore")
+ final_frame = ret.final_frame.decode("UTF-8","ignore")
info = json.loads(ret.info.decode("UTF-8","ignore"))
animated = True if ret.animated else False
info["job_timestamp"] = job_timestamp
- return {"animated": animated, "data":data_main, "data_extra":data_extra, "info": info}
+ return {"animated": animated, "data":data_main, "data_extra":data_extra, "final_frame":final_frame, "info": info}
def whisper_load_model(model_filename):
@@ -6936,6 +6939,7 @@ Change Mode
gendat = gen["data"]
genanim = gen["animated"]
gendatextra = gen["data_extra"]
+ genfinalframe = gen["final_frame"]
geninfo = json.dumps(gen["info"]) # sdapi really expects a stringified JSON
genresp = None
if is_comfyui_imggen:
@@ -6947,7 +6951,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":geninfo,"animated":genanim,"extra_data":gendatextra}).encode())
+ genresp = (json.dumps({"images":[gendat],"parameters":{},"info":geninfo,"animated":genanim,"extra_data":gendatextra, "final_frame":genfinalframe}).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 7f0a636bb..493c11bfc 100644
--- a/otherarch/sdcpp/sdtype_adapter.cpp
+++ b/otherarch/sdcpp/sdtype_adapter.cpp
@@ -161,11 +161,13 @@ static bool remove_limits = false;
static struct {
std::string data;
std::string data_extra;
+ std::string final_frame;
std::string info;
bool animated;
void reset() {
data = "";
data_extra = "";
+ final_frame = "";
info = "{}";
animated = false;
}
@@ -174,6 +176,7 @@ static struct {
output.status = status;
output.data = data.c_str();
output.data_extra = data_extra.c_str();
+ output.final_frame = final_frame.c_str();
output.info = info.c_str();
output.animated = animated;
return output;
@@ -1529,6 +1532,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
upscaled_image.data = nullptr;
std::string gen_data;
std::string gen_data2;
+ std::string final_frame_data;
if (is_passthrough)
{
@@ -1573,6 +1577,12 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
status2 = create_mjpg_avi_membuf_from_sd_images(results, generated_num_results, vid_fps, 40, &out_data2,&out_len2, generated_audio);
}
+ if(generated_num_results>1)
+ {
+ sd_image_t *final_frame_image = &results[generated_num_results-1];
+ final_frame_data = raw_image_to_png_base64(*final_frame_image);
+ }
+
if(!sd_is_quiet && sddebugmode==1)
{
printf("Video Output Sizes: GIF=%zu AVI=%zu\n",out_len,out_len2);
@@ -1641,6 +1651,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
sd_generation.data = gen_data;
sd_generation.data_extra = gen_data2;
+ sd_generation.final_frame = final_frame_data;
sd_generation.animated = isanim;
sd_generation.info = jsoninfo.dump();
return sd_generation.outputs(1);