forked from bartvdbraak/blender
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.
This commit is contained in:
parent
29f2cbdd8f
commit
11645e7a3f
@ -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 @@ 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;
|
||||
|
@ -27,6 +27,7 @@
|
||||
set(INC
|
||||
.
|
||||
../../../intern/guardedalloc
|
||||
../blenlib
|
||||
)
|
||||
|
||||
set(INC_SYS
|
||||
|
@ -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] )
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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_
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user