Difference between revisions of "MythTV on Mac x86"

From MythTV Official Wiki
Jump to: navigation, search
(Changes Needed)
(Changes Needed)
Line 8: Line 8:
  
 
* Update QT version being used.  3.3.4 doesn't compile with gcc 4.0; 3.3.5 compiles but generates a bus error when displaying Myth menus. Using a development snapshot of 3.3.6 seems to work.  Replace the QT url in osx-packager with the following:  ftp://ftp.trolltech.com/qt/snapshots/qt-mac-free-3.3.6-snapshot-20060311.tar.gz  (these snapshots are changed frequently, pick a current one from that directory)
 
* Update QT version being used.  3.3.4 doesn't compile with gcc 4.0; 3.3.5 compiles but generates a bus error when displaying Myth menus. Using a development snapshot of 3.3.6 seems to work.  Replace the QT url in osx-packager with the following:  ftp://ftp.trolltech.com/qt/snapshots/qt-mac-free-3.3.6-snapshot-20060311.tar.gz  (these snapshots are changed frequently, pick a current one from that directory)
A.Weder (18.03.2006): I had to remove "-no-mac-style" from the qt-mt conf options in osx-packager.pl, since I got compile errors about QMacStyle not being defined in widgets/qtabbar.cpp. This is for the qt 20060317 snapshot of qt-mac 3.3.6, but also seems to hold for earlier snapshots.
+
A.Weder (18.03.2006): I had to remove "-no-style-mac" from the qt-mt conf options in osx-packager.pl, since I got compile errors about QMacStyle not being defined in widgets/qtabbar.cpp. This is for the qt 20060317 snapshot of qt-mac 3.3.6, but also seems to hold for earlier snapshots.
  
 
* Override Host for sourceforge?  I found the availability of packages to be spotty on the default host, if it fails, replace the hostname with a working host.
 
* Override Host for sourceforge?  I found the availability of packages to be spotty on the default host, if it fails, replace the hostname with a working host.

Revision as of 19:45, 18 March 2006

MythTV is working on the new Intel based Apple Macintosh platforms. This page is intended to share information among the people attempting to build and optimize the Intel Mac code.

In the 'contrib' directory of the MythTV source code, there is a perl script which automates the build process for MythTV on MacOS systems. The script is called osx-packager.pl. The descriptions of changes needed assume that script as a starting point.


Changes Needed

Here's a brief summary of chages needed to build MythTV on an Intel based Mac system:

  • Update QT version being used. 3.3.4 doesn't compile with gcc 4.0; 3.3.5 compiles but generates a bus error when displaying Myth menus. Using a development snapshot of 3.3.6 seems to work. Replace the QT url in osx-packager with the following: ftp://ftp.trolltech.com/qt/snapshots/qt-mac-free-3.3.6-snapshot-20060311.tar.gz (these snapshots are changed frequently, pick a current one from that directory)

A.Weder (18.03.2006): I had to remove "-no-style-mac" from the qt-mt conf options in osx-packager.pl, since I got compile errors about QMacStyle not being defined in widgets/qtabbar.cpp. This is for the qt 20060317 snapshot of qt-mac 3.3.6, but also seems to hold for earlier snapshots.

  • Override Host for sourceforge? I found the availability of packages to be spotty on the default host, if it fails, replace the hostname with a working host.
  • libdvdnav: Endian byte swapping missing from src/dvdread/bswap.h The following can be added to use Apple-supplied routines:
#elif defined(__APPLE__)
#include <libkern/OSByteOrder.h>
#define B2N_16(x) x = OSSwapBigToHostConstInt16(x) 
#define B2N_32(x) x = OSSwapBigToHostConstInt32(x)
#define B2N_64(x) x = OSSwapBigToHostConstInt64(x)
  • libexif: compile failed. replace 'static ExifSShort' by just 'ExifSShort' in libexif/exif-utils.c near line 83.
  • libdvdread: Endian byte swapping missing from dvdread/bswap.h See bswap.h changes above.


MythTV changes:

  • Update osx-packager.pl to add configure parameters used in building MythTV. In the section "configure mythplugins, and mythtv, etc", the 'mythtv' portion should look something like this:
 'mythtv'
 =>  [
       '--disable-distcc',
       '--disable-mmx',
       '--arch=i686', 
       '--extra-cxxflags=-msse -msse2 -msse3', 
       '--prefix=' . $PREFIX,
     ],
  • Fix libs/libavcodec/liba52/resample.c -- Apply changes in patch below.
  • 3rd bswap.h patch, in file 'libs/libmythdvdnav/bswap.h'. See bswap changes described above.
  • This diff, against the released 0.19 codebase, fixes the crash and allows video to work. It does also fix resample.c. For working audio, you need the latest audiooutputca.cpp from SVN, not the released version, or see the next patch below.
diff -ur mythtv-0.19/libs/libavcodec/liba52/resample.c /Users/ogre/src/mythtv-0.19/libs/libavcodec/liba52/resample.c
--- mythtv-0.19/libs/libavcodec/liba52/resample.c       2006-01-05 15:19:29.000000000 -0800
+++ /Users/ogre/src/mythtv-0.19/libs/libavcodec/liba52/resample.c       2006-03-16 13:31:42.000000000 -0800
@@ -13,14 +13,14 @@
 
 #include "resample_c.c"
 
-#ifdef ARCH_X86
+#ifdef HAVE_MMX
 #include "resample_mmx.c"
 #endif
 
 void* a52_resample_init(uint32_t mm_accel,int flags,int chans){
 void* tmp;
 
-#ifdef ARCH_X86
+#ifdef HAVE_MMX
     if(mm_accel&MM_ACCEL_X86_MMX){
        tmp=a52_resample_MMX(flags,chans);
        if(tmp){
diff -ur mythtv-0.19/libs/libavcodec/msmpeg4.c /Users/ogre/src/mythtv-0.19/libs/libavcodec/msmpeg4.c
--- mythtv-0.19/libs/libavcodec/msmpeg4.c       2006-01-15 23:14:43.000000000 -0800
+++ /Users/ogre/src/mythtv-0.19/libs/libavcodec/msmpeg4.c       2006-03-16 13:25:10.000000000 -0800
@@ -725,7 +725,7 @@
        necessitate to modify mpegvideo.c. The problem comes from the
        fact they decided to store the quantized DC (which would lead
        to problems if Q could vary !) */
-#if (defined(ARCH_X86) || defined(ARCH_X86_64)) && !defined PIC
+#if defined(HAVE_MMX) && (defined(ARCH_X86) || defined(ARCH_X86_64)) && !defined PIC
     asm volatile(
         "movl %3, %%eax         \n\t"
         "shrl $1, %%eax         \n\t"
diff -ur mythtv-0.19/libs/libmythtv/videoout_quartz.cpp /Users/ogre/src/mythtv-0.19/libs/libmythtv/videoout_quartz.cpp
--- mythtv-0.19/libs/libmythtv/videoout_quartz.cpp      2005-11-26 08:38:42.000000000 -0800
+++ /Users/ogre/src/mythtv-0.19/libs/libmythtv/videoout_quartz.cpp      2006-03-16 13:59:53.000000000 -0800
@@ -1315,10 +1315,12 @@
     data->windowedMode = gContext->GetNumSetting("RunFrontendInWindow", 0);
     data->correctGamma = gContext->GetNumSetting("MacGammaCorrect", 0);
     
+#ifdef HAVE_ALTIVEC
     if (gContext->GetNumSetting("MacYuvConversion", 1))
         data->yuvConverter = yuv2vuy_init_altivec();
     else
-        data->yuvConverter = NULL;
+#endif
+        data->yuvConverter = yuv2vuy_init_plain();
 
     if (!CreateQuartzBuffers())
     {
diff -ur mythtv-0.19/libs/libmythtv/yuv2rgb.cpp /Users/ogre/src/mythtv-0.19/libs/libmythtv/yuv2rgb.cpp
--- mythtv-0.19/libs/libmythtv/yuv2rgb.cpp      2006-01-19 21:04:02.000000000 -0800
+++ /Users/ogre/src/mythtv-0.19/libs/libmythtv/yuv2rgb.cpp      2006-03-16 14:06:33.000000000 -0800
@@ -682,7 +682,6 @@
     }
 }
 
-#ifdef HAVE_ALTIVEC
 static void non_vec_yuv420_2vuy (uint8_t * image, uint8_t * py,
                                  uint8_t * pu, uint8_t * pv,
                                  int h_size, int v_size,
@@ -717,6 +716,13 @@
     }
 }
 
+yuv2vuy_fun yuv2vuy_init_plain(void)
+{
+       return non_vec_yuv420_2vuy;
+}
+
+#ifdef HAVE_ALTIVEC
+
 // Altivec code adapted from VLC's i420_yuv2.c (thanks to Titer and Paul Jara) 
 
 #define VEC_NEXT_LINES()                                                    \
diff -ur mythtv-0.19/libs/libmythtv/yuv2rgb.h /Users/ogre/src/mythtv-0.19/libs/libmythtv/yuv2rgb.h
--- mythtv-0.19/libs/libmythtv/yuv2rgb.h        2005-04-21 07:14:28.000000000 -0700
+++ /Users/ogre/src/mythtv-0.19/libs/libmythtv/yuv2rgb.h        2006-03-16 14:01:06.000000000 -0800
@@ -50,6 +50,7 @@
                               int vuy_stride, int y_stride, int uv_stride);
 
 yuv2vuy_fun yuv2vuy_init_altivec (void);
+yuv2vuy_fun yuv2vuy_init_plain(void);
 
 typedef void (* vuy2yuv_fun) (uint8_t * image, uint8_t * py,
                               uint8_t * pu, uint8_t * pv,

  • This fixes audio in v0.19. 0.20 is reported to already have this fix.
diff -ur mythtv-0.19/libs/libmyth/audiooutputca.cpp /Users/ogre/src/mythtv-0.19/libs/libmyth/audiooutp\
utca.cpp                                                                                               
--- mythtv-0.19/libs/libmyth/audiooutputca.cpp  2005-10-10 17:30:51.000000000 -0700                    
+++ /Users/ogre/src/mythtv-0.19/libs/libmyth/audiooutputca.cpp  2006-03-16 15:01:02.000000000 -0800    
@@ -107,8 +107,13 @@                                                                                   
     bzero(&conv_in_desc, sizeof(AudioStreamBasicDescription));                                        
     conv_in_desc.mSampleRate       = audio_samplerate;                                                
     conv_in_desc.mFormatID         = kAudioFormatLinearPCM;                                           
-    conv_in_desc.mFormatFlags      = kLinearPCMFormatFlagIsSignedInteger                              
-                                     | kLinearPCMFormatFlagIsBigEndian;                               
+#ifdef WORDS_BIGENDIAN                                                                                
+    conv_in_desc.mFormatFlags      = kLinearPCMFormatFlagIsSignedInteger                              
+                                  | kLinearPCMFormatFlagIsBigEndian;                                  
+#else                                                                                                 
+   conv_in_desc.mFormatFlags      = kLinearPCMFormatFlagIsSignedInteger;                              
+#endif                                                                                                
+                                                                                                      
     conv_in_desc.mBytesPerPacket   = audio_bytes_per_sample;                                          
     conv_in_desc.mFramesPerPacket  = 1;                                                               
     conv_in_desc.mBytesPerFrame    = audio_bytes_per_sample;                                          
  • Optional, to re-enable MMX: Apply the patch found at this link. Modify osx-packager.pl to remove 'disable-mmx', and add --enable-memalign-hack. I also had to add "-read_only_relocs,warning" to the QMAKE_LFLAGS line in the MythTV build config to get around a linker error.

Current Status

Application successfully compiles. MythTV menu system displays, communicates with backend, and displays video. HD MPEG2 video can be played on a Core Duo 1.66GHz Mac Mini.


Useful Links

Core Video Programming Guide All Intel Macs support Core Image / Core Video, which can be used for optimized video playback and offloading effects such as de-interlacing to the GPU.


Other Notes

'/proc/cpuinfo/' is used to determine CPU type in linux builds. In MacOS, "/usr/sbin/system_profiler SPHardwareDataType" could be used to determine the architecture and CPU type.