diff options
Diffstat (limited to 'source/blender/imbuf/intern/indexer.c')
-rw-r--r-- | source/blender/imbuf/intern/indexer.c | 69 |
1 files changed, 65 insertions, 4 deletions
diff --git a/source/blender/imbuf/intern/indexer.c b/source/blender/imbuf/intern/indexer.c index e66be77ecaf..d0281744830 100644 --- a/source/blender/imbuf/intern/indexer.c +++ b/source/blender/imbuf/intern/indexer.c @@ -35,6 +35,7 @@ #include "BLI_path_util.h" #include "BLI_string.h" #include "BLI_fileops.h" +#include "BLI_ghash.h" #include "IMB_indexer.h" #include "IMB_anim.h" @@ -1148,19 +1149,64 @@ static void index_rebuild_fallback(FallbackIndexBuilderContext *context, * ---------------------------------------------------------------------- */ IndexBuildContext *IMB_anim_index_rebuild_context(struct anim *anim, IMB_Timecode_Type tcs_in_use, - IMB_Proxy_Size proxy_sizes_in_use, int quality) + IMB_Proxy_Size proxy_sizes_in_use, int quality, + const bool overwrite, GSet *file_list) { IndexBuildContext *context = NULL; + IMB_Proxy_Size proxy_sizes_to_build = proxy_sizes_in_use; + int i; + + /* Don't generate the same file twice! */ + if (file_list) { + for (i = 0; i < IMB_PROXY_MAX_SLOT; ++i) { + IMB_Proxy_Size proxy_size = proxy_sizes[i]; + if (proxy_size & proxy_sizes_to_build) { + char filename[FILE_MAX]; + get_proxy_filename(anim, proxy_size, filename, false); + + if (BLI_gset_haskey(file_list, filename)) { + proxy_sizes_to_build &= ~proxy_size; + printf("Proxy: %s already registered for generation, skipping\n", filename); + } + else { + BLI_gset_insert(file_list, BLI_strdup(filename)); + } + } + } + } + + if (!overwrite) { + IMB_Proxy_Size built_proxies = IMB_anim_proxy_get_existing(anim); + if (built_proxies != 0) { + + for (i = 0; i < IMB_PROXY_MAX_SLOT; ++i) { + IMB_Proxy_Size proxy_size = proxy_sizes[i]; + if (proxy_size & built_proxies) { + char filename[FILE_MAX]; + get_proxy_filename(anim, proxy_size, filename, false); + printf("Skipping proxy: %s\n", filename); + } + } + } + proxy_sizes_to_build &= ~built_proxies; + } + + fflush(stdout); + + if (proxy_sizes_to_build == 0) { + return NULL; + } + switch (anim->curtype) { #ifdef WITH_FFMPEG case ANIM_FFMPEG: - context = index_ffmpeg_create_context(anim, tcs_in_use, proxy_sizes_in_use, quality); + context = index_ffmpeg_create_context(anim, tcs_in_use, proxy_sizes_to_build, quality); break; #endif #ifdef WITH_AVI default: - context = index_fallback_create_context(anim, tcs_in_use, proxy_sizes_in_use, quality); + context = index_fallback_create_context(anim, tcs_in_use, proxy_sizes_to_build, quality); break; #endif } @@ -1237,7 +1283,7 @@ void IMB_free_indices(struct anim *anim) void IMB_anim_set_index_dir(struct anim *anim, const char *dir) { - if (strcmp(anim->index_dir, dir) == 0) { + if (STREQ(anim->index_dir, dir)) { return; } BLI_strncpy(anim->index_dir, dir, sizeof(anim->index_dir)); @@ -1304,3 +1350,18 @@ int IMB_anim_index_get_frame_index(struct anim *anim, IMB_Timecode_Type tc, return IMB_indexer_get_frame_index(idx, position); } +IMB_Proxy_Size IMB_anim_proxy_get_existing(struct anim *anim) +{ + const int num_proxy_sizes = IMB_PROXY_MAX_SLOT; + IMB_Proxy_Size existing = 0; + int i; + for (i = 0; i < num_proxy_sizes; ++i) { + IMB_Proxy_Size proxy_size = proxy_sizes[i]; + char filename[FILE_MAX]; + get_proxy_filename(anim, proxy_size, filename, false); + if (BLI_exists(filename)) { + existing |= proxy_size; + } + } + return existing; +} |