/* only this runs inside thread */ static void proxy_startjob(void *pjv, short *stop, short *do_update, float *progress) { ProxyJob *pj = pjv; Scene *scene = pj->scene; MovieClip *clip = pj->clip; struct MovieDistortion *distortion = NULL; short size_flag; int cfra, sfra = SFRA, efra = EFRA; int build_sizes[4], build_count = 0; int build_undistort_sizes[4], build_undistort_count = 0; size_flag = clip->proxy.build_size_flag; build_count = proxy_bitflag_to_array(size_flag, build_sizes, 0); build_undistort_count = proxy_bitflag_to_array(size_flag, build_undistort_sizes, 1); if (clip->source == MCLIP_SRC_MOVIE) { if (pj->index_context) IMB_anim_index_rebuild(pj->index_context, stop, do_update, progress); if (!build_undistort_count) { if (*stop) pj->stop = 1; return; } else { sfra = 1; efra = IMB_anim_get_duration(clip->anim, IMB_TC_NONE); } } if (build_undistort_count) distortion = BKE_tracking_distortion_new(); for (cfra = sfra; cfra <= efra; cfra++) { if (clip->source != MCLIP_SRC_MOVIE) BKE_movieclip_build_proxy_frame(clip, pj->clip_flag, NULL, cfra, build_sizes, build_count, 0); BKE_movieclip_build_proxy_frame(clip, pj->clip_flag, distortion, cfra, build_undistort_sizes, build_undistort_count, 1); if (*stop || G.afbreek) break; *do_update = TRUE; *progress = ((float) cfra - sfra) / (efra - sfra); } if (distortion) BKE_tracking_distortion_free(distortion); if (*stop) pj->stop = 1; }
/* simple case for movies -- handle frame-by-frame, do threading within single frame */ static void do_movie_proxy(void *pjv, int *UNUSED(build_sizes), int UNUSED(build_count), int *build_undistort_sizes, int build_undistort_count, short *stop, short *do_update, float *progress) { ProxyJob *pj = pjv; Scene *scene = pj->scene; MovieClip *clip = pj->clip; struct MovieDistortion *distortion = NULL; int cfra, sfra = SFRA, efra = EFRA; if (pj->index_context) IMB_anim_index_rebuild(pj->index_context, stop, do_update, progress); if (!build_undistort_count) { if (*stop) pj->stop = 1; return; } else { sfra = 1; efra = clip->len; } if (build_undistort_count) { int threads = BLI_system_thread_count(); int width, height; BKE_movieclip_get_size(clip, NULL, &width, &height); distortion = BKE_tracking_distortion_new(&clip->tracking, width, height); BKE_tracking_distortion_set_threads(distortion, threads); } for (cfra = sfra; cfra <= efra; cfra++) { BKE_movieclip_build_proxy_frame(clip, pj->clip_flag, distortion, cfra, build_undistort_sizes, build_undistort_count, 1); if (*stop || G.is_break) break; *do_update = true; *progress = ((float) cfra - sfra) / (efra - sfra); } if (distortion) BKE_tracking_distortion_free(distortion); if (*stop) pj->stop = 1; }
static void do_sequence_proxy(void *pjv, int *build_sizes, int build_count, int *build_undistort_sizes, int build_undistort_count, short *stop, short *do_update, float *progress) { ProxyJob *pj = pjv; MovieClip *clip = pj->clip; Scene *scene = pj->scene; int sfra = SFRA, efra = EFRA; ProxyThread *handles; ListBase threads; int i, tot_thread = BLI_system_thread_count(); ProxyQueue queue; BLI_spin_init(&queue.spin); queue.cfra = sfra; queue.sfra = sfra; queue.efra = efra; queue.stop = stop; queue.do_update = do_update; queue.progress = progress; handles = MEM_callocN(sizeof(ProxyThread) * tot_thread, "proxy threaded handles"); if (tot_thread > 1) BLI_init_threads(&threads, do_proxy_thread, tot_thread); for (i = 0; i < tot_thread; i++) { ProxyThread *handle = &handles[i]; handle->clip = clip; handle->queue = &queue; handle->build_count = build_count; handle->build_sizes = build_sizes; handle->build_undistort_count = build_undistort_count; handle->build_undistort_sizes = build_undistort_sizes; if (build_undistort_count) handle->distortion = BKE_tracking_distortion_new(); if (tot_thread > 1) BLI_insert_thread(&threads, handle); } if (tot_thread > 1) BLI_end_threads(&threads); else do_proxy_thread(handles); MEM_freeN(handles); if (build_undistort_count) { for (i = 0; i < tot_thread; i++) { ProxyThread *handle = &handles[i]; BKE_tracking_distortion_free(handle->distortion); } } }
static void do_sequence_proxy(void *pjv, int *build_sizes, int build_count, int *build_undistort_sizes, int build_undistort_count, short *stop, short *do_update, float *progress) { ProxyJob *pj = pjv; MovieClip *clip = pj->clip; Scene *scene = pj->scene; TaskScheduler *task_scheduler = BLI_task_scheduler_get(); TaskPool *task_pool; int sfra = SFRA, efra = EFRA; ProxyThread *handles; int i, tot_thread = BLI_task_scheduler_num_threads(task_scheduler); int width, height; ProxyQueue queue; if (build_undistort_count) { BKE_movieclip_get_size(clip, NULL, &width, &height); } BLI_spin_init(&queue.spin); queue.cfra = sfra; queue.sfra = sfra; queue.efra = efra; queue.stop = stop; queue.do_update = do_update; queue.progress = progress; task_pool = BLI_task_pool_create(task_scheduler, &queue); handles = MEM_callocN(sizeof(ProxyThread) * tot_thread, "proxy threaded handles"); for (i = 0; i < tot_thread; i++) { ProxyThread *handle = &handles[i]; handle->clip = clip; handle->build_count = build_count; handle->build_sizes = build_sizes; handle->build_undistort_count = build_undistort_count; handle->build_undistort_sizes = build_undistort_sizes; if (build_undistort_count) { handle->distortion = BKE_tracking_distortion_new(&clip->tracking, width, height); } BLI_task_pool_push(task_pool, proxy_task_func, handle, false, TASK_PRIORITY_LOW); } BLI_task_pool_work_and_wait(task_pool); BLI_task_pool_free(task_pool); if (build_undistort_count) { for (i = 0; i < tot_thread; i++) { ProxyThread *handle = &handles[i]; BKE_tracking_distortion_free(handle->distortion); } } BLI_spin_end(&queue.spin); MEM_freeN(handles); }