[svn] / branches / release-1_3-branch / xvidcore / dshow / src / CXvidDecoder.cpp Repository:
ViewVC logotype

Diff of /branches/release-1_3-branch/xvidcore/dshow/src/CXvidDecoder.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1946, Thu Jan 27 13:18:13 2011 UTC revision 2102, Mon Jun 8 19:15:30 2015 UTC
# Line 3  Line 3 
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-2012 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
# Line 20  Line 20 
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.2.2 2011-01-27 13:18:13 Isibaar Exp $   * $Id$
24   *   *
25   ****************************************************************************/   ****************************************************************************/
26    
# Line 36  Line 36 
36          C:\DX90SDK\Samples\C++\DirectShow\BaseClasses\Debug          C:\DX90SDK\Samples\C++\DirectShow\BaseClasses\Debug
37  */  */
38    
39  /*  #ifdef ENABLE_MFT
40  #define XVID_USE_MFT  #define XVID_USE_MFT
41  #define XVID_USE_TRAYICON  #endif
 */  
42    
43  #include <windows.h>  #include <windows.h>
44    
# Line 89  Line 88 
88          { &MEDIATYPE_Video, &CLSID_DIVX_UC },          { &MEDIATYPE_Video, &CLSID_DIVX_UC },
89          { &MEDIATYPE_Video, &CLSID_DX50 },          { &MEDIATYPE_Video, &CLSID_DX50 },
90          { &MEDIATYPE_Video, &CLSID_DX50_UC },          { &MEDIATYPE_Video, &CLSID_DX50_UC },
91            { &MEDIATYPE_Video, &CLSID_3IVX },
92            { &MEDIATYPE_Video, &CLSID_3IVX_UC },
93            { &MEDIATYPE_Video, &CLSID_3IV0 },
94            { &MEDIATYPE_Video, &CLSID_3IV0_UC },
95            { &MEDIATYPE_Video, &CLSID_3IV1 },
96            { &MEDIATYPE_Video, &CLSID_3IV1_UC },
97            { &MEDIATYPE_Video, &CLSID_3IV2 },
98            { &MEDIATYPE_Video, &CLSID_3IV2_UC },
99            { &MEDIATYPE_Video, &CLSID_LMP4 },
100            { &MEDIATYPE_Video, &CLSID_LMP4_UC },
101            { &MEDIATYPE_Video, &CLSID_RMP4 },
102            { &MEDIATYPE_Video, &CLSID_RMP4_UC },
103            { &MEDIATYPE_Video, &CLSID_SMP4 },
104            { &MEDIATYPE_Video, &CLSID_SMP4_UC },
105            { &MEDIATYPE_Video, &CLSID_HDX4 },
106            { &MEDIATYPE_Video, &CLSID_HDX4_UC },
107          { &MEDIATYPE_Video, &CLSID_MP4V },          { &MEDIATYPE_Video, &CLSID_MP4V },
108    { &MEDIATYPE_Video, &CLSID_MP4V_UC },    { &MEDIATYPE_Video, &CLSID_MP4V_UC },
109  };  };
# Line 160  Line 175 
175  /* note: g_cTemplates must be global; used by strmbase.lib(dllentry.cpp,dllsetup.cpp) */  /* note: g_cTemplates must be global; used by strmbase.lib(dllentry.cpp,dllsetup.cpp) */
176  int g_cTemplates = sizeof(g_Templates) / sizeof(CFactoryTemplate);  int g_cTemplates = sizeof(g_Templates) / sizeof(CFactoryTemplate);
177    
 #ifdef XVID_USE_TRAYICON  
178  extern HINSTANCE g_xvid_hInst;  extern HINSTANCE g_xvid_hInst;
179    
180  static int GUI_Page = 0;  static int GUI_Page = 0;
# Line 202  Line 216 
216    
217          return TRUE; /* ok */          return TRUE; /* ok */
218  }  }
 #endif  
219    
220  STDAPI DllRegisterServer()  STDAPI DllRegisterServer()
221  {  {
# Line 227  Line 240 
240          /* Register the MFT decoder */          /* Register the MFT decoder */
241          MFTRegister(CLSID_XVID,                          // CLSID          MFTRegister(CLSID_XVID,                          // CLSID
242                          MFT_CATEGORY_VIDEO_DECODER,          // Category                          MFT_CATEGORY_VIDEO_DECODER,          // Category
243                          const_cast<LPWSTR>(XVID_NAME_L),     // Friendly name                                  const_cast<LPWSTR>(XVID_NAME_MFT_L), // Friendly name
244                          0,                                   // Flags                          0,                                   // Flags
245                          inputs_num,                          // Number of input types                          inputs_num,                          // Number of input types
246                          mft_bs,                              // Input types                          mft_bs,                              // Input types
# Line 296  Line 309 
309    
310  /* constructor */  /* constructor */
311    
 #define XVID_DLL_NAME "xvidcore.dll"  
   
312  CXvidDecoder::CXvidDecoder(LPUNKNOWN punk, HRESULT *phr) :  CXvidDecoder::CXvidDecoder(LPUNKNOWN punk, HRESULT *phr) :
313      CVideoTransformFilter(NAME("CXvidDecoder"), punk, CLSID_XVID), m_hdll (NULL)      CVideoTransformFilter(NAME("CXvidDecoder"), punk, CLSID_XVID), m_hdll (NULL)
314  {  {
# Line 320  Line 331 
331      LoadRegistryInfo();      LoadRegistryInfo();
332    
333      *phr = OpenLib();      *phr = OpenLib();
334    
335            {
336                    TCHAR lpFilename[MAX_PATH];
337                    int sLen = GetModuleFileName(NULL, lpFilename, MAX_PATH);
338    #ifdef _UNICODE
339                    if ((sLen >= 11) && (_wcsnicmp(&(lpFilename[sLen - 11]), TEXT("dllhost.exe"), 11) == 0)) {
340    #else
341                    if ((sLen >= 11) && (_strnicmp(&(lpFilename[sLen - 11]), TEXT("dllhost.exe"), 11) == 0)) {
342    #endif
343                            if (Tray_Icon == 0) Tray_Icon = -1; // create no tray icon upon thumbnail generation
344                    }
345                    else
346                            if (Tray_Icon == -1) Tray_Icon = 0; // can show tray icon
347            }
348    
349  }  }
350    
351  HRESULT CXvidDecoder::OpenLib()  HRESULT CXvidDecoder::OpenLib()
# Line 481  Line 507 
507  {  {
508      DPRINTF("Destructor");      DPRINTF("Destructor");
509    
510  #ifdef XVID_USE_TRAYICON          if (Tray_Icon > 0) { /* Destroy tray icon */
         if (Tray_Icon) { /* Destroy tray icon */  
511                  NOTIFYICONDATA nid;                  NOTIFYICONDATA nid;
512                  ZeroMemory(&nid,sizeof(NOTIFYICONDATA));                  ZeroMemory(&nid,sizeof(NOTIFYICONDATA));
513    
# Line 493  Line 518 
518                  Shell_NotifyIcon(NIM_DELETE, &nid);                  Shell_NotifyIcon(NIM_DELETE, &nid);
519                  Tray_Icon = 0;                  Tray_Icon = 0;
520          }          }
 #endif  
521    
522          /* Close xvidcore library */          /* Close xvidcore library */
523          CloseLib();          CloseLib();
# Line 605  Line 629 
629    {    {
630    case FOURCC_mp4v:    case FOURCC_mp4v:
631          case FOURCC_MP4V:          case FOURCC_MP4V:
632            case FOURCC_lmp4 :
633            case FOURCC_LMP4 :
634            case FOURCC_rmp4 :
635            case FOURCC_RMP4 :
636            case FOURCC_smp4 :
637            case FOURCC_SMP4 :
638            case FOURCC_hdx4 :
639            case FOURCC_HDX4 :
640                  if (!(g_config.supported_4cc & SUPPORT_MP4V)) {                  if (!(g_config.supported_4cc & SUPPORT_MP4V)) {
641                          CloseLib();                          CloseLib();
642                          return VFW_E_TYPE_NOT_ACCEPTED;                          return VFW_E_TYPE_NOT_ACCEPTED;
643                  }                  }
644                  break;                  break;
645            case FOURCC_divx :
646          case FOURCC_DIVX :          case FOURCC_DIVX :
647            case FOURCC_dx50 :
648            case FOURCC_DX50 :
649                  if (!(g_config.supported_4cc & SUPPORT_DIVX)) {                  if (!(g_config.supported_4cc & SUPPORT_DIVX)) {
650                          CloseLib();                          CloseLib();
651                          return VFW_E_TYPE_NOT_ACCEPTED;                          return VFW_E_TYPE_NOT_ACCEPTED;
652                  }                  }
653                  break;                  break;
654          case FOURCC_DX50 :          case FOURCC_3ivx :
655                  if (!(g_config.supported_4cc & SUPPORT_DX50)) {          case FOURCC_3IVX :
656            case FOURCC_3iv0 :
657            case FOURCC_3IV0 :
658            case FOURCC_3iv1 :
659            case FOURCC_3IV1 :
660            case FOURCC_3iv2 :
661            case FOURCC_3IV2 :
662                    if (!(g_config.supported_4cc & SUPPORT_3IVX)) {
663                          CloseLib();                          CloseLib();
664                          return VFW_E_TYPE_NOT_ACCEPTED;                          return VFW_E_TYPE_NOT_ACCEPTED;
665                  }                  }
666            case FOURCC_xvid :
667          case FOURCC_XVID :          case FOURCC_XVID :
668                  break;                  break;
669    
# Line 781  Line 824 
824  /* (internal function) change colorspace */  /* (internal function) change colorspace */
825  #define CALC_BI_STRIDE(width,bitcount)  ((((width * bitcount) + 31) & ~31) >> 3)  #define CALC_BI_STRIDE(width,bitcount)  ((((width * bitcount) + 31) & ~31) >> 3)
826    
827  HRESULT CXvidDecoder::ChangeColorspace(GUID subtype, GUID formattype, void * format)  HRESULT CXvidDecoder::ChangeColorspace(GUID subtype, GUID formattype, void * format, int noflip)
828  {  {
829          DWORD biWidth;          DWORD biWidth;
830    
# Line 804  Line 847 
847                  return S_FALSE;                  return S_FALSE;
848          }          }
849    
850            if (noflip) rgb_flip = 0;
851    
852          if (subtype == CLSID_MEDIASUBTYPE_IYUV)          if (subtype == CLSID_MEDIASUBTYPE_IYUV)
853          {          {
854                  DPRINTF("IYUV");                  DPRINTF("IYUV");
# Line 877  Line 922 
922    
923          if (direction == PINDIR_OUTPUT)          if (direction == PINDIR_OUTPUT)
924          {          {
925                  return ChangeColorspace(*pmt->Subtype(), *pmt->FormatType(), pmt->Format());                  return ChangeColorspace(*pmt->Subtype(), *pmt->FormatType(), pmt->Format(), 0);
926          }          }
927    
928          return S_OK;          return S_OK;
# Line 899  Line 944 
944  {  {
945          DPRINTF("CompleteConnect");          DPRINTF("CompleteConnect");
946    
947  #ifdef XVID_USE_TRAYICON          if ((direction == PINDIR_OUTPUT) && (Tray_Icon == 0)&& (g_config.bTrayIcon != 0))
         if ((direction == PINDIR_OUTPUT) && (Tray_Icon == 0))  
948          {          {
949                  WNDCLASSEX wc;                  WNDCLASSEX wc;
950    
# Line 938  Line 982 
982                  DestroyIcon(nid.hIcon);                  DestroyIcon(nid.hIcon);
983                  Tray_Icon = 1;                  Tray_Icon = 1;
984          }          }
 #endif  
985    
986          return S_OK;          return S_OK;
987  }  }
# Line 1014  Line 1057 
1057          {          {
1058                  HRESULT result;                  HRESULT result;
1059    
1060                  result = ChangeColorspace(mtOut->subtype, mtOut->formattype, mtOut->pbFormat);                  result = ChangeColorspace(mtOut->subtype, mtOut->formattype, mtOut->pbFormat, 0);
1061                  DeleteMediaType(mtOut);                  DeleteMediaType(mtOut);
1062    
1063                  if (result != S_OK)                  if (result != S_OK)
# Line 1335  Line 1378 
1378          bs_guid_table[i++] = (GUID *)&CLSID_XVID;          bs_guid_table[i++] = (GUID *)&CLSID_XVID;
1379          bs_guid_table[i++] = (GUID *)&CLSID_XVID_UC;          bs_guid_table[i++] = (GUID *)&CLSID_XVID_UC;
1380    
1381          if (g_config.supported_4cc & SUPPORT_DX50) {          if (g_config.supported_4cc & SUPPORT_3IVX) {
1382                  bs_guid_table[i++] = (GUID *)&CLSID_DX50;                  bs_guid_table[i++] = (GUID *)&CLSID_3IVX;
1383                  bs_guid_table[i++] = (GUID *)&CLSID_DX50_UC;                  bs_guid_table[i++] = (GUID *)&CLSID_3IVX_UC;
1384                    bs_guid_table[i++] = (GUID *)&CLSID_3IV0;
1385                    bs_guid_table[i++] = (GUID *)&CLSID_3IV0_UC;
1386                    bs_guid_table[i++] = (GUID *)&CLSID_3IV1;
1387                    bs_guid_table[i++] = (GUID *)&CLSID_3IV1_UC;
1388                    bs_guid_table[i++] = (GUID *)&CLSID_3IV2;
1389                    bs_guid_table[i++] = (GUID *)&CLSID_3IV2_UC;
1390          }          }
1391          if (g_config.supported_4cc & SUPPORT_DIVX) {          if (g_config.supported_4cc & SUPPORT_DIVX) {
1392                  bs_guid_table[i++] = (GUID *)&CLSID_DIVX;                  bs_guid_table[i++] = (GUID *)&CLSID_DIVX;
1393                  bs_guid_table[i++] = (GUID *)&CLSID_DIVX_UC;                  bs_guid_table[i++] = (GUID *)&CLSID_DIVX_UC;
1394                    bs_guid_table[i++] = (GUID *)&CLSID_DX50;
1395                    bs_guid_table[i++] = (GUID *)&CLSID_DX50_UC;
1396          }          }
1397          if (g_config.supported_4cc & SUPPORT_MP4V) {          if (g_config.supported_4cc & SUPPORT_MP4V) {
1398                  bs_guid_table[i++] = (GUID *)&CLSID_MP4V;                  bs_guid_table[i++] = (GUID *)&CLSID_MP4V;
1399                  bs_guid_table[i++] = (GUID *)&CLSID_MP4V_UC;                  bs_guid_table[i++] = (GUID *)&CLSID_MP4V_UC;
1400                    bs_guid_table[i++] = (GUID *)&CLSID_LMP4;
1401                    bs_guid_table[i++] = (GUID *)&CLSID_LMP4_UC;
1402                    bs_guid_table[i++] = (GUID *)&CLSID_RMP4;
1403                    bs_guid_table[i++] = (GUID *)&CLSID_RMP4_UC;
1404                    bs_guid_table[i++] = (GUID *)&CLSID_SMP4;
1405                    bs_guid_table[i++] = (GUID *)&CLSID_SMP4_UC;
1406                    bs_guid_table[i++] = (GUID *)&CLSID_HDX4;
1407                    bs_guid_table[i++] = (GUID *)&CLSID_HDX4_UC;
1408          }          }
1409    
1410          const GUID *subtype;          const GUID *subtype;
# Line 1579  Line 1638 
1638                          hr = MFCreateAMMediaTypeFromMFMediaType(pType, GUID_NULL, &am);                          hr = MFCreateAMMediaTypeFromMFMediaType(pType, GUID_NULL, &am);
1639    
1640                          if (SUCCEEDED(hr)) {                          if (SUCCEEDED(hr)) {
1641                                  if (FAILED(ChangeColorspace(am->subtype, am->formattype, am->pbFormat))) {                                  if (FAILED(ChangeColorspace(am->subtype, am->formattype, am->pbFormat, 1))) {
1642                                          DPRINTF("(MFT)InternalCheckOutputType (MF_E_INVALIDTYPE)");                                          DPRINTF("(MFT)InternalCheckOutputType (MF_E_INVALIDTYPE)");
1643                                          return MF_E_INVALIDTYPE;                                          return MF_E_INVALIDTYPE;
1644                                  }                                  }
# Line 1595  Line 1654 
1654                          hr = OnSetOutputType(pType);                          hr = OnSetOutputType(pType);
1655                  }                  }
1656          }          }
1657  #ifdef XVID_USE_TRAYICON  
1658          if (SUCCEEDED(hr) && Tray_Icon == 0) /* Create message passing window */          if (SUCCEEDED(hr) && (Tray_Icon == 0) && (g_config.bTrayIcon != 0))  /* Create message passing window */
1659          {          {
1660                  WNDCLASSEX wc;                  WNDCLASSEX wc;
1661    
# Line 1634  Line 1693 
1693                  DestroyIcon(nid.hIcon);                  DestroyIcon(nid.hIcon);
1694                  Tray_Icon = 1;                  Tray_Icon = 1;
1695          }          }
 #endif  
1696    
1697          LeaveCriticalSection(&m_mft_lock);          LeaveCriticalSection(&m_mft_lock);
1698          return hr;          return hr;
# Line 2145  Line 2203 
2203                  hr = pmt->GetGUID(MF_MT_SUBTYPE, &subtype);                  hr = pmt->GetGUID(MF_MT_SUBTYPE, &subtype);
2204          }          }
2205    
2206          if (subtype == CLSID_MP4V || subtype == CLSID_MP4V_UC) {          if (subtype == CLSID_MP4V || subtype == CLSID_MP4V_UC ||
2207                subtype == CLSID_LMP4 || subtype == CLSID_LMP4_UC ||
2208                subtype == CLSID_RMP4 || subtype == CLSID_RMP4_UC ||
2209                subtype == CLSID_SMP4 || subtype == CLSID_SMP4_UC ||
2210                subtype == CLSID_HDX4 || subtype == CLSID_HDX4_UC) {
2211                  if (!(g_config.supported_4cc & SUPPORT_MP4V)) {                  if (!(g_config.supported_4cc & SUPPORT_MP4V)) {
2212                          CloseLib();                          CloseLib();
2213                          hr = MF_E_INVALIDTYPE;                          hr = MF_E_INVALIDTYPE;
# Line 2160  Line 2222 
2222                  else m_create.fourcc = FOURCC_DIVX;                  else m_create.fourcc = FOURCC_DIVX;
2223          }          }
2224          else if (subtype == CLSID_DX50 || subtype == CLSID_DX50_UC) {          else if (subtype == CLSID_DX50 || subtype == CLSID_DX50_UC) {
2225                  if (!(g_config.supported_4cc & SUPPORT_DX50)) {                  if (!(g_config.supported_4cc & SUPPORT_DIVX)) {
2226                          CloseLib();                          CloseLib();
2227                          hr = MF_E_INVALIDTYPE;                          hr = MF_E_INVALIDTYPE;
2228                  }                  }
2229                  else m_create.fourcc = FOURCC_DX50;                  else m_create.fourcc = FOURCC_DX50;
2230          }          }
2231            else if (subtype == CLSID_3IVX || subtype == CLSID_3IVX_UC ||
2232                     subtype == CLSID_3IV0 || subtype == CLSID_3IV0_UC ||
2233                     subtype == CLSID_3IV1 || subtype == CLSID_3IV1_UC ||
2234                     subtype == CLSID_3IV2 || subtype == CLSID_3IV2_UC) {
2235                    if (!(g_config.supported_4cc & SUPPORT_3IVX)) {
2236                            CloseLib();
2237                            hr = MF_E_INVALIDTYPE;
2238                    }
2239                    else m_create.fourcc = FOURCC_3IVX;
2240            }
2241          else if (subtype == CLSID_XVID || subtype == CLSID_XVID_UC) {          else if (subtype == CLSID_XVID || subtype == CLSID_XVID_UC) {
2242                  m_create.fourcc = FOURCC_XVID;                  m_create.fourcc = FOURCC_XVID;
2243          }          }

Legend:
Removed from v.1946  
changed lines
  Added in v.2102

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4