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

📄 videorenderer.cpp

📁 <VC++视频音频开发>一书的光盘资料。
💻 CPP
字号:
/**************************************************************************************
 *                                                                                    *
 *                                                                                    *
 **************************************************************************************/

#include "VideoRenderer.h"

/*
 * 视频补偿器封装类
 */

MediaVideoRenderer::MediaVideoRenderer()
{
	this->overlayRenderer = new MediaVideoRendererOverlay();
	this->rgbRenderer     = new MediaVideoRendererRGB();

	this->renderer        = NULL;
}

MediaVideoRenderer::~MediaVideoRenderer()
{
	delete this->overlayRenderer;
	delete this->rgbRenderer;
}

/*
 * 媒体项方法
 */

media_type_t  MediaVideoRenderer::GetType()
{
	return MEDIA_TYPE_VIDEO_RENDERER;
}

char         *MediaVideoRenderer::GetName()
{
	if(this->renderer)
		return this->renderer->GetName();

	return "Video Renderer Wrapper";
}

MP_RESULT     MediaVideoRenderer::Connect(MediaItem *item)
{
	if(this->renderer)
		return this->renderer->Connect(item);

	return MP_RESULT_ERROR;
}

MP_RESULT     MediaVideoRenderer::ReleaseConnections()
{
	return MP_RESULT_OK;
}

DWORD         MediaVideoRenderer::GetCaps()
{
	return 0;
}

MP_RESULT     MediaVideoRenderer::Configure(HINSTANCE hInstance, HWND hwnd)
{
	return MP_RESULT_ERROR;
}

/*
 * 视频补偿方法
 */

MP_RESULT MediaVideoRenderer::Init(HWND hwnd, 
								   unsigned int width, 
								   unsigned int height, 
								   media_video_mode_t preferedMode)
{
	this->renderer = NULL;

	switch(preferedMode) {

	case VIDEO_MODE_RGB16:
	case VIDEO_MODE_RGB24:
	case VIDEO_MODE_RGB32:

		if(this->rgbRenderer->Init(hwnd, width, height) == MP_RESULT_OK) {
				
			this->renderer = (MediaVideoRenderer *) this->rgbRenderer;
			return MP_RESULT_OK;
		}
		else {

			return MP_RESULT_ERROR;
		}
		break;

	case VIDEO_MODE_YUV12:
	case VIDEO_MODE_UYVY:
	case VIDEO_MODE_YUY2:

		if(this->overlayRenderer->Init(hwnd, width, height) == MP_RESULT_OK) {

			this->renderer = (MediaVideoRenderer *) this->overlayRenderer;
			return MP_RESULT_OK;
		}
		else {

			/*
			 * 尝试标准补偿器
			 */

			if(this->rgbRenderer->Init(hwnd, width, height) == MP_RESULT_OK) {
	
				this->renderer = (MediaVideoRenderer *) this->rgbRenderer;
				return MP_RESULT_OK;
			}
			else {

				return MP_RESULT_ERROR;
			}
		}
		break;
	}

	return MP_RESULT_ERROR;
}

MP_RESULT MediaVideoRenderer::InitFullscreen(HWND hwnd, 
											 unsigned int width, 
											 unsigned int height,
											 media_video_mode_t preferedMode)
{
	this->renderer = NULL;

	switch(preferedMode) {

	case VIDEO_MODE_RGB16:
	case VIDEO_MODE_RGB24:
	case VIDEO_MODE_RGB32:

		if(this->rgbRenderer->InitFullscreen(hwnd, width, height) == MP_RESULT_OK) {
				
			this->renderer = (MediaVideoRenderer *) this->rgbRenderer;
			return MP_RESULT_OK;
		}
		else {

			return MP_RESULT_ERROR;
		}
		break;

	case VIDEO_MODE_YUV12:
	case VIDEO_MODE_UYVY:
	case VIDEO_MODE_YUY2:

		if(this->overlayRenderer->InitFullscreen(hwnd, width, height) == MP_RESULT_OK) {

			this->renderer = (MediaVideoRenderer *) this->overlayRenderer;
			return MP_RESULT_OK;
		}
		else {

			/*
			 * 尝试标准补偿器
			 */

			if(this->rgbRenderer->InitFullscreen(hwnd, width, height) == MP_RESULT_OK) {
	
				this->renderer = (MediaVideoRenderer *) this->rgbRenderer;
				return MP_RESULT_OK;
			}
			else {

				return MP_RESULT_ERROR;
			}
		}
		break;
	}

	return MP_RESULT_ERROR;
}

/*
 * 以下两个不使用
 */

MP_RESULT MediaVideoRenderer::Init(HWND hwnd, unsigned int width, unsigned int height)
{
	if(this->renderer) {

		this->renderer->Close();
		return this->renderer->Init(hwnd, width, height);
	}

	return MP_RESULT_ERROR;
}

MP_RESULT MediaVideoRenderer::InitFullscreen(HWND hwnd, unsigned int width, unsigned int height)
{
	if(this->renderer) {

		this->renderer->Close();
		return this->renderer->InitFullscreen(hwnd, width, height);
	}

	return MP_RESULT_ERROR;
}



 

MP_RESULT MediaVideoRenderer::Stop()
{
	if(this->renderer)
		return this->renderer->Stop();

	return MP_RESULT_ERROR;
}

RECT *MediaVideoRenderer::GetFullscreenRects()
{
	if(this->renderer)
		return this->renderer->GetFullscreenRects();

	return NULL;
}

media_video_mode_t MediaVideoRenderer::GetVideoMode()
{
	if(this->renderer)
		return this->renderer->GetVideoMode();

	return VIDEO_MODE_NONE;
}

MP_RESULT MediaVideoRenderer::Draw(MediaBuffer *buffer, RECT *rect, int frameNumber, int invertFlag)
{
	if(this->renderer)
		return this->renderer->Draw(buffer, rect, frameNumber, invertFlag);

	return MP_RESULT_ERROR;
}

MP_RESULT MediaVideoRenderer::DrawFullscreen(MediaBuffer *buffer, int frameNumber, int invertFlag, int desktop)
{
	if(this->renderer)
		return this->renderer->DrawFullscreen(buffer, frameNumber, invertFlag, desktop);

	return MP_RESULT_ERROR;
}

MP_RESULT MediaVideoRenderer::Close()
{
	if(this->renderer) {
		
		this->renderer->Close();
		this->renderer = NULL;
	}

	return MP_RESULT_ERROR;
}

⌨️ 快捷键说明

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