summaryrefslogtreecommitdiffstats
path: root/libhb
diff options
context:
space:
mode:
authorkonablend <[email protected]>2009-04-14 20:10:57 +0000
committerkonablend <[email protected]>2009-04-14 20:10:57 +0000
commit16b2cd579e17d46bdf7bcec3059a92d2c80d21e8 (patch)
treef23def4a82677bda7b031b1e2f56c249e6c93d9e /libhb
parent6a59b3ba40c2d2bbe977684d31b345bdd3a5ef93 (diff)
This patch adds mingw32 cross-compilation support to HandBrake trunk to
produce native win32 binaries. The main benefits are the binary does not have any Cygwin runtime requirements and various host platforms can be leveraged to build HandBrake. Cross-compilation toolchains are complex to setup and recommended for experts only; but once setup it can build at speeds similar to native builds, on Darwin or Linux. BUILD INSTRUCTIONS: Add mingw32 toolchain to beginning of your path and take the toolchain prefix from gcc (eg: i386-mingw32-gcc) and pass to configure: ./configure --cross=i386-ming32 PRODUCTS: - hb.lib (static library) - HandBrakeCLI.exe DOWNLOADS: Contrib downloads need to be seeded with: - pthreads-w32-2-8-0-release.tar.gz (new) - xvidcore-20090311.tar.gz SUMMARY: Specifically, all GUI trees are not impacted. configure - added --cross=PREFIX - reworked search for gcc and cross-compile related tools to use prefix contrib/ - sub-patches added as needed for mingw contrib/xvidcore/ - bumped from 1.1.3 -> 1.2.1+ (daily 20090311) - reconstituted P01-cygwin.patch - created new P00-darwin.patch needed for macho64 asm flag on x86_64 arch libhb/ - uint -> uint32_t - remaining changes guarded by mingw32 macro. test/ - modified to support pthread-compatibility library attach/detach. - all changes guarded by mingw32 macro. BRANCHES: source: https://hbfork.googlecode.com/svn/branches/mingw@28 target: svn://svn.handbrake.fr/HandBrake/trunk@2325 git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@2326 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb')
-rw-r--r--libhb/common.h14
-rw-r--r--libhb/decavcodec.c4
-rw-r--r--libhb/decmetadata.c2
-rw-r--r--libhb/fifo.c2
-rw-r--r--libhb/module.defs33
-rw-r--r--libhb/module.rules12
-rw-r--r--libhb/ports.c29
-rw-r--r--libhb/ports.h3
-rw-r--r--libhb/reader.c2
9 files changed, 79 insertions, 22 deletions
diff --git a/libhb/common.h b/libhb/common.h
index 1fa3d4fe1..b7c468672 100644
--- a/libhb/common.h
+++ b/libhb/common.h
@@ -18,6 +18,20 @@
#include <sys/stat.h>
#include <dirent.h>
+#if defined( SYS_MINGW )
+# define fseek fseeko64
+# define ftell ftello64
+# undef fseeko
+# define fseeko fseeko64
+# undef ftello
+# define ftello ftello64
+# define flockfile(...)
+# define funlockfile(...)
+# define getc_unlocked getc
+# undef off_t
+# define off_t off64_t
+#endif
+
#ifndef MIN
#define MIN( a, b ) ( (a) > (b) ? (b) : (a) )
#endif
diff --git a/libhb/decavcodec.c b/libhb/decavcodec.c
index 532059706..8b09afcf7 100644
--- a/libhb/decavcodec.c
+++ b/libhb/decavcodec.c
@@ -401,7 +401,7 @@ static int decavcodecBSInfo( hb_work_object_t *w, const hb_buffer_t *buf,
AVCodecParserContext *parser = av_parser_init( codec->id );
AVCodecContext *context = avcodec_alloc_context();
hb_avcodec_open( context, codec );
-#ifdef SYS_CYGWIN
+#if defined( SYS_CYGWIN )
uint8_t *buffer = memalign(16, AVCODEC_MAX_AUDIO_FRAME_SIZE);
#else
uint8_t *buffer = malloc( AVCODEC_MAX_AUDIO_FRAME_SIZE );
@@ -1132,7 +1132,7 @@ static void decodeAudio( hb_work_private_t *pv, uint8_t *data, int size )
// complicated, machine dependent alignment here we use the
// fact that malloc returns an aligned pointer on most architectures.
- #ifdef SYS_CYGWIN
+ #if defined( SYS_CYGWIN )
// Cygwin's malloc doesn't appear to return 16-byte aligned memory so use memalign instead.
pv->buffer = memalign(16, AVCODEC_MAX_AUDIO_FRAME_SIZE);
#else
diff --git a/libhb/decmetadata.c b/libhb/decmetadata.c
index 235fc69fd..85c3cd28b 100644
--- a/libhb/decmetadata.c
+++ b/libhb/decmetadata.c
@@ -130,7 +130,7 @@ static void decmp4metadata( hb_title_t *title )
MP4ChapterTypeQt );
if( chapter_list && ( hb_list_count( title->list_chapter ) == 0 ) ) {
- uint i = 1;
+ uint32_t i = 1;
while( i <= chapter_count )
{
hb_chapter_t * chapter;
diff --git a/libhb/fifo.c b/libhb/fifo.c
index 9441f7172..c756f5673 100644
--- a/libhb/fifo.c
+++ b/libhb/fifo.c
@@ -147,7 +147,7 @@ hb_buffer_t * hb_buffer_init( int size )
if (size)
{
-#if defined( SYS_DARWIN ) || defined( SYS_FREEBSD )
+#if defined( SYS_DARWIN ) || defined( SYS_FREEBSD ) || defined( SYS_MINGW )
b->data = malloc( b->alloc );
#elif defined( SYS_CYGWIN )
/* FIXME */
diff --git a/libhb/module.defs b/libhb/module.defs
index e3942f781..dc2fb1ad5 100644
--- a/libhb/module.defs
+++ b/libhb/module.defs
@@ -1,6 +1,12 @@
-$(eval $(call import.MODULE.defs,LIBHB,libhb,A52DEC BZIP2 FAAC FAAD2 FFMPEG LAME LIBDCA LIBDVDREAD LIBMKV LIBMP4V2 LIBOGG LIBSAMPLERATE LIBTHEORA LIBVORBIS MPEG2DEC X264 XVIDCORE ZLIB LIBHB TEST DOC))
+__deps__ := A52DEC BZIP2 FAAC FAAD2 FFMPEG LAME LIBDCA \
+ LIBDVDREAD LIBMKV LIBMP4V2 LIBOGG LIBSAMPLERATE LIBTHEORA \
+ LIBVORBIS MPEG2DEC PTHREADW32 X264 XVIDCORE ZLIB
+
+$(eval $(call import.MODULE.defs,LIBHB,libhb,$(__deps__)))
$(eval $(call import.GCC,LIBHB))
+###############################################################################
+
LIBHB.src/ = $(SRC/)libhb/
LIBHB.build/ = $(BUILD/)libhb/
@@ -10,10 +16,7 @@ LIBHB.m4.out = $(patsubst $(LIBHB.src/)%.m4,$(LIBHB.build/)%,$(LIBHB.m4.in))
LIBHB.c = $(wildcard $(LIBHB.src/)*.c)
LIBHB.c.o = $(patsubst $(SRC/)%.c,$(BUILD/)%.o,$(LIBHB.c))
LIBHB.d = $(LIBHB.m4.out) $(LIBHB.h.out) \
- $(foreach n, \
- A52DEC BZIP2 FAAC FAAD2 FFMPEG LAME LIBDCA LIBDVDREAD LIBMKV LIBMP4V2 LIBOGG \
- LIBSAMPLERATE LIBTHEORA LIBVORBIS MPEG2DEC X264 XVIDCORE ZLIB, \
- $($n.INSTALL.target) )
+ $(foreach n,$(LIBHB.prerequisites),$($n.INSTALL.target) )
LIBHB.h.in = $(wildcard $(LIBHB.src/)*.h)
LIBHB.h.out = $(patsubst $(SRC/)%,$(BUILD/)%,$(LIBHB.h.in))
@@ -40,6 +43,8 @@ else ifeq ($(BUILD.system),darwin)
LIBHB.GCC.D += SYS_DARWIN
else ifeq ($(BUILD.system),linux)
LIBHB.GCC.D += SYS_LINUX _LARGEFILE_SOURCE _FILE_OFFSET_BITS=64
+else ifeq ($(BUILD.system),mingw)
+ LIBHB.GCC.D += SYS_MINGW PTW32_STATIC_LIB
else ifeq ($(BUILD.system),solaris)
LIBHB.GCC.D += SYS_SunOS _LARGEFILE_SOURCE _FILE_OFFSET_BITS=64
else
@@ -76,4 +81,22 @@ endif
###############################################################################
+ifeq (1-mingw,$(BUILD.cross)-$(BUILD.system))
+
+LIBHB.dll = $(LIBHB.build/)hb.dll
+LIBHB.lib = $(LIBHB.build/)hb.lib
+
+LIBHB.dll.libs = $(foreach n, \
+ a52 bz2 avcodec avformat avutil dca dvdread faac faad mkv mpeg2 mp3lame mp4v2 \
+ ogg pthreadGC2 samplerate swscale theora vorbis vorbisenc x264 xvidcore z, \
+ $(CONTRIB.build/)lib/lib$(n).a )
+
+LIBHB.GCC.args.extra.dylib++ = -Wl,--out-implib,$(LIBHB.lib)
+LIBHB.GCC.l += iberty ws2_32
+LIBHB.out += $(LIBHB.dll) $(LIBHB.lib)
+
+endif
+
+###############################################################################
+
BUILD.out += $(LIBHB.out)
diff --git a/libhb/module.rules b/libhb/module.rules
index 8f63a143f..c92ababa2 100644
--- a/libhb/module.rules
+++ b/libhb/module.rules
@@ -36,5 +36,17 @@ endif
###############################################################################
+ifeq (1-mingw,$(BUILD.cross)-$(BUILD.system))
+
+libhb.build: $(LIBHB.dll)
+
+$(LIBHB.dll): | $(dirname $(LIBHB.dll) $(LIBHB.lib))
+$(LIBHB.dll): $(LIBHB.c.o) $(LIBHB.yasm.o)
+ $(call LIBHB.GCC.DYLIB++,$@,$^ $(LIBHB.dll.libs))
+
+endif
+
+###############################################################################
+
clean: libhb.clean
build: libhb.build
diff --git a/libhb/ports.c b/libhb/ports.c
index 1d2c4923f..2e6b65329 100644
--- a/libhb/ports.c
+++ b/libhb/ports.c
@@ -31,6 +31,11 @@
#include <windows.h>
#endif
+#ifdef SYS_MINGW
+#include <pthread.h>
+#include <windows.h>
+#endif
+
#ifdef SYS_SunOS
#include <sys/processor.h>
#endif
@@ -39,15 +44,15 @@
#include <sys/time.h>
-//#ifdef SYS_CYGWIN
-//#include <winsock2.h>
-//#include <ws2tcpip.h>
-//#else
+#ifdef SYS_MINGW
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
-//#endif
+#endif
#include "hb.h"
@@ -97,7 +102,7 @@ void hb_snooze( int delay )
snooze( 1000 * delay );
#elif defined( SYS_DARWIN ) || defined( SYS_LINUX ) || defined( SYS_FREEBSD) || defined( SYS_SunOS )
usleep( 1000 * delay );
-#elif defined( SYS_CYGWIN )
+#elif defined( SYS_CYGWIN ) || defined( SYS_MINGW )
Sleep( delay );
#endif
}
@@ -119,7 +124,7 @@ int hb_get_cpu_count()
}
cpu_count = 1;
-#if defined(SYS_CYGWIN)
+#if defined(SYS_CYGWIN) || defined(SYS_MINGW)
SYSTEM_INFO cpuinfo;
GetSystemInfo( &cpuinfo );
cpu_count = cpuinfo.dwNumberOfProcessors;
@@ -181,7 +186,7 @@ void hb_get_tempory_directory( hb_handle_t * h, char path[512] )
char base[512];
/* Create the base */
-#ifdef SYS_CYGWIN
+#if defined( SYS_CYGWIN ) || defined( SYS_MINGW )
char *p;
int i_size = GetTempPath( 512, base );
if( i_size <= 0 || i_size >= 512 )
@@ -227,11 +232,11 @@ void hb_get_tempory_filename( hb_handle_t * h, char name[1024],
***********************************************************************/
void hb_mkdir( char * name )
{
-//#ifdef SYS_CYGWIN
-// mkdir( name );
-//#else
+#ifdef SYS_MINGW
+ mkdir( name );
+#else
mkdir( name, 0755 );
-//#endif
+#endif
}
/************************************************************************
diff --git a/libhb/ports.h b/libhb/ports.h
index 9c2143944..c544f19a6 100644
--- a/libhb/ports.h
+++ b/libhb/ports.h
@@ -43,6 +43,9 @@ typedef struct hb_thread_s hb_thread_t;
#elif defined( SYS_CYGWIN )
# define HB_LOW_PRIORITY 0
# define HB_NORMAL_PRIORITY 1
+#elif defined( SYS_MINGW )
+# define HB_LOW_PRIORITY 0
+# define HB_NORMAL_PRIORITY 0
#endif
hb_thread_t * hb_thread_init( char * name, void (* function)(void *),
diff --git a/libhb/reader.c b/libhb/reader.c
index 7b44a6500..8c5ecdd2a 100644
--- a/libhb/reader.c
+++ b/libhb/reader.c
@@ -27,7 +27,7 @@ typedef struct
int64_t scr_offset;
hb_psdemux_t demux;
int scr_changes;
- uint sequence;
+ uint32_t sequence;
uint8_t st_slots; // size (in slots) of stream_timing array
uint8_t saw_video; // != 0 if we've seen video
uint8_t saw_audio; // != 0 if we've seen audio