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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to