Ejemplo n.º 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;
}
Ejemplo n.º 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;
}