Exemplo n.º 1
0
bool HDevice::ConnectFilters()
{
	bool success = true;

	if (!EnsureInitialized(L"ConnectFilters") ||
	    !EnsureInactive(L"ConnectFilters"))
		return false;

	if (videoCapture != NULL) {
		success = ConnectPins(PIN_CATEGORY_CAPTURE,
				MEDIATYPE_Video, videoFilter,
				videoCapture);
		if (!success) {
			success = RenderFilters(PIN_CATEGORY_CAPTURE,
					MEDIATYPE_Video, videoFilter,
					videoCapture);
		}
	}

	if ((audioCapture || audioOutput) && success) {
		IBaseFilter *filter = (audioCapture != nullptr) ?
			audioCapture.Get() : audioOutput.Get();

		if (audioCapture != nullptr)
			SetAudioBuffering(10);

		success = ConnectPins(PIN_CATEGORY_CAPTURE,
				MEDIATYPE_Audio, audioFilter,
				filter);
		if (!success) {
			success = RenderFilters(PIN_CATEGORY_CAPTURE,
					MEDIATYPE_Audio, audioFilter,
					filter);
		}
	}

	if (success)
		LogFilters(graph);

	return success;
}
Exemplo n.º 2
0
void ezQtNodeScene::NodeEventsHandler(const ezDocumentNodeManagerEvent& e)
{
  switch (e.m_EventType)
  {
    case ezDocumentNodeManagerEvent::Type::NodeMoved:
    {
      ezVec2 vPos = m_pManager->GetNodePos(e.m_pObject);
      ezQtNode* pNode = m_Nodes[e.m_pObject];
      pNode->setPos(vPos.x, vPos.y);
    }
    break;
    case ezDocumentNodeManagerEvent::Type::AfterPinsConnected:
    {
      ConnectPins(e.m_pConnection);
    }
    break;
    case ezDocumentNodeManagerEvent::Type::BeforePinsDisonnected:
    {
      DisconnectPins(e.m_pConnection);
    }
    break;
    case ezDocumentNodeManagerEvent::Type::BeforePinsChanged:
    {
    }
    break;
    case ezDocumentNodeManagerEvent::Type::AfterPinsChanged:
    {
    }
    break;
      // case ezDocumentNodeManagerEvent::Type::BeforeNodeAdded:
      //  {
      //  }
      //  break;
    case ezDocumentNodeManagerEvent::Type::AfterNodeAdded:
    {
      CreateNode(e.m_pObject);
    }
    break;
    case ezDocumentNodeManagerEvent::Type::BeforeNodeRemoved:
    {
      DeleteNode(e.m_pObject);
    }
    break;
      // case ezDocumentNodeManagerEvent::Type::AfterNodeRemoved:
      //  {
      //  }
      //  break;

    default:
      break;
  }
}
Exemplo n.º 3
0
void ezQtNodeScene::SetDocumentNodeManager(const ezDocumentNodeManager* pManager)
{
  if (pManager == m_pManager)
    return;

  Clear();
  if (m_pManager != nullptr)
  {
    m_pManager->m_NodeEvents.RemoveEventHandler(ezMakeDelegate(&ezQtNodeScene::NodeEventsHandler, this));
    m_pManager->GetDocument()->GetSelectionManager()->m_Events.RemoveEventHandler(
        ezMakeDelegate(&ezQtNodeScene::SelectionEventsHandler, this));
    m_pManager->m_PropertyEvents.RemoveEventHandler(ezMakeDelegate(&ezQtNodeScene::PropertyEventsHandler, this));
  }

  m_pManager = pManager;

  if (pManager != nullptr)
  {
    pManager->m_NodeEvents.AddEventHandler(ezMakeDelegate(&ezQtNodeScene::NodeEventsHandler, this));
    m_pManager->GetDocument()->GetSelectionManager()->m_Events.AddEventHandler(
        ezMakeDelegate(&ezQtNodeScene::SelectionEventsHandler, this));
    m_pManager->m_PropertyEvents.AddEventHandler(ezMakeDelegate(&ezQtNodeScene::PropertyEventsHandler, this));

    // Create Nodes
    const auto& rootObjects = pManager->GetRootObject()->GetChildren();
    for (const auto& pObject : rootObjects)
    {
      if (pManager->IsNode(pObject))
      {
        CreateNode(pObject);
      }
    }

    // Connect Pins
    for (auto it = m_Nodes.GetIterator(); it.IsValid(); ++it)
    {
      auto outputs = pManager->GetOutputPins(it.Value()->GetObject());
      for (const ezPin* pOutPin : outputs)
      {
        auto connections = pOutPin->GetConnections();
        for (const ezConnection* pConnection : connections)
        {
          ConnectPins(pConnection);
        }
      }
    }
  }
}
Exemplo n.º 4
0
bool DShowMoviePlayer::loadMovie (void)
{
	if (!_oleInitialized)
	{
		::CoInitialize (0);
	}

	char physicFileName[512];
	wchar_t physicFileNameW[512];
	ATOM_GetNativePathName (_fileName.c_str(), physicFileName);
	if (!convertCStringToWString (physicFileName, physicFileNameW, 512))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "Error converting C string filename to UNICODE");
		return false;
	}

#if 1
	HRESULT hr = ::CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&_graphBuilder);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error creating graph");
		return false;
	}

	hr = ::CoCreateInstance (CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&_grabberFilter);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error creating sample grabber");
		return false;
	}

	hr = _grabberFilter->QueryInterface (IID_ISampleGrabber, (void**)&_grabber);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error querying sample grabber");
		return false;
	}

	AM_MEDIA_TYPE mt;
	memset (&mt, 0, sizeof(AM_MEDIA_TYPE));
	mt.majortype = MEDIATYPE_Video;
	mt.subtype = MEDIASUBTYPE_RGB32;
	mt.formattype = FORMAT_VideoInfo;
	hr = _grabber->SetMediaType (&mt);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error setting smaple grabber media type");
		return false;
	}

	hr = _graphBuilder->AddFilter (_grabberFilter, L"Sample Grabber");
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error adding filter");
		return false;
	}

	hr = _graphBuilder->QueryInterface (IID_IMediaControl, (void**)&_control);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error querying media control");
		return false;
	}

	IBaseFilter *render = 0;
	hr = ::CoCreateInstance (CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&render);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error creating render filter");
		return false;
	}

	hr = _graphBuilder->AddFilter (render, L"Null renderer");
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error adding null-renderer filter");
		return false;
	}

	hr = _control->RenderFile (physicFileNameW);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error rendering file");
		return false;
	}
#if 0
	IPin *grabberOut = 0;
	FindPin (_grabberFilter, PINDIR_OUTPUT, 0, &grabberOut);
	if (grabberOut)
	{
		grabberOut->Disconnect ();
		grabberOut->Release ();
	}
#endif

	SaveGraphFile (_graphBuilder, L"C:\\test.grf");
	hr = _graphBuilder->QueryInterface (IID_IVideoWindow, (void**)&_window);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error querying video window");
		return false;
	}

	_window->put_AutoShow (OAFALSE);

#if 0
	if (!ConnectPins (_graphBuilder, _grabberFilter, 0, render, 0))
	{
		return false;
	}
	_control->RenderFile (physicFileNameW);
#endif

	memset(&mt, 0, sizeof(mt));
	mt.majortype = MEDIATYPE_Video;
	mt.subtype = MEDIASUBTYPE_RGB32;
	mt.formattype = FORMAT_VideoInfo;

	hr = _grabber->GetConnectedMediaType (&mt);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error getting connected media type");
		return false;
	}

	VIDEOINFOHEADER *vih = (VIDEOINFOHEADER*)mt.pbFormat;
	_videoWidth = vih->bmiHeader.biWidth;
	_videoHeight = vih->bmiHeader.biHeight;
	_bufferSize = mt.lSampleSize;
	if (mt.cbFormat != 0)
	{
		::CoTaskMemFree ((PVOID)mt.pbFormat);
		mt.cbFormat = 0;
		mt.pbFormat = 0;
	}
	if (mt.pUnk != NULL)
	{
		mt.pUnk->Release ();
		mt.pUnk = NULL;
	}

	_grabber->SetOneShot (FALSE);
	_grabber->SetBufferSamples (TRUE);

	hr = _graphBuilder->QueryInterface (IID_IMediaEvent, (void**)&_event);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error querying media event");
		return false;
	}

	hr = _graphBuilder->QueryInterface (IID_IMediaSeeking, (void**)&_seeking);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error querying media seeking");
		return false;
	}

#else
	HRESULT hr = ::CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&_graphBuilder);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error creating graph");
		return false;
	}

	hr = _graphBuilder->QueryInterface (IID_IMediaControl, (void**)&_control);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error querying media control");
		return false;
	}

	hr = _graphBuilder->QueryInterface (IID_IMediaEvent, (void**)&_event);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error querying media event");
		return false;
	}

	hr = _graphBuilder->QueryInterface (IID_IMediaSeeking, (void**)&_seeking);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error querying media seeking");
		return false;
	}

	hr = ::CoCreateInstance (CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&_grabberFilter);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error creating sample grabber");
		return false;
	}

	hr = _graphBuilder->AddFilter (_grabberFilter, L"Sample Grabber");
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error adding filter");
		return false;
	}

	hr = _grabberFilter->QueryInterface (IID_ISampleGrabber, (void**)&_grabber);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error querying sample grabber");
		return false;
	}

	AM_MEDIA_TYPE mt;
	memset (&mt, 0, sizeof(AM_MEDIA_TYPE));
	mt.majortype = MEDIATYPE_Video;
	mt.subtype = MEDIASUBTYPE_RGB24;
	mt.formattype = FORMAT_VideoInfo;
	hr = _grabber->SetMediaType (&mt);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error setting smaple grabber media type");
		return false;
	}

	IBaseFilter *srcFilter = 0;
	hr = _graphBuilder->AddSourceFilter (physicFileNameW, L"Source", &srcFilter);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error adding source filter");
		return false;
	}

	hr = connectFilters (_graphBuilder, srcFilter, _grabberFilter);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error connecting filters");
		return false;
	}

	IBaseFilter *render = 0;
	hr = ::CoCreateInstance (CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&render);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error creating render filter");
		return false;
	}

	_graphBuilder->AddFilter (render, L"Render");

	hr = connectFilters (_graphBuilder, _grabberFilter, render);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error connect filters");
		return false;
	}

	hr = _graphBuilder->RenderFile (physicFileNameW, NULL);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error rendering file");
		return false;
	}

	hr = _graphBuilder->QueryInterface (IID_IVideoWindow, (void**)&_window);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error querying video window");
		return false;
	}

	_window->put_AutoShow (OAFALSE);

	AM_MEDIA_TYPE mtt;
	hr = _grabber->GetConnectedMediaType (&mtt);
	if (FAILED(hr))
	{
		ATOM_LOGGER::error ("%s() %s\n", __FUNCTION__, "[DSHOW] Error getting connected media type info");
		return false;
	}
	
	VIDEOINFOHEADER *vih = (VIDEOINFOHEADER*)mtt.pbFormat;
	_videoWidth = vih->bmiHeader.biWidth;
	_videoHeight = vih->bmiHeader.biHeight;
	if (mtt.cbFormat != 0)
	{
		::CoTaskMemFree ((PVOID)mtt.pbFormat);
		mtt.cbFormat = 0;
		mtt.pbFormat = 0;
	}
	if (mtt.pUnk != NULL)
	{
		mtt.pUnk->Release ();
		mtt.pUnk = NULL;
	}

	_grabber->SetOneShot (FALSE);
	_grabber->SetBufferSamples (TRUE);
#endif

	return true;
}