[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