3 |
* XVID MPEG-4 VIDEO CODEC |
* XVID MPEG-4 VIDEO CODEC |
4 |
* - Xvid Decoder part of the DShow Filter - |
* - Xvid Decoder part of the DShow Filter - |
5 |
* |
* |
6 |
* Copyright(C) 2002-2010 Peter Ross <pross@xvid.org> |
* Copyright(C) 2002-2011 Peter Ross <pross@xvid.org> |
7 |
* 2003-2010 Michael Militzer <michael@xvid.org> |
* 2003-2011 Michael Militzer <michael@xvid.org> |
8 |
* |
* |
9 |
* This program is free software ; you can redistribute it and/or modify |
* This program is free software ; you can redistribute it and/or modify |
10 |
* it under the terms of the GNU General Public License as published by |
* it under the terms of the GNU General Public License as published by |
20 |
* along with this program ; if not, write to the Free Software |
* along with this program ; if not, write to the Free Software |
21 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
22 |
* |
* |
23 |
* $Id: CXvidDecoder.cpp,v 1.20 2010-10-17 18:31:46 Isibaar Exp $ |
* $Id$ |
|
* |
|
|
****************************************************************************/ |
|
|
|
|
|
/**************************************************************************** |
|
|
* |
|
|
* 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 |
|
24 |
* |
* |
25 |
****************************************************************************/ |
****************************************************************************/ |
26 |
|
|
36 |
C:\DX90SDK\Samples\C++\DirectShow\BaseClasses\Debug |
C:\DX90SDK\Samples\C++\DirectShow\BaseClasses\Debug |
37 |
*/ |
*/ |
38 |
|
|
39 |
//#define XVID_USE_MFT |
#ifdef ENABLE_MFT |
40 |
//#define XVID_USE_TRAYICON |
#define XVID_USE_MFT |
41 |
|
#endif |
42 |
|
|
43 |
|
#define XVID_USE_TRAYICON |
44 |
|
|
45 |
#include <windows.h> |
#include <windows.h> |
46 |
|
|
90 |
{ &MEDIATYPE_Video, &CLSID_DIVX_UC }, |
{ &MEDIATYPE_Video, &CLSID_DIVX_UC }, |
91 |
{ &MEDIATYPE_Video, &CLSID_DX50 }, |
{ &MEDIATYPE_Video, &CLSID_DX50 }, |
92 |
{ &MEDIATYPE_Video, &CLSID_DX50_UC }, |
{ &MEDIATYPE_Video, &CLSID_DX50_UC }, |
93 |
|
{ &MEDIATYPE_Video, &CLSID_3IVX }, |
94 |
|
{ &MEDIATYPE_Video, &CLSID_3IVX_UC }, |
95 |
|
{ &MEDIATYPE_Video, &CLSID_3IV0 }, |
96 |
|
{ &MEDIATYPE_Video, &CLSID_3IV0_UC }, |
97 |
|
{ &MEDIATYPE_Video, &CLSID_3IV1 }, |
98 |
|
{ &MEDIATYPE_Video, &CLSID_3IV1_UC }, |
99 |
|
{ &MEDIATYPE_Video, &CLSID_3IV2 }, |
100 |
|
{ &MEDIATYPE_Video, &CLSID_3IV2_UC }, |
101 |
|
{ &MEDIATYPE_Video, &CLSID_LMP4 }, |
102 |
|
{ &MEDIATYPE_Video, &CLSID_LMP4_UC }, |
103 |
|
{ &MEDIATYPE_Video, &CLSID_RMP4 }, |
104 |
|
{ &MEDIATYPE_Video, &CLSID_RMP4_UC }, |
105 |
|
{ &MEDIATYPE_Video, &CLSID_SMP4 }, |
106 |
|
{ &MEDIATYPE_Video, &CLSID_SMP4_UC }, |
107 |
|
{ &MEDIATYPE_Video, &CLSID_HDX4 }, |
108 |
|
{ &MEDIATYPE_Video, &CLSID_HDX4_UC }, |
109 |
{ &MEDIATYPE_Video, &CLSID_MP4V }, |
{ &MEDIATYPE_Video, &CLSID_MP4V }, |
110 |
{ &MEDIATYPE_Video, &CLSID_MP4V_UC }, |
{ &MEDIATYPE_Video, &CLSID_MP4V_UC }, |
111 |
}; |
}; |
147 |
{ |
{ |
148 |
&CLSID_XVID, // Filter CLSID |
&CLSID_XVID, // Filter CLSID |
149 |
XVID_NAME_L, // Filter name |
XVID_NAME_L, // Filter name |
150 |
MERIT_PREFERRED, // Its merit |
MERIT_PREFERRED+2, // Its merit |
151 |
sizeof(psudPins) / sizeof(AMOVIESETUP_PIN), // Number of pins |
sizeof(psudPins) / sizeof(AMOVIESETUP_PIN), // Number of pins |
152 |
psudPins // Pin details |
psudPins // Pin details |
153 |
}; |
}; |
181 |
extern HINSTANCE g_xvid_hInst; |
extern HINSTANCE g_xvid_hInst; |
182 |
|
|
183 |
static int GUI_Page = 0; |
static int GUI_Page = 0; |
184 |
|
static int Tray_Icon = 0; |
185 |
extern "C" void CALLBACK Configure(HWND hWndParent, HINSTANCE hInstParent, LPSTR lpCmdLine, int nCmdShow ); |
extern "C" void CALLBACK Configure(HWND hWndParent, HINSTANCE hInstParent, LPSTR lpCmdLine, int nCmdShow ); |
186 |
|
|
187 |
LRESULT CALLBACK msg_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) |
LRESULT CALLBACK msg_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) |
203 |
}; |
}; |
204 |
break; |
break; |
205 |
|
|
206 |
|
case WM_DESTROY: |
207 |
|
NOTIFYICONDATA nid; |
208 |
|
ZeroMemory(&nid,sizeof(NOTIFYICONDATA)); |
209 |
|
|
210 |
|
nid.cbSize = NOTIFYICONDATA_V1_SIZE; |
211 |
|
nid.hWnd = hwnd; |
212 |
|
nid.uID = 1456; |
213 |
|
|
214 |
|
Shell_NotifyIcon(NIM_DELETE, &nid); |
215 |
|
Tray_Icon = 0; |
216 |
default: |
default: |
217 |
return DefWindowProc(hwnd, uMsg, wParam, lParam); |
return DefWindowProc(hwnd, uMsg, wParam, lParam); |
218 |
} |
} |
313 |
|
|
314 |
/* constructor */ |
/* constructor */ |
315 |
|
|
|
#define XVID_DLL_NAME "xvidcore.dll" |
|
|
|
|
316 |
CXvidDecoder::CXvidDecoder(LPUNKNOWN punk, HRESULT *phr) : |
CXvidDecoder::CXvidDecoder(LPUNKNOWN punk, HRESULT *phr) : |
317 |
CVideoTransformFilter(NAME("CXvidDecoder"), punk, CLSID_XVID), m_hdll (NULL) |
CVideoTransformFilter(NAME("CXvidDecoder"), punk, CLSID_XVID), m_hdll (NULL) |
318 |
{ |
{ |
321 |
xvid_decore_func = NULL; // Hmm, some strange errors appearing if I try to initialize... |
xvid_decore_func = NULL; // Hmm, some strange errors appearing if I try to initialize... |
322 |
xvid_global_func = NULL; // ...this in constructor's init-list. So, they assigned here. |
xvid_global_func = NULL; // ...this in constructor's init-list. So, they assigned here. |
323 |
|
|
|
#ifdef XVID_USE_TRAYICON |
|
|
MSG_hwnd = NULL; |
|
|
#endif |
|
|
|
|
324 |
#if defined(XVID_USE_MFT) |
#if defined(XVID_USE_MFT) |
325 |
InitializeCriticalSection(&m_mft_lock); |
InitializeCriticalSection(&m_mft_lock); |
326 |
m_pInputType = NULL; |
m_pInputType = NULL; |
347 |
xvid_gbl_init_t init; |
xvid_gbl_init_t init; |
348 |
memset(&init, 0, sizeof(init)); |
memset(&init, 0, sizeof(init)); |
349 |
init.version = XVID_VERSION; |
init.version = XVID_VERSION; |
350 |
|
init.cpu_flags = g_config.cpu; |
351 |
|
|
352 |
|
xvid_gbl_info_t info; |
353 |
|
memset(&info, 0, sizeof(info)); |
354 |
|
info.version = XVID_VERSION; |
355 |
|
|
356 |
m_hdll = LoadLibrary(XVID_DLL_NAME); |
m_hdll = LoadLibrary(XVID_DLL_NAME); |
357 |
if (m_hdll == NULL) { |
if (m_hdll == NULL) { |
387 |
return E_FAIL; |
return E_FAIL; |
388 |
} |
} |
389 |
|
|
390 |
|
if (xvid_global_func(0, XVID_GBL_INFO, &info, NULL) < 0) |
391 |
|
{ |
392 |
|
xvid_global_func = NULL; |
393 |
|
xvid_decore_func = NULL; |
394 |
|
FreeLibrary(m_hdll); |
395 |
|
m_hdll = NULL; |
396 |
|
MessageBox(0, "xvid_global() failed", "Error", MB_TOPMOST); |
397 |
|
return E_FAIL; |
398 |
|
} |
399 |
|
|
400 |
memset(&m_create, 0, sizeof(m_create)); |
memset(&m_create, 0, sizeof(m_create)); |
401 |
m_create.version = XVID_VERSION; |
m_create.version = XVID_VERSION; |
402 |
m_create.handle = NULL; |
m_create.handle = NULL; |
403 |
|
/* Decoder threads */ |
404 |
|
if (g_config.cpu & XVID_CPU_FORCE) { |
405 |
|
m_create.num_threads = g_config.num_threads; |
406 |
|
} |
407 |
|
else { |
408 |
|
m_create.num_threads = info.num_threads; /* Autodetect */ |
409 |
|
g_config.num_threads = info.num_threads; |
410 |
|
} |
411 |
|
|
412 |
memset(&m_frame, 0, sizeof(m_frame)); |
memset(&m_frame, 0, sizeof(m_frame)); |
413 |
m_frame.version = XVID_VERSION; |
m_frame.version = XVID_VERSION; |
495 |
CXvidDecoder::~CXvidDecoder() |
CXvidDecoder::~CXvidDecoder() |
496 |
{ |
{ |
497 |
DPRINTF("Destructor"); |
DPRINTF("Destructor"); |
|
CloseLib(); |
|
498 |
|
|
499 |
#ifdef XVID_USE_TRAYICON |
#ifdef XVID_USE_TRAYICON |
500 |
if (MSG_hwnd != NULL) { |
if (Tray_Icon) { /* Destroy tray icon */ |
501 |
NOTIFYICONDATA nid; |
NOTIFYICONDATA nid; |
502 |
nid.cbSize = sizeof(NOTIFYICONDATA); |
ZeroMemory(&nid,sizeof(NOTIFYICONDATA)); |
503 |
|
|
504 |
|
nid.cbSize = NOTIFYICONDATA_V1_SIZE; |
505 |
nid.hWnd = MSG_hwnd; |
nid.hWnd = MSG_hwnd; |
506 |
nid.uID = 100; |
nid.uID = 1456; |
507 |
|
|
508 |
Shell_NotifyIcon(NIM_DELETE, &nid); |
Shell_NotifyIcon(NIM_DELETE, &nid); |
509 |
|
Tray_Icon = 0; |
|
DestroyWindow(MSG_hwnd); |
|
|
MSG_hwnd = NULL; |
|
510 |
} |
} |
511 |
#endif |
#endif |
512 |
|
|
513 |
|
/* Close xvidcore library */ |
514 |
|
CloseLib(); |
515 |
|
|
516 |
#if defined(XVID_USE_MFT) |
#if defined(XVID_USE_MFT) |
517 |
DeleteCriticalSection(&m_mft_lock); |
DeleteCriticalSection(&m_mft_lock); |
518 |
#endif |
#endif |
620 |
{ |
{ |
621 |
case FOURCC_mp4v: |
case FOURCC_mp4v: |
622 |
case FOURCC_MP4V: |
case FOURCC_MP4V: |
623 |
|
case FOURCC_lmp4 : |
624 |
|
case FOURCC_LMP4 : |
625 |
|
case FOURCC_rmp4 : |
626 |
|
case FOURCC_RMP4 : |
627 |
|
case FOURCC_smp4 : |
628 |
|
case FOURCC_SMP4 : |
629 |
|
case FOURCC_hdx4 : |
630 |
|
case FOURCC_HDX4 : |
631 |
if (!(g_config.supported_4cc & SUPPORT_MP4V)) { |
if (!(g_config.supported_4cc & SUPPORT_MP4V)) { |
632 |
CloseLib(); |
CloseLib(); |
633 |
return VFW_E_TYPE_NOT_ACCEPTED; |
return VFW_E_TYPE_NOT_ACCEPTED; |
634 |
} |
} |
635 |
break; |
break; |
636 |
|
case FOURCC_divx : |
637 |
case FOURCC_DIVX : |
case FOURCC_DIVX : |
638 |
|
case FOURCC_dx50 : |
639 |
|
case FOURCC_DX50 : |
640 |
if (!(g_config.supported_4cc & SUPPORT_DIVX)) { |
if (!(g_config.supported_4cc & SUPPORT_DIVX)) { |
641 |
CloseLib(); |
CloseLib(); |
642 |
return VFW_E_TYPE_NOT_ACCEPTED; |
return VFW_E_TYPE_NOT_ACCEPTED; |
643 |
} |
} |
644 |
break; |
break; |
645 |
case FOURCC_DX50 : |
case FOURCC_3ivx : |
646 |
if (!(g_config.supported_4cc & SUPPORT_DX50)) { |
case FOURCC_3IVX : |
647 |
|
case FOURCC_3iv0 : |
648 |
|
case FOURCC_3IV0 : |
649 |
|
case FOURCC_3iv1 : |
650 |
|
case FOURCC_3IV1 : |
651 |
|
case FOURCC_3iv2 : |
652 |
|
case FOURCC_3IV2 : |
653 |
|
if (!(g_config.supported_4cc & SUPPORT_3IVX)) { |
654 |
CloseLib(); |
CloseLib(); |
655 |
return VFW_E_TYPE_NOT_ACCEPTED; |
return VFW_E_TYPE_NOT_ACCEPTED; |
656 |
} |
} |
657 |
|
case FOURCC_xvid : |
658 |
case FOURCC_XVID : |
case FOURCC_XVID : |
659 |
break; |
break; |
660 |
|
|
815 |
/* (internal function) change colorspace */ |
/* (internal function) change colorspace */ |
816 |
#define CALC_BI_STRIDE(width,bitcount) ((((width * bitcount) + 31) & ~31) >> 3) |
#define CALC_BI_STRIDE(width,bitcount) ((((width * bitcount) + 31) & ~31) >> 3) |
817 |
|
|
818 |
HRESULT CXvidDecoder::ChangeColorspace(GUID subtype, GUID formattype, void * format) |
HRESULT CXvidDecoder::ChangeColorspace(GUID subtype, GUID formattype, void * format, int noflip) |
819 |
{ |
{ |
820 |
DWORD biWidth; |
DWORD biWidth; |
821 |
|
|
838 |
return S_FALSE; |
return S_FALSE; |
839 |
} |
} |
840 |
|
|
841 |
|
if (noflip) rgb_flip = 0; |
842 |
|
|
843 |
if (subtype == CLSID_MEDIASUBTYPE_IYUV) |
if (subtype == CLSID_MEDIASUBTYPE_IYUV) |
844 |
{ |
{ |
845 |
DPRINTF("IYUV"); |
DPRINTF("IYUV"); |
913 |
|
|
914 |
if (direction == PINDIR_OUTPUT) |
if (direction == PINDIR_OUTPUT) |
915 |
{ |
{ |
916 |
return ChangeColorspace(*pmt->Subtype(), *pmt->FormatType(), pmt->Format()); |
return ChangeColorspace(*pmt->Subtype(), *pmt->FormatType(), pmt->Format(), 0); |
917 |
} |
} |
918 |
|
|
919 |
return S_OK; |
return S_OK; |
936 |
DPRINTF("CompleteConnect"); |
DPRINTF("CompleteConnect"); |
937 |
|
|
938 |
#ifdef XVID_USE_TRAYICON |
#ifdef XVID_USE_TRAYICON |
939 |
if ((direction == PINDIR_OUTPUT) && (MSG_hwnd == NULL)) |
if ((direction == PINDIR_OUTPUT) && (Tray_Icon == 0)) |
940 |
{ |
{ |
941 |
WNDCLASSEX wc; |
WNDCLASSEX wc; |
942 |
|
|
959 |
|
|
960 |
/* display the tray icon */ |
/* display the tray icon */ |
961 |
NOTIFYICONDATA nid; |
NOTIFYICONDATA nid; |
962 |
|
ZeroMemory(&nid,sizeof(NOTIFYICONDATA)); |
963 |
|
|
964 |
nid.cbSize = sizeof(NOTIFYICONDATA); |
nid.cbSize = NOTIFYICONDATA_V1_SIZE; |
965 |
nid.hWnd = MSG_hwnd; |
nid.hWnd = MSG_hwnd; |
966 |
nid.uID = 100; |
nid.uID = 1456; |
|
nid.uVersion = NOTIFYICON_VERSION; |
|
967 |
nid.uCallbackMessage = WM_ICONMESSAGE; |
nid.uCallbackMessage = WM_ICONMESSAGE; |
968 |
nid.hIcon = LoadIcon(g_xvid_hInst, MAKEINTRESOURCE(IDI_ICON)); |
nid.hIcon = LoadIcon(g_xvid_hInst, MAKEINTRESOURCE(IDI_ICON)); |
969 |
strcpy_s(nid.szTip, 19, "Xvid Video Decoder"); |
strcpy_s(nid.szTip, 19, "Xvid Video Decoder"); |
970 |
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; |
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; |
971 |
|
|
972 |
Shell_NotifyIcon(NIM_ADD, &nid); |
Shell_NotifyIcon(NIM_ADD, &nid); |
973 |
|
|
974 |
|
DestroyIcon(nid.hIcon); |
975 |
|
Tray_Icon = 1; |
976 |
} |
} |
977 |
#endif |
#endif |
978 |
|
|
984 |
{ |
{ |
985 |
DPRINTF("BreakConnect"); |
DPRINTF("BreakConnect"); |
986 |
|
|
|
#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 |
|
|
|
|
987 |
return S_OK; |
return S_OK; |
988 |
} |
} |
989 |
|
|
1050 |
{ |
{ |
1051 |
HRESULT result; |
HRESULT result; |
1052 |
|
|
1053 |
result = ChangeColorspace(mtOut->subtype, mtOut->formattype, mtOut->pbFormat); |
result = ChangeColorspace(mtOut->subtype, mtOut->formattype, mtOut->pbFormat, 0); |
1054 |
DeleteMediaType(mtOut); |
DeleteMediaType(mtOut); |
1055 |
|
|
1056 |
if (result != S_OK) |
if (result != S_OK) |
1371 |
bs_guid_table[i++] = (GUID *)&CLSID_XVID; |
bs_guid_table[i++] = (GUID *)&CLSID_XVID; |
1372 |
bs_guid_table[i++] = (GUID *)&CLSID_XVID_UC; |
bs_guid_table[i++] = (GUID *)&CLSID_XVID_UC; |
1373 |
|
|
1374 |
if (g_config.supported_4cc & SUPPORT_DX50) { |
if (g_config.supported_4cc & SUPPORT_3IVX) { |
1375 |
bs_guid_table[i++] = (GUID *)&CLSID_DX50; |
bs_guid_table[i++] = (GUID *)&CLSID_3IVX; |
1376 |
bs_guid_table[i++] = (GUID *)&CLSID_DX50_UC; |
bs_guid_table[i++] = (GUID *)&CLSID_3IVX_UC; |
1377 |
|
bs_guid_table[i++] = (GUID *)&CLSID_3IV0; |
1378 |
|
bs_guid_table[i++] = (GUID *)&CLSID_3IV0_UC; |
1379 |
|
bs_guid_table[i++] = (GUID *)&CLSID_3IV1; |
1380 |
|
bs_guid_table[i++] = (GUID *)&CLSID_3IV1_UC; |
1381 |
|
bs_guid_table[i++] = (GUID *)&CLSID_3IV2; |
1382 |
|
bs_guid_table[i++] = (GUID *)&CLSID_3IV2_UC; |
1383 |
} |
} |
1384 |
if (g_config.supported_4cc & SUPPORT_DIVX) { |
if (g_config.supported_4cc & SUPPORT_DIVX) { |
1385 |
bs_guid_table[i++] = (GUID *)&CLSID_DIVX; |
bs_guid_table[i++] = (GUID *)&CLSID_DIVX; |
1386 |
bs_guid_table[i++] = (GUID *)&CLSID_DIVX_UC; |
bs_guid_table[i++] = (GUID *)&CLSID_DIVX_UC; |
1387 |
|
bs_guid_table[i++] = (GUID *)&CLSID_DX50; |
1388 |
|
bs_guid_table[i++] = (GUID *)&CLSID_DX50_UC; |
1389 |
} |
} |
1390 |
if (g_config.supported_4cc & SUPPORT_MP4V) { |
if (g_config.supported_4cc & SUPPORT_MP4V) { |
1391 |
bs_guid_table[i++] = (GUID *)&CLSID_MP4V; |
bs_guid_table[i++] = (GUID *)&CLSID_MP4V; |
1392 |
bs_guid_table[i++] = (GUID *)&CLSID_MP4V_UC; |
bs_guid_table[i++] = (GUID *)&CLSID_MP4V_UC; |
1393 |
|
bs_guid_table[i++] = (GUID *)&CLSID_LMP4; |
1394 |
|
bs_guid_table[i++] = (GUID *)&CLSID_LMP4_UC; |
1395 |
|
bs_guid_table[i++] = (GUID *)&CLSID_RMP4; |
1396 |
|
bs_guid_table[i++] = (GUID *)&CLSID_RMP4_UC; |
1397 |
|
bs_guid_table[i++] = (GUID *)&CLSID_SMP4; |
1398 |
|
bs_guid_table[i++] = (GUID *)&CLSID_SMP4_UC; |
1399 |
|
bs_guid_table[i++] = (GUID *)&CLSID_HDX4; |
1400 |
|
bs_guid_table[i++] = (GUID *)&CLSID_HDX4_UC; |
1401 |
} |
} |
1402 |
|
|
1403 |
const GUID *subtype; |
const GUID *subtype; |
1618 |
|
|
1619 |
EnterCriticalSection(&m_mft_lock); |
EnterCriticalSection(&m_mft_lock); |
1620 |
|
|
1621 |
/* Actually set the type or just test it? |
/* Actually set the type or just test it? */ |
1622 |
BOOL bReallySet = ((dwFlags & MFT_SET_TYPE_TEST_ONLY) == 0); |
BOOL bReallySet = ((dwFlags & MFT_SET_TYPE_TEST_ONLY) == 0); |
1623 |
|
|
1624 |
/* If we have samples pending the type can't be changed right now */ |
/* If we have samples pending the type can't be changed right now */ |
1631 |
hr = MFCreateAMMediaTypeFromMFMediaType(pType, GUID_NULL, &am); |
hr = MFCreateAMMediaTypeFromMFMediaType(pType, GUID_NULL, &am); |
1632 |
|
|
1633 |
if (SUCCEEDED(hr)) { |
if (SUCCEEDED(hr)) { |
1634 |
if (FAILED(ChangeColorspace(am->subtype, am->formattype, am->pbFormat))) { |
if (FAILED(ChangeColorspace(am->subtype, am->formattype, am->pbFormat, 1))) { |
1635 |
DPRINTF("(MFT)InternalCheckOutputType (MF_E_INVALIDTYPE)"); |
DPRINTF("(MFT)InternalCheckOutputType (MF_E_INVALIDTYPE)"); |
1636 |
return MF_E_INVALIDTYPE; |
return MF_E_INVALIDTYPE; |
1637 |
} |
} |
1647 |
hr = OnSetOutputType(pType); |
hr = OnSetOutputType(pType); |
1648 |
} |
} |
1649 |
} |
} |
|
|
|
1650 |
#ifdef XVID_USE_TRAYICON |
#ifdef XVID_USE_TRAYICON |
1651 |
if (SUCCEEDED(hr) && MSG_hwnd == NULL) /* Create message passing window */ |
if (SUCCEEDED(hr) && Tray_Icon == 0) /* Create message passing window */ |
1652 |
{ |
{ |
1653 |
WNDCLASSEX wc; |
WNDCLASSEX wc; |
1654 |
|
|
1671 |
|
|
1672 |
/* display the tray icon */ |
/* display the tray icon */ |
1673 |
NOTIFYICONDATA nid; |
NOTIFYICONDATA nid; |
1674 |
|
ZeroMemory(&nid,sizeof(NOTIFYICONDATA)); |
1675 |
|
|
1676 |
nid.cbSize = sizeof(NOTIFYICONDATA); |
nid.cbSize = NOTIFYICONDATA_V1_SIZE; |
1677 |
nid.hWnd = MSG_hwnd; |
nid.hWnd = MSG_hwnd; |
1678 |
nid.uID = 100; |
nid.uID = 1456; |
|
nid.uVersion = NOTIFYICON_VERSION; |
|
1679 |
nid.uCallbackMessage = WM_ICONMESSAGE; |
nid.uCallbackMessage = WM_ICONMESSAGE; |
1680 |
nid.hIcon = LoadIcon(g_xvid_hInst, MAKEINTRESOURCE(IDI_ICON)); |
nid.hIcon = LoadIcon(g_xvid_hInst, MAKEINTRESOURCE(IDI_ICON)); |
1681 |
strcpy_s(nid.szTip, 19, "Xvid Video Decoder"); |
strcpy_s(nid.szTip, 19, "Xvid Video Decoder"); |
1682 |
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; |
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; |
1683 |
|
|
1684 |
Shell_NotifyIcon(NIM_ADD, &nid); |
Shell_NotifyIcon(NIM_ADD, &nid); |
1685 |
|
|
1686 |
|
DestroyIcon(nid.hIcon); |
1687 |
|
Tray_Icon = 1; |
1688 |
} |
} |
1689 |
#endif |
#endif |
1690 |
|
|
2017 |
if (FAILED(pSample->GetSampleDuration(&m_timelength))) { |
if (FAILED(pSample->GetSampleDuration(&m_timelength))) { |
2018 |
m_timelength = INVALID_TIME; |
m_timelength = INVALID_TIME; |
2019 |
} |
} |
2020 |
|
if (m_timestamp != INVALID_TIME && stats.type == XVID_TYPE_IVOP) { |
2021 |
|
m_rtFrame = m_timestamp; |
2022 |
|
} |
2023 |
} |
} |
2024 |
|
|
2025 |
LeaveCriticalSection(&m_mft_lock); |
LeaveCriticalSection(&m_mft_lock); |
2197 |
hr = pmt->GetGUID(MF_MT_SUBTYPE, &subtype); |
hr = pmt->GetGUID(MF_MT_SUBTYPE, &subtype); |
2198 |
} |
} |
2199 |
|
|
2200 |
if (subtype == CLSID_MP4V || subtype == CLSID_MP4V_UC) { |
if (subtype == CLSID_MP4V || subtype == CLSID_MP4V_UC || |
2201 |
|
subtype == CLSID_LMP4 || subtype == CLSID_LMP4_UC || |
2202 |
|
subtype == CLSID_RMP4 || subtype == CLSID_RMP4_UC || |
2203 |
|
subtype == CLSID_SMP4 || subtype == CLSID_SMP4_UC || |
2204 |
|
subtype == CLSID_HDX4 || subtype == CLSID_HDX4_UC) { |
2205 |
if (!(g_config.supported_4cc & SUPPORT_MP4V)) { |
if (!(g_config.supported_4cc & SUPPORT_MP4V)) { |
2206 |
CloseLib(); |
CloseLib(); |
2207 |
hr = MF_E_INVALIDTYPE; |
hr = MF_E_INVALIDTYPE; |
2216 |
else m_create.fourcc = FOURCC_DIVX; |
else m_create.fourcc = FOURCC_DIVX; |
2217 |
} |
} |
2218 |
else if (subtype == CLSID_DX50 || subtype == CLSID_DX50_UC) { |
else if (subtype == CLSID_DX50 || subtype == CLSID_DX50_UC) { |
2219 |
if (!(g_config.supported_4cc & SUPPORT_DX50)) { |
if (!(g_config.supported_4cc & SUPPORT_DIVX)) { |
2220 |
CloseLib(); |
CloseLib(); |
2221 |
hr = MF_E_INVALIDTYPE; |
hr = MF_E_INVALIDTYPE; |
2222 |
} |
} |
2223 |
else m_create.fourcc = FOURCC_DX50; |
else m_create.fourcc = FOURCC_DX50; |
2224 |
} |
} |
2225 |
|
else if (subtype == CLSID_3IVX || subtype == CLSID_3IVX_UC || |
2226 |
|
subtype == CLSID_3IV0 || subtype == CLSID_3IV0_UC || |
2227 |
|
subtype == CLSID_3IV1 || subtype == CLSID_3IV1_UC || |
2228 |
|
subtype == CLSID_3IV2 || subtype == CLSID_3IV2_UC) { |
2229 |
|
if (!(g_config.supported_4cc & SUPPORT_3IVX)) { |
2230 |
|
CloseLib(); |
2231 |
|
hr = MF_E_INVALIDTYPE; |
2232 |
|
} |
2233 |
|
else m_create.fourcc = FOURCC_3IVX; |
2234 |
|
} |
2235 |
else if (subtype == CLSID_XVID || subtype == CLSID_XVID_UC) { |
else if (subtype == CLSID_XVID || subtype == CLSID_XVID_UC) { |
2236 |
m_create.fourcc = FOURCC_XVID; |
m_create.fourcc = FOURCC_XVID; |
2237 |
} |
} |