Fix #27877: writing .avi files > 4 GB not working on windows.
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 6 Jul 2011 10:19:04 +0000 (10:19 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 6 Jul 2011 10:19:04 +0000 (10:19 +0000)
Solution is to replace "long" by "int64_t" and "fseek" by "_fseeki64", because
long on 64 bit windows is still 32 bit.

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

index 85685e2bd4cbafe3bdf75274962b241b1d7321ad..1446971a8ac7f34e4181e6179493c65aaa259675 100644 (file)
 #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 @@ typedef struct _AviMovie {
 #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;
index b62e0cc5afd6b95e86c58d65269b224a4dded621..bae61fd678b268e45af48dbe0961e6db03cb522f 100644 (file)
@@ -27,6 +27,7 @@
 set(INC 
        .
        ../../../intern/guardedalloc
+       ../blenlib
 )
 
 set(INC_SYS
index 0bf8c3c74db3219d208b22b9f834ee5d014bcfdd..4d2ce8fd845026c656f00481705df0e8adab0896 100644 (file)
@@ -3,7 +3,7 @@ Import ('env')
 
 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] )
index 82bf3a3d21b76b9edc1a4190c059b24bdb0a783e..ff3aafbf0655b0517039908544243029922781a1 100644 (file)
@@ -42,6 +42,9 @@
 #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 @@ AviError AVI_open_movie (const char *name, AviMovie *movie) {
 
        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 @@ AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...) {
        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 @@ AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...) {
        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 @@ AviError AVI_write_frame (AviMovie *movie, int frame_num, ...) {
        AviIndexEntry *temp;
        va_list ap;
        int stream;
-       long rec_off;
+       int64_t rec_off;
        AviFormat format;
        void *buffer;
        int size;
index edb708d8a691c349fb4cd4619cef9f571be2a916..96c62843436656215a67772ac971e3804bd2b473 100644 (file)
@@ -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) {
index d0eb3c7d67d3d6a4713cf87c146cc9ac80ab4ec4..e0c819c2dba31327356ff2ccab1e5b7556b268b9 100644 (file)
@@ -98,6 +98,15 @@ extern "C" {
 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_
index e9db148e992753645bd34a7b30514a68c4d1aaf9..41eedef8835e9bfb748b8a09baac41f8bf6f3c75 100644 (file)
@@ -478,7 +478,7 @@ LinkNode *BLI_read_file_as_lines(const char *name)
        FILE *fp= fopen(name, "r");
        LinkNode *lines= NULL;
        char *buf;
-       int size;
+       int64_t size;
 
        if (!fp) return NULL;
                
index c8a6ae5a6d0d575ae363a01907c6eef30820b9b6..a927de60cd832aff7885a0806fdaa74f97779b7b 100644 (file)
@@ -327,7 +327,7 @@ static PyObject* gPyLoadGlobalDict(PyObject*)
 {
        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 @@ static PyObject* gPyLoadGlobalDict(PyObject*)
        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);