Difference between revisions of "MythTV on Mac x86"

From MythTV Official Wiki
Jump to: navigation, search
Line 158: Line 158:
 
Application successfully compiles.  MythTV menu system displays, and communicates with backend.
 
Application successfully compiles.  MythTV menu system displays, and communicates with backend.
  
Seg Faults when trying to display video.  Doesn't display list of programs from backend.
 
 
MacOS Crash Log shows:
 
 
Thread 5 Crashed:<br>
 
0  ...ickTimeComponents.component      0x98e0043d <B>YUV420To2VUY_W1x</B> + 671<br>
 
1  ...ickTimeComponents.component      0x98de371a FinalGlueBeforeTheBlit + 1529<br>
 
2  ...ickTimeComponents.component      0x98de7a5a PrepareForBlitThenDoBlit + 40<br>
 
3  ...ickTimeComponents.component      0x98de4207 ScalingCodecComponentDispatch + 2437<br>
 
4  ...ple.CoreServices.CarbonCore      0x90cc1638 CallComponentDispatch + 34<br>
 
5  ...ickTimeComponents.component      0x995941c5 ImageCodecDrawBand + 43<br>
 
6  ...ickTimeComponents.component      0x98c5ab6a BaseCodec_DecompressWorkFunction + 1033<br>
 
7  ...ple.CoreServices.CarbonCore      0x90ccd75b InvokeComponentMPWorkFunctionUPP + 22<br>
 
8  ...ickTimeComponents.component      0x98c58c6f BaseCodec_DecompressCallBack_Common + 2713<br>
 
9  ...ickTimeComponents.component      0x98c5c40c Base_CDBandDecompress + 5748<br>
 
10  ...ple.CoreServices.CarbonCore      0x90cc1953 CallComponentFunctionCommon + 513<br>
 
11  ...ickTimeComponents.component      0x98c56f41 Base_CDComponentDispatch + 125<br>
 
12  ...ickTimeComponents.component      0x98de39e0 ScalingCodecComponentDispatch + 350<br>
 
13  ...ickTimeComponents.component      0x98df6bf7 YUV420CodecComponentDispatch + 87<br>
 
14  ...ple.CoreServices.CarbonCore      0x90cc1638 CallComponentDispatch + 34<br>
 
15  com.apple.QuickTime                0x94439b33 ImageCodecBandDecompress + 43<br>
 
16  com.apple.QuickTime                0x94427d8f DoBandedDecompress + 15359<br>
 
17  com.apple.QuickTime                0x94423dee ICMAction + 642<br>
 
18  com.apple.QuickTime                0x94422ae6 ICMDeviceLoop + 635<br>
 
19  com.apple.QuickTime                0x9442bc35 <B>DecompressSequenceFrameWhen</B> + 797<br>
 
 
MPlayer and VLC also have the same crash when in Quartz mode.  A call to DecompressSequenceFrameWhen results in a crash in YUV420To2VUY.
 
  
 
==Useful Links==
 
==Useful Links==
 
[http://mplayerhq.hu/pipermail/ffmpeg-devel/2006-February/007608.html ffmpeg updates] for mmx assembly code.
 
[http://mplayerhq.hu/pipermail/ffmpeg-devel/2006-February/007608.html ffmpeg updates] for mmx assembly code.
 
[http://forum.videolan.org/viewtopic.php?t=16725&start=30&sid=b8154ad0dd403ecef0577c343d0b7d45 VLC Forum], thread with post desribing similar crash when using Quartz/Quicktime output.
 
  
 
==Other Notes==
 
==Other Notes==

Revision as of 08:38, 17 March 2006

MythTV currently does not display video on the new Intel based Apple Macintosh platforms. This page is intended to share information among the people attempting to get this working.

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:

  • Enable backend, 'osx-packager.pl -enable-backend'. Otherwise, the frontend fails when necessary components aren't available. (libmythtv.pro should probably be updated to add mpegdescriptors.cpp/h to the frontend requirements)
  • 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)
  • 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. comment out the 'static' 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.
  • Fix libs/libfreemheg/BaseClasses.h (called from Actions.cpp), #include <malloc.h> to #include <sys/malloc.h>
  • This diff, against the released 0.19 codebase, fixes the crash and allows video and audio to work. It does also fix resample.cpp.
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/libmyth/audiooutputca.cpp /Users/ogre/src/mythtv-0.19/libs/libmyth/audiooutputca.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;
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,

Current Status

Application successfully compiles. MythTV menu system displays, and communicates with backend.


Useful Links

ffmpeg updates for mmx assembly code.

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.