Difference between revisions of "MythTV on Mac x86"

From MythTV Official Wiki
Jump to: navigation, search
(Made comments about fixes in SVN, simplified audiooutputca.cpp patch)
(Deleted very, very outdated text in favor of redirect to current info)
(91 intermediate revisions by 34 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 changes 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)
 
Note that this is not required with the latest version of osx-packager.pl, because that library is not built.
 
 
 
* 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=pentium-m',
 
        '--extra-cxxflags=-msse -msse2 -msse3',
 
        '--prefix=' . $PREFIX,
 
      ],
 
 
 
* Adding '--disable-firewire' may be needed, if you get an error about a missing "AVCVideoServices" framework.
 
 
 
* 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. Note that head Subversion has this fix already.
 
 
 
* 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.
 
<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>
 
* This fixes audio in v0.19.  0.20 is reported to already have this fix.
 
<pre>
 
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;                             
 
+    conv_in_desc.mFormatFlags      = kLinearPCMFormatFlagIsSignedInteger;
 
+#ifdef WORDS_BIGENDIAN                                                                               
 
+    conv_in_desc.mFormatFlags    |= kLinearPCMFormatFlagIsBigEndian;                                 
 
+#endif                                                                                               
 
    conv_in_desc.mBytesPerPacket  = audio_bytes_per_sample;                                         
 
    conv_in_desc.mFramesPerPacket  = 1;                                                             
 
    conv_in_desc.mBytesPerFrame    = audio_bytes_per_sample;                                         
 
</pre>
 
 
 
== Enabling MMX ==
 
The frontend will run fine without MMX, but you can save a lot of CPU overhead by re-enabling the MMX optimizations in the MPEG2 decoding code, especially for HD video.  Faster iMac or MacBook systems may be able to get by without this.  To do HD video on the Mac Mini, the MMX patch is probably necessary.
 
 
 
* Enable MMX and memlign_hack in the configure options in osx-packager.pl
 
 
 
  'mythtv'
 
  =>  [
 
        '--disable-distcc',
 
        '--disable-firewire',
 
        '--enable-mmx',
 
        '--arch=pentium-m',
 
        '--enable-memalign-hack',
 
        '--extra-cxxflags=-msse -msse2 -msse3',
 
        '--prefix=' . $PREFIX,
 
      ],
 
 
 
* Add "-read_only_relocs,warning" to the QMAKE_LFLAGS line in the MythTV build config.  Without this change, I get an error: "ld: resample.o has local relocation entries in non-writable section (__TEXT,__text)"
 
 
 
* Apply the patch found at [http://mplayerhq.hu/pipermail/ffmpeg-devel/2006-February/007608.html this link].  This changes involve mostly syntax revisions, to appease Apple's choice of tools. 
 
 
 
* For 0.19-fixes:  I got "Undefined Symbols" errors in the MMX assembly code, related to the "relocation entries" errors above.  The only way I could get it to compile is to remove the "MANGLE" macros in the assembly code in libavcodec.  To 'mangle' the variables by hand, just add an underscore before the name.  So the code would change from '"movq "MANGLE(magicF2W)", %%mm7 \n\t"' to '"movq _magicF2W, %%mm7 \n\t"'.  The files affected are:
 
  libs/libavcodec/i386/dsputil_mmx.c
 
  libs/libavcodec/i386/motion_est_mmx.c
 
  libs/libavcodec/i386/simple_idct_mmx.c
 
  libs/libavcodec/liba52/resample_mmx.c
 
 
 
The MANGLE macro was fixed in the 0.20 svn code.  So, a simpler solution would be to add those updates.  I'll try to go back and do a clean build, with the 0.20 svn updates, and revise the info here.
 
 
 
== 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==
 
 
 
* Links on the IR receiver / remote included in the last iMac G5 and all intel based Macs.  Basic integration, passing arrow keys, ESC, enter to mythfrontend should be feasible.
 
[http://www.cocoadev.com/index.pl?UsingTheAppleRemoteControl http://www.cocoadev.com/index.pl?UsingTheAppleRemoteControl]<br>
 
[http://www.osxbook.com/software/iremoted/ http://www.osxbook.com/software/iremoted/]
 
 
 
* Anyone got links for MMX/SSE accelerated i420 2yuv colorspace conversion code?
 
 
 
* [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.
 
 
 
==Binaries==
 
 
 
For anyone who just wants a binary, here are links to what people have compiled.
 
*[http://www.goof.com/~mmead/Mythfrontend-0.19-intel.dmg.bz2 Mythfrontend 0.19 for Tiger on Intel].  Compiled with instructions from this page 03/22/2006.
 
*[http://www.goof.com/~mmead/Mythfrontend-0.19-intel-mmx.dmg.bz2 Mythfrontend 0.19 for Tiger on Intel MMX ENABLED].  Compiled with instructions from this page 03/23/2006.
 
 
 
[[Category:Developer Documentation]] [[Category:MacOS]]
 

Revision as of 10:20, 28 August 2012

Redirect to: