--- trunk/xvidcore/dshow/src/CXvidDecoder.cpp 2010/10/17 18:36:12 1899 +++ trunk/xvidcore/dshow/src/CXvidDecoder.cpp 2011/02/14 16:59:16 1949 @@ -20,15 +20,7 @@ * along with this program ; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: CXvidDecoder.cpp,v 1.21 2010-10-17 18:36:12 Isibaar Exp $ - * - ****************************************************************************/ - -/**************************************************************************** - * - * 2003/12/11 - added some additional options, mainly to make the deblocking - * code from xvidcore available. Most of the new code is taken - * from Nic's dshow filter, (C) Nic, http://nic.dnsalias.com + * $Id: CXvidDecoder.cpp,v 1.28 2011-02-14 16:59:16 Isibaar Exp $ * ****************************************************************************/ @@ -44,8 +36,10 @@ C:\DX90SDK\Samples\C++\DirectShow\BaseClasses\Debug */ +/* #define XVID_USE_MFT #define XVID_USE_TRAYICON +*/ #include @@ -95,6 +89,22 @@ { &MEDIATYPE_Video, &CLSID_DIVX_UC }, { &MEDIATYPE_Video, &CLSID_DX50 }, { &MEDIATYPE_Video, &CLSID_DX50_UC }, + { &MEDIATYPE_Video, &CLSID_3IVX }, + { &MEDIATYPE_Video, &CLSID_3IVX_UC }, + { &MEDIATYPE_Video, &CLSID_3IV0 }, + { &MEDIATYPE_Video, &CLSID_3IV0_UC }, + { &MEDIATYPE_Video, &CLSID_3IV1 }, + { &MEDIATYPE_Video, &CLSID_3IV1_UC }, + { &MEDIATYPE_Video, &CLSID_3IV2 }, + { &MEDIATYPE_Video, &CLSID_3IV2_UC }, + { &MEDIATYPE_Video, &CLSID_LMP4 }, + { &MEDIATYPE_Video, &CLSID_LMP4_UC }, + { &MEDIATYPE_Video, &CLSID_RMP4 }, + { &MEDIATYPE_Video, &CLSID_RMP4_UC }, + { &MEDIATYPE_Video, &CLSID_SMP4 }, + { &MEDIATYPE_Video, &CLSID_SMP4_UC }, + { &MEDIATYPE_Video, &CLSID_HDX4 }, + { &MEDIATYPE_Video, &CLSID_HDX4_UC }, { &MEDIATYPE_Video, &CLSID_MP4V }, { &MEDIATYPE_Video, &CLSID_MP4V_UC }, }; @@ -136,7 +146,7 @@ { &CLSID_XVID, // Filter CLSID XVID_NAME_L, // Filter name - MERIT_PREFERRED, // Its merit + MERIT_PREFERRED+2, // Its merit sizeof(psudPins) / sizeof(AMOVIESETUP_PIN), // Number of pins psudPins // Pin details }; @@ -170,6 +180,7 @@ extern HINSTANCE g_xvid_hInst; static int GUI_Page = 0; +static int Tray_Icon = 0; extern "C" void CALLBACK Configure(HWND hWndParent, HINSTANCE hInstParent, LPSTR lpCmdLine, int nCmdShow ); LRESULT CALLBACK msg_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) @@ -190,7 +201,17 @@ return DefWindowProc(hwnd, uMsg, wParam, lParam); }; break; + + case WM_DESTROY: + NOTIFYICONDATA nid; + ZeroMemory(&nid,sizeof(NOTIFYICONDATA)); + + nid.cbSize = NOTIFYICONDATA_V1_SIZE; + nid.hWnd = hwnd; + nid.uID = 1456; + Shell_NotifyIcon(NIM_DELETE, &nid); + Tray_Icon = 0; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } @@ -301,10 +322,6 @@ xvid_decore_func = NULL; // Hmm, some strange errors appearing if I try to initialize... xvid_global_func = NULL; // ...this in constructor's init-list. So, they assigned here. -#ifdef XVID_USE_TRAYICON - MSG_hwnd = NULL; -#endif - #if defined(XVID_USE_MFT) InitializeCriticalSection(&m_mft_lock); m_pInputType = NULL; @@ -331,6 +348,11 @@ xvid_gbl_init_t init; memset(&init, 0, sizeof(init)); init.version = XVID_VERSION; + init.cpu_flags = g_config.cpu; + + xvid_gbl_info_t info; + memset(&info, 0, sizeof(info)); + info.version = XVID_VERSION; m_hdll = LoadLibrary(XVID_DLL_NAME); if (m_hdll == NULL) { @@ -366,9 +388,27 @@ return E_FAIL; } + if (xvid_global_func(0, XVID_GBL_INFO, &info, NULL) < 0) + { + xvid_global_func = NULL; + xvid_decore_func = NULL; + FreeLibrary(m_hdll); + m_hdll = NULL; + MessageBox(0, "xvid_global() failed", "Error", MB_TOPMOST); + return E_FAIL; + } + memset(&m_create, 0, sizeof(m_create)); m_create.version = XVID_VERSION; m_create.handle = NULL; + /* Decoder threads */ + if (g_config.cpu & XVID_CPU_FORCE) { + m_create.num_threads = g_config.num_threads; + } + else { + m_create.num_threads = info.num_threads; /* Autodetect */ + g_config.num_threads = info.num_threads; + } memset(&m_frame, 0, sizeof(m_frame)); m_frame.version = XVID_VERSION; @@ -456,22 +496,24 @@ CXvidDecoder::~CXvidDecoder() { DPRINTF("Destructor"); - CloseLib(); #ifdef XVID_USE_TRAYICON - if (MSG_hwnd != NULL) { + if (Tray_Icon) { /* Destroy tray icon */ NOTIFYICONDATA nid; - nid.cbSize = sizeof(NOTIFYICONDATA); + ZeroMemory(&nid,sizeof(NOTIFYICONDATA)); + + nid.cbSize = NOTIFYICONDATA_V1_SIZE; nid.hWnd = MSG_hwnd; - nid.uID = 100; + nid.uID = 1456; - Shell_NotifyIcon(NIM_DELETE, &nid); - - DestroyWindow(MSG_hwnd); - MSG_hwnd = NULL; + Shell_NotifyIcon(NIM_DELETE, &nid); + Tray_Icon = 0; } #endif + /* Close xvidcore library */ + CloseLib(); + #if defined(XVID_USE_MFT) DeleteCriticalSection(&m_mft_lock); #endif @@ -577,24 +619,43 @@ switch(hdr->biCompression) { - case FOURCC_mp4v: - case FOURCC_MP4V: + case FOURCC_mp4v : + case FOURCC_MP4V : + case FOURCC_lmp4 : + case FOURCC_LMP4 : + case FOURCC_rmp4 : + case FOURCC_RMP4 : + case FOURCC_smp4 : + case FOURCC_SMP4 : + case FOURCC_hdx4 : + case FOURCC_HDX4 : if (!(g_config.supported_4cc & SUPPORT_MP4V)) { CloseLib(); return VFW_E_TYPE_NOT_ACCEPTED; } break; + case FOURCC_divx : case FOURCC_DIVX : + case FOURCC_dx50 : + case FOURCC_DX50 : if (!(g_config.supported_4cc & SUPPORT_DIVX)) { CloseLib(); return VFW_E_TYPE_NOT_ACCEPTED; } break; - case FOURCC_DX50 : - if (!(g_config.supported_4cc & SUPPORT_DX50)) { + case FOURCC_3ivx : + case FOURCC_3IVX : + case FOURCC_3iv0 : + case FOURCC_3IV0 : + case FOURCC_3iv1 : + case FOURCC_3IV1 : + case FOURCC_3iv2 : + case FOURCC_3IV2 : + if (!(g_config.supported_4cc & SUPPORT_3IVX)) { CloseLib(); return VFW_E_TYPE_NOT_ACCEPTED; } + case FOURCC_xvid : case FOURCC_XVID : break; @@ -874,7 +935,7 @@ DPRINTF("CompleteConnect"); #ifdef XVID_USE_TRAYICON - if ((direction == PINDIR_OUTPUT) && (MSG_hwnd == NULL)) + if ((direction == PINDIR_OUTPUT) && (Tray_Icon == 0)) { WNDCLASSEX wc; @@ -897,17 +958,20 @@ /* display the tray icon */ NOTIFYICONDATA nid; - - nid.cbSize = sizeof(NOTIFYICONDATA); + ZeroMemory(&nid,sizeof(NOTIFYICONDATA)); + + nid.cbSize = NOTIFYICONDATA_V1_SIZE; nid.hWnd = MSG_hwnd; - nid.uID = 100; - nid.uVersion = NOTIFYICON_VERSION; + nid.uID = 1456; nid.uCallbackMessage = WM_ICONMESSAGE; nid.hIcon = LoadIcon(g_xvid_hInst, MAKEINTRESOURCE(IDI_ICON)); strcpy_s(nid.szTip, 19, "Xvid Video Decoder"); nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; Shell_NotifyIcon(NIM_ADD, &nid); + + DestroyIcon(nid.hIcon); + Tray_Icon = 1; } #endif @@ -919,22 +983,6 @@ { DPRINTF("BreakConnect"); -#ifdef XVID_USE_TRAYICON - if ((direction == PINDIR_OUTPUT) && (MSG_hwnd != NULL)) { - NOTIFYICONDATA nid; - - nid.cbSize = sizeof(NOTIFYICONDATA); - nid.hWnd = MSG_hwnd; - nid.uID = 100; - nid.uVersion = NOTIFYICON_VERSION; - - if(Shell_NotifyIcon(NIM_DELETE, &nid) == TRUE) { - DestroyWindow(MSG_hwnd); - MSG_hwnd = NULL; - } - } -#endif - return S_OK; } @@ -1322,17 +1370,33 @@ bs_guid_table[i++] = (GUID *)&CLSID_XVID; bs_guid_table[i++] = (GUID *)&CLSID_XVID_UC; - if (g_config.supported_4cc & SUPPORT_DX50) { - bs_guid_table[i++] = (GUID *)&CLSID_DX50; - bs_guid_table[i++] = (GUID *)&CLSID_DX50_UC; + if (g_config.supported_4cc & SUPPORT_3IVX) { + bs_guid_table[i++] = (GUID *)&CLSID_3IVX; + bs_guid_table[i++] = (GUID *)&CLSID_3IVX_UC; + bs_guid_table[i++] = (GUID *)&CLSID_3IV0; + bs_guid_table[i++] = (GUID *)&CLSID_3IV0_UC; + bs_guid_table[i++] = (GUID *)&CLSID_3IV1; + bs_guid_table[i++] = (GUID *)&CLSID_3IV1_UC; + bs_guid_table[i++] = (GUID *)&CLSID_3IV2; + bs_guid_table[i++] = (GUID *)&CLSID_3IV2_UC; } if (g_config.supported_4cc & SUPPORT_DIVX) { bs_guid_table[i++] = (GUID *)&CLSID_DIVX; bs_guid_table[i++] = (GUID *)&CLSID_DIVX_UC; + bs_guid_table[i++] = (GUID *)&CLSID_DX50; + bs_guid_table[i++] = (GUID *)&CLSID_DX50_UC; } if (g_config.supported_4cc & SUPPORT_MP4V) { bs_guid_table[i++] = (GUID *)&CLSID_MP4V; bs_guid_table[i++] = (GUID *)&CLSID_MP4V_UC; + bs_guid_table[i++] = (GUID *)&CLSID_LMP4; + bs_guid_table[i++] = (GUID *)&CLSID_LMP4_UC; + bs_guid_table[i++] = (GUID *)&CLSID_RMP4; + bs_guid_table[i++] = (GUID *)&CLSID_RMP4_UC; + bs_guid_table[i++] = (GUID *)&CLSID_SMP4; + bs_guid_table[i++] = (GUID *)&CLSID_SMP4_UC; + bs_guid_table[i++] = (GUID *)&CLSID_HDX4; + bs_guid_table[i++] = (GUID *)&CLSID_HDX4_UC; } const GUID *subtype; @@ -1582,9 +1646,8 @@ hr = OnSetOutputType(pType); } } - #ifdef XVID_USE_TRAYICON - if (SUCCEEDED(hr) && MSG_hwnd == NULL) /* Create message passing window */ + if (SUCCEEDED(hr) && Tray_Icon == 0) /* Create message passing window */ { WNDCLASSEX wc; @@ -1607,17 +1670,20 @@ /* display the tray icon */ NOTIFYICONDATA nid; - - nid.cbSize = sizeof(NOTIFYICONDATA); + ZeroMemory(&nid,sizeof(NOTIFYICONDATA)); + + nid.cbSize = NOTIFYICONDATA_V1_SIZE; nid.hWnd = MSG_hwnd; - nid.uID = 100; - nid.uVersion = NOTIFYICON_VERSION; + nid.uID = 1456; nid.uCallbackMessage = WM_ICONMESSAGE; nid.hIcon = LoadIcon(g_xvid_hInst, MAKEINTRESOURCE(IDI_ICON)); strcpy_s(nid.szTip, 19, "Xvid Video Decoder"); nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; - + Shell_NotifyIcon(NIM_ADD, &nid); + + DestroyIcon(nid.hIcon); + Tray_Icon = 1; } #endif @@ -1950,6 +2016,9 @@ if (FAILED(pSample->GetSampleDuration(&m_timelength))) { m_timelength = INVALID_TIME; } + if (m_timestamp != INVALID_TIME && stats.type == XVID_TYPE_IVOP) { + m_rtFrame = m_timestamp; + } } LeaveCriticalSection(&m_mft_lock); @@ -2127,7 +2196,11 @@ hr = pmt->GetGUID(MF_MT_SUBTYPE, &subtype); } - if (subtype == CLSID_MP4V || subtype == CLSID_MP4V_UC) { + if (subtype == CLSID_MP4V || subtype == CLSID_MP4V_UC || + subtype == CLSID_LMP4 || subtype == CLSID_LMP4_UC || + subtype == CLSID_RMP4 || subtype == CLSID_RMP4_UC || + subtype == CLSID_SMP4 || subtype == CLSID_SMP4_UC || + subtype == CLSID_HDX4 || subtype == CLSID_HDX4_UC) { if (!(g_config.supported_4cc & SUPPORT_MP4V)) { CloseLib(); hr = MF_E_INVALIDTYPE; @@ -2142,12 +2215,22 @@ else m_create.fourcc = FOURCC_DIVX; } else if (subtype == CLSID_DX50 || subtype == CLSID_DX50_UC) { - if (!(g_config.supported_4cc & SUPPORT_DX50)) { + if (!(g_config.supported_4cc & SUPPORT_DIVX)) { CloseLib(); hr = MF_E_INVALIDTYPE; } else m_create.fourcc = FOURCC_DX50; } + else if (subtype == CLSID_3IVX || subtype == CLSID_3IVX_UC || + subtype == CLSID_3IV0 || subtype == CLSID_3IV0_UC || + subtype == CLSID_3IV1 || subtype == CLSID_3IV1_UC || + subtype == CLSID_3IV2 || subtype == CLSID_3IV2_UC) { + if (!(g_config.supported_4cc & SUPPORT_3IVX)) { + CloseLib(); + hr = MF_E_INVALIDTYPE; + } + else m_create.fourcc = FOURCC_3IVX; + } else if (subtype == CLSID_XVID || subtype == CLSID_XVID_UC) { m_create.fourcc = FOURCC_XVID; }