[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12320] trunk/blender/source: == Core ==

Peter Schlaile peter at schlaile.de
Sun Oct 21 17:42:08 CEST 2007


Revision: 12320
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12320
Author:   schlaile
Date:     2007-10-21 17:42:08 +0200 (Sun, 21 Oct 2007)

Log Message:
-----------
== Core ==

This adds fractional FPS support to blender and should finally
make NTSC work correctly.

NTSC has an FPS of 30.0/1.001 which is approximately 29.97 FPS.
Therefore, it is not enough to simply make frs_sec a float, since
you can't represent this accurately enough. 
I added a seperate variable frs_sec_base and FPS is now 
frs_sec / frs_sec_base.

I changed all the places, where frs_sec was used to my best knowledge.

For convenience sake, I added several macros, that should make life
easier in the future:

FRA2TIME(a) : convert frame number to a double precision time in seconds
TIME2FRA(a) : the same in the opposite direction
FPS         : return current FPS as a double precision number 
              (last resort)

This closes bug #6715 
Standard framerates not supported / breaks sync -- 23.967 29.967 etc.

https://projects.blender.org/tracker/?func=detail&aid=6715&group_id=9&atid=125

Please give this heavy testing with NTSC files, quicktime in/export
and the python interface.
Errors are most probably only spotted on longer timelines, so that is
also important.

The patch was tested by Troy Sobotka and me, so it most probably should
work out of the box, but wider testing is important, since errors are
very subtle.

Enjoy!

Modified Paths:
--------------
    trunk/blender/source/blender/avi/intern/options.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenkernel/intern/writeavi.c
    trunk/blender/source/blender/blenkernel/intern/writeffmpeg.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/include/BIF_editsound.h
    trunk/blender/source/blender/include/blendef.h
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/python/api2_2x/sceneRender.c
    trunk/blender/source/blender/python/api2_2x/sceneSequence.c
    trunk/blender/source/blender/quicktime/apple/quicktime_export.c
    trunk/blender/source/blender/src/buttons_scene.c
    trunk/blender/source/blender/src/drawipo.c
    trunk/blender/source/blender/src/drawseq.c
    trunk/blender/source/blender/src/drawsound.c
    trunk/blender/source/blender/src/drawtime.c
    trunk/blender/source/blender/src/drawview.c
    trunk/blender/source/blender/src/editipo.c
    trunk/blender/source/blender/src/editipo_mods.c
    trunk/blender/source/blender/src/editnla.c
    trunk/blender/source/blender/src/editscreen.c
    trunk/blender/source/blender/src/editseq.c
    trunk/blender/source/blender/src/edittime.c
    trunk/blender/source/blender/src/hddaudio.c
    trunk/blender/source/blender/src/header_time.c
    trunk/blender/source/blender/src/seqaudio.c
    trunk/blender/source/blender/src/transform.c
    trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp

Modified: trunk/blender/source/blender/avi/intern/options.c
===================================================================
--- trunk/blender/source/blender/avi/intern/options.c	2007-10-21 14:45:49 UTC (rev 12319)
+++ trunk/blender/source/blender/avi/intern/options.c	2007-10-21 15:42:08 UTC (rev 12320)
@@ -99,8 +99,8 @@
 				break;
 				
 			case AVI_OPTION_FRAMERATE:
-				if (1000000/(*((int *) opt_data)))
-					movie->header->MicroSecPerFrame = 1000000/(*((int *) opt_data));					
+				if (1000000/(*((double *) opt_data)))
+					movie->header->MicroSecPerFrame = 1000000/(*((double *) opt_data));					
 
 				for (i=0; i < movie->header->Streams; i++) {
 					if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) {

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2007-10-21 14:45:49 UTC (rev 12319)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2007-10-21 15:42:08 UTC (rev 12320)
@@ -197,6 +197,7 @@
 	sce->r.images= 100;
 	sce->r.framelen= 1.0;
 	sce->r.frs_sec= 25;
+	sce->r.frs_sec_base= 1;
 	sce->r.ocres = 128;
 	
 	sce->r.bake_mode= 1;	/* prevent to include render stuff here */

Modified: trunk/blender/source/blender/blenkernel/intern/writeavi.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/writeavi.c	2007-10-21 14:45:49 UTC (rev 12319)
+++ trunk/blender/source/blender/blenkernel/intern/writeavi.c	2007-10-21 15:42:08 UTC (rev 12320)
@@ -138,7 +138,8 @@
 	int x, y;
 	char name[256];
 	AviFormat format;
-	int quality, framerate;
+	int quality;
+	double framerate;
 	
 	makeavistring(rd, name);
 
@@ -147,7 +148,7 @@
 	y = recty;
 
 	quality= rd->quality;
-	framerate= rd->frs_sec;
+	framerate= (double) rd->frs_sec / (double) rd->frs_sec_base;
 	
 	avi = MEM_mallocN (sizeof(AviMovie), "avimovie");
 

Modified: trunk/blender/source/blender/blenkernel/intern/writeffmpeg.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/writeffmpeg.c	2007-10-21 14:45:49 UTC (rev 12319)
+++ trunk/blender/source/blender/blenkernel/intern/writeffmpeg.c	2007-10-21 15:42:08 UTC (rev 12320)
@@ -355,18 +355,26 @@
 	if (ffmpeg_type == FFMPEG_DV && G.scene->r.frs_sec != 25) {
 		c->time_base.den = 2997;
 		c->time_base.num = 100;
+	} else if ((double) ((int) G.scene->r.frs_sec_base) == 
+		   G.scene->r.frs_sec_base) {
+		c->time_base.den = G.scene->r.frs_sec;
+		c->time_base.num = (int) G.scene->r.frs_sec_base;
 	} else {
-		c->time_base.den = G.scene->r.frs_sec;
-		c->time_base.num = 1;
+		c->time_base.den = G.scene->r.frs_sec * 100000;
+		c->time_base.num = ((double) G.scene->r.frs_sec_base) * 100000;
 	}
 #else
 	/* FIXME: Really bad hack (tm) for NTSC support */
 	if (ffmpeg_type == FFMPEG_DV && G.scene->r.frs_sec != 25) {
 		c->frame_rate = 2997;
 		c->frame_rate_base = 100;
+	} else if ((double) ((int) G.scene->r.frs_sec_base) == 
+		   G.scene->r.frs_sec_base) {
+		c->frame_rate = G.scene->r.frs_sec;
+		c->frame_rate_base = G.scene->r.frs_sec_base;
 	} else {
-		c->frame_rate = G.scene->r.frs_sec;
-		c->frame_rate_base = 1;
+		c->frame_rate = G.scene->r.frs_sec * 100000;
+		c->frame_rate_base = ((double) G.scene->r.frs_sec_base)*100000;
 	}
 #endif
 	

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2007-10-21 14:45:49 UTC (rev 12319)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2007-10-21 15:42:08 UTC (rev 12320)
@@ -6743,11 +6743,21 @@
 	}
 
 	if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 2)) {
-		Image *ima;	
+		Image *ima;
+		Scene *sce;
+
 		/* initialize 1:1 Aspect */
 		for(ima= main->image.first; ima; ima= ima->id.next) {
 			ima->aspx = ima->aspy = 1.0f;				
 		}
+
+		/* fix frs_sec_base */
+		for(sce= main->scene.first; sce; sce= sce->id.next) {
+			if (sce->r.frs_sec_base == 0) {
+				sce->r.frs_sec_base = 1;
+			}
+		}
+
 	}
 
 	if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 4)) {

Modified: trunk/blender/source/blender/include/BIF_editsound.h
===================================================================
--- trunk/blender/source/blender/include/BIF_editsound.h	2007-10-21 14:45:49 UTC (rev 12319)
+++ trunk/blender/source/blender/include/BIF_editsound.h	2007-10-21 15:42:08 UTC (rev 12320)
@@ -71,7 +71,7 @@
 struct hdaudio * sound_open_hdaudio(char * name);
 struct hdaudio * sound_copy_hdaudio(struct hdaudio * c);
 
-long sound_hdaudio_get_duration(struct hdaudio * hdaudio, int frame_rate);
+long sound_hdaudio_get_duration(struct hdaudio * hdaudio, double frame_rate);
 void sound_hdaudio_extract(struct hdaudio * hdaudio, 
 			   short * target_buffer,
 			   int sample_position /* units of target_rate */,

Modified: trunk/blender/source/blender/include/blendef.h
===================================================================
--- trunk/blender/source/blender/include/blendef.h	2007-10-21 14:45:49 UTC (rev 12319)
+++ trunk/blender/source/blender/include/blendef.h	2007-10-21 15:42:08 UTC (rev 12320)
@@ -113,6 +113,9 @@
 #define	EFRA			(G.scene->r.efra)
 #define PSFRA			((G.scene->r.psfra != 0)? (G.scene->r.psfra): (G.scene->r.sfra))
 #define PEFRA			((G.scene->r.psfra != 0)? (G.scene->r.pefra): (G.scene->r.efra))
+#define FRA2TIME(a)           ((((double) G.scene->r.frs_sec_base) * (a)) / G.scene->r.frs_sec)
+#define TIME2FRA(a)           ((((double) G.scene->r.frs_sec) * (a)) / G.scene->r.frs_sec_base)
+#define FPS                     (((double) G.scene->r.frs_sec) / G.scene->r.frs_sec_base)
 
 #define ISPOIN(a, b, c)			( (a->b) && (a->c) )
 #define ISPOIN3(a, b, c, d)		( (a->b) && (a->c) && (a->d) )

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h	2007-10-21 14:45:49 UTC (rev 12319)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h	2007-10-21 15:42:08 UTC (rev 12320)
@@ -241,16 +241,17 @@
 	 */
 	short osa;
 	
-	short frs_sec, edgeint;
-
 	/* safety, border and display rect */
 	rctf safety, border;
 	rcti disprect;
 	
 	/* information on different layers to be rendered */
 	ListBase layers;
-	short actlay, pad;
-	int pad2;
+	short actlay, pad2;
+
+	short edgeint;
+	short frs_sec;
+	float frs_sec_base;
 	
 	/**
 	 * Value used to define filter size for all filter options  */

Modified: trunk/blender/source/blender/python/api2_2x/sceneRender.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/sceneRender.c	2007-10-21 14:45:49 UTC (rev 12319)
+++ trunk/blender/source/blender/python/api2_2x/sceneRender.c	2007-10-21 15:42:08 UTC (rev 12320)
@@ -75,6 +75,7 @@
 	EXPP_RENDER_ATTR_SFRAME,
 	EXPP_RENDER_ATTR_EFRAME,
 	EXPP_RENDER_ATTR_FPS,
+	EXPP_RENDER_ATTR_FPS_BASE,
 	EXPP_RENDER_ATTR_SIZEX,
 	EXPP_RENDER_ATTR_SIZEY,
 	EXPP_RENDER_ATTR_GAUSSFILTER,
@@ -285,7 +286,8 @@
 static void M_Render_DoSizePreset( BPy_RenderData * self, short xsch,
 				   short ysch, short xasp, short yasp,
 				   short size, short xparts, short yparts,
-				   short frames, float a, float b, float c,
+				   short fps, float fps_base,
+				   float a, float b, float c,
 				   float d )
 {
 	self->renderContext->xsch = xsch;
@@ -293,7 +295,8 @@
 	self->renderContext->xasp = xasp;
 	self->renderContext->yasp = yasp;
 	self->renderContext->size = size;
-	self->renderContext->frs_sec = frames;
+	self->renderContext->frs_sec = fps;
+	self->renderContext->frs_sec_base = fps_base;
 	self->renderContext->xparts = xparts;
 	self->renderContext->yparts = yparts;
 
@@ -1022,6 +1025,12 @@
 					      120 );
 }
 
+PyObject *RenderData_FramesPerSecBase( BPy_RenderData * self, PyObject * args )
+{
+	return M_Render_GetSetAttributeFloat( 
+		args, &self->renderContext->frs_sec_base, 1.0f, 120.0f );
+}
+
 PyObject *RenderData_EnableGrayscale( BPy_RenderData * self )
 {
 	self->renderContext->planes = R_PLANESBW;
@@ -1057,20 +1066,24 @@
 	if( type == B_PR_PAL ) {
 		M_Render_DoSizePreset( self, 720, 576, 54, 51, 100,
 				       self->renderContext->xparts,
-				       self->renderContext->yparts, 25, 0.1f,
+				       self->renderContext->yparts, 25, 1.0f,
+				       0.1f,
 				       0.9f, 0.1f, 0.9f );
 		self->renderContext->mode &= ~R_PANORAMA;
 		BLI_init_rctf( &self->renderContext->safety, 0.1f, 0.9f, 0.1f,
 			       0.9f );
 	} else if( type == B_PR_NTSC ) {
 		M_Render_DoSizePreset( self, 720, 480, 10, 11, 100, 1, 1,
-				       30, 0.1f, 0.9f, 0.1f, 0.9f );
+				       30, 1.001f, 
+				       0.1f, 0.9f, 0.1f, 0.9f );
 		self->renderContext->mode &= ~R_PANORAMA;
 		BLI_init_rctf( &self->renderContext->safety, 0.1f, 0.9f, 0.1f,
 			       0.9f );
 	} else if( type == B_PR_PRESET ) {
 		M_Render_DoSizePreset( self, 720, 576, 54, 51, 100, 1, 1,
-				       self->renderContext->frs_sec, 0.1f, 0.9f,
+				       self->renderContext->frs_sec, 
+				       self->renderContext->frs_sec_base, 
+				       0.1f, 0.9f,
 				       0.1f, 0.9f );
 		self->renderContext->mode = R_OSA + R_SHADOW + R_FIELDS;
 		self->renderContext->imtype = R_TARGA;
@@ -1078,34 +1091,42 @@
 			       0.9f );
 	} else if( type == B_PR_PRV ) {
 		M_Render_DoSizePreset( self, 640, 512, 1, 1, 50, 1, 1,
-				       self->renderContext->frs_sec, 0.1f, 0.9f,
+				       self->renderContext->frs_sec, 
+				       self->renderContext->frs_sec_base, 
+				       0.1f, 0.9f,
 				       0.1f, 0.9f );
 		self->renderContext->mode &= ~R_PANORAMA;
 		BLI_init_rctf( &self->renderContext->safety, 0.1f, 0.9f, 0.1f,
 			       0.9f );
 	} else if( type == B_PR_PC ) {
 		M_Render_DoSizePreset( self, 640, 480, 100, 100, 100, 1, 1,
-				       self->renderContext->frs_sec, 0.0f, 1.0f,
+				       self->renderContext->frs_sec, 
+				       self->renderContext->frs_sec_base, 
+				       0.0f, 1.0f,
 				       0.0f, 1.0f );
 		self->renderContext->mode &= ~R_PANORAMA;
 		BLI_init_rctf( &self->renderContext->safety, 0.0f, 1.0f, 0.0f,
 			       1.0f );
 	} else if( type == B_PR_PAL169 ) {
 		M_Render_DoSizePreset( self, 720, 576, 64, 45, 100, 1, 1,
-				       25, 0.1f, 0.9f, 0.1f, 0.9f );
+				       25, 1.0f, 0.1f, 0.9f, 0.1f, 0.9f );

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list