Example #1
0
/* 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;
}
Example #2
0
/* 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;
}
Example #3
0
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);
		}
	}
}
Example #4
0
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);
}