/* returns true if early out is possible */ static bool prefetch_check_early_out(const bContext *C) { SpaceClip *sc = CTX_wm_space_clip(C); MovieClip *clip = ED_space_clip_get_clip(sc); int first_uncached_frame, end_frame; int clip_len; clip_len = BKE_movieclip_get_duration(clip); /* check whether all the frames from prefetch range are cached */ end_frame = prefetch_get_final_frame(C); first_uncached_frame = prefetch_find_uncached_frame(clip, sc->user.framenr, end_frame, sc->user.render_size, sc->user.render_flag, 1); if (first_uncached_frame > end_frame || first_uncached_frame == clip_len) { int start_frame = prefetch_get_start_frame(C); first_uncached_frame = prefetch_find_uncached_frame(clip, sc->user.framenr, start_frame, sc->user.render_size, sc->user.render_flag, -1); if (first_uncached_frame < start_frame) return true; } return false; }
/* get memory buffer for first uncached frame within prefetch frame range */ static unsigned char *prefetch_thread_next_frame( PrefetchQueue *queue, MovieClip *clip, size_t *r_size, int *r_current_frame) { unsigned char *mem = NULL; BLI_spin_lock(&queue->spin); if (!*queue->stop && !check_prefetch_break() && IN_RANGE_INCL(queue->current_frame, queue->start_frame, queue->end_frame)) { int current_frame; if (queue->forward) { current_frame = prefetch_find_uncached_frame(clip, queue->current_frame + 1, queue->end_frame, queue->render_size, queue->render_flag, 1); /* switch direction if read frames from current up to scene end frames */ if (current_frame > queue->end_frame) { queue->current_frame = queue->initial_frame; queue->forward = false; } } if (!queue->forward) { current_frame = prefetch_find_uncached_frame(clip, queue->current_frame - 1, queue->start_frame, queue->render_size, queue->render_flag, -1); } if (IN_RANGE_INCL(current_frame, queue->start_frame, queue->end_frame)) { int frames_processed; mem = prefetch_read_file_to_memory(clip, current_frame, queue->render_size, queue->render_flag, r_size); *r_current_frame = current_frame; queue->current_frame = current_frame; if (queue->forward) { frames_processed = queue->current_frame - queue->initial_frame; } else { frames_processed = (queue->end_frame - queue->initial_frame) + (queue->initial_frame - queue->current_frame); } *queue->do_update = 1; *queue->progress = (float)frames_processed / (queue->end_frame - queue->start_frame); } } BLI_spin_unlock(&queue->spin); return mem; }