Changeset 296


Ignore:
Timestamp:
Jun 15, 2014, 8:06:22 AM (8 years ago)
Author:
roman
Message:

CVmr9Window::CMonitorInformation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Utilities/RenderInterlacedVideo/MainPropertySheet.h

    r295 r296  
    173173        MSG_WM_LBUTTONDBLCLK(OnLButtonDblClk)
    174174END_MSG_MAP()
     175
     176public:
     177
     178        ////////////////////////////////////////////////////////
     179        // CMonitorInformation
     180
     181        class CMonitorInformation
     182        {
     183        public:
     184                CComPtr<IVMRMonitorConfig9> m_pVmrMonitorConfig;
     185                CTempBufferT<VMR9MonitorInfo> m_pMonitorInformations;
     186                SIZE_T m_nMonitorInformationCount;
     187
     188        public:
     189        // CMonitorInformation
     190                CMonitorInformation() :
     191                        m_nMonitorInformationCount(0)
     192                {
     193                }
     194                CMonitorInformation(IVMRMonitorConfig9* pVmrMonitorConfig)
     195                {
     196                        Initialize(pVmrMonitorConfig);
     197                }
     198                CMonitorInformation(IUnknown* pUnknown)
     199                {
     200                        Initialize(pUnknown);
     201                }
     202                VOID Initialize(IVMRMonitorConfig9* pVmrMonitorConfig)
     203                {
     204                        _A(pVmrMonitorConfig);
     205                        m_pVmrMonitorConfig = pVmrMonitorConfig;
     206                        DWORD nMonitorInformationCount = 0;
     207                        m_pVmrMonitorConfig->GetAvailableMonitors(NULL, 0, &nMonitorInformationCount);
     208                        if(nMonitorInformationCount < 32)
     209                                nMonitorInformationCount = 32;
     210                        m_pMonitorInformations.Free();
     211                        _W(m_pMonitorInformations.Allocate(nMonitorInformationCount));
     212                        __C(m_pVmrMonitorConfig->GetAvailableMonitors(m_pMonitorInformations, nMonitorInformationCount, &nMonitorInformationCount));
     213                        m_nMonitorInformationCount = nMonitorInformationCount;
     214                }
     215                VOID Initialize(IUnknown* pUnknown)
     216                {
     217                        const CComQIPtr<IVMRMonitorConfig9> pVmrMonitorConfig = pUnknown;
     218                        __D(pVmrMonitorConfig, E_NOINTERFACE);
     219                        Initialize(pVmrMonitorConfig);
     220                }
     221                VOID TraceMonitor() const
     222                {
     223                        #if _DEVELOPMENT
     224                                _A(m_pVmrMonitorConfig);
     225                                UINT nMonitor, nDefaultMonitor;
     226                                __C(m_pVmrMonitorConfig->GetMonitor(&nMonitor));
     227                                __C(m_pVmrMonitorConfig->GetDefaultMonitor(&nDefaultMonitor));
     228                                _Z4(atlTraceGeneral, 4, _T("nMonitor %d, nDefaultMonitor %d\n"), nMonitor, nDefaultMonitor);
     229                        #endif // _DEVELOPMENT
     230                }
     231                BOOL SuggestMonitor(RECT Position, UINT& nSuggestMonitor) const
     232                {
     233                        BOOL bSuggestMonitorAvailable = FALSE;
     234                        LONG nSuggestMonitorScore;
     235                        for(DWORD nIndex = 0; nIndex < m_nMonitorInformationCount; nIndex++)
     236                        {
     237                                const VMR9MonitorInfo& MonitorInformation = m_pMonitorInformations[nIndex];
     238                                const CRect& MonitorPosition = reinterpret_cast<const CRect&>(MonitorInformation.rcMonitor);
     239                                _Z4(atlTraceGeneral, 4, _T("MonitorInformation.uDevID %d, .hMon 0x%08X, .dwFlags 0x%X, .szDevice \"%ls\", .szDescription \"%ls\"\n"),
     240                                        MonitorInformation.uDevID,
     241                                        //MonitorInformation.rcMonitor.left, ...
     242                                        MonitorInformation.hMon, MonitorInformation.dwFlags,
     243                                        MonitorInformation.szDevice, MonitorInformation.szDescription,
     244                                        //MonitorInformation.liDriverVersion,
     245                                        //MonitorInformation.dwVendorId, MonitorInformation.dwDeviceId, MonitorInformation.dwSubSysId, MonitorInformation.dwRevision,
     246                                        0);
     247                                CRect VisiblePosition;
     248                                if(!VisiblePosition.IntersectRect(MonitorPosition, &Position))
     249                                        continue;
     250                                const LONG nScore = VisiblePosition.Height() * VisiblePosition.Width();
     251                                if(bSuggestMonitorAvailable && nSuggestMonitorScore > nScore)
     252                                        continue;
     253                                nSuggestMonitor = MonitorInformation.uDevID;
     254                                bSuggestMonitorAvailable = TRUE;
     255                                nSuggestMonitorScore = nScore;
     256                        }
     257                        return bSuggestMonitorAvailable;
     258                }
     259        };
    175260
    176261public:
     
    12681353                        __C(m_FilterGraph->Connect(pSourceFilter->GetOutputPin(), _FilterGraphHelper::GetFilterPin(m_RendererWindow.m_pBaseFilter)));
    12691354                        __C(m_FilterGraph.m_pMediaEventEx->SetNotifyWindow((OAHWND) m_hWnd, WM_FILTERGRAPHEVENT, (LONG_PTR) this));
    1270 
    1271                         __C(m_FilterGraph.m_pMediaEventEx->CancelDefaultHandling(EC_DISPLAY_CHANGED));
    1272                         _W(GetParent().SetWindowPos(NULL, 1680 + 100, 100, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE));
    1273                         CRect RendererPosition;
    1274                         _W(m_RendererWindow.GetWindowRect(RendererPosition));
    1275 
    1276                         CComQIPtr<IVMRMonitorConfig9> pVmrMonitorConfig9 = pBaseFilter;
    1277                         UINT nMonitor, nDefaultMonitor;
    1278                         __C(pVmrMonitorConfig9->GetMonitor(&nMonitor));
    1279                         __C(pVmrMonitorConfig9->GetDefaultMonitor(&nDefaultMonitor));
    1280                         _Z4(atlTraceGeneral, 4, _T("nMonitor %d, nDefaultMonitor %d\n"), nMonitor, nDefaultMonitor);
    1281                         CTempBufferT<VMR9MonitorInfo> pMonitorInformations(32);
    1282                         DWORD nMonitorInformationCount = 0;
    1283                         __C(pVmrMonitorConfig9->GetAvailableMonitors(pMonitorInformations, 32, &nMonitorInformationCount));
    1284                         for(DWORD nMonitorIndex = 0; nMonitorIndex < nMonitorInformationCount; nMonitorIndex++)
    1285                         {
    1286                                 const VMR9MonitorInfo& MonitorInformation = pMonitorInformations[nMonitorIndex];
    1287                                 const CRect& MonitorPosition = reinterpret_cast<const CRect&>(MonitorInformation.rcMonitor);
    1288                                 _Z4(atlTraceGeneral, 4, _T("MonitorInformation.uDevID %d, .hMon 0x%08X, .dwFlags 0x%X, .szDevice \"%ls\", .szDescription \"%ls\"\n"),
    1289                                         MonitorInformation.uDevID,
    1290                                         //MonitorInformation.rcMonitor.left, ...
    1291                                         MonitorInformation.hMon, MonitorInformation.dwFlags,
    1292                                         MonitorInformation.szDevice, MonitorInformation.szDescription,
    1293                                         //MonitorInformation.liDriverVersion,
    1294                                         //MonitorInformation.dwVendorId, MonitorInformation.dwDeviceId, MonitorInformation.dwSubSysId, MonitorInformation.dwRevision,
    1295                                         0);
    1296                                 if(MonitorPosition.PtInRect(RendererPosition.TopLeft()) && MonitorPosition.PtInRect(RendererPosition.BottomRight()))
     1355                        #pragma region Simulate EC_DISPLAY_CHANGED (Development)
     1356                        #if _DEVELOPMENT
     1357                                __C(m_FilterGraph.m_pMediaEventEx->CancelDefaultHandling(EC_DISPLAY_CHANGED));
     1358                                _W(GetParent().SetWindowPos(NULL, 1680 + 100, 100, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE));
     1359                                CRect RendererPosition;
     1360                                _W(m_RendererWindow.GetWindowRect(RendererPosition));
     1361                                CVmr9Window::CMonitorInformation MonitorInformation(pBaseFilter);
     1362                                UINT nMonitor;
     1363                                if(MonitorInformation.SuggestMonitor(RendererPosition, nMonitor))
    12971364                                {
    1298                                         _Z4(atlTraceGeneral, 4, _T("MonitorInformation.uDevID %d\n"), MonitorInformation.uDevID);
    1299                                         HRESULT nSetMonitorResult = pVmrMonitorConfig9->SetMonitor(MonitorInformation.uDevID);
     1365                                        _Z4(atlTraceGeneral, 4, _T("nMonitor %d\n"), nMonitor);
     1366                                        _A(MonitorInformation.m_pVmrMonitorConfig->SetMonitor(nMonitor) == VFW_E_WRONG_STATE);
     1367                                        const CComPtr<IPin> pInputPin = _FilterGraphHelper::GetFilterPin(pBaseFilter, PINDIR_INPUT);
     1368                                        const CComPtr<IPin> pOutputPin = _FilterGraphHelper::GetPeerPin(pInputPin);
     1369                                        __D(pInputPin && pOutputPin, E_NOINTERFACE);
     1370                                        const CMediaType pMediaType = _FilterGraphHelper::GetPinMediaType(pOutputPin);
     1371                                        __C(m_FilterGraph.Disconnect(pOutputPin));
     1372                                        __C(m_FilterGraph.Disconnect(pInputPin));
     1373                                        const HRESULT nSetMonitorResult = MonitorInformation.m_pVmrMonitorConfig->SetMonitor(nMonitor);
    13001374                                        _Z45_DSHRESULT(nSetMonitorResult);
    1301                                         if(nSetMonitorResult == VFW_E_WRONG_STATE)
    1302                                         {
    1303                                                 const CComPtr<IPin> pInputPin = _FilterGraphHelper::GetFilterPin(pBaseFilter, PINDIR_INPUT);
    1304                                                 const CComPtr<IPin> pOutputPin = _FilterGraphHelper::GetPeerPin(pInputPin);
    1305                                                 __D(pInputPin && pOutputPin, E_NOINTERFACE);
    1306                                                 const CMediaType pMediaType = _FilterGraphHelper::GetPinMediaType(pOutputPin);
    1307                                                 __C(m_FilterGraph.Disconnect(pOutputPin));
    1308                                                 __C(m_FilterGraph.Disconnect(pInputPin));
    1309 
    1310 
    1311                                                 //m_RendererWindow.Terminate();
    1312                                                 //__C(m_FilterGraph.RemoveFilter(pBaseFilter));
    1313                                                 nSetMonitorResult = pVmrMonitorConfig9->SetMonitor(MonitorInformation.uDevID);
    1314                                                 _Z45_DSHRESULT(nSetMonitorResult);
    1315                                                 //__C(m_FilterGraph->AddFilter(pBaseFilter, CT2CW(_T("VMR-9"))));
    1316                                                 //m_RendererWindow.Initialize(pBaseFilter);
    1317                                                 m_RendererWindow.UpdateVideoPosition();
    1318                                                
    1319 
    1320                                                 if(SUCCEEDED(nSetMonitorResult))
    1321                                                 {
    1322                                                         const HRESULT nConnectResult = m_FilterGraph.ConnectDirect(pOutputPin, pInputPin, pMediaType);
    1323                                                         _Z45_DSHRESULT(nConnectResult);
    1324                                                         __C(nConnectResult);
    1325                                                 }
    1326                                         }
    1327                                         __C(nSetMonitorResult);
    1328                                         __C(pVmrMonitorConfig9->GetMonitor(&nMonitor));
    1329                                         __C(pVmrMonitorConfig9->GetDefaultMonitor(&nDefaultMonitor));
    1330                                         _Z4(atlTraceGeneral, 4, _T("nMonitor %d, nDefaultMonitor %d\n"), nMonitor, nDefaultMonitor);
    1331                                         break;
     1375                                        m_RendererWindow.UpdateVideoPosition();
     1376                                        const HRESULT nConnectResult = m_FilterGraph.ConnectDirect(pOutputPin, pInputPin, pMediaType);
     1377                                        _Z45_DSHRESULT(nConnectResult);
     1378                                        if(FAILED(nConnectResult))
     1379                                                __C(m_FilterGraph.Connect(pOutputPin, pInputPin));
    13321380                                }
    1333                         }
    1334 
     1381                        #endif // _DEVELOPMENT
     1382                        #pragma endregion
    13351383                        UpdateControls();
    13361384                        return 0;
Note: See TracChangeset for help on using the changeset viewer.