static void *do_prefetch_thread(void *data_v) { PrefetchThread *data = (PrefetchThread *) data_v; MovieClip *clip = data->clip; unsigned char *mem; size_t size; int current_frame; while ((mem = prefetch_thread_next_frame(data->queue, data->clip, &size, ¤t_frame))) { ImBuf *ibuf; MovieClipUser user = {0}; int flag = IB_rect | IB_alphamode_detect; int result; user.framenr = current_frame; user.render_size = data->queue->render_size; user.render_flag = data->queue->render_flag; ibuf = IMB_ibImageFromMemory(mem, size, flag, clip->colorspace_settings.name, "prefetch frame"); result = BKE_movieclip_put_frame_if_possible(data->clip, &user, ibuf); IMB_freeImBuf(ibuf); MEM_freeN(mem); if (!result) { /* no more space in the cache, stop reading frames */ *data->queue->stop = 1; break; } } return NULL; }
static void prefetch_task_func(TaskPool *pool, void *task_data, int UNUSED(threadid)) { PrefetchQueue *queue = (PrefetchQueue *)BLI_task_pool_userdata(pool); MovieClip *clip = (MovieClip *)task_data; unsigned char *mem; size_t size; int current_frame; while ((mem = prefetch_thread_next_frame(queue, clip, &size, ¤t_frame))) { ImBuf *ibuf; MovieClipUser user = {0}; int flag = IB_rect | IB_alphamode_detect; int result; char *colorspace_name = NULL; const bool use_proxy = (clip->flag & MCLIP_USE_PROXY) && (queue->render_size != MCLIP_PROXY_RENDER_SIZE_FULL); user.framenr = current_frame; user.render_size = queue->render_size; user.render_flag = queue->render_flag; /* Proxies are stored in the display space. */ if (!use_proxy) { colorspace_name = clip->colorspace_settings.name; } ibuf = IMB_ibImageFromMemory(mem, size, flag, colorspace_name, "prefetch frame"); result = BKE_movieclip_put_frame_if_possible(clip, &user, ibuf); IMB_freeImBuf(ibuf); MEM_freeN(mem); if (!result) { /* no more space in the cache, stop reading frames */ *queue->stop = 1; break; } } }
static bool prefetch_movie_frame(MovieClip *clip, int frame, short render_size, short render_flag, short *stop) { MovieClipUser user = {0}; ImBuf *ibuf; if (check_prefetch_break() || *stop) return false; user.framenr = frame; user.render_size = render_size; user.render_flag = render_flag; if (!BKE_movieclip_has_cached_frame(clip, &user)) { ibuf = BKE_movieclip_anim_ibuf_for_frame(clip, &user); if (ibuf) { int result; result = BKE_movieclip_put_frame_if_possible(clip, &user, ibuf); if (!result) { /* no more space in the cache, we could stop prefetching here */ *stop = 1; } IMB_freeImBuf(ibuf); } else { /* error reading frame, fair enough stop attempting further reading */ *stop = 1; } } return true; }