Difference between revisions of "MythTV on Mac x86"

From MythTV Official Wiki
Jump to: navigation, search
(Deleted very, very outdated text in favor of redirect to current info)
(108 intermediate revisions by 38 users not shown)
Line 1: Line 1:
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.
+
#REDIRECT [[Myth on Mac OS X]]
 
 
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-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.
 
 
 
* 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 and audio to work.  It does also fix resample.c.
 
<pre>
 
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,
 
 
 
</pre>
 
 
 
* Optional, to re-enable MMX:  Apply the patch found at [http://mplayerhq.hu/pipermail/ffmpeg-devel/2006-February/007608.html 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==
 
 
 
[http://developer.apple.com/documentation/GraphicsImaging/Conceptual/CoreVideo/CVProg_Intro/chapter_1_section_1.html 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.
 
 
 
[[Category:Developer Documentation]] [[Category:MacOS]]
 

Revision as of 10:20, 28 August 2012

Redirect to: