HRESULT CCoreAACDecoder::DecideBufferSize(IMemAllocator *pAllocator, ALLOCATOR_PROPERTIES *pProperties) { pProperties->cBuffers = 8; m_OutputBuffLen = m_Channels * MAXFRAMELEN * sizeof(short); pProperties->cbBuffer = m_OutputBuffLen; NOTE1("CCoreAACDecoder::DecideBufferSize %d", pProperties->cbBuffer); ALLOCATOR_PROPERTIES Actual; HRESULT hr = pAllocator->SetProperties(pProperties, &Actual); if(FAILED(hr)) return hr; if (Actual.cbBuffer < pProperties->cbBuffer || Actual.cBuffers < pProperties->cBuffers) return E_INVALIDARG; return S_OK; }
// // CompleteConnect // // When we complete connection we need to see if the video has changed sizes // If it has then we activate the window and reset the source and destination // rectangles. If the video is the same size then we bomb out early. By doing // this we make sure that temporary disconnections such as when we go into a // fullscreen mode do not cause unnecessary property changes. The basic ethos // is that all properties should be persistent across connections if possible // HRESULT CVideoRenderer::CompleteConnect(IPin *pReceivePin) { CAutoLock cInterfaceLock(&m_InterfaceLock); CBaseVideoRenderer::CompleteConnect(pReceivePin); m_DrawImage.ResetPaletteVersion(); // Has the video size changed between connections VIDEOINFOHEADER *pVideoInfo = (VIDEOINFOHEADER *) m_mtIn.Format(); if (pVideoInfo->bmiHeader.biWidth == m_VideoSize.cx) { if (pVideoInfo->bmiHeader.biHeight == m_VideoSize.cy) { return NOERROR; } } // Pass the video window handle upstream HWND hwnd = m_VideoText.GetWindowHWND(); NOTE1("Sending EC_NOTIFY_WINDOW %x",hwnd); SendNotifyWindow(pReceivePin,hwnd); // Set them for the current video dimensions m_DrawImage.SetDrawContext(); m_VideoSize.cx = pVideoInfo->bmiHeader.biWidth; m_VideoSize.cy = pVideoInfo->bmiHeader.biHeight; m_VideoText.SetDefaultSourceRect(); m_VideoText.SetDefaultTargetRect(); m_VideoText.OnVideoSizeChange(); m_VideoText.ActivateWindow(); return NOERROR; } // CompleteConnect
// // OnReceiveMessage // // This is the derived class window message handler methods // LRESULT CVideoText::OnReceiveMessage(HWND hwnd, // Window handle UINT uMsg, // Message ID WPARAM wParam, // First parameter LPARAM lParam) // Other parameter { IBaseFilter *pFilter = NULL; RECT ClientRect; // Blank out the window background if (uMsg == WM_ERASEBKGND) { EXECUTE_ASSERT(GetClientRect(m_hwnd,&ClientRect)); HBRUSH hBrush = CreateSolidBrush(RGB(0,0,0)); EXECUTE_ASSERT(FillRect(m_hdc,&ClientRect,hBrush)); EXECUTE_ASSERT(DeleteObject(hBrush)); return (LRESULT) 0; } // Handle WM_CLOSE by aborting the playback if (uMsg == WM_CLOSE) { m_pRenderer->NotifyEvent(EC_USERABORT,0,0); DoShowWindow(SW_HIDE); return CBaseWindow::OnClose(); } // We pass on WM_ACTIVATEAPP messages to the filtergraph so that the // IVideoWindow plug in distributor can switch us out of fullscreen // mode where appropriate. These messages may also be used by the // resource manager to keep track of which renderer has the focus if (uMsg == WM_ACTIVATEAPP) { NOTE1("Notification of EC_ACTIVATE (%d)",(BOOL) wParam); m_pRenderer->QueryInterface(IID_IBaseFilter,(void **) &pFilter); if (pFilter) { m_pRenderer->NotifyEvent(EC_ACTIVATE, wParam, (LPARAM) pFilter); pFilter->Release(); } return (LRESULT) 0; } // Treat clicks on text as requests to move window if (uMsg == WM_NCHITTEST) { LRESULT Result = DefWindowProc(hwnd,uMsg,wParam,lParam); if (Result == HTCLIENT) Result = HTCAPTION; return Result; } // The base class that implements IVideoWindow looks after a flag // that says whether or not the cursor should be hidden. If so we // hide the cursor and return (LRESULT) 1. Otherwise we pass to // the DefWindowProc to show the cursor as normal. This is used // when our window is made fullscreen to imitate the Modex filter if (uMsg == WM_SETCURSOR) { if (IsCursorHidden() == TRUE) { SetCursor(NULL); return (LRESULT) 1; } } // When we detect a display change we send an EC_DISPLAY_CHANGED // message along with our input pin. The filtergraph will stop // everyone and reconnect our input pin. When being reconnected // we can then accept the media type that matches the new display // mode since we may no longer be able to draw the current format if (uMsg == WM_DISPLAYCHANGE) { m_pRenderer->m_Display.RefreshDisplayType(NULL); m_pRenderer->OnDisplayChange(); NOTE("Sent EC_DISPLAY_CHANGED event"); return (LRESULT) 0; } return CBaseWindow::OnReceiveMessage(hwnd,uMsg,wParam,lParam); } // OnReceiveMessage