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.25 2010-12-22 15:21:13 Isibaar Exp $ |
* $Id: CXvidDecoder.cpp,v 1.25.2.4 2011-03-17 15:13:25 Isibaar Exp $ |
24 |
* |
* |
25 |
****************************************************************************/ |
****************************************************************************/ |
26 |
|
|
36 |
C:\DX90SDK\Samples\C++\DirectShow\BaseClasses\Debug |
C:\DX90SDK\Samples\C++\DirectShow\BaseClasses\Debug |
37 |
*/ |
*/ |
38 |
|
|
39 |
|
/* |
40 |
#define XVID_USE_MFT |
#define XVID_USE_MFT |
41 |
#define XVID_USE_TRAYICON |
#define XVID_USE_TRAYICON |
42 |
|
*/ |
43 |
|
|
44 |
#include <windows.h> |
#include <windows.h> |
45 |
|
|
89 |
{ &MEDIATYPE_Video, &CLSID_DIVX_UC }, |
{ &MEDIATYPE_Video, &CLSID_DIVX_UC }, |
90 |
{ &MEDIATYPE_Video, &CLSID_DX50 }, |
{ &MEDIATYPE_Video, &CLSID_DX50 }, |
91 |
{ &MEDIATYPE_Video, &CLSID_DX50_UC }, |
{ &MEDIATYPE_Video, &CLSID_DX50_UC }, |
92 |
|
{ &MEDIATYPE_Video, &CLSID_3IVX }, |
93 |
|
{ &MEDIATYPE_Video, &CLSID_3IVX_UC }, |
94 |
|
{ &MEDIATYPE_Video, &CLSID_3IV0 }, |
95 |
|
{ &MEDIATYPE_Video, &CLSID_3IV0_UC }, |
96 |
|
{ &MEDIATYPE_Video, &CLSID_3IV1 }, |
97 |
|
{ &MEDIATYPE_Video, &CLSID_3IV1_UC }, |
98 |
|
{ &MEDIATYPE_Video, &CLSID_3IV2 }, |
99 |
|
{ &MEDIATYPE_Video, &CLSID_3IV2_UC }, |
100 |
|
{ &MEDIATYPE_Video, &CLSID_LMP4 }, |
101 |
|
{ &MEDIATYPE_Video, &CLSID_LMP4_UC }, |
102 |
|
{ &MEDIATYPE_Video, &CLSID_RMP4 }, |
103 |
|
{ &MEDIATYPE_Video, &CLSID_RMP4_UC }, |
104 |
|
{ &MEDIATYPE_Video, &CLSID_SMP4 }, |
105 |
|
{ &MEDIATYPE_Video, &CLSID_SMP4_UC }, |
106 |
|
{ &MEDIATYPE_Video, &CLSID_HDX4 }, |
107 |
|
{ &MEDIATYPE_Video, &CLSID_HDX4_UC }, |
108 |
{ &MEDIATYPE_Video, &CLSID_MP4V }, |
{ &MEDIATYPE_Video, &CLSID_MP4V }, |
109 |
{ &MEDIATYPE_Video, &CLSID_MP4V_UC }, |
{ &MEDIATYPE_Video, &CLSID_MP4V_UC }, |
110 |
}; |
}; |
146 |
{ |
{ |
147 |
&CLSID_XVID, // Filter CLSID |
&CLSID_XVID, // Filter CLSID |
148 |
XVID_NAME_L, // Filter name |
XVID_NAME_L, // Filter name |
149 |
MERIT_PREFERRED, // Its merit |
MERIT_PREFERRED+2, // Its merit |
150 |
sizeof(psudPins) / sizeof(AMOVIESETUP_PIN), // Number of pins |
sizeof(psudPins) / sizeof(AMOVIESETUP_PIN), // Number of pins |
151 |
psudPins // Pin details |
psudPins // Pin details |
152 |
}; |
}; |
621 |
{ |
{ |
622 |
case FOURCC_mp4v: |
case FOURCC_mp4v: |
623 |
case FOURCC_MP4V: |
case FOURCC_MP4V: |
624 |
|
case FOURCC_lmp4 : |
625 |
|
case FOURCC_LMP4 : |
626 |
|
case FOURCC_rmp4 : |
627 |
|
case FOURCC_RMP4 : |
628 |
|
case FOURCC_smp4 : |
629 |
|
case FOURCC_SMP4 : |
630 |
|
case FOURCC_hdx4 : |
631 |
|
case FOURCC_HDX4 : |
632 |
if (!(g_config.supported_4cc & SUPPORT_MP4V)) { |
if (!(g_config.supported_4cc & SUPPORT_MP4V)) { |
633 |
CloseLib(); |
CloseLib(); |
634 |
return VFW_E_TYPE_NOT_ACCEPTED; |
return VFW_E_TYPE_NOT_ACCEPTED; |
635 |
} |
} |
636 |
break; |
break; |
637 |
|
case FOURCC_divx : |
638 |
case FOURCC_DIVX : |
case FOURCC_DIVX : |
639 |
|
case FOURCC_dx50 : |
640 |
|
case FOURCC_DX50 : |
641 |
if (!(g_config.supported_4cc & SUPPORT_DIVX)) { |
if (!(g_config.supported_4cc & SUPPORT_DIVX)) { |
642 |
CloseLib(); |
CloseLib(); |
643 |
return VFW_E_TYPE_NOT_ACCEPTED; |
return VFW_E_TYPE_NOT_ACCEPTED; |
644 |
} |
} |
645 |
break; |
break; |
646 |
case FOURCC_DX50 : |
case FOURCC_3ivx : |
647 |
if (!(g_config.supported_4cc & SUPPORT_DX50)) { |
case FOURCC_3IVX : |
648 |
|
case FOURCC_3iv0 : |
649 |
|
case FOURCC_3IV0 : |
650 |
|
case FOURCC_3iv1 : |
651 |
|
case FOURCC_3IV1 : |
652 |
|
case FOURCC_3iv2 : |
653 |
|
case FOURCC_3IV2 : |
654 |
|
if (!(g_config.supported_4cc & SUPPORT_3IVX)) { |
655 |
CloseLib(); |
CloseLib(); |
656 |
return VFW_E_TYPE_NOT_ACCEPTED; |
return VFW_E_TYPE_NOT_ACCEPTED; |
657 |
} |
} |
658 |
|
case FOURCC_xvid : |
659 |
case FOURCC_XVID : |
case FOURCC_XVID : |
660 |
break; |
break; |
661 |
|
|
816 |
/* (internal function) change colorspace */ |
/* (internal function) change colorspace */ |
817 |
#define CALC_BI_STRIDE(width,bitcount) ((((width * bitcount) + 31) & ~31) >> 3) |
#define CALC_BI_STRIDE(width,bitcount) ((((width * bitcount) + 31) & ~31) >> 3) |
818 |
|
|
819 |
HRESULT CXvidDecoder::ChangeColorspace(GUID subtype, GUID formattype, void * format) |
HRESULT CXvidDecoder::ChangeColorspace(GUID subtype, GUID formattype, void * format, int noflip) |
820 |
{ |
{ |
821 |
DWORD biWidth; |
DWORD biWidth; |
822 |
|
|
839 |
return S_FALSE; |
return S_FALSE; |
840 |
} |
} |
841 |
|
|
842 |
|
if (noflip) rgb_flip = 0; |
843 |
|
|
844 |
if (subtype == CLSID_MEDIASUBTYPE_IYUV) |
if (subtype == CLSID_MEDIASUBTYPE_IYUV) |
845 |
{ |
{ |
846 |
DPRINTF("IYUV"); |
DPRINTF("IYUV"); |
914 |
|
|
915 |
if (direction == PINDIR_OUTPUT) |
if (direction == PINDIR_OUTPUT) |
916 |
{ |
{ |
917 |
return ChangeColorspace(*pmt->Subtype(), *pmt->FormatType(), pmt->Format()); |
return ChangeColorspace(*pmt->Subtype(), *pmt->FormatType(), pmt->Format(), 0); |
918 |
} |
} |
919 |
|
|
920 |
return S_OK; |
return S_OK; |
1051 |
{ |
{ |
1052 |
HRESULT result; |
HRESULT result; |
1053 |
|
|
1054 |
result = ChangeColorspace(mtOut->subtype, mtOut->formattype, mtOut->pbFormat); |
result = ChangeColorspace(mtOut->subtype, mtOut->formattype, mtOut->pbFormat, 0); |
1055 |
DeleteMediaType(mtOut); |
DeleteMediaType(mtOut); |
1056 |
|
|
1057 |
if (result != S_OK) |
if (result != S_OK) |
1372 |
bs_guid_table[i++] = (GUID *)&CLSID_XVID; |
bs_guid_table[i++] = (GUID *)&CLSID_XVID; |
1373 |
bs_guid_table[i++] = (GUID *)&CLSID_XVID_UC; |
bs_guid_table[i++] = (GUID *)&CLSID_XVID_UC; |
1374 |
|
|
1375 |
if (g_config.supported_4cc & SUPPORT_DX50) { |
if (g_config.supported_4cc & SUPPORT_3IVX) { |
1376 |
bs_guid_table[i++] = (GUID *)&CLSID_DX50; |
bs_guid_table[i++] = (GUID *)&CLSID_3IVX; |
1377 |
bs_guid_table[i++] = (GUID *)&CLSID_DX50_UC; |
bs_guid_table[i++] = (GUID *)&CLSID_3IVX_UC; |
1378 |
|
bs_guid_table[i++] = (GUID *)&CLSID_3IV0; |
1379 |
|
bs_guid_table[i++] = (GUID *)&CLSID_3IV0_UC; |
1380 |
|
bs_guid_table[i++] = (GUID *)&CLSID_3IV1; |
1381 |
|
bs_guid_table[i++] = (GUID *)&CLSID_3IV1_UC; |
1382 |
|
bs_guid_table[i++] = (GUID *)&CLSID_3IV2; |
1383 |
|
bs_guid_table[i++] = (GUID *)&CLSID_3IV2_UC; |
1384 |
} |
} |
1385 |
if (g_config.supported_4cc & SUPPORT_DIVX) { |
if (g_config.supported_4cc & SUPPORT_DIVX) { |
1386 |
bs_guid_table[i++] = (GUID *)&CLSID_DIVX; |
bs_guid_table[i++] = (GUID *)&CLSID_DIVX; |
1387 |
bs_guid_table[i++] = (GUID *)&CLSID_DIVX_UC; |
bs_guid_table[i++] = (GUID *)&CLSID_DIVX_UC; |
1388 |
|
bs_guid_table[i++] = (GUID *)&CLSID_DX50; |
1389 |
|
bs_guid_table[i++] = (GUID *)&CLSID_DX50_UC; |
1390 |
} |
} |
1391 |
if (g_config.supported_4cc & SUPPORT_MP4V) { |
if (g_config.supported_4cc & SUPPORT_MP4V) { |
1392 |
bs_guid_table[i++] = (GUID *)&CLSID_MP4V; |
bs_guid_table[i++] = (GUID *)&CLSID_MP4V; |
1393 |
bs_guid_table[i++] = (GUID *)&CLSID_MP4V_UC; |
bs_guid_table[i++] = (GUID *)&CLSID_MP4V_UC; |
1394 |
|
bs_guid_table[i++] = (GUID *)&CLSID_LMP4; |
1395 |
|
bs_guid_table[i++] = (GUID *)&CLSID_LMP4_UC; |
1396 |
|
bs_guid_table[i++] = (GUID *)&CLSID_RMP4; |
1397 |
|
bs_guid_table[i++] = (GUID *)&CLSID_RMP4_UC; |
1398 |
|
bs_guid_table[i++] = (GUID *)&CLSID_SMP4; |
1399 |
|
bs_guid_table[i++] = (GUID *)&CLSID_SMP4_UC; |
1400 |
|
bs_guid_table[i++] = (GUID *)&CLSID_HDX4; |
1401 |
|
bs_guid_table[i++] = (GUID *)&CLSID_HDX4_UC; |
1402 |
} |
} |
1403 |
|
|
1404 |
const GUID *subtype; |
const GUID *subtype; |
1632 |
hr = MFCreateAMMediaTypeFromMFMediaType(pType, GUID_NULL, &am); |
hr = MFCreateAMMediaTypeFromMFMediaType(pType, GUID_NULL, &am); |
1633 |
|
|
1634 |
if (SUCCEEDED(hr)) { |
if (SUCCEEDED(hr)) { |
1635 |
if (FAILED(ChangeColorspace(am->subtype, am->formattype, am->pbFormat))) { |
if (FAILED(ChangeColorspace(am->subtype, am->formattype, am->pbFormat, 1))) { |
1636 |
DPRINTF("(MFT)InternalCheckOutputType (MF_E_INVALIDTYPE)"); |
DPRINTF("(MFT)InternalCheckOutputType (MF_E_INVALIDTYPE)"); |
1637 |
return MF_E_INVALIDTYPE; |
return MF_E_INVALIDTYPE; |
1638 |
} |
} |
2198 |
hr = pmt->GetGUID(MF_MT_SUBTYPE, &subtype); |
hr = pmt->GetGUID(MF_MT_SUBTYPE, &subtype); |
2199 |
} |
} |
2200 |
|
|
2201 |
if (subtype == CLSID_MP4V || subtype == CLSID_MP4V_UC) { |
if (subtype == CLSID_MP4V || subtype == CLSID_MP4V_UC || |
2202 |
|
subtype == CLSID_LMP4 || subtype == CLSID_LMP4_UC || |
2203 |
|
subtype == CLSID_RMP4 || subtype == CLSID_RMP4_UC || |
2204 |
|
subtype == CLSID_SMP4 || subtype == CLSID_SMP4_UC || |
2205 |
|
subtype == CLSID_HDX4 || subtype == CLSID_HDX4_UC) { |
2206 |
if (!(g_config.supported_4cc & SUPPORT_MP4V)) { |
if (!(g_config.supported_4cc & SUPPORT_MP4V)) { |
2207 |
CloseLib(); |
CloseLib(); |
2208 |
hr = MF_E_INVALIDTYPE; |
hr = MF_E_INVALIDTYPE; |
2217 |
else m_create.fourcc = FOURCC_DIVX; |
else m_create.fourcc = FOURCC_DIVX; |
2218 |
} |
} |
2219 |
else if (subtype == CLSID_DX50 || subtype == CLSID_DX50_UC) { |
else if (subtype == CLSID_DX50 || subtype == CLSID_DX50_UC) { |
2220 |
if (!(g_config.supported_4cc & SUPPORT_DX50)) { |
if (!(g_config.supported_4cc & SUPPORT_DIVX)) { |
2221 |
CloseLib(); |
CloseLib(); |
2222 |
hr = MF_E_INVALIDTYPE; |
hr = MF_E_INVALIDTYPE; |
2223 |
} |
} |
2224 |
else m_create.fourcc = FOURCC_DX50; |
else m_create.fourcc = FOURCC_DX50; |
2225 |
} |
} |
2226 |
|
else if (subtype == CLSID_3IVX || subtype == CLSID_3IVX_UC || |
2227 |
|
subtype == CLSID_3IV0 || subtype == CLSID_3IV0_UC || |
2228 |
|
subtype == CLSID_3IV1 || subtype == CLSID_3IV1_UC || |
2229 |
|
subtype == CLSID_3IV2 || subtype == CLSID_3IV2_UC) { |
2230 |
|
if (!(g_config.supported_4cc & SUPPORT_3IVX)) { |
2231 |
|
CloseLib(); |
2232 |
|
hr = MF_E_INVALIDTYPE; |
2233 |
|
} |
2234 |
|
else m_create.fourcc = FOURCC_3IVX; |
2235 |
|
} |
2236 |
else if (subtype == CLSID_XVID || subtype == CLSID_XVID_UC) { |
else if (subtype == CLSID_XVID || subtype == CLSID_XVID_UC) { |
2237 |
m_create.fourcc = FOURCC_XVID; |
m_create.fourcc = FOURCC_XVID; |
2238 |
} |
} |