Fix T66872: Changing clip color space does not update background images
authorSergey Sharybin <sergey.vfx@gmail.com>
Sun, 28 Jul 2019 11:24:18 +0000 (13:24 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Sun, 28 Jul 2019 11:24:18 +0000 (13:24 +0200)
Such reload can no longer happen directly and is to be done via dependency
graph.

Eventually, the movie cache will become shared across all copies of the
clip, but even then we still need to have dependency graph mechanism because
we need to update FFmpeg animation handle (which can not be shared across
the copies).

release/datafiles/locale
release/scripts/addons
release/scripts/addons_contrib
source/blender/blenkernel/BKE_movieclip.h
source/blender/blenkernel/intern/movieclip.c
source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
source/blender/editors/space_clip/clip_ops.c
source/blender/makesdna/DNA_ID.h
source/blender/makesrna/intern/rna_color.c
source/blender/makesrna/intern/rna_movieclip.c

index 6625026f62f492dd677f5f29c68b9d70c96fb34b..63f65770e67f38db29f76ac910dd87bd9841b919 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 6625026f62f492dd677f5f29c68b9d70c96fb34b
+Subproject commit 63f65770e67f38db29f76ac910dd87bd9841b919
index 979298511916b25ec97bb22feb1c06cc9fbc86dd..37a8bdc661649cb6197e73b5eb96481cd5fb0c5e 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 979298511916b25ec97bb22feb1c06cc9fbc86dd
+Subproject commit 37a8bdc661649cb6197e73b5eb96481cd5fb0c5e
index b4fce25e94ec139554e821f58bbada3384b13afa..d9ed9d4d064c74c86e2767cd4be32d602a0ee317 160000 (submodule)
@@ -1 +1 @@
-Subproject commit b4fce25e94ec139554e821f58bbada3384b13afa
+Subproject commit d9ed9d4d064c74c86e2767cd4be32d602a0ee317
index 9425f396bc52ea4705456a6bff586f3908d950b5..14d7784f93ee46627c09282f080594b47a945b10 100644 (file)
@@ -118,7 +118,9 @@ bool BKE_movieclip_put_frame_if_possible(struct MovieClip *clip,
 
 /* Dependency graph evaluation. */
 
-void BKE_movieclip_eval_update(struct Depsgraph *depsgraph, struct MovieClip *clip);
+void BKE_movieclip_eval_update(struct Depsgraph *depsgraph,
+                               struct Main *bmain,
+                               struct MovieClip *clip);
 void BKE_movieclip_eval_selection_update(struct Depsgraph *depsgraph, struct MovieClip *clip);
 
 /* caching flags */
index 6bc83f8dd09199be0a810af4ac15abceec4b0345..e55bb675063e6671716b273adcf87d0f7e31cb15 100644 (file)
@@ -53,6 +53,7 @@
 
 #include "BKE_animsys.h"
 #include "BKE_colortools.h"
+#include "BKE_global.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
 #include "BKE_movieclip.h"
@@ -1772,9 +1773,17 @@ static void movieclip_selection_synchronize(MovieClip *clip_dst, const MovieClip
   }
 }
 
-void BKE_movieclip_eval_update(struct Depsgraph *depsgraph, MovieClip *clip)
+void movieclip_eval_update_reload(struct Depsgraph *depsgraph, Main *bmain, MovieClip *clip)
+{
+  BKE_movieclip_reload(bmain, clip);
+  if (DEG_is_active(depsgraph)) {
+    MovieClip *clip_orig = (MovieClip *)DEG_get_original_id(&clip->id);
+    BKE_movieclip_reload(bmain, clip_orig);
+  }
+}
+
+void movieclip_eval_update_generic(struct Depsgraph *depsgraph, MovieClip *clip)
 {
-  DEG_debug_print_eval(depsgraph, __func__, clip->id.name, clip);
   BKE_tracking_dopesheet_tag_update(&clip->tracking);
   if (DEG_is_active(depsgraph)) {
     MovieClip *clip_orig = (MovieClip *)DEG_get_original_id(&clip->id);
@@ -1782,6 +1791,17 @@ void BKE_movieclip_eval_update(struct Depsgraph *depsgraph, MovieClip *clip)
   }
 }
 
+void BKE_movieclip_eval_update(struct Depsgraph *depsgraph, Main *bmain, MovieClip *clip)
+{
+  DEG_debug_print_eval(depsgraph, __func__, clip->id.name, clip);
+  if (clip->id.recalc & ID_RECALC_SOURCE) {
+    movieclip_eval_update_reload(depsgraph, bmain, clip);
+  }
+  else {
+    movieclip_eval_update_generic(depsgraph, clip);
+  }
+}
+
 void BKE_movieclip_eval_selection_update(struct Depsgraph *depsgraph, MovieClip *clip)
 {
   DEG_debug_print_eval(depsgraph, __func__, clip->id.name, clip);
index fa6d7bc6028356a14a70189f331a992a6d1fbb1c..b06d6e73de0bb30aca5843fce048e587f94d2e25 100644 (file)
@@ -1557,7 +1557,7 @@ void DepsgraphNodeBuilder::build_movieclip(MovieClip *clip)
   add_operation_node(clip_id,
                      NodeType::PARAMETERS,
                      OperationCode::MOVIECLIP_EVAL,
-                     function_bind(BKE_movieclip_eval_update, _1, clip_cow));
+                     function_bind(BKE_movieclip_eval_update, _1, bmain_, clip_cow));
 
   add_operation_node(clip_id,
                      NodeType::BATCH_CACHE,
index 45479c4253d39bf02cac6bcc66c9620d7d9a73ef..e1af97286853a63c001845ea68c420c6497d27a2 100644 (file)
@@ -1434,7 +1434,7 @@ static void proxy_endjob(void *pjv)
 
   if (pj->clip->source == MCLIP_SRC_MOVIE) {
     /* Timecode might have changed, so do a full reload to deal with this. */
-    BKE_movieclip_reload(pj->main, pj->clip);
+    DEG_id_tag_update(&pj->clip->id, ID_RECALC_SOURCE);
   }
   else {
     /* For image sequences we'll preserve original cache. */
index dc4164169f9039b5fedbdc8013372734407a5810..ef9069acb787bee7c9223f820a6bb4af74178dda 100644 (file)
@@ -620,6 +620,11 @@ typedef enum IDRecalcFlag {
    * Basically, the same what changing frame in a timeline will do. */
   ID_RECALC_TIME = (1 << 22),
 
+  /* Input has changed and datablock is to be reload from disk.
+   * Applies to movie clips to inform that copy-on-written version is to be refreshed for the new
+   * input file or for color space changes. */
+  ID_RECALC_SOURCE = (1 << 23),
+
   /***************************************************************************
    * Pseudonyms, to have more semantic meaning in the actual code without
    * using too much low-level and implementation specific tags. */
index 43df1d8e1aa9fe9abfa734093d206dd3175b06d1..d221b7005f63cfcc5e6717a08e61a90daee58b63 100644 (file)
@@ -597,7 +597,7 @@ static void rna_ColorManagedColorspaceSettings_reload_update(Main *bmain,
   else if (GS(id->name) == ID_MC) {
     MovieClip *clip = (MovieClip *)id;
 
-    BKE_movieclip_reload(bmain, clip);
+    DEG_id_tag_update(&clip->id, ID_RECALC_SOURCE);
     BKE_sequence_invalidate_movieclip_strips(bmain, clip);
 
     WM_main_add_notifier(NC_MOVIECLIP | ND_DISPLAY, &clip->id);
index 247c4c69019b1a1a2c93fb21435758c0b56c3d27..10e19b92ddacf49fcd02c4ed51b7b2a76a61e730 100644 (file)
 #  include "DNA_screen_types.h"
 #  include "DNA_space_types.h"
 
-static void rna_MovieClip_reload_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
+static void rna_MovieClip_reload_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
 {
   MovieClip *clip = (MovieClip *)ptr->id.data;
 
-  BKE_movieclip_reload(bmain, clip);
-  DEG_id_tag_update(&clip->id, 0);
+  DEG_id_tag_update(&clip->id, ID_RECALC_SOURCE);
 }
 
 static void rna_MovieClip_size_get(PointerRNA *ptr, int *values)