Exemplo n.º 1
0
// @pymethod |PyIPropertyBag|Write|Called by the control to write each property in turn to the storage provided by the container.
PyObject *PyIPropertyBag::Write(PyObject *self, PyObject *args)
{
	PyObject *obName;
	PyObject *obValue;
	// @pyparm str|propName||Name of the property to read.
	// @pyparm object|value||The value for the property.  The value must be able to be converted to a COM VARIANT.
	if ( !PyArg_ParseTuple(args, "OO:Write", &obName, &obValue) )
		return NULL;

	IPropertyBag *pIPB = GetI(self);
	if ( pIPB == NULL )
		return NULL;

	TmpWCHAR Name;
	if ( !PyWinObject_AsWCHAR(obName, &Name))
		return NULL;
	VARIANT var;
	if ( !PyCom_VariantFromPyObject(obValue, &var) )
		return NULL;

	PY_INTERFACE_PRECALL;
	HRESULT hr = pIPB->Write(Name, &var);
	VariantClear(&var);
	PY_INTERFACE_POSTCALL;
	if ( FAILED(hr) )
		return PyCom_BuildPyException(hr, pIPB, IID_IPropertyBag);

	Py_INCREF(Py_None);
	return Py_None;
}
Exemplo n.º 2
0
void Audio::LogDeviceInformation(IEnumMoniker *pEnum)
{
	logger.addline("Starting to record audio or video input devices.", info);
	IMoniker *pMoniker = NULL;

	while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
	{
		logger.addline("Have found a new device", success);
		IPropertyBag *pPropBag;
		HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
		if (FAILED(hr))
		{
			pMoniker->Release();
			continue;
		}

		VARIANT var;
		VariantInit(&var);

		// Get description or friendly name.
		hr = pPropBag->Read(L"Description", &var, 0);
		if (FAILED(hr))
		{
			hr = pPropBag->Read(L"FriendlyName", &var, 0);
		}
		if (SUCCEEDED(hr))
		{
			//printf("%S\n", var.bstrVal);
			logger.addline("Below is the device name.", debug);
			logger.addline(ConvertBSTRToMBS(var.bstrVal), debug);
			VariantClear(&var);
		}

		hr = pPropBag->Write(L"FriendlyName", &var);

		// WaveInID applies only to audio capture devices.
		hr = pPropBag->Read(L"WaveInID", &var, 0);
		if (SUCCEEDED(hr))
		{
			//printf("WaveIn ID: %d\n", var.lVal);
			logger.addline("Below is the WaveIn ID.", debug);
			logger.addline("BLANK FOR NOW! FIX ME LATER", debug);
			VariantClear(&var);
		}

		hr = pPropBag->Read(L"DevicePath", &var, 0);
		if (SUCCEEDED(hr))
		{
			// The device path is not intended for display.
			printf("Device path: %S\n", var.bstrVal);
			logger.addline("Below is the device path.", debug);
			//logger.addline(ConvertBSTRToMBS(var.bstrVal), success);
			VariantClear(&var);
		}

		pPropBag->Release();
		pMoniker->Release();
	}
}
Exemplo n.º 3
0
	void DisplayDeviceInformation(IEnumMoniker *pEnum)
	{
		IMoniker *pMoniker = NULL;

		while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
		{
			IPropertyBag *pPropBag;
			HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
			if (FAILED(hr))
			{
				pMoniker->Release();
				continue;  
			} 

			VARIANT var;
			VariantInit(&var);

			// Get description or friendly name.
			hr = pPropBag->Read(L"Description", &var, 0);
			if (FAILED(hr))
			{
				hr = pPropBag->Read(L"FriendlyName", &var, 0);
			}
			if (SUCCEEDED(hr))
			{
				out_message() << "Capture device: " << var.bstrVal << std::endl;
				VariantClear(&var); 
			}

			hr = pPropBag->Write(L"FriendlyName", &var);

			// WaveInID applies only to audio capture devices.
			hr = pPropBag->Read(L"WaveInID", &var, 0);
			if (SUCCEEDED(hr))
			{
				out_message() << "Audio device: " << var.lVal << std::endl;
				VariantClear(&var); 
			}

			hr = pPropBag->Read(L"DevicePath", &var, 0);
			if (SUCCEEDED(hr))
			{
				// The device path is not intended for display.
				out_message() << "Video device: " << var.bstrVal << std::endl;
				VariantClear(&var); 
			}

			pPropBag->Release();
			pMoniker->Release();
		}
	}
Exemplo n.º 4
0
// ILAVDecoder
STDMETHODIMP CDecWMV9::Init()
{
  DbgLog((LOG_TRACE, 10, L"CDecWMV9::Init(): Trying to open WMV9 DMO decoder"));
  HRESULT hr = S_OK;

  // Disable deinterlacing setting in the registry
  // Apparently required on XP
  CreateRegistryKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Scrunch");
  CRegistry reg = CRegistry(HKEY_CURRENT_USER, L"Software\\Microsoft\\Scrunch", hr);
  if (SUCCEEDED(hr)) {
    reg.ReadDWORD(L"Deinterlace.old", hr);
    if (FAILED(hr)) {
      DWORD dwValue = reg.ReadDWORD(L"Deinterlace", hr);
      if (FAILED(hr))
        dwValue = 0;
      reg.WriteDWORD(L"Deinterlace.old", dwValue);
      reg.WriteDWORD(L"Deinterlace", 0);
    }
  }

  hr = CoCreateInstance(CLSID_CWMVDecMediaObject, NULL, CLSCTX_INPROC_SERVER, IID_IMediaObject, (void **)&m_pDMO);
  if (FAILED(hr)) {
    DbgLog((LOG_TRACE, 10, L"-> Failed to create DMO object"));
    return hr;
  }

  // Force decoder deinterlacing to off
  IPropertyBag *pProp = NULL;
  hr = m_pDMO->QueryInterface(&pProp);
  if (SUCCEEDED(hr)) {
    VARIANT var = {0};
    var.vt = VT_BOOL;
    var.boolVal = FALSE;
    pProp->Write(g_wszWMVCDecoderDeinterlacing, &var);
    SafeRelease(&pProp);
  }

  return S_OK;
}
Exemplo n.º 5
0
HRESULT SetVideoParams( IMediaObject *pDMO, VideoEncParams *pParams )
{
	HRESULT      hr;
	VARIANT      varg;
	IPropertyBag *pPropertyBag = NULL;

	if( NULL == pDMO || NULL == pParams )
	{
		return ( E_INVALIDARG );
	}

	do
	{
		//
		// Get the IPropertyBag IF and set the appropriate params
		//
		hr = pDMO->QueryInterface(IID_IPropertyBag, (void**)&pPropertyBag);
		if( FAILED( hr ) )
		{
			break;
		}
		//
		//set the encoder in VBR mode if required
		//
		if( pParams->fIsVBR == TRUE )
		{
			::VariantInit(&varg);
			varg.vt      = VT_BOOL;
			varg.boolVal = TRUE;

			hr = pPropertyBag->Write( g_wszWMVCVBREnabled, &varg );
			if( FAILED( hr ) )
			{
				hr = E_VIDEO_VBR_NOT_SUPPORTED;
				break;
			}
			//
			// if it is 1 pass VBR set the Quality param
			//
			if( pParams->nPasses == 1 )
			{
				::VariantInit(&varg);
				varg.vt = VT_I4;
				varg.lVal = pParams->nVBRQuality;
				hr = pPropertyBag->Write( g_wszWMVCVBRQuality, &varg );
				if( FAILED( hr ) )
				{
					hr = E_VBR_QUALITY_REJECTED;
					break;
				}
			}
		}
		//
		//set the number of passes
		//
		if( pParams->nPasses > 1 )
		{
			::VariantInit(&varg);
			varg.vt   = VT_I4;
			varg.lVal = pParams->nPasses;

			hr = pPropertyBag->Write( g_wszWMVCPassesUsed, &varg );
			if( FAILED( hr ) )
			{
				hr = E_VIDEO_NPASS_NOT_SUPPORTED;
				break;
			}
		}
		//
		// set the bitrate for all the modes except 1 pass VBR
		//
		if( !( pParams->fIsVBR == TRUE && pParams->nPasses == 1 ) )
		{
			::VariantInit(&varg);
			varg.vt = VT_I4;
			varg.lVal = pParams->nBitrate;
			hr = pPropertyBag->Write( g_wszWMVCAvgBitrate, &varg );
			if( FAILED( hr ) )
			{
				hr = E_VIDEO_BITRATE_REJECTED;
				break;
			}
		}
		//
		// set the buffer window
		//
		::VariantInit(&varg);
		varg.vt = VT_I4;
		varg.lVal = pParams->nBufferDelay;
		hr = pPropertyBag->Write( g_wszWMVCVideoWindow, &varg );
		if( FAILED( hr ) )
		{
			hr = E_VIDEO_BUFFER_REJECTED;
			break;
		}

		if( pParams->fIsConstrained == TRUE )
		{
			::VariantInit(&varg);
			varg.vt   = VT_I4;
			varg.lVal = pParams->nPeakBitrate;

			hr = pPropertyBag->Write( g_wszWMVCMaxBitrate, &varg );
			if( FAILED( hr ) )
			{
				hr = E_VIDEO_PEAK_BITRATE_REJECTED;
				break;
			}

			::VariantInit(&varg);
			varg.vt   = VT_I4;
			varg.lVal = pParams->nPeakBuffer;

			hr = pPropertyBag->Write( g_wszWMVCBMax, &varg );
			if( FAILED( hr ) )
			{
				hr = E_VIDEO_PEAK_BUFFER_REJECTED;
				break;
			}
		}

		//
		// set the profile for WMV# only
		//
		hr = S_OK;
		BSTR bstrIn=NULL;
		if( pParams->dwTag == WMCFOURCC_WMV3 )
		{
			switch( pParams->nProfile )
			{
			case P_MAIN:
				bstrIn = ::SysAllocString(L"MP");
				break;
			case P_SIMPLE:
				bstrIn = ::SysAllocString(L"SP");
				break;
			case P_COMPLEX:
				bstrIn = ::SysAllocString(L"CP");
				break;
			default:
				hr = E_VIDEO_INVALID_PROFILE;
				break;
			}
			if( FAILED( hr ) ) break;

			::VariantInit(&varg);
			varg.vt      = VT_BSTR;
			varg.bstrVal = bstrIn;
			hr = pPropertyBag->Write( g_wszWMVCDecoderComplexityRequested, &varg );
			::SysFreeString( bstrIn );
			if( FAILED( hr ) )
			{
				hr = E_VIDEO_PROFILE_REJECTED;
				break;
			}
		}

		//
		// set the complexity param
		//
		::VariantInit(&varg);
		varg.vt = VT_I4;
		varg.lVal = pParams->nComplexity;
		hr = pPropertyBag->Write( g_wszWMVCComplexityEx, &varg );
		if( FAILED( hr ) )
		{
			hr = E_VIDEO_KEYDIST_REJECTED;
			break;
		}

		//
		// set the max distance between the key frames
		//
		::VariantInit(&varg);
		varg.vt = VT_I4;
		varg.lVal = pParams->nKeyDist;
		hr = pPropertyBag->Write( g_wszWMVCKeyframeDistance, &varg );
		if( FAILED( hr ) )
		{
			hr = E_VIDEO_KEYDIST_REJECTED;
			break;
		}

		//
		// set the crispness params for WMV# only
		//
		if( pParams->dwTag == WMCFOURCC_WMV3 || pParams->dwTag == WMCFOURCC_WMV2 || pParams->dwTag == WMCFOURCC_WMV1 )
		{
			::VariantInit(&varg);
			varg.vt = VT_I4;
			varg.lVal = pParams->nCrisp;
			hr = pPropertyBag->Write( g_wszWMVCCrisp, &varg );
			if( FAILED( hr ) )
			{
				hr = E_VIDEO_CRISPNESS_REJECTED;
				break;
			}
		}

		if ( pParams->fIsVBR)
		{
			::VariantInit(&varg);
			varg.vt = VT_I4;
			varg.lVal = pParams->nQuality;
			hr = pPropertyBag->Write( g_wszWMVCVBRQuality, &varg );
			if( FAILED( hr ) )
			{
				hr = E_VIDEO_QUALITY_REJECTED;
				break;
			}
		}  

#ifdef SUPPORT_INTERLACE
		//
		// set the interlace mode for WMV# only
		//
		if( pParams->dwTag == WMCFOURCC_WMV3 && pParams->fIsInterlaced)
		{
			::VariantInit(&varg);
			varg.vt = VT_BOOL;
			varg.boolVal = TRUE;
			hr = pPropertyBag->Write( g_wszWMVCInterlacedCodingEnabled, &varg );
			if( FAILED( hr ) )
			{
				hr = E_VIDEO_INTERLACE_REJECTED;
				break;
			}
		}
#endif //SUPPORT_INTERLACE

	}
	while( FALSE );
	SAFERELEASE( pPropertyBag );
	return ( hr );
}