Exemple #1
0
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, &current_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;
}
Exemple #2
0
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, &current_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;
		}
	}
}
Exemple #3
0
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;
}