frontend, obs-filters: Add missing file support for filters

This commit is contained in:
Exeldro
2026-05-07 12:58:16 -04:00
committed by Ryan Foster
parent 403f075a47
commit b093030106
3 changed files with 80 additions and 8 deletions
+21 -8
View File
@@ -1157,15 +1157,28 @@ void OBSBasic::Load(SceneCollection &collection)
LoadData(data, collection);
}
static inline void AddMissingFiles(void *data, obs_source_t *source)
namespace {
void addMissingFilterFiles(obs_source_t *, obs_source_t *filter, void *data)
{
obs_missing_files_t *f = (obs_missing_files_t *)data;
obs_missing_files_t *sf = obs_source_get_missing_files(source);
obs_missing_files_t *missing_files = static_cast<obs_missing_files_t *>(data);
obs_missing_files_t *filter_missing_files = obs_source_get_missing_files(filter);
obs_missing_files_append(f, sf);
obs_missing_files_destroy(sf);
obs_missing_files_append(missing_files, filter_missing_files);
obs_missing_files_destroy(filter_missing_files);
}
void addMissingFiles(void *data, obs_source_t *source)
{
obs_missing_files_t *missing_files = static_cast<obs_missing_files_t *>(data);
obs_missing_files_t *source_missing_files = obs_source_get_missing_files(source);
obs_missing_files_append(missing_files, source_missing_files);
obs_missing_files_destroy(source_missing_files);
obs_source_enum_filters(source, addMissingFilterFiles, data);
}
} // namespace
void OBSBasic::LoadData(obs_data_t *data, SceneCollection &collection)
{
ClearSceneData();
@@ -1317,12 +1330,12 @@ void OBSBasic::LoadData(obs_data_t *data, SceneCollection &collection)
updateRemigrationMenuItem(collection.getCoordinateMode(), ui->actionRemigrateSceneCollection);
obs_missing_files_t *files = obs_missing_files_create();
obs_load_sources(sources, AddMissingFiles, files);
obs_load_sources(sources, addMissingFiles, files);
if (resetVideo)
ResetVideo();
if (transitionsData)
LoadTransitions(transitionsData, AddMissingFiles, files);
LoadTransitions(transitionsData, addMissingFiles, files);
if (sceneOrder)
LoadSceneListOrder(sceneOrder);
@@ -1651,7 +1664,7 @@ void OBSBasic::on_actionShowMissingFiles_triggered()
obs_missing_files_t *files = obs_missing_files_create();
auto cb_sources = [](void *data, obs_source_t *source) {
AddMissingFiles(data, source);
addMissingFiles(data, source);
return true;
};
+29
View File
@@ -465,6 +465,34 @@ static enum gs_color_space color_grade_filter_get_color_space(void *data, size_t
return source_space;
}
static void missing_file_callback(void *src, const char *new_path, void *data)
{
struct lut_filter_data *filter = src;
obs_source_t *source = filter->context;
obs_data_t *settings = obs_source_get_settings(source);
obs_data_set_string(settings, SETTING_IMAGE_PATH, new_path);
obs_source_update(source, settings);
obs_data_release(settings);
UNUSED_PARAMETER(data);
}
static obs_missing_files_t *color_grade_filter_missing_files(void *data)
{
struct lut_filter_data *filter = data;
obs_missing_files_t *files = obs_missing_files_create();
if (filter->file && strcmp(filter->file, "") != 0 && !os_file_exists(filter->file)) {
obs_missing_file_t *file = obs_missing_file_create(filter->file, missing_file_callback,
OBS_MISSING_FILE_SOURCE, filter->context, NULL);
obs_missing_files_add_file(files, file);
}
return files;
}
struct obs_source_info color_grade_filter = {
.id = "clut_filter",
.type = OBS_SOURCE_TYPE_FILTER,
@@ -477,4 +505,5 @@ struct obs_source_info color_grade_filter = {
.get_properties = color_grade_filter_properties,
.video_render = color_grade_filter_render,
.video_get_color_space = color_grade_filter_get_color_space,
.missing_files = color_grade_filter_missing_files,
};
+30
View File
@@ -343,6 +343,34 @@ static enum gs_color_space mask_filter_get_color_space(void *data, size_t count,
return source_space;
}
static void missing_file_callback(void *src, const char *new_path, void *data)
{
struct mask_filter_data *filter = src;
obs_source_t *source = filter->context;
obs_data_t *settings = obs_source_get_settings(source);
obs_data_set_string(settings, SETTING_IMAGE_PATH, new_path);
obs_source_update(source, settings);
obs_data_release(settings);
UNUSED_PARAMETER(data);
}
static obs_missing_files_t *mask_filter_missing_files(void *data)
{
struct mask_filter_data *filter = data;
obs_missing_files_t *files = obs_missing_files_create();
if (filter->image_file && strcmp(filter->image_file, "") != 0 && !os_file_exists(filter->image_file)) {
obs_missing_file_t *file = obs_missing_file_create(filter->image_file, missing_file_callback,
OBS_MISSING_FILE_SOURCE, filter->context, NULL);
obs_missing_files_add_file(files, file);
}
return files;
}
struct obs_source_info mask_filter = {
.id = "mask_filter",
.type = OBS_SOURCE_TYPE_FILTER,
@@ -355,6 +383,7 @@ struct obs_source_info mask_filter = {
.get_properties = mask_filter_properties_v1,
.video_tick = mask_filter_tick,
.video_render = mask_filter_render,
.missing_files = mask_filter_missing_files,
};
struct obs_source_info mask_filter_v2 = {
@@ -371,4 +400,5 @@ struct obs_source_info mask_filter_v2 = {
.video_tick = mask_filter_tick,
.video_render = mask_filter_render,
.video_get_color_space = mask_filter_get_color_space,
.missing_files = mask_filter_missing_files,
};