diff --git a/plugins/image-source/image-source.c b/plugins/image-source/image-source.c index 2a9211daa..75810c83d 100644 --- a/plugins/image-source/image-source.c +++ b/plugins/image-source/image-source.c @@ -1,4 +1,6 @@ #include +#include +#include #define blog(log_level, format, ...) \ blog(log_level, "[image_source: '%s'] " format, \ @@ -16,12 +18,22 @@ struct image_source { char *file; bool persistent; + time_t file_timestamp; + float update_time_elapsed; gs_texture_t *tex; uint32_t cx; uint32_t cy; }; + +static time_t get_modified_timestamp(const char *filename) +{ + struct stat stats; + stat(filename, &stats); + return stats.st_mtime; +} + static const char *image_source_get_name(void *unused) { UNUSED_PARAMETER(unused); @@ -40,8 +52,10 @@ static void image_source_load(struct image_source *context) if (file && *file) { debug("loading texture '%s'", file); - + context->file_timestamp = get_modified_timestamp(file); context->tex = gs_texture_create_from_file(file); + context->update_time_elapsed = 0; + if (context->tex) { context->cx = gs_texture_get_width(context->tex); context->cy = gs_texture_get_height(context->tex); @@ -150,6 +164,26 @@ static void image_source_render(void *data, gs_effect_t *effect) gs_draw_sprite(context->tex, 0, context->cx, context->cy); } +static void image_source_tick(void *data, float seconds) +{ + struct image_source *context = data; + uint64_t now = os_gettime_ns(); + + if (!obs_source_showing(context->source)) return; + + context->update_time_elapsed += seconds; + + if (context->update_time_elapsed >= 1.0f) { + time_t t = get_modified_timestamp(context->file); + context->update_time_elapsed = 0.0f; + + if (context->file_timestamp < t) { + image_source_load(context); + } + } +} + + static const char *image_filter = "All formats (*.bmp *.tga *.png *.jpeg *.jpg *.gif);;" "BMP Files (*.bmp);;" @@ -187,6 +221,7 @@ static struct obs_source_info image_source_info = { .get_width = image_source_getwidth, .get_height = image_source_getheight, .video_render = image_source_render, + .video_tick = image_source_tick, .get_properties = image_source_properties };