[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38142] trunk/blender/source: Fix #27877: writing .avi files > 4 GB not working on windows.

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Jul 6 12:19:06 CEST 2011


Revision: 38142
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38142
Author:   blendix
Date:     2011-07-06 10:19:04 +0000 (Wed, 06 Jul 2011)
Log Message:
-----------
Fix #27877: writing .avi files > 4 GB not working on windows.

Solution is to replace "long" by "int64_t" and "fseek" by "_fseeki64", because
long on 64 bit windows is still 32 bit.

Modified Paths:
--------------
    trunk/blender/source/blender/avi/AVI_avi.h
    trunk/blender/source/blender/avi/CMakeLists.txt
    trunk/blender/source/blender/avi/SConscript
    trunk/blender/source/blender/avi/intern/avi.c
    trunk/blender/source/blender/avi/intern/options.c
    trunk/blender/source/blender/blenlib/BLI_winstuff.h
    trunk/blender/source/blender/blenlib/intern/storage.c
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp

Modified: trunk/blender/source/blender/avi/AVI_avi.h
===================================================================
--- trunk/blender/source/blender/avi/AVI_avi.h	2011-07-06 10:05:27 UTC (rev 38141)
+++ trunk/blender/source/blender/avi/AVI_avi.h	2011-07-06 10:19:04 UTC (rev 38142)
@@ -55,11 +55,12 @@
 #ifndef __AVI_H__
 #define __AVI_H__
 
+#include "MEM_sys_types.h"
 #include <stdio.h> /* for FILE */
 
 typedef struct _AviChunk {
   int fcc;
-  int size;
+  int64_t size;
 } AviChunk;
 
 typedef struct _AviList {
@@ -185,16 +186,16 @@
 #define AVI_MOVIE_READ  0
 #define AVI_MOVIE_WRITE 1
 	
-	unsigned long size;
+	int64_t size;
 
 	AviMainHeader *header;
 	AviStreamRec *streams;
 	AviIndexEntry *entries;
 	int index_entries;
 	
-	int movi_offset;
-	int read_offset;
-	long *offset_table;
+	int64_t movi_offset;
+	int64_t read_offset;
+	int64_t *offset_table;
 	
 	/* Local data goes here */
 	int interlace;

Modified: trunk/blender/source/blender/avi/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/avi/CMakeLists.txt	2011-07-06 10:05:27 UTC (rev 38141)
+++ trunk/blender/source/blender/avi/CMakeLists.txt	2011-07-06 10:19:04 UTC (rev 38142)
@@ -27,6 +27,7 @@
 set(INC 
 	.
 	../../../intern/guardedalloc
+	../blenlib
 )
 
 set(INC_SYS

Modified: trunk/blender/source/blender/avi/SConscript
===================================================================
--- trunk/blender/source/blender/avi/SConscript	2011-07-06 10:05:27 UTC (rev 38141)
+++ trunk/blender/source/blender/avi/SConscript	2011-07-06 10:19:04 UTC (rev 38142)
@@ -3,7 +3,7 @@
 
 sources = env.Glob('intern/*.c')
 
-incs = '. #/intern/guardedalloc'
+incs = '. #/intern/guardedalloc ../blenlib'
 incs += ' ' + env['BF_JPEG_INC']
 
 env.BlenderLib ('bf_avi', sources, Split(incs), [], libtype=['core','player'], priority = [190,120] )

Modified: trunk/blender/source/blender/avi/intern/avi.c
===================================================================
--- trunk/blender/source/blender/avi/intern/avi.c	2011-07-06 10:05:27 UTC (rev 38141)
+++ trunk/blender/source/blender/avi/intern/avi.c	2011-07-06 10:19:04 UTC (rev 38142)
@@ -42,7 +42,10 @@
 #include <ctype.h>
 
 #include "MEM_guardedalloc.h"
+#include "MEM_sys_types.h"
 
+#include "BLI_winstuff.h"
+
 #include "AVI_avi.h"
 #include "avi_intern.h"
 
@@ -593,7 +596,6 @@
 
 	movie->movi_offset = ftell (movie->fp);
 	movie->read_offset = movie->movi_offset;
-	if (AVI_DEBUG) printf ("movi_offset is %d\n", movie->movi_offset);
 	
 	/* Read in the index if the file has one, otherwise create one */
 	if (movie->header->Flags & AVIF_HASINDEX) {
@@ -707,8 +709,8 @@
 	AviList list;
 	AviChunk chunk;
 	int i;
-	int header_pos1, header_pos2;
-	int stream_pos1, stream_pos2;
+	int64_t header_pos1, header_pos2;
+	int64_t stream_pos1, stream_pos2;
 
 	movie->type = AVI_MOVIE_WRITE;
 	movie->fp = fopen (name, "wb");
@@ -718,7 +720,7 @@
 	if (movie->fp == NULL)
 		return AVI_ERROR_OPEN;
 
-	movie->offset_table = (long *) MEM_mallocN ((1+streams*2) * sizeof (long),"offsettable");
+	movie->offset_table = (int64_t *) MEM_mallocN ((1+streams*2) * sizeof (int64_t),"offsettable");
 	
 	for (i=0; i < 1 + streams*2; i++)
 		movie->offset_table[i] = -1L;
@@ -897,7 +899,7 @@
 	AviIndexEntry *temp;
 	va_list ap;
 	int stream;
-	long rec_off;
+	int64_t rec_off;
 	AviFormat format;
 	void *buffer;
 	int size;

Modified: trunk/blender/source/blender/avi/intern/options.c
===================================================================
--- trunk/blender/source/blender/avi/intern/options.c	2011-07-06 10:05:27 UTC (rev 38141)
+++ trunk/blender/source/blender/avi/intern/options.c	2011-07-06 10:19:04 UTC (rev 38142)
@@ -40,6 +40,8 @@
 #include "avi_intern.h"
 #include "endian.h"
 
+#include "BLI_winstuff.h"
+
 /* avi_set_compress_options gets its own file... now don't WE feel important? */
 
 AviError AVI_set_compress_option (AviMovie *movie, int option_type, int stream, AviOption option, void *opt_data) {

Modified: trunk/blender/source/blender/blenlib/BLI_winstuff.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_winstuff.h	2011-07-06 10:05:27 UTC (rev 38141)
+++ trunk/blender/source/blender/blenlib/BLI_winstuff.h	2011-07-06 10:19:04 UTC (rev 38142)
@@ -98,6 +98,15 @@
 typedef unsigned int mode_t;
 #endif
 
+/* use functions that take a 64 bit offset for files larger than 4GB */
+#ifndef FREE_WINDOWS
+#include <stdio.h>
+#define fseek(stream, offset, origin) _fseeki64(stream, offset, origin)
+#define ftell(stream) _ftelli64(stream)
+#define lseek(fd, offset, origin) _lseeki64(fd, offset, origin)
+#define tell(fd) _telli64(fd)
+#endif
+
 /* mingw using _SSIZE_T_ to declare ssize_t type */
 #ifndef _SSIZE_T_
 #define _SSIZE_T_

Modified: trunk/blender/source/blender/blenlib/intern/storage.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/storage.c	2011-07-06 10:05:27 UTC (rev 38141)
+++ trunk/blender/source/blender/blenlib/intern/storage.c	2011-07-06 10:19:04 UTC (rev 38142)
@@ -478,7 +478,7 @@
 	FILE *fp= fopen(name, "r");
 	LinkNode *lines= NULL;
 	char *buf;
-	int size;
+	int64_t size;
 
 	if (!fp) return NULL;
 		

Modified: trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp	2011-07-06 10:05:27 UTC (rev 38141)
+++ trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp	2011-07-06 10:19:04 UTC (rev 38142)
@@ -327,7 +327,7 @@
 {
 	char marshal_path[512];
 	char *marshal_buffer = NULL;
-	unsigned int marshal_length;
+	size_t marshal_length;
 	FILE *fp = NULL;
 	int result;
 
@@ -338,7 +338,7 @@
 	if (fp) {
 		// obtain file size:
 		fseek (fp, 0, SEEK_END);
-		marshal_length = ftell(fp);
+		marshal_length = (size_t)ftell(fp);
 		rewind(fp);
 
 		marshal_buffer = (char*)malloc (sizeof(char)*marshal_length);




More information about the Bf-blender-cvs mailing list