Fixes for proxies color space
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 6 Mar 2014 11:27:16 +0000 (17:27 +0600)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 6 Mar 2014 11:32:45 +0000 (17:32 +0600)
Basically proxy colorspace didn't work well enough.

It is still a bit weird and mainly:

- Proxies for image sequences are built in the image color space.

- Proxies for movies are built in the movie color space.

This could be unified but would need some work in proxy build
to make it not just pipe frames from one FFmpeg context to
another but also apply OCIO on it.

source/blender/blenkernel/intern/movieclip.c
source/blender/editors/space_clip/clip_ops.c
source/blender/imbuf/intern/indexer.c

index 39c3b96f66e1ae56369b53e5941532eda09e70c6..a41b47809eb60ef6ef6307342f762af4225f2a05 100644 (file)
@@ -214,8 +214,17 @@ static ImBuf *movieclip_load_sequence_file(MovieClip *clip, MovieClipUser *user,
                int undistort = user->render_flag & MCLIP_PROXY_RENDER_UNDISTORT;
                get_proxy_fname(clip, user->render_size, undistort, framenr, name);
 
-               /* proxies were built using default color space settings */
-               colorspace = NULL;
+               /* Well, this is a bit weird, but proxies for movie sources
+                * are built in the same exact color space as the input,
+                *
+                * But image sequences are built in the display space.
+                */
+               if (clip->source == MCLIP_SRC_MOVIE) {
+                       colorspace = clip->colorspace_settings.name;
+               }
+               else {
+                       colorspace = NULL;
+               }
        }
        else {
                get_sequence_fname(clip, framenr, name);
index 7a6c4268aab09ac95e0a3826f3fce489aeb67233..bb6c50d62244da8030fca85d00ba2dabf0c246b4 100644 (file)
@@ -1002,7 +1002,7 @@ static void do_movie_proxy(void *pjv, int *UNUSED(build_sizes), int UNUSED(build
        }
        else {
                sfra = 1;
-               efra = IMB_anim_get_duration(clip->anim, IMB_TC_NONE);
+               efra = clip->len;
        }
 
        if (build_undistort_count) {
@@ -1118,7 +1118,8 @@ static void *do_proxy_thread(void *data_v)
        while ((mem = proxy_thread_next_frame(data->queue, data->clip, &size, &cfra))) {
                ImBuf *ibuf;
 
-               ibuf = IMB_ibImageFromMemory(mem, size, IB_rect | IB_multilayer | IB_alphamode_detect, NULL, "proxy frame");
+               ibuf = IMB_ibImageFromMemory(mem, size, IB_rect | IB_multilayer | IB_alphamode_detect,
+                                            data->clip->colorspace_settings.name, "proxy frame");
 
                BKE_movieclip_build_proxy_frame_for_ibuf(data->clip, ibuf, NULL, cfra,
                                                         data->build_sizes, data->build_count, false);
index 3eaf42b1b22ee95d816b2dd4177f17ab6758d312..2afcda8a1a64e2f5146504a6ad35b42589f387a1 100644 (file)
@@ -1265,8 +1265,8 @@ struct anim *IMB_anim_open_proxy(
 
        get_proxy_filename(anim, preview_size, fname, FALSE);
 
-       /* proxies are generated in default color space */
-       anim->proxy_anim[i] = IMB_open_anim(fname, 0, 0, NULL);
+       /* proxies are generated in the same color space as animation itself */
+       anim->proxy_anim[i] = IMB_open_anim(fname, 0, 0, anim->colorspace);
        
        anim->proxies_tried |= preview_size;