Beispiel #1
0
/* similar to BKE_makepicstring() */
void BKE_makeanimstring(char *string, RenderData *rd)
{
	bMovieHandle *mh= BKE_get_movie_handle(rd->im_format.imtype);
	if(mh->get_movie_path)
		mh->get_movie_path(string, rd);
	else
		string[0]= '\0';
}
Beispiel #2
0
/* only this runs inside thread */
static void screenshot_startjob(void *sjv, short *stop, short *do_update, float *UNUSED(progress))
{
	ScreenshotJob *sj= sjv;
	RenderData rd= sj->scene->r;
	bMovieHandle *mh= BKE_get_movie_handle(sj->scene->r.im_format.imtype);
	
	/* we need this as local variables for renderdata */
	rd.frs_sec= U.scrcastfps;
	rd.frs_sec_base= 1.0f;
	
	if(BKE_imtype_is_movie(rd.im_format.imtype)) {
		if(!mh->start_movie(sj->scene, &rd, sj->dumpsx, sj->dumpsy, &sj->reports)) {
			printf("screencast job stopped\n");
			return;
		}
	}
	else
		mh= NULL;
	
	sj->stop= stop;
	sj->do_update= do_update;
	
	*do_update= 1; // wait for opengl rect
	
	while(*stop==0) {
		
		if(sj->dumprect) {
			
			if(mh) {
				if(mh->append_movie(&rd, rd.sfra, rd.cfra, (int *)sj->dumprect,
				                    sj->dumpsx, sj->dumpsy, &sj->reports))
				{
					BKE_reportf(&sj->reports, RPT_INFO, "Appended frame: %d", rd.cfra);
					printf("Appended frame %d\n", rd.cfra);
				} else
					break;
			}
			else {
				ImBuf *ibuf= IMB_allocImBuf(sj->dumpsx, sj->dumpsy, rd.im_format.planes, 0);
				char name[FILE_MAX];
				int ok;
				
				BKE_makepicstring(name, rd.pic, sj->bmain->name, rd.cfra, rd.im_format.imtype, rd.scemode & R_EXTENSION, TRUE);
				
				ibuf->rect= sj->dumprect;
				ok= BKE_write_ibuf(ibuf, name, &rd.im_format);
				
				if(ok==0) {
					printf("Write error: cannot save %s\n", name);
					BKE_reportf(&sj->reports, RPT_INFO, "Write error: cannot save %s\n", name);
					break;
				}
				else {
					printf("Saved file: %s\n", name);
					BKE_reportf(&sj->reports, RPT_INFO, "Saved file: %s", name);
				}
				
				/* imbuf knows which rects are not part of ibuf */
				IMB_freeImBuf(ibuf);	
			}
			
			MEM_freeN(sj->dumprect);
			sj->dumprect= NULL;
			
			*do_update= 1;
			
			rd.cfra++;

		}
		else 
			PIL_sleep_ms(U.scrcastwait);
	}
	
	if(mh)
		mh->end_movie();

	BKE_report(&sj->reports, RPT_INFO, "Screencast job stopped");
}