Port fix from gooseberry that doesn't load the full res file if a proxy
authorAntony Riakiotakis <kalast@gmail.com>
Wed, 4 Feb 2015 17:48:47 +0000 (18:48 +0100)
committerAntony Riakiotakis <kalast@gmail.com>
Wed, 4 Feb 2015 17:48:55 +0000 (18:48 +0100)
is requested.

source/blender/blenkernel/BKE_image.h
source/blender/blenkernel/intern/image.c
source/blender/blenkernel/intern/sequencer.c
source/blender/imbuf/intern/anim_movie.c

index 5ee8ae231d878e99867c0561293b4559b1bfbd37..945224f8bf499fb35d856f661b10277e2c3ab846 100644 (file)
@@ -91,6 +91,7 @@ void    BKE_imformat_defaults(struct ImageFormatData *im_format);
 void    BKE_imbuf_to_image_format(struct ImageFormatData *im_format, const struct ImBuf *imbuf);
 
 struct anim *openanim(const char *name, int flags, int streamindex, char colorspace[IMA_MAX_SPACE]);
+struct anim *openanim_noload(const char *name, int flags, int streamindex, char colorspace[IMA_MAX_SPACE]);
 
 void    BKE_image_de_interlace(struct Image *ima, int odd);
 
index b405e0a6240bcef7a5b1d423c35b56b44a90fa3b..b130372a20cb37215e3c4f6ed7fd93ff5854a3bb 100644 (file)
@@ -2107,6 +2107,14 @@ void BKE_image_path_from_imtype(
        image_path_makepicstring(string, base, relbase, frame, imtype, NULL, use_ext, use_frames);
 }
 
+struct anim *openanim_noload(const char *name, int flags, int streamindex, char colorspace[IMA_MAX_SPACE])
+{
+       struct anim *anim;
+
+       anim = IMB_open_anim(name, flags, streamindex, colorspace);
+       return anim;
+}
+
 /* used by sequencer too */
 struct anim *openanim(const char *name, int flags, int streamindex, char colorspace[IMA_MAX_SPACE])
 {
index 450363692693960418d88ba104adf9cb9b707de4..dd46fdcfbeddf0af1f783a03918fa58d4b1fd66a 100644 (file)
@@ -1330,7 +1330,7 @@ static double seq_rendersize_to_scale_factor(int size)
        return 0.25;
 }
 
-static void seq_open_anim_file(Sequence *seq)
+static void seq_open_anim_file(Sequence *seq, bool openfile)
 {
        char name[FILE_MAX];
        StripProxy *proxy;
@@ -1343,8 +1343,14 @@ static void seq_open_anim_file(Sequence *seq)
                         seq->strip->dir, seq->strip->stripdata->name);
        BLI_path_abs(name, G.main->name);
        
-       seq->anim = openanim(name, IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0),
-                            seq->streamindex, seq->strip->colorspace_settings.name);
+       if (openfile) {
+               seq->anim = openanim(name, IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0),
+                                    seq->streamindex, seq->strip->colorspace_settings.name);
+       }
+       else {
+               seq->anim = openanim_noload(name, IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0),
+                                           seq->streamindex, seq->strip->colorspace_settings.name);
+       }
 
        if (seq->anim == NULL) {
                return;
@@ -1458,7 +1464,7 @@ static ImBuf *seq_proxy_fetch(const SeqRenderData *context, Sequence *seq, int c
                        return NULL;
                }
  
-               seq_open_anim_file(seq);
+               seq_open_anim_file(seq, true);
 
                frameno = IMB_anim_index_get_frame_index(seq->anim, seq->strip->proxy->tc, frameno);
 
@@ -1560,7 +1566,7 @@ SeqIndexBuildContext *BKE_sequencer_proxy_rebuild_context(Main *bmain, Scene *sc
        context->seq = nseq;
 
        if (nseq->type == SEQ_TYPE_MOVIE) {
-               seq_open_anim_file(nseq);
+               seq_open_anim_file(nseq, true);
 
                if (nseq->anim) {
                        context->index_context = IMB_anim_index_rebuild_context(nseq->anim,
@@ -2780,7 +2786,7 @@ static ImBuf *do_render_strip_uncached(const SeqRenderData *context, Sequence *s
 
                case SEQ_TYPE_MOVIE:
                {
-                       seq_open_anim_file(seq);
+                       seq_open_anim_file(seq, false);
 
                        if (seq->anim) {
                                IMB_Proxy_Size proxy_size = seq_rendersize_to_proxysize(context->preview_render_size);
index b8f6e66adfea4deef0203f8c0a3e6ede933225cd..ffdecb793aab8cdc7a514e7e5edc59891b53013f 100644 (file)
@@ -1314,25 +1314,27 @@ struct ImBuf *IMB_anim_absolute(struct anim *anim, int position,
 
        filter_y = (anim->ib_flags & IB_animdeinterlace);
 
-       if (anim->curtype == 0) {
-               ibuf = anim_getnew(anim);
-               if (ibuf == NULL) {
-                       return(NULL);
+       if (preview_size == IMB_PROXY_NONE) {
+               if (anim->curtype == 0) {
+                       ibuf = anim_getnew(anim);
+                       if (ibuf == NULL) {
+                               return(NULL);
+                       }
+
+                       IMB_freeImBuf(ibuf); /* ???? */
+                       ibuf = NULL;
                }
 
-               IMB_freeImBuf(ibuf); /* ???? */
-               ibuf = NULL;
+               if (position < 0) return(NULL);
+               if (position >= anim->duration) return(NULL);
        }
-
-       if (position < 0) return(NULL);
-       if (position >= anim->duration) return(NULL);
-
-       if (preview_size != IMB_PROXY_NONE) {
+       else {
                struct anim *proxy = IMB_anim_open_proxy(anim, preview_size);
 
                if (proxy) {
                        position = IMB_anim_index_get_frame_index(
                            anim, tc, position);
+
                        return IMB_anim_absolute(
                                   proxy, position,
                                   IMB_TC_NONE, IMB_PROXY_NONE);