⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genprofile_lib.cpp

📁 mpeg4 video codec mpeg4 video codec
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	//	// The width must be on a byte boundry	//	if ( dwWidth * wBitsPerPixel % 8 != 0 )	{		return E_INVALIDARG;	}	//	// The width, height, and frames per second must all be non-zero	//	if ( 0 == dwWidth || 0 == dwHeight  || 0 == dwFPS )	{		return E_INVALIDARG;	}	do	{		//		// Allocate space for the format data ( WMVIDEOINFOHEADER + pallete data )		//		dwFormatDataSize = sizeof( WMVIDEOINFOHEADER );		cbExpectedPostVIHDataSize = 0;		//		// If there are <= 8 bits / pixel, then there needs to be palette data following the WMVIDEOINFOHEADER		//		fPalettePresent = ( wBitsPerPixel <= 8 );		if ( fPalettePresent )		{			dwMaxColors = 1 << wBitsPerPixel;			cbExpectedPostVIHDataSize = sizeof( RGBQUAD ) * dwMaxColors;		}		//		// If the format uses bitfields, then make sure the data is following		//		fBitfieldsPresent = ( BI_BITFIELDS == dwFourCC );		if ( fBitfieldsPresent )		{			cbExpectedPostVIHDataSize = BITFIELD_DATA_SIZE;		}		if ( fPalettePresent || fBitfieldsPresent )		{			dwFormatDataSize += cbExpectedPostVIHDataSize;			if ( !pbPaletteData || ( cbPaletteDataSize != cbExpectedPostVIHDataSize ) )			{				hr = E_INVALIDARG;				break;			}		}		pbFormatData = new BYTE[ dwFormatDataSize ];		if ( !pbFormatData )		{			hr = E_OUTOFMEMORY;			break;		}		ZeroMemory( pbFormatData, dwFormatDataSize );		pbPostVIHData = pbFormatData + sizeof( WMVIDEOINFOHEADER );		pvihUncompressedVideo = (WMVIDEOINFOHEADER*) pbFormatData;		//		// Set up the local copy of the uncompressed media type		//		ZeroMemory( &mtUncompressedVideo, sizeof( mtUncompressedVideo ) );		mtUncompressedVideo.majortype = WMMEDIATYPE_Video;		mtUncompressedVideo.subtype = guidFormat;		mtUncompressedVideo.bFixedSizeSamples = TRUE;		mtUncompressedVideo.bTemporalCompression = FALSE;		mtUncompressedVideo.lSampleSize = wBitsPerPixel * dwWidth * dwHeight / 8;		mtUncompressedVideo.formattype = WMFORMAT_VideoInfo;		mtUncompressedVideo.pUnk = NULL;		mtUncompressedVideo.cbFormat = dwFormatDataSize;		mtUncompressedVideo.pbFormat = (BYTE*) pbFormatData;		//		// Configure the WMVIDEOINFOHEADER structure for uncompressed video		//		pvihUncompressedVideo->dwBitRate = mtUncompressedVideo.lSampleSize * dwFPS * 8;		pvihUncompressedVideo->rcSource.right = dwWidth;		pvihUncompressedVideo->rcSource.bottom = dwHeight;		pvihUncompressedVideo->rcTarget.right = dwWidth;		pvihUncompressedVideo->rcTarget.bottom = dwHeight;		pvihUncompressedVideo->bmiHeader.biSizeImage = mtUncompressedVideo.lSampleSize;		pvihUncompressedVideo->bmiHeader.biPlanes = 1;		pvihUncompressedVideo->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );		pvihUncompressedVideo->bmiHeader.biWidth = dwWidth;		pvihUncompressedVideo->bmiHeader.biHeight = dwHeight;		pvihUncompressedVideo->bmiHeader.biCompression = dwFourCC;		pvihUncompressedVideo->bmiHeader.biBitCount = wBitsPerPixel;		pvihUncompressedVideo->AvgTimePerFrame = ( (LONGLONG) 10000000 ) / ( (LONGLONG) dwFPS );		//		// Copy the palette information, if present		//		if ( ( fPalettePresent || fBitfieldsPresent ) && pbPaletteData )		{			memcpy( pbPostVIHData, pbPaletteData, cbExpectedPostVIHDataSize );		}		//		// Return a copy of the media type to the caller, since the media type is on the stack		//		hr = CopyMediaType( ppmtMediaType, &mtUncompressedVideo );		if ( FAILED( hr ) )		{			break;		}	}	while( FALSE );	SAFE_ARRAYDELETE( pbFormatData );	return( hr );}//------------------------------------------------------------------------------// Name: CreateScriptMediaType()// Desc: Initializes a WM_MEDIA_TYPE for script.//------------------------------------------------------------------------------STDMETHODIMP CreateScriptMediaType(  WM_MEDIA_TYPE** ppmtMediaType ){	HRESULT hr = S_OK;	WM_MEDIA_TYPE wmtMediaType;	WMSCRIPTFORMAT wsfScriptFormat;	assert( ppmtMediaType );	do	{		ZeroMemory( &wmtMediaType, sizeof( wmtMediaType ) );		//		// Configure media type		//		wmtMediaType.majortype              = WMMEDIATYPE_Script;		wmtMediaType.subtype                = GUID_NULL;		wmtMediaType.bFixedSizeSamples      = FALSE;		wmtMediaType.bTemporalCompression   = TRUE;		wmtMediaType.lSampleSize            = 0;		wmtMediaType.formattype             = WMFORMAT_Script;		wmtMediaType.cbFormat               = sizeof( WMSCRIPTFORMAT );		wmtMediaType.pbFormat               = (BYTE*) &wsfScriptFormat;		wsfScriptFormat.scriptType          = WMSCRIPTTYPE_TwoStrings;		//		// Return a copy of the media type to the caller		//		hr = CopyMediaType( ppmtMediaType, &wmtMediaType );		if ( FAILED( hr ) )		{			break;		}	}	while ( FALSE );	return hr;}//------------------------------------------------------------------------------// Name: CreateImageMediaType()// Desc: Initializes a WM_MEDIA_TYPE for image.//------------------------------------------------------------------------------STDMETHODIMP CreateImageMediaType(  WM_MEDIA_TYPE** ppmtMediaType,								  DWORD dwWidth,								  DWORD dwHeight,								  DWORD dwBitrate ){	static const WORD BIT_COUNT = 24;	HRESULT hr = S_OK;	WM_MEDIA_TYPE wmtMediaType;	WMVIDEOINFOHEADER vihVideoInfo;	do	{		ZeroMemory( &wmtMediaType, sizeof( wmtMediaType ) );		//		// Set up the WM_MEDIA_TYPE structure		//		wmtMediaType.majortype              = WMMEDIATYPE_Image;		wmtMediaType.subtype                = WMMEDIASUBTYPE_RGB24;		wmtMediaType.bFixedSizeSamples      = FALSE;		wmtMediaType.bTemporalCompression   = FALSE;		wmtMediaType.lSampleSize			= 0;		wmtMediaType.bFixedSizeSamples      = FALSE;		wmtMediaType.bTemporalCompression   = FALSE;		wmtMediaType.lSampleSize            = 0;		wmtMediaType.formattype             = WMFORMAT_VideoInfo;		wmtMediaType.pUnk                   = NULL;		wmtMediaType.cbFormat               = sizeof( WMVIDEOINFOHEADER );		wmtMediaType.pbFormat               = (BYTE*) &vihVideoInfo;		//		// Set up the WMVIDEOINFOHEADER structure		//		ZeroMemory( &vihVideoInfo, sizeof( vihVideoInfo ) );		vihVideoInfo.rcSource.left = 0;		vihVideoInfo.rcSource.top = 0;		vihVideoInfo.rcSource.bottom = dwHeight;		vihVideoInfo.rcSource.right = dwWidth;		vihVideoInfo.rcTarget = vihVideoInfo.rcSource;		vihVideoInfo.dwBitRate = dwBitrate;		vihVideoInfo.dwBitErrorRate = 0;		vihVideoInfo.AvgTimePerFrame = 0;		vihVideoInfo.bmiHeader.biSize = sizeof( BITMAPINFOHEADER );		vihVideoInfo.bmiHeader.biWidth = dwWidth;		vihVideoInfo.bmiHeader.biHeight = dwHeight;		vihVideoInfo.bmiHeader.biPlanes = 1;		vihVideoInfo.bmiHeader.biBitCount = BIT_COUNT;		vihVideoInfo.bmiHeader.biCompression = BI_RGB;		vihVideoInfo.bmiHeader.biSizeImage = ( dwHeight * dwWidth * vihVideoInfo.bmiHeader.biBitCount ) / 8;		vihVideoInfo.bmiHeader.biXPelsPerMeter = 0;		vihVideoInfo.bmiHeader.biYPelsPerMeter = 0;		vihVideoInfo.bmiHeader.biClrUsed = 0;		vihVideoInfo.bmiHeader.biClrImportant = 0;		//		// Return a copy of the media type to the caller		//		hr = CopyMediaType( ppmtMediaType, &wmtMediaType );		if ( FAILED( hr ) )		{			break;		}	}	while ( FALSE );	return hr;}//------------------------------------------------------------------------------// Name: CreateWebMediaType()// Desc: Initializes a WM_MEDIA_TYPE for Web media.//------------------------------------------------------------------------------STDMETHODIMP CreateWebMediaType(  WM_MEDIA_TYPE** ppmtMediaType ){	HRESULT hr = S_OK;	WM_MEDIA_TYPE wmtMediaType;	WMT_WEBSTREAM_FORMAT wwfWebFormat;	do	{		ZeroMemory( &wmtMediaType, sizeof( wmtMediaType ) );		//		// Configure media type		//		wmtMediaType.majortype              = WMMEDIATYPE_FileTransfer;		wmtMediaType.subtype                = WMMEDIASUBTYPE_WebStream;		wmtMediaType.bFixedSizeSamples      = FALSE;		wmtMediaType.bTemporalCompression   = TRUE;		wmtMediaType.lSampleSize            = 0;		wmtMediaType.formattype             = WMFORMAT_WebStream;		wmtMediaType.pUnk                   = NULL;		wmtMediaType.cbFormat               = sizeof( WMT_WEBSTREAM_FORMAT );		wmtMediaType.pbFormat               = (BYTE*) &wwfWebFormat;		ZeroMemory( &wwfWebFormat, sizeof( wwfWebFormat ) );		wwfWebFormat.cbSize = sizeof( WMT_WEBSTREAM_FORMAT );		wwfWebFormat.cbSampleHeaderFixedData = sizeof( WMT_WEBSTREAM_SAMPLE_HEADER );		wwfWebFormat.wVersion = 1;		wwfWebFormat.wReserved = 0;		//		// Return a copy of the media type to the caller		//		hr = CopyMediaType( ppmtMediaType, &wmtMediaType );		if ( FAILED( hr ) )		{			break;		}	}	while ( FALSE );	return hr;}//------------------------------------------------------------------------------// Name: CreateFileMediaType()// Desc: Initializes a WM_MEDIA_TYPE for file transfer.//------------------------------------------------------------------------------STDMETHODIMP CreateFileMediaType(  WM_MEDIA_TYPE** ppmtMediaType ){	HRESULT hr = S_OK;	WM_MEDIA_TYPE wmtMediaType;	do	{		ZeroMemory( &wmtMediaType, sizeof( wmtMediaType ) );		//		// Configure media type		//		wmtMediaType.majortype              = WMMEDIATYPE_FileTransfer;		wmtMediaType.subtype                = GUID_NULL;		wmtMediaType.bFixedSizeSamples      = FALSE;		wmtMediaType.bTemporalCompression   = FALSE;		wmtMediaType.lSampleSize            = 0;		//		// Return a copy of the media type to the caller		//		hr = CopyMediaType( ppmtMediaType, &wmtMediaType );		if ( FAILED( hr ) )		{			break;		}	}	while ( FALSE );	return hr;}//------------------------------------------------------------------------------// Name: CreateVideoStream()// Desc: Creates a video stream and returns its configuration object.//------------------------------------------------------------------------------STDMETHODIMP CreateVideoStream( Twmv9dll *dll,							   IWMStreamConfig** ppStreamConfig,							   IWMCodecInfo3* pCodecInfo3,							   IWMProfile *pProfile,							   DWORD dwCodecIndex,							   DWORD dwBitrate,							   DWORD dwBufferWindow,							   DWORD dwWidth,							   DWORD dwHeight,							   double dFPS,							   DWORD dwQuality,							   DWORD dwSecPerKey,							   BOOL fIsVBR,							   VIDEO_VBR_MODE vbrMode,							   DWORD dwVBRQuality,							   DWORD dwMaxBitrate,							   DWORD dwMaxBufferWindow,							   LCID dwLanguage  ){	HRESULT hr = S_OK;	IWMStreamConfig* pStreamConfig = NULL;	IWMPropertyVault* pPropertyVault = NULL;	WM_MEDIA_TYPE* pMediaType = NULL;	IWMVideoMediaProps* pVideoMediaProps = NULL;	DWORD dwNumberOfPasses;	if ( !ppStreamConfig )	{		return E_POINTER;	}	if ( !pProfile )	{		return E_INVALIDARG;	}	//	// pCodecInfo3 is allowed to be NULL, since CreateVideoMediatype calls EnsureIWMCodecInfo3	//	do	{		switch( vbrMode )		{		case VBR_OFF:			dwNumberOfPasses = 0;			break;		case VBR_QUALITYBASED:			dwNumberOfPasses = 1;			break;		case VBR_CONSTRAINED:			dwNumberOfPasses = 2;			break;		case VBR_UNCONSTRAINED:			dwNumberOfPasses = 2;			break;		default:			hr = E_FAIL;			break;		}		if ( FAILED( hr ) )		{			break;		}		//		// Create the video stream		//		hr = pProfile->CreateNewStream( WMMEDIATYPE_Video, &pStreamConfig );		if ( FAILED( hr ) )		{			break;		}		assert( pStreamConfig );		//		// Configure the new video stream		//		hr = pStreamConfig->SetBitrate( dwBitrate );		if ( FAILED( hr ) )		{			break;		}		hr = pStreamConfig->SetBufferWindow( dwBufferWindow );		if ( FAILED( hr ) )		{			break;		}		//		// Set the media type for the stream		//		hr = CreateVideoMediaType(  dll,			&pMediaType,			pCodecInfo3,			dwCodecIndex,			dFPS,			dwWidth,			dwHeight,			dwBitrate,			fIsVBR,			dwNumberOfPasses );		if ( FAILED( hr ) )		{			break;		}		assert( pMediaType );		hr = pStreamConfig->QueryInterface( IID_IWMVideoMediaProps, (void**) &pVideoMediaProps );		if ( FAILED( hr ) )		{			break;		}		assert( pVideoMediaProps );		hr = pVideoMediaProps->SetMediaType( pMediaType );		if ( FAILED( hr ) )		{			break;		}		//		// Set quality and MaxKeyFrameSpacing on the IWMVideoMediaProps object		//		hr = pVideoMediaProps->SetQuality( dwQuality );		if ( FAILED( hr ) )		{			break;		}		hr = pVideoMediaProps->SetMaxKeyFrameSpacing( (LONGLONG) dwSecPerKey * 10000000 );		if ( FAILED( hr ) )		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -