static unsigned char *proxy_thread_next_frame(ProxyQueue *queue, MovieClip *clip, size_t *size_r, int *cfra_r) { unsigned char *mem = NULL; BLI_spin_lock(&queue->spin); if (!*queue->stop && queue->cfra <= queue->efra) { MovieClipUser user = {0}; char name[FILE_MAX]; size_t size; int file; user.framenr = queue->cfra; BKE_movieclip_filename_for_frame(clip, &user, name); file = open(name, O_BINARY | O_RDONLY, 0); if (file < 0) { BLI_spin_unlock(&queue->spin); return NULL; } size = BLI_file_descriptor_size(file); if (size < 1) { close(file); BLI_spin_unlock(&queue->spin); return NULL; } mem = MEM_mallocN(size, "movieclip proxy memory file"); if (read(file, mem, size) != size) { close(file); BLI_spin_unlock(&queue->spin); MEM_freeN(mem); return NULL; } *size_r = size; *cfra_r = queue->cfra; queue->cfra++; close(file); *queue->do_update = 1; *queue->progress = (float)(queue->cfra - queue->sfra) / (queue->efra - queue->sfra); } BLI_spin_unlock(&queue->spin); return mem; }
/* read file for specified frame number to the memory */ static unsigned char *prefetch_read_file_to_memory( MovieClip *clip, int current_frame, short render_size, short render_flag, size_t *r_size) { MovieClipUser user = {0}; char name[FILE_MAX]; size_t size; int file; unsigned char *mem; user.framenr = current_frame; user.render_size = render_size; user.render_flag = render_flag; BKE_movieclip_filename_for_frame(clip, &user, name); file = BLI_open(name, O_BINARY | O_RDONLY, 0); if (file == -1) { return NULL; } size = BLI_file_descriptor_size(file); if (size < 1) { close(file); return NULL; } mem = MEM_mallocN(size, "movieclip prefetch memory file"); if (read(file, mem, size) != size) { close(file); MEM_freeN(mem); return NULL; } *r_size = size; close(file); return mem; }