[Mplayer-cvslog] CVS: main/libmpcodecs vd_realvid.c, 1.26, 1.27 ad_realaud.c, 1.29, 1.30

Alex Beregszaszi syncmail at mplayerhq.hu
Thu Jun 24 11:16:52 CEST 2004


CVS change done by Alex Beregszaszi

Update of /cvsroot/mplayer/main/libmpcodecs
In directory mail:/var2/tmp/cvs-serv30789/libmpcodecs

Modified Files:
	vd_realvid.c ad_realaud.c 
Log Message:
support for realvideo codecs under macosx, original patch by Donnie Smith

Index: vd_realvid.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpcodecs/vd_realvid.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- vd_realvid.c	30 Apr 2004 10:26:26 -0000	1.26
+++ vd_realvid.c	24 Jun 2004 09:16:50 -0000	1.27
@@ -14,11 +14,15 @@
 #include "vd_internal.h"
 #include "wine/windef.h"
 
+#ifdef USE_MACSHLB
+#include <CoreServices/CoreServices.h>
+#endif
+
 static vd_info_t info = {
 	"RealVideo decoder",
 	"realvid",
-	"Florian Schneider & A'rpi", // win32 dlls support by alex
-	"using original closed source codecs for Linux",
+	"Alex Beregszaszi",
+	"Florian Schneider, Arpad Gereoffy, Alex Beregszaszi, Donnie Smith",
 	"binary real video codecs"
 };
 
@@ -61,7 +65,7 @@
 #endif
 
 static void *rv_handle=NULL;
-static int inited;
+static int inited=0;
 #ifdef USE_WIN32DLL
 static int dll_type = 0; /* 0 = unix dlopen, 1 = win32 dll */
 #endif
@@ -177,6 +181,64 @@
 }
 #endif
 
+#ifdef USE_MACSHLB
+void *load_one_sym_mac(char *symbolName, CFragConnectionID *connID);
+
+static int load_syms_mac(char *path) {
+    Ptr mainAddr;
+    OSStatus status;
+    FSRef fsref;
+    FSSpec fsspec;
+    OSErr err;
+    Str255 errMessage;
+    CFragConnectionID *connID;
+
+    mp_msg(MSGT_DECVIDEO,MSGL_INFO, "opening mac shlb '%s'\n", path);
+
+    if ( (connID = (CFragConnectionID *)NewPtr( sizeof( CFragConnectionID ))) == nil ) {
+        mp_msg(MSGT_DECVIDEO,MSGL_WARN,"NewPtr() failed.\n" );
+        return 0;
+    }
+
+    if ( (status = FSPathMakeRef( path, &fsref, NULL )) != noErr ) {
+        mp_msg(MSGT_DECVIDEO,MSGL_WARN,"FSPathMakeRef() failed with error %d.\n", status );
+        return 0;
+    }
+
+    if ( (status = FSGetCatalogInfo( &fsref, kFSCatInfoNone, NULL, NULL, &fsspec, NULL )) != noErr ) {
+        mp_msg(MSGT_DECVIDEO,MSGL_WARN,"FSGetCatalogInfo() failed with error %d.\n", status );
+        return 0;
+    }
+
+    if ( (err = GetDiskFragment( &fsspec, 0, kCFragGoesToEOF, NULL, kPrivateCFragCopy, connID, &mainAddr, errMessage )) != noErr ) {
+        p2cstrcpy( errMessage, errMessage );
+        mp_msg(MSGT_DECVIDEO,MSGL_WARN,"GetDiskFragment() failed with error %d: %s\n", err, errMessage );
+        return 0;
+    }
+
+    rvyuv_custom_message = load_one_sym_mac("RV20toYUV420CustomMessage", connID);
+    rvyuv_free = load_one_sym_mac("RV20toYUV420Free", connID);
+    rvyuv_hive_message = load_one_sym_mac("RV20toYUV420HiveMessage", connID);
+    rvyuv_init = load_one_sym_mac("RV20toYUV420Init", connID);
+    rvyuv_transform = load_one_sym_mac("RV20toYUV420Transform", connID);
+
+    if(rvyuv_custom_message &&
+       rvyuv_free &&
+       rvyuv_hive_message &&
+       rvyuv_init &&
+       rvyuv_transform)
+    {
+	rv_handle = connID;
+	return 1;
+    }
+
+    mp_msg(MSGT_DECVIDEO,MSGL_WARN,"Error resolving symbols! (version incompatibility?)\n");
+    (void)CloseConnection(connID);
+    return 0; // error
+}
+#endif
+
+
 /* we need exact positions */
 struct rv_init_t {
 	short unk1;
@@ -208,6 +270,9 @@
 
 	/* first try to load linux dlls, if failed and we're supporting win32 dlls,
 	   then try to load the windows ones */
+#ifdef USE_MACSHLB
+	if (strstr(sh->codec->dll, ".shlb") && !load_syms_mac(path))
+#endif
 #ifdef HAVE_LIBDL       
 	if(strstr(sh->codec->dll,".dll") || !load_syms_linux(path))
 #endif
@@ -225,7 +290,6 @@
 //	if((sh->format!=0x30335652) && !mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,IMGFMT_I420)) return 0;
 	// init codec:
 	sh->context=NULL;
-	inited=0;
 #ifdef USE_WIN32DLL
 	if (dll_type == 1)
 	    result=(*wrvyuv_init)(&init_data, &sh->context);
@@ -271,6 +335,17 @@
 #ifdef HAVE_LIBDL
 	if(rv_handle) dlclose(rv_handle);
 #endif
+#ifdef USE_MACSHLB
+	if (rv_handle){
+	    (void)CloseConnection(rv_handle);
+	    DisposePtr((Ptr)rv_handle);
+	}
+	if (rvyuv_custom_message) DisposePtr((Ptr)rvyuv_custom_message);
+	if (rvyuv_free) DisposePtr((Ptr)rvyuv_free);
+	if (rvyuv_hive_message) DisposePtr((Ptr)rvyuv_hive_message);
+	if (rvyuv_init) DisposePtr((Ptr)rvyuv_init);
+	if (rvyuv_transform) DisposePtr((Ptr)rvyuv_transform);
+#endif
 	rv_handle=NULL;
 }
 

Index: ad_realaud.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpcodecs/ad_realaud.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- ad_realaud.c	30 Apr 2004 10:26:26 -0000	1.29
+++ ad_realaud.c	24 Jun 2004 09:16:50 -0000	1.30
@@ -16,11 +16,15 @@
 #include "ad_internal.h"
 #include "wine/windef.h"
 
+#ifdef USE_MACSHLB
+#include <CoreServices/CoreServices.h>
+#endif
+
 static ad_info_t info =  {
 	"RealAudio decoder",
 	"realaud",
-	"A'rpi", // win32 dlls support by alex
-	"Florian Schneider",
+	"Alex Beregszaszi",
+	"Florian Schneider, Arpad Gereoffy, Alex Beregszaszi, Donnie Smith",
 	"binary real audio codecs"
 };
 
@@ -66,6 +70,7 @@
 
 static int dll_type = 0; /* 0 = unix dlopen, 1 = win32 dll */
 #endif
+
 static void *rv_handle = NULL;
 
 #if 0
@@ -206,6 +211,113 @@
 }
 #endif
 
+
+#ifdef USE_MACSHLB
+/*
+ Helper function to create a function pointer (from a null terminated (!)
+ pascal string) like GetProcAddress(). Some assembler is required due
+ to different calling conventions, for further details, see 
+ http://developer.apple.com/ samplecode/CFM_MachO_CFM/listing1.html .
+
+ Caller is expected to DisposePtr(mfp).
+ N.B.: Code is used by vd_realaud.c as well.
+*/
+void *load_one_sym_mac(char *symbolName, CFragConnectionID *connID) {
+    OSErr err;
+    Ptr symbolAddr;
+    CFragSymbolClass symbolClass;
+    UInt32  *mfp;
+    char realname[255];
+    
+    if (strlen(symbolName) > 255)
+    {
+	mp_mpsg(MSGT_DECVIDEO, MSGL_V, "FindSymbol symbolname overflow\n");
+	return NULL;
+    }
+    
+    snprintf(realname, 255, "%c%s", strlen(symbolName), symbolName);
+
+    if ( (err = FindSymbol( *connID, realname, 
+                            &symbolAddr, &symbolClass )) != noErr ) {
+        mp_msg(MSGT_DECVIDEO,MSGL_V,"FindSymbol( \"%s\" ) failed with error code %d.\n", symbolName + 1, err );
+        return NULL;
+    }
+
+    if ( (mfp = (UInt32 *)NewPtr( 6 * sizeof(UInt32) )) == nil )
+        return NULL;
+
+    mfp[0] = 0x3D800000 | ((UInt32)symbolAddr >> 16);
+    mfp[1] = 0x618C0000 | ((UInt32)symbolAddr & 0xFFFF);
+    mfp[2] = 0x800C0000;
+    mfp[3] = 0x804C0004;
+    mfp[4] = 0x7C0903A6;
+    mfp[5] = 0x4E800420;
+    MakeDataExecutable( mfp, 6 * sizeof(UInt32) );
+
+    return( mfp );
+}
+
+static int load_syms_mac(char *path)
+{
+    Ptr mainAddr;
+    OSStatus status;
+    FSRef fsref;
+    FSSpec fsspec;
+    OSErr err;
+    Str255 errMessage;
+    CFragConnectionID *connID;
+
+    mp_msg(MSGT_DECVIDEO, MSGL_INFO, "opening mac shlb '%s'\n", path);
+
+    if ( (connID = (CFragConnectionID *)NewPtr( sizeof( CFragConnectionID ))) == nil ) {
+        mp_msg(MSGT_DECVIDEO,MSGL_WARN,"NewPtr() failed.\n" );
+        return 0;
+    }
+
+    if ( (status = FSPathMakeRef( path, &fsref, NULL )) != noErr ) {
+        mp_msg(MSGT_DECVIDEO,MSGL_WARN,"FSPathMakeRef() failed with error %d.\n", status );
+        return 0;
+    }
+
+    if ( (status = FSGetCatalogInfo( &fsref, kFSCatInfoNone, NULL, NULL, &fsspec, NULL )) != noErr ) {
+        mp_msg(MSGT_DECVIDEO,MSGL_WARN,"FSGetCatalogInfo() failed with error %d.\n", status );
+        return 0;
+    }
+
+    if ( (err = GetDiskFragment( &fsspec, 0, kCFragGoesToEOF, NULL, kPrivateCFragCopy, connID, &mainAddr, errMessage )) != noErr ) {
+
+        p2cstrcpy( errMessage, errMessage );
+        mp_msg(MSGT_DECVIDEO,MSGL_WARN,"GetDiskFragment() failed with error %d: %s\n", err, errMessage );
+        return 0;
+    }
+
+    raCloseCodec = load_one_sym_mac( "RACloseCodec", connID);
+    raDecode = load_one_sym_mac("RADecode", connID);
+    raFlush = load_one_sym_mac("RAFlush", connID);
+    raFreeDecoder = load_one_sym_mac("RAFreeDecoder", connID);
+    raGetFlavorProperty = load_one_sym_mac("\RAGetFlavorProperty", connID);
+    raOpenCodec = load_one_sym_mac("RAOpenCodec", connID);
+    raOpenCodec2 = load_one_sym_mac("RAOpenCodec2", connID);
+    raInitDecoder = load_one_sym_mac("RAInitDecoder", connID);
+    raSetFlavor = load_one_sym_mac("RASetFlavor", connID);
+    raSetDLLAccessPath = load_one_sym_mac("SetDLLAccessPath", connID);
+    raSetPwd = load_one_sym_mac("RASetPwd", connID); // optional, used by SIPR
+
+    if (raCloseCodec && raDecode && /*raFlush && */raFreeDecoder &&
+    raGetFlavorProperty && (raOpenCodec || raOpenCodec2) && raSetFlavor &&
+    /*raSetDLLAccessPath &&*/ raInitDecoder)
+    {
+    rv_handle = connID;
+    return 1;
+    }
+
+    mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Cannot resolve symbols - incompatible shlb: %s\n",path);
+    (void)CloseConnection(connID);
+    return 0;
+}
+
+#endif
+
 static int preinit(sh_audio_t *sh){
   // let's check if the driver is available, return 0 if not.
   // (you should do that if you use external lib(s) which is optional)
@@ -220,6 +332,10 @@
 
     /* first try to load linux dlls, if failed and we're supporting win32 dlls,
        then try to load the windows ones */
+      
+#ifdef USE_MACSHLB
+    if (strstr(sh->codec->dll,".shlb") && !load_syms_mac(path))
+#endif
 #ifdef HAVE_LIBDL       
     if (strstr(sh->codec->dll,".dll") || !load_syms_linux(path))
 #endif
@@ -293,7 +409,7 @@
 	((short*)(sh->wf+1))[4], // codec data length
 	((char*)(sh->wf+1))+10 // extras
     };
-#ifdef USE_WIN32DLL
+#if defined(USE_WIN32DLL) || defined(USE_MACSHLB)
     wra_init_t winit_data={
 	sh->wf->nSamplesPerSec,
 	sh->wf->wBitsPerSample,
@@ -304,11 +420,17 @@
 	((short*)(sh->wf+1))[4], // codec data length
 	((char*)(sh->wf+1))+10 // extras
     };
+#endif
+#ifdef USE_MACSHLB
+	result=raInitDecoder(sh->context,&winit_data);
+#else
+#ifdef USE_WIN32DLL
     if (dll_type == 1)
 	result=wraInitDecoder(sh->context,&winit_data);
     else
 #endif
     result=raInitDecoder(sh->context,&init_data);
+#endif
     if(result){
       mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Decoder init failed, error code: 0x%X\n",result);
       return 0;
@@ -395,6 +517,21 @@
     if (raFreeDecoder) raFreeDecoder(sh->context);
     if (raCloseCodec) raCloseCodec(sh->context);
 
+#ifdef USE_MACSHLB
+    if (rv_handle){
+      (void)CloseConnection(rv_handle);
+      DisposePtr((Ptr)rv_handle);
+    }
+    if (raCloseCodec) DisposePtr((Ptr)raCloseCodec);
+    if (raDecode) DisposePtr((Ptr)raDecode);
+    if (raFlush) DisposePtr((Ptr)raFlush);
+    if (raFreeDecoder) DisposePtr((Ptr)raFreeDecoder);
+    if (raGetFlavorProperty) DisposePtr((Ptr)raGetFlavorProperty);
+    if (raOpenCodec) DisposePtr((Ptr)raOpenCodec);
+    if (raOpenCodec2) DisposePtr((Ptr)raOpenCodec2);
+    if (raInitDecoder) DisposePtr((Ptr)raInitDecoder);
+#endif
+
 #ifdef USE_WIN32DLL
     if (dll_type == 1)
     {




More information about the MPlayer-cvslog mailing list