From ryoma @ users.sourceforge.jp Mon Nov 21 02:19:35 2005 From: ryoma @ users.sourceforge.jp (ryoma) Date: Mon, 21 Nov 2005 02:19:35 +0900 (JST) Subject: [Vmaid-devel] =?iso-2022-jp?b?TmF0aXZlIENvZGVjIBskQiRLJEQbKEI=?= =?iso-2022-jp?b?GyRCJCQkRiEjGyhC?= Message-ID: <20051121.021935.85415985.ryoma@users.sourceforge.jp> こんばんわ。ryoma です。 # かなりお久しぶりでございます。(^^; avicore/icm.c に対する ***テスト用*** パッチと、それをテストするための サンプルを添付しておきます。 # サンプル付属の Makefile は BSD make 形式です…。 とりあず、huffyuv 2.1.1 を移植中なのですが、今は、MinGW (http://www.mingw.org) で公開されているヘッダファイルから必要な部分を 抜き出して、必要な互換関数?をこしらえて、…なんとも泥臭い事をやってる のですが、まあ、なんとなく動いてるっぽいです。(^^;;; # もう少し整理して公開したいと思います。 私は一からコーデックを書くほどの技量はありませんし、ほとんどの場合は Windows 向けに書かれたコードを移植する事になるのかなと思っているのです が、もっとスマートな方法がありましたら、御意見お聞かせください。 -- ryoma -------------- next part -------------- Index: avicore/icm.c =================================================================== RCS file: /cvsroot/vmaid/vmaid/avicore/icm.c,v retrieving revision 1.35 diff -u -r1.35 icm.c --- avicore/icm.c 7 Oct 2005 20:46:24 -0000 1.35 +++ avicore/icm.c 20 Nov 2005 16:23:41 -0000 @@ -19,10 +19,10 @@ #include "icm.h" #include #include "misc/fileio.h" -#ifdef W32CODECDIR +#if defined (W32CODECDIR) || defined (NATIVE_CODEC) # include "misc/profile.h" # include "icm32.h" -#endif /* W32CODECDIR */ +#endif #ifdef G_OS_WIN32 # include # include @@ -34,29 +34,40 @@ # define icm_send_driver_message(icm_object,msg,lParam1,lParam2) \ SendDriverMessage(((IcmObject *)(icm_object))->hDrvr,msg,lParam1,lParam2) #endif /* G_OS_WIN32 */ -#ifdef W32CODECDIR + +#if defined (W32CODECDIR) || defined (NATIVE_CODEC) # define icm_send_driver_message(icm_object,msg,lParam1,lParam2) \ ((IcmObject *)(icm_object))->icm_driver->DriverProc \ (((IcmObject *)(icm_object))->dwDriverId, \ ((IcmObject *)(icm_object))->icm_driver->hLib,msg,lParam1,lParam2) -#endif /* W32CODECDIR */ +#endif typedef struct _IcmDriver { -#if defined (G_OS_WIN32) +#if defined (G_OS_WIN32) || defined(NATIVE_CODEC) LPWSTR lpszName; -#elif defined (W32CODECDIR) +#else + guint8 dummy; +#endif + +#ifdef W32CODECDIR PE_image *hLib; LONG lOpenID; +#endif + +#if defined (W32CODECDIR) || defined(NATIVE_CODEC) LONG WINAPI (*DriverProc)(DWORD dwDriverId, HANDLE hdrvr, UINT msg, LONG lParam1, LONG lParam2); -#else /* defined (G_OS_WIN32) || defined (W32CODECDIR) */ - guint8 dummy; -#endif /* defined (G_OS_WIN32) || defined (W32CODECDIR) */ + gint attribute; +#endif + +#ifdef NATIVE_CODEC + GModule *module; +#endif } IcmDriver; @@ -80,11 +91,22 @@ #ifdef G_OS_WIN32 HDRVR hDrvr; #endif /* G_OS_WIN32 */ -#ifdef W32CODECDIR +#if defined (W32CODECDIR) || defined(NATIVE_CODEC) DWORD dwDriverId; -#endif /* W32CODECDIR */ +#endif /* defined (W32CODECDIR) || defined(NATIVE_CODEC) */ }; +#ifdef NATIVE_CODEC /* XXX: */ +typedef HANDLE HDRVR; + +#define NATIVE_CODEC_DIR ".vmaid_codec" + +struct _codec { + LONG (*proc) (DWORD dwDriverId, HDRVR hdrvr, UINT msg, LONG lParam1, LONG lParam2); + void (*conf) (void); +}; +#endif + /****************************************************************************** * * @@ -94,7 +116,7 @@ static GHashTable *ghash_handler = NULL, *ghash_path = NULL; -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined (NATIVE_CODEC) static guint32 icm_handler_tolower (const guint32 key) { @@ -198,35 +220,51 @@ { g_free (path); } -# else /* not G_OS_WIN32 */ - if ((icm_driver = g_malloc0 (sizeof (IcmDriver))) - && (icm_driver->hLib = peimage_create()) - && peimage_load (icm_driver->hLib, path) - && (icm_driver->DriverProc - = peimage_resolve (icm_driver->hLib, "DriverProc"))) - { - icm_driver->DriverProc (0, icm_driver->hLib, DRV_LOAD, 0, 0); - icm_driver->DriverProc (0, icm_driver->hLib, DRV_ENABLE, 0, 0); - icm_driver->lOpenID = icm_driver->DriverProc - (0, icm_driver->hLib, DRV_OPEN, (LONG)L"", 0); - g_hash_table_insert (ghash_path, path, icm_driver); +# endif /* G_OS_WIN32 */ +#ifdef W32CODECDIR + if ( 'l' == g_ascii_tolower(path[g_strlen(path) - 1]) ) { + if ((icm_driver = g_malloc0 (sizeof (IcmDriver))) + && (icm_driver->hLib = peimage_create()) + && peimage_load (icm_driver->hLib, path) + && (icm_driver->DriverProc + = peimage_resolve (icm_driver->hLib, "DriverProc"))) + { + icm_driver->attribute = ICM_ATTR_WIN32; + icm_driver->DriverProc (0, icm_driver->hLib, DRV_LOAD, 0, 0); + icm_driver->DriverProc (0, icm_driver->hLib, DRV_ENABLE, 0, 0); + icm_driver->lOpenID = icm_driver->DriverProc + (0, icm_driver->hLib, DRV_OPEN, (LONG)L"", 0); + g_hash_table_insert (ghash_path, path, icm_driver); + } + else + { + if (icm_driver->hLib) + peimage_destroy (icm_driver->hLib); + g_free (icm_driver); + g_free (path); + icm_driver = NULL; + } + } +#endif /* W32CODECDIR */ +#ifdef NATIVE_CODEC + if ( 'o' == g_ascii_tolower(path[g_strlen(path) - 1]) ) { + if ( NULL != (icm_driver = g_malloc0(sizeof(IcmDriver))) ) { + icm_driver->attribute = ICM_ATTR_NATIVE; + icm_driver->lpszName = (LPWSTR)g_strdup(path); + g_hash_table_insert(ghash_path, path, icm_driver); } - else - { - if (icm_driver->hLib) - peimage_destroy (icm_driver->hLib); - g_free (icm_driver); - g_free (path); - icm_driver = NULL; + else { + g_free(path); } -# endif /* not G_OS_WIN32 */ + } +#endif /* NATIVE_CODEC */ } if (icm_driver) /* ja:登録 */ g_hash_table_insert (ghash_handler, GUINT_TO_POINTER (handler), icm_driver); } } -#endif /* defined (G_OS_WIN32) || defined (W32CODECDIR) */ +#endif /* defined (G_OS_WIN32) || defined (W32CODECDIR) || defined (NATIVE_CODEC)*/ /* ja:ICMを初期化する @@ -234,17 +272,17 @@ gboolean icm_init (void) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined (NATIVE_CODEC) GHashTable *ghash; -#endif /* defined (G_OS_WIN32) || defined (W32CODECDIR) */ +#endif #ifdef G_OS_WIN32 DWORD dwIndex, dwName, dwType, dwValue; HKEY hKey; TCHAR szName[MAX_PATH], szValue[MAX_PATH]; #endif /* G_OS_WIN32 */ -#ifdef W32CODECDIR +#if defined (W32CODECDIR) || defined (NATIVE_CODEC) Profile *profile; -#endif /* W32CODECDIR */ +#endif if (ghash_handler || ghash_path) return FALSE; @@ -279,7 +317,7 @@ g_free (key); } #endif /* G_OS_WIN32 */ -#ifdef W32CODECDIR +#if defined (W32CODECDIR) || defined (NATIVE_CODEC) /* ja:設定 */ profile = profile_open (NULL); if (profile) @@ -325,7 +363,16 @@ } else { - path = g_build_filename (W32CODECDIR, tmp, NULL); + if ( 'l' == g_ascii_tolower(tmp[g_strlen(tmp) - 1]) ) { + path = g_build_filename (W32CODECDIR, tmp, NULL); + } +#ifdef NATIVE_CODEC + if ( 'o' == g_ascii_tolower(tmp[g_strlen(tmp) - 1]) ) { + path = g_build_filename(g_get_home_dir(), + NATIVE_CODEC_DIR, /* XXX: */ + tmp, NULL); + } +#endif g_free (tmp); } tmp = path; @@ -341,13 +388,13 @@ } profile_close (profile); } -#endif /* W32CODECDIR */ -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#endif /* defined (W32CODECDIR) || defined (NATIVE_CODEC) */ +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined (NATIVE_CODEC) ghash_handler = g_hash_table_new (icm_hash_handler, icm_equal_handler); ghash_path = g_hash_table_new (icm_hash_path, icm_equal_path); g_hash_table_foreach (ghash, icm_init_callback, ghash); g_hash_table_destroy (ghash); -#endif /* defined (G_OS_WIN32) || defined (W32CODECDIR) */ +#endif #ifdef G_OS_WIN32 return RegCloseKey (hKey) == ERROR_SUCCESS; #else /* not G_OS_WIN32 */ @@ -369,16 +416,18 @@ IcmDriver *icm_driver; icm_driver = orig_value; -#ifdef G_OS_WIN32 +#if defined(G_OS_WIN32) || defined(NATIVE_CODEC) g_free (icm_driver->lpszName); -#endif /* G_OS_WIN32 */ -#ifdef W32CODECDIR +#endif +#if defined(W32CODECDIR) || defined(NATIVE_CODEC) icm_driver->DriverProc (icm_driver->lOpenID, icm_driver->hLib, DRV_CLOSE, 0, 0); icm_driver->DriverProc (0, icm_driver->hLib, DRV_DISABLE, 0, 0); icm_driver->DriverProc (0, icm_driver->hLib, DRV_FREE, 0, 0); - peimage_destroy (icm_driver->hLib); -#endif /* W32CODECDIR */ + if ( ICM_ATTR_WIN32 == icm_driver->attribute ) { + peimage_destroy (icm_driver->hLib); + } +#endif g_free (icm_driver); g_free (orig_key); } @@ -508,7 +557,7 @@ IcmObject * icm_open (const guint32 handler, const gint mode) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) IcmObject *icm_object; ICOPEN icopen; @@ -548,8 +597,39 @@ icm_object->hDrvr = OpenDriver (icm_object->icm_driver->lpszName, NULL, (LONG)&icopen); # else /* not G_OS_WIN32 */ - icm_object->dwDriverId = icm_object->icm_driver->DriverProc - (0, icm_object->icm_driver->hLib, DRV_OPEN, 0, (LONG)&icopen); +#ifdef W32CODECDIR + if ( ICM_ATTR_WIN32 == icm_get_attribute(icm_object) ) { + icm_object->dwDriverId = icm_object->icm_driver->DriverProc + (0, icm_object->icm_driver->hLib, DRV_OPEN, 0, (LONG)&icopen); + } +#endif +#ifdef NATIVE_CODEC + if ( ICM_ATTR_NATIVE == icm_get_attribute(icm_object) ) { + struct _codec* Obj; /* XXX: */ + icm_object->dwDriverId = 0; + + if (TRUE != g_module_supported()) { + g_warning("NATIVE CODEC: TRUE != g_module_supported()\n"); + } + if (NULL == + (icm_object->icm_driver->module = + g_module_open((gchar*)icm_object->icm_driver->lpszName, 0)) ) { + g_warning("NATIVE CODEC: NULL == g_module_open(%s)\n", + (gchar*)icm_object->icm_driver->lpszName); + } + if (TRUE != g_module_symbol(icm_object->icm_driver->module + , "entry", (gpointer*)&Obj)) { + g_warning("NATIVE CODEC: TRUE != g_module_symbol()\n"); + if (TRUE != g_module_close(icm_object->icm_driver->module)) { + g_warning("NATIVE CODEC: TRUE != g_module_close()\n"); + } + } else if (NULL != Obj->proc) { + icm_object->icm_driver->DriverProc = Obj->proc; + icm_object->dwDriverId = icm_object->icm_driver->DriverProc + (0, icm_object->icm_driver->hLib, DRV_OPEN, 0, (LONG)&icopen); + } + } +#endif /* NATIVE_CODEC */ # endif /* not G_OS_WIN32 */ } # ifdef G_OS_WIN32 @@ -564,8 +644,13 @@ icinfo.dwSize = sizeof (ICINFO); icm_send_driver_message (icm_object, ICM_GETINFO, (LONG)&icinfo, sizeof (ICINFO)); - icm_object->name = g_utf16_to_utf8 (icinfo.szDescription, -1, - NULL, NULL, NULL); + + if ( ICM_ATTR_WIN32 == icm_get_attribute(icm_object) ) { + icm_object->name = g_utf16_to_utf8 (icinfo.szDescription, -1, + NULL, NULL, NULL); + } else { + icm_object->name = g_strdup((gchar*)icinfo.szDescription); + } icm_object->flags = 0; if (icinfo.dwFlags & VIDCF_QUALITY) icm_object->flags = ICM_FLAG_QUALITY; @@ -581,6 +666,7 @@ icm_object->flags |= ICM_FLAG_FASTTEMPORALC; if (icinfo.dwFlags & VIDCF_FASTTEMPORALD) icm_object->flags |= ICM_FLAG_FASTTEMPORALD; +/* XXX: #if defined(W32CODECDIR) || defined(NATIVE_CODEC) */ # ifdef W32CODECDIR if (icinfo.dwFlags & VIDCF_QUALITYTIME) icm_object->flags |= ICM_FLAG_QUALITYTIME; @@ -592,9 +678,9 @@ icm_object = NULL; } return icm_object; -#else /* not defined (G_OS_WIN32) || defined (W32CODECDIR) */ +#else /* not defined (G_OS_WIN32)||defined(W32CODECDIR)||defined(NATIVE_CODEC) */ return NULL; -#endif /* not defined (G_OS_WIN32) || defined (W32CODECDIR) */ +#endif /* not defined (G_OS_WIN32)||defined(W32CODECDIR)||defined(NATIVE_CODEC) */ } @@ -609,10 +695,15 @@ #ifdef G_OS_WIN32 CloseDriver (icm_object->hDrvr, 0, 0); #endif /* G_OS_WIN32 */ -#ifdef W32CODECDIR +#if defined(W32CODECDIR) || defined(NATIVE_CODEC) icm_object->icm_driver->DriverProc (icm_object->dwDriverId, icm_object->icm_driver->hLib, DRV_CLOSE, 0, 0); -#endif /* W32CODECDIR */ +#endif +#ifdef NATIVE_CODEC + if (TRUE != g_module_close(icm_object->icm_driver->module)) { + g_warning("NATIVE CODEC: TRUE != g_module_close()"); + } +#endif g_free (icm_object->name); g_free (icm_object->bmih_in); g_free (icm_object->bmih_out); @@ -694,7 +785,7 @@ gint icm_get_attribute (IcmObject *icm_object) { - return ICM_ATTR_WIN32; + return icm_object->icm_driver->attribute; } @@ -709,7 +800,7 @@ gsize icm_get_state_size (IcmObject *icm_object) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) return icm_object ? icm_send_driver_message (icm_object, ICM_GETSTATE, 0, 0) : 0; #else /* not defined (G_OS_WIN32) || defined (W32CODECDIR) */ @@ -728,7 +819,7 @@ gpointer param, gsize param_size) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) return icm_object && param && param_size > 0 && icm_send_driver_message (icm_object, ICM_GETSTATE, (LPARAM)param, param_size) == ICERR_OK; @@ -748,7 +839,7 @@ gpointer param, gsize param_size) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) if (icm_object && param && param_size > 0) { icm_send_driver_message (icm_object, ICM_SETSTATE, @@ -771,7 +862,7 @@ gboolean icm_is_dialog_about (IcmObject *icm_object) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) return icm_object && icm_send_driver_message (icm_object, ICM_ABOUT, -1, 0) == ICERR_OK; #else /* not defined (G_OS_WIN32) || defined (W32CODECDIR) */ @@ -785,7 +876,7 @@ void icm_dialog_about (IcmObject *icm_object) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) if (icm_object) icm_send_driver_message (icm_object, ICM_ABOUT, 0, 0); #endif /* defined (G_OS_WIN32) || defined (W32CODECDIR) */ @@ -798,7 +889,7 @@ gboolean icm_is_dialog_configure (IcmObject *icm_object) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) return icm_object && icm_send_driver_message (icm_object, ICM_CONFIGURE, -1, 0) == ICERR_OK; #else /* not defined (G_OS_WIN32) || defined (W32CODECDIR) */ @@ -812,7 +903,7 @@ void icm_dialog_configure (IcmObject *icm_object) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) if (icm_object) icm_send_driver_message (icm_object, ICM_CONFIGURE, 0, 0); #endif /* defined (G_OS_WIN32) || defined (W32CODECDIR) */ @@ -832,7 +923,7 @@ icm_compress_query (IcmObject *icm_object, const BitmapInfoHeader *bmih) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) return icm_object && bmih && icm_send_driver_message (icm_object, ICM_COMPRESS_QUERY, (LONG)bmih, 0) == ICERR_OK; #else /* not defined (G_OS_WIN32) || defined (W32CODECDIR) */ @@ -847,7 +938,7 @@ gint icm_compress_get_default_key_frame (IcmObject *icm_object) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) if (icm_object && (icm_get_flags (icm_object) & ICM_FLAG_TEMPORAL) != 0) { DWORD dwKeyFrame; @@ -867,7 +958,7 @@ gint icm_compress_get_default_quality (IcmObject *icm_object) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) if (icm_object && (icm_get_flags (icm_object) & ICM_FLAG_QUALITY) != 0) { @@ -890,7 +981,7 @@ icm_compress_get_format_size (IcmObject *icm_object, const BitmapInfoHeader *bmih) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) if (!icm_object || !bmih) return 0; return icm_send_driver_message (icm_object, @@ -911,7 +1002,7 @@ const BitmapInfoHeader *bmih_in, BitmapInfoHeader *bmih_out) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) return icm_object && bmih_in && bmih_out && icm_send_driver_message (icm_object, ICM_COMPRESS_GET_FORMAT, (LONG)bmih_in, (LONG)bmih_out) == ICERR_OK; @@ -927,7 +1018,7 @@ gsize icm_compress_get_size (IcmObject *icm_object) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) return icm_object && icm_object->bmih_in && icm_object->bmih_out ? icm_send_driver_message (icm_object, ICM_COMPRESS_GET_SIZE, (LONG)icm_object->bmih_in, (LONG)icm_object->bmih_out) : 0; @@ -959,7 +1050,7 @@ const guint32 rate, const guint32 scale) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) if (!icm_object) return FALSE; if (bmih_in) @@ -1021,7 +1112,7 @@ gboolean icm_compress_begin (IcmObject *icm_object) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) if (!icm_object || !icm_object->bmih_in || icm_object->prev) return FALSE; if (!icm_object->bmih_out) @@ -1057,7 +1148,7 @@ gboolean icm_compress_end (IcmObject *icm_object) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) if (!icm_object || !icm_object->prev) return FALSE; g_free (icm_object->prev); @@ -1082,7 +1173,7 @@ gpointer input, gpointer output) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) DWORD dwFlags,dwID; ICCOMPRESS iccompress; @@ -1143,7 +1234,7 @@ icm_decompress_query (IcmObject *icm_object, const BitmapInfoHeader *bmih) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) return icm_object && bmih && icm_send_driver_message (icm_object, ICM_DECOMPRESS_QUERY, (LONG)bmih, 0) == ICERR_OK; @@ -1161,7 +1252,7 @@ icm_decompress_get_format_size (IcmObject *icm_object, const BitmapInfoHeader *bmih) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) gsize bmih_size = 0; if (icm_object && bmih) @@ -1204,7 +1295,7 @@ const BitmapInfoHeader *bmih_in, BitmapInfoHeader *bmih_out) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) if (icm_object && bmih_in && bmih_out && icm_send_driver_message (icm_object, ICM_DECOMPRESS_GET_FORMAT, (LONG)bmih_in, (LONG)bmih_out) == ICERR_OK) @@ -1236,7 +1327,7 @@ icm_decompress_begin (IcmObject *icm_object, const BitmapInfoHeader *bmih) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) if (!icm_object || !bmih || icm_object->bmih_in || icm_object->bmih_out) return FALSE; icm_object->bmih_out @@ -1264,7 +1355,7 @@ gboolean icm_decompress_end (IcmObject *icm_object) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) if (!icm_object || (!icm_object->bmih_in && !icm_object->bmih_out)) return FALSE; g_free (icm_object->bmih_in); @@ -1291,7 +1382,7 @@ gpointer input, gpointer output) { -#if defined (G_OS_WIN32) || defined (W32CODECDIR) +#if defined (G_OS_WIN32) || defined (W32CODECDIR) || defined(NATIVE_CODEC) ICDECOMPRESS icdecompress; if (!icm_object || !input || !output -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: test_codec.tar.bz2 型: application/octet-stream サイズ: 3053 バイト 説明: 無し URL: http://lists.sourceforge.jp/mailman/archives/vmaid-devel/attachments/20051121/1c308c3b/attachment.obj From iwm @ maid.org Wed Nov 23 17:15:02 2005 From: iwm @ maid.org (Kazuki IWAMOTO) Date: Wed, 23 Nov 2005 17:15:02 +0900 Subject: [Vmaid-devel] =?iso-2022-jp?b?UmU6IE5hdGl2ZSBDb2RlYyA=?= =?iso-2022-jp?b?GyRCJEskRCQkJEYhIxsoQg==?= In-Reply-To: <20051121.021935.85415985.ryoma@users.sourceforge.jp> References: <20051121.021935.85415985.ryoma@users.sourceforge.jp> Message-ID: <43842506.3090204@maid.org> 岩本一樹です。おひさしぶりです。 パッチへの感想です。 1)NATIVE_CODECは不要 codec無しではAVIの編集は成り立たないと思います。ゆえにOSがWindows ではないときには、常にNativeのcodecを使いようにしたいです。 (OSがWindowsならば常にNativeのcodecは使わない) 2)DriverProc Windowsのcodecの仕様を踏襲する形でVideo maidのNativeなcodecを 実装するのはマズイと思います。 DriverProcはlParam1とlParam2がポインタになることがありますが、 そういう仕様は問題があると私は思います。DriverProcという1つの関数を エクスポートしてmsgで使い分けるのではなく、Nativeのcodecでは 機能に対応した各々の関数を用意した方が良いと思います。 Win32ならばlParam1にポインタを設定できるけど、環境によっては ポインタがLONG(32ビット)よりも大きい場合もありえると思います。 3)Nativeのcodecの読み込み方法 Profileは廃止予定です。ProfileからNativeのcodecを読み込むのではなく、 どこかのディレクトリを検索するような方法にしたいと考えています。 Win32エミュレーションの方はdllloaderを破棄して新たにw32loaderを作り、 それでOpenDriverなどの関数を実装する予定です。それによりicm.cの ソースレベルではOSがWindowsの時と、w32loaderによるエミュレーションの 差がなくなるようにします。 codecの登録は例えば.w32loaderみたいなファイルに [registry] HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Drivers32\VIDC.hfyu=huffyuv2.dll という記述をしておくことにします。そしてそれをRegOpenKeyExで開いて 値を取得するみたいな... パッチの方法はWindowsのcodecを少ない労力で移植するには適していると思います。 私が考えている方法だと、移植の手間は多くなると思います。 あとhuffyuvですが、Nativeのcodecを実装するときには、私も始めに huffyuv 2.1.1を作る予定でした。huffyuvは現在、誰も開発を行っていないようです。 ゆえに我々でhuffyuvの後継を宣言して、Windows版も含めて開発を行うことを 考えています。 岩本一樹 iwm @ maid.org From ryoma @ users.sourceforge.jp Fri Nov 25 20:45:05 2005 From: ryoma @ users.sourceforge.jp (ryoma) Date: Fri, 25 Nov 2005 20:45:05 +0900 (JST) Subject: [Vmaid-devel] =?iso-2022-jp?b?UmU6IE5hdGl2ZSBDb2RlYyA=?= =?iso-2022-jp?b?GyRCJEskRCQkJEYhIxsoQg==?= In-Reply-To: <43842506.3090204@maid.org> References: <20051121.021935.85415985.ryoma@users.sourceforge.jp> <43842506.3090204@maid.org> Message-ID: <20051125.204505.28781837.ryoma@users.sourceforge.jp> こんばんわ。ryoma です。 # 登録してあるアドレスしか受け付けてくれないのでしたね…。 > 1)NATIVE_CODECは不要 > ... 了解しました。 > 2)DriverProc > Windowsのcodecの仕様を踏襲する形でVideo maidのNativeなcodecを > 実装するのはマズイと思います。 > DriverProcはlParam1とlParam2がポインタになることがありますが、 > そういう仕様は問題があると私は思います。DriverProcという1つの関数を > エクスポートしてmsgで使い分けるのではなく、Nativeのcodecでは > 機能に対応した各々の関数を用意した方が良いと思います。 > Win32ならばlParam1にポインタを設定できるけど、環境によっては > ポインタがLONG(32ビット)よりも大きい場合もありえると思います。 サンプルコードではアドホックに long を使っていますが、私が参考にした MSDN の文書が古いのかもしれません。 以下のように書かれてまして、long にした次第でした。 LONG DriverProc( DWORD dwDriverId, HDRVR hdrvr, UINT msg, LONG lParam1, LONG lParam2 ); huffyuv の DriverProc は以下の様になってますね…。 こちらが新しい書き方なのでしょうか。 LRESULT PASCAL DriverProc(DWORD dwDriverID, HDRVR hDriver, UINT uiMessage, LPARAM lParam1, LPARAM lParam2); この場合、問題は起きないはずです。 以下、MinGW のヘッダより。 /* basetsd.h */ #define __int64 long long #if defined(_WIN64) typedef __int64 LONG_PTR, *PLONG_PTR; #else typedef long LONG_PTR, *PLONG_PTR; #endif /* windef.h */ typedef LONG_PTR LPARAM; typedef LONG_PTR LRESULT; ポインタが 32 ビットより大きい場合と言えば、主に 64 ビットになると思う のですが、UNIX 系?の 64 ビット環境では、大体は long は 64 ビットにな ると思います。最終的な判断は採用しているデータモデルに依存するのでしょ うから、結局なんとも言えませんが…、あまり心配ないかと。 # よく調べてませんが、LP64 で検索すれば、ちらほらと。 > 3)Nativeのcodecの読み込み方法 > Profileは廃止予定です。ProfileからNativeのcodecを読み込むのではなく、 > どこかのディレクトリを検索するような方法にしたいと考えています。 了解しました。 > Win32エミュレーションの方はdllloaderを破棄して新たにw32loaderを作り、 > それでOpenDriverなどの関数を実装する予定です。それによりicm.cの > ソースレベルではOSがWindowsの時と、w32loaderによるエミュレーションの > 差がなくなるようにします。 > codecの登録は例えば.w32loaderみたいなファイルに > [registry] > HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Drivers32\VIDC.hfyu=huffyuv2.dll > という記述をしておくことにします。そしてそれをRegOpenKeyExで開いて > 値を取得するみたいな... 現状のコードでは、エミュレーションとネイティブで同時に同じコーデックは 使えないので、何か考えます。 # そのうち、Win64 の事も考えないといけなくなるのかな…。 > パッチの方法はWindowsのcodecを少ない労力で移植するには適していると思います。 > 私が考えている方法だと、移植の手間は多くなると思います。 0からコーデックを書く場合であれば良いのですが、やはり、移植するとなる と、「少ない労力」に傾いてしまいます。(^^ > あとhuffyuvですが、Nativeのcodecを実装するときには、私も始めに > huffyuv 2.1.1を作る予定でした。huffyuvは現在、誰も開発を行っていないようです。 > ゆえに我々でhuffyuvの後継を宣言して、Windows版も含めて開発を行うことを > 考えています。 Huffyuv 0.2.5 patch なんて物もあるようですが、とりあえず huffyuv 2.1.1 から始めることにしました。 # とりあえず完成したと言うことで、手を付ける必要がないのか、開発を放棄 # したのか、どちらなんでしょうかね…。 -- ryoma From iwm @ maid.org Mon Nov 28 01:22:25 2005 From: iwm @ maid.org (Kazuki IWAMOTO) Date: Mon, 28 Nov 2005 01:22:25 +0900 Subject: [Vmaid-devel] =?iso-2022-jp?b?UmU6IE5hdGl2ZSBDb2RlYyA=?= =?iso-2022-jp?b?GyRCJEskRCQkJEYhIxsoQg==?= In-Reply-To: <20051125.204505.28781837.ryoma@users.sourceforge.jp> References: <20051121.021935.85415985.ryoma@users.sourceforge.jp> <43842506.3090204@maid.org> <20051125.204505.28781837.ryoma@users.sourceforge.jp> Message-ID: <4389DD41.2000905@maid.org> 岩本一樹です。 MSDNを見る限りDriverProcのlParamはLONGのようで、32ビットだと書かれています。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_driverproc.asp huffyuvのDriverProcでLRESULTやLPARAMを使う根拠はMSDNにはないようです。 ただ「DriverProcの定義をVideo maidでは LRESULT PASCAL DriverProc(DWORD dwDriverID, HDRVR hDriver, UINT uiMessage, LPARAM lParam1, LPARAM lParam2); とする」と決めてしまっても良いかもしれません。で、 「LRESULTやLPARAMはポインタよりも大きい何か」 と定義しておけば、一応筋は通ります。外のヘッダを読み込むのではなく、 LRESULTやLPARAMを自前のcodec.hで定義しているのですから、 Windowsっぽいソースコードだけど、実体は別物ってのもOKだと思います。 > 現状のコードでは、エミュレーションとネイティブで同時に同じコーデックは > 使えないので、何か考えます。 私の考えでは、同じコーデックがあるときにはネイティブ優先だと思います。 > 0からコーデックを書く場合であれば良いのですが、やはり、移植するとなる > と、「少ない労力」に傾いてしまいます。(^^ でもhuffyuv以外にWindowsのソースコードを使って移植するようなcodecは ないと思います。huffyuvのためにWindows寄りの仕様にしてしまうと、その他の codecが辛くなるかもしれません。 しかし、いろいろと考えるよりも、実際に作ってから考えましょう。 岩本一樹 iwm @ maid.org From iwm @ maid.org Wed Nov 30 02:37:39 2005 From: iwm @ maid.org (Kazuki IWAMOTO) Date: Wed, 30 Nov 2005 02:37:39 +0900 Subject: [Vmaid-devel] =?iso-2022-jp?b?MjAwNRskQkcvGyhCMTEbJEI3biROGyhC?= =?iso-2022-jp?b?GyRCOHgzKyRIOiM4ZRsoQg==?= Message-ID: <438C91E3.5020600@maid.org> 岩本一樹です。 Text maid、Video maid、Melody maidを更新しました。主な更新は GNUのサイトにある最新のライセンスの条文に置き換えたことくらいです。 ryomaさんがVideo maidのcodecを作ることになったので、私の方では 予定を変更して今後はVideo maidのWindowsエミュレーションの改良を 先に行いたいと思います。 岩本一樹 iwm @ maid.org