亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? videomanrendererogl.cpp

?? VideoMan (Video Manager) is an open-source C++ library that helps you developing video based applica
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//#include "StdAfx.h"
#include <math.h>

#include "VideoManRendererOGL.h"

#ifndef GL_BGRA
#define GL_BGRA GL_BGRA_EXT
#endif

#ifndef GL_BGR
#define GL_BGR GL_BGR_EXT
#endif

RendererOGLInput::RendererOGLInput(void)
{
}

RendererOGLInput::~RendererOGLInput(void)
{
}

VideoManRendererOGL::VideoManRendererOGL(void)
{
	supportedFormats.push_back(RGB24);
	supportedFormats.push_back(BGR24);
	supportedFormats.push_back(RGB32);
	supportedFormats.push_back(BGR32);
	supportedFormats.push_back(GREY16);
	supportedFormats.push_back(GREY8);	
}

VideoManRendererOGL::~VideoManRendererOGL(void)
{
	for( size_t v = 0; v < inputList.size(); v++ )
	{
		deleteVideoInput( v );
	}
	inputList.clear();
}

bool VideoManRendererOGL::addVideoInput( VideoInput *video )
{
	RendererOGLInput input;

	input.videoInput = video;
	VideoManInputFormat format = video->getVideoManInputFormat();
	PIXEL_FORMAT pF = format.getPixelFormatOut();
	input.depth = format.depth;
	input.nChannels = format.nChannels;
	input.width = format.width;
	input.height = format.height;
	input.pixelFormat = pF;
	input.supported = supportedFormat( pF );	
	if ( !input.supported )
	{
		input.activated = false;
		inputList.push_back( input );
		return false;
	}
		
	if ( !generateTexture( &input ) )
	{
		return false;
	}

	//Initialize screen coordinates
	input.screenCoords.bottom = 0;
	input.screenCoords.left = 0;
	input.screenCoords.width = input.width;
	input.screenCoords.height = input.height;
	
	if ( emptyIndexes.size() > 0 )
	{
		size_t inputIndex = static_cast<size_t>( emptyIndexes.front() );
		emptyIndexes.erase( emptyIndexes.begin() );
		inputList[inputIndex] = input;
		activateVideoInput( inputIndex );
	}
	else
	{		
		inputList.push_back( input );
		activateVideoInput( inputList.size() - 1 );
	}
	//inputList.push_back( input );
	//activateVideoInput( inputList.size() - 1 );
	return true;
}

void VideoManRendererOGL::deleteVideoInput( size_t inputIndex )
{
	assert( inputIndex >= 0 && inputIndex < inputList.size() && "deleteVideoInput: Index out of range");
	glDeleteTextures( 1, &inputList[inputIndex].texture );
	deactivateVideoInput( inputIndex );
	inputList[inputIndex].supported = false;	
	emptyIndexes.push_back( inputIndex );
	emptyIndexes.sort();
}


bool VideoManRendererOGL::generateTexture( RendererInput *input )
{
	RendererOGLInput *inputOGL = (RendererOGLInput*) input;
	/*int pow = 32;
	while( pow < inputOGL->width )//&& pow <= MAX_SIZE )
	{
		pow = pow * 2;
	}
	int textureWidth = pow;
	pow = 32;
	while( pow<inputOGL->height )//&& pow<=MAX_SIZE )
	{
		pow = pow * 2;
	}
	int textureHeight = pow;*/
	int textureWidth = inputOGL->width;
	int textureHeight = inputOGL->height;

	float Bpp = static_cast<float>( inputOGL->depth ) / 8.0f;
	//std::vector<char*> data(textureHeight * textureWidth * static_cast<size_t>( Bpp ), 0);	
	glGenTextures( 1, &inputOGL->texture );
	glBindTexture( GL_TEXTURE_2D, inputOGL->texture );

	glTexParameteri( GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR );//GL_LINEAR
	glTexParameteri( GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR );
	glTexParameteri( GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP );
	glTexParameteri( GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP );	

	//Cambiado para poder cargar imagenes de 16 bpp y un canal - SIN PROBAR!!!
	//glTexImage2D(GL_TEXTURE_2D, 0, 3, textureWidth, textureHeight, 0, video.format.oglTextureFormat, GL_UNSIGNED_BYTE, &data[0]);
	inputOGL->dataType = GL_UNSIGNED_BYTE;
	switch ( inputOGL->pixelFormat )
	{
		case GREY16:
		{
			inputOGL->oglTextureFormat = GL_LUMINANCE;
			inputOGL->internalFormat = GL_LUMINANCE16;
			inputOGL->dataType = GL_UNSIGNED_SHORT;
			glTexImage2D( GL_TEXTURE_2D, 0, inputOGL->internalFormat, textureWidth, textureHeight, 0, inputOGL->oglTextureFormat, inputOGL->dataType, NULL );
			break;
		}
		case GREY8:	
		{
			inputOGL->oglTextureFormat = GL_LUMINANCE;
			inputOGL->internalFormat = 1;
			glTexImage2D( GL_TEXTURE_2D, 0, 1, textureWidth, textureHeight, 0, inputOGL->oglTextureFormat, GL_UNSIGNED_BYTE, NULL );
			break;
		}
		case RAW8:
		{
			inputOGL->oglTextureFormat = GL_LUMINANCE;
			inputOGL->internalFormat = 1;
			glTexImage2D( GL_TEXTURE_2D, 0, 1, textureWidth, textureHeight, 0, inputOGL->oglTextureFormat, GL_UNSIGNED_BYTE, NULL );
			break;
		}
		case BGR24:
		{			
			inputOGL->oglTextureFormat = GL_BGR;
			inputOGL->internalFormat = 3;
			glTexImage2D( GL_TEXTURE_2D, 0, 3, textureWidth, textureHeight, 0, inputOGL->oglTextureFormat, GL_UNSIGNED_BYTE, NULL );
			break;
		}
		case RGB24:
		{
			inputOGL->oglTextureFormat = GL_RGB;
			inputOGL->internalFormat = 3;
			glTexImage2D( GL_TEXTURE_2D, 0, 3, textureWidth, textureHeight, 0, inputOGL->oglTextureFormat, GL_UNSIGNED_BYTE, NULL );
			break;
		}
		case BGR32:
		{
			inputOGL->oglTextureFormat = GL_BGRA;
			inputOGL->internalFormat = 3;
			glTexImage2D( GL_TEXTURE_2D, 0, 3, textureWidth, textureHeight, 0, inputOGL->oglTextureFormat, GL_UNSIGNED_BYTE, NULL );
			break;
		}
		case RGB32:
		{
			inputOGL->oglTextureFormat = GL_RGBA;
			inputOGL->internalFormat = 3;
			glTexImage2D( GL_TEXTURE_2D, 0, 3, textureWidth, textureHeight, 0, inputOGL->oglTextureFormat, GL_UNSIGNED_BYTE, NULL );
			break;
		}
		default: 
			{				
				return false;
			}
	}
	//Calculate texture coordinates
	inputOGL->tu1 = 0.0f;
	inputOGL->tv1 = 0.0f;
	inputOGL->tu2 = static_cast<float>( inputOGL->width / (float)textureWidth );
	inputOGL->tv2 = static_cast<float>( inputOGL->height / (float)textureHeight );
	
	return true;
}


inline void VideoManRendererOGL::renderInputs()
{
	for( size_t i = 0; i < inputList.size(); i++ )
	{
		renderInput( i );
	}
}


inline void VideoManRendererOGL::renderInput( size_t v )
{
	assert( v >= 0 && v < inputList.size() && "renderInput: Index out of range");
	
	if ( !inputList[v].activated )
		return;
	glEnable(GL_TEXTURE_2D);
	glDisable(GL_LIGHTING);
	glDisable(GL_DEPTH_TEST);
	glColor3f(1.0, 1.0, 1.0);

	glBindTexture(GL_TEXTURE_2D, inputList[v].texture);
	glViewport( inputList[v].screenCoords.left, inputList[v].screenCoords.bottom, inputList[v].screenCoords.width, inputList[v].screenCoords.height);

	glMatrixMode( GL_PROJECTION );
	glLoadIdentity();
	glMatrixMode( GL_MODELVIEW );
	glLoadIdentity();
	
	glBegin( GL_TRIANGLE_STRIP );
		glTexCoord2f( inputList[v].tu1, inputList[v].tv2 );
		glVertex2f( -1,  1 );
		glTexCoord2f( inputList[v].tu1, inputList[v].tv1 );
		glVertex2f( -1, -1 );
		glTexCoord2f( inputList[v].tu2, inputList[v].tv2 );
		glVertex2f(  1,  1 );
		glTexCoord2f( inputList[v].tu2, inputList[v].tv1 );
		glVertex2f(  1, -1 );			
	glEnd();
	/*glLineWidth( 2.0f );
	glColor3f( 0.8f, 0.8f, 0.8f );
	glDisable( GL_TEXTURE_2D );
	glBegin( GL_LINE_LOOP );
		glVertex2i( -1,  1);
		glVertex2i( -1, -1);
		glVertex2i(  1, -1);
		glVertex2i(  1,  1);
	glEnd();*/
}

inline void VideoManRendererOGL::updateTexture( size_t v )
{
	if ( !inputList[v].activated )
		return;
	assert( v >= 0  &&  v < inputList.size() && "updateTexture: Index out of range");
	glBindTexture( GL_TEXTURE_2D, inputList[v].texture );
	if ( inputList[v].videoInput->pixelBuffer != NULL )
	{		
		glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, inputList[v].width, inputList[v].height,
		inputList[v].oglTextureFormat, inputList[v].dataType, (void*)inputList[v].videoInput->pixelBuffer);	
	}	
}

inline void VideoManRendererOGL::updateTexture( size_t v, const char *image )
{
	if ( !inputList[v].activated )
		return;
	assert( v >= 0  &&  v < inputList.size() && "updateTexture: Index out of range");
	assert( image != NULL && "updateTexture: Invalid Image");

	glBindTexture( GL_TEXTURE_2D, inputList[v].texture );	
	glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, inputList[v].width, inputList[v].height,
		inputList[v].oglTextureFormat, inputList[v].dataType, (void*)image );
}

void VideoManRendererOGL::activateAllVideoInputs()
{
	//activatedInputs = (int)inputList.size();
	activatedInputs = 0;
	for ( int f = 0; f < (int)inputList.size(); f++ )
	{
		if ( inputList[f].supported )
		{
			inputList[f].activated = true;
			activatedInputs++;
		}
	}
	changeScreenSize( screenSize.left,screenSize.bottom,screenSize.width,screenSize.height  );

	/*if ( screenSize.top == 0 || screenSize.right == 0 )
		return;
	if ( inputList.size() == 0 )
		return;
	else if ( inputList.size() == 1 )
	{
		return activateVideoInput( 0, screenSize );
	}
	int numInputs = (int) inputList.size();
	float numColsF = sqrt( ( (float)screenSize.right / (float)screenSize.top ) * 1.33333f * (float)numInputs );
	int numCols = floor( numColsF );
	if ( numCols == 0 ) numCols = 1;
	if ( numCols > numInputs ) numCols = numInputs;
	//if ((numColsF-numCols)>(numColsF-(numCols+1)))
	//	numCols=numCols+1;
	int numFils = ceil( (float)numInputs / (float)numCols );

	float despC = 0.0f;
	float despF = 0.0f;
	float despCs = 0.0f;
	float despFs = 0.0f;
	int v = 0;
	for ( int f = 0; f < numFils; f++ )
	{
		for ( int c = 0; c < numCols; c++ )
		{
			
			if ( v >= numInputs )
				break;
			despC = (float)c / (float)numCols;
			despF = (float)f / (float)numFils;
			despCs = (float)(c+1) / (float)numCols;
			despFs = (float)(f+1) / (float)numFils;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人小视频在线观看| 欧美aaaaaa午夜精品| 国产suv一区二区三区88区| 精品国产伦理网| 国产精品一区二区无线| 国产日本亚洲高清| 91视视频在线直接观看在线看网页在线看| 国产精品美女久久久久久久久久久| 成人免费毛片片v| 亚洲一区在线观看网站| 3d成人h动漫网站入口| 极品瑜伽女神91| 国产天堂亚洲国产碰碰| 成人高清视频在线观看| 亚洲精品视频在线| 欧美一激情一区二区三区| 国产自产v一区二区三区c| 国产精品久久久久久久久免费樱桃 | 国产欧美1区2区3区| k8久久久一区二区三区 | 亚洲香蕉伊在人在线观| 在线综合+亚洲+欧美中文字幕| 久久国产精品免费| 亚洲欧洲国产日本综合| 欧美日本国产一区| 成人网在线播放| 日韩高清电影一区| 中文字幕第一页久久| 欧美日韩精品久久久| 国产乱人伦精品一区二区在线观看| 中文字幕一区二区三区视频| 6080亚洲精品一区二区| 成人免费看视频| 日韩电影在线一区二区三区| 久久久久久久性| 欧美乱妇20p| 国产成人av影院| 日韩国产精品大片| 亚洲日本在线视频观看| 日韩欧美亚洲国产精品字幕久久久 | 日本高清不卡视频| 国产一区二区在线观看视频| 一区二区三区中文字幕在线观看| 日韩午夜激情av| 在线亚洲一区二区| 国产91在线|亚洲| 另类成人小视频在线| 最近中文字幕一区二区三区| 久久综合九色欧美综合狠狠| 欧洲国内综合视频| jiyouzz国产精品久久| 久久99精品久久只有精品| 亚洲国产一区二区a毛片| 国产精品久久久久影院亚瑟| 精品国产一区二区亚洲人成毛片| 欧美午夜电影在线播放| 成人a级免费电影| 国产精品一区二区你懂的| 亚洲h动漫在线| 亚洲黄色av一区| 亚洲四区在线观看| 国产精品福利av| 欧美国产禁国产网站cc| 26uuu精品一区二区在线观看| 欧美乱妇23p| 欧美福利电影网| 欧美日韩免费一区二区三区视频| 91偷拍与自偷拍精品| 大白屁股一区二区视频| 97精品国产97久久久久久久久久久久| 国产麻豆精品95视频| 久久成人综合网| 老司机精品视频线观看86 | 自拍av一区二区三区| 日本一区二区成人在线| 国产亚洲成年网址在线观看| 欧美精品一区二区三区蜜桃 | 欧美大片一区二区| 欧美一区二区三区的| 日韩情涩欧美日韩视频| 欧美一级二级三级蜜桃| 日韩欧美国产不卡| 亚洲精品在线免费播放| 久久久亚洲精品石原莉奈| 久久久久久久久久久久久女国产乱 | 青青草97国产精品免费观看无弹窗版 | 麻豆精品在线视频| 蜜桃av一区二区在线观看| 蜜桃91丨九色丨蝌蚪91桃色| 日韩精品视频网站| 久久精工是国产品牌吗| 国产美女精品在线| av在线这里只有精品| 色哟哟亚洲精品| 欧美精品日日鲁夜夜添| 精品国产制服丝袜高跟| 日本一区二区不卡视频| 综合分类小说区另类春色亚洲小说欧美| 综合网在线视频| 亚洲第一成人在线| 精品一区二区三区蜜桃| 成人在线视频首页| 日本黄色一区二区| 91精品国产高清一区二区三区蜜臀| 日韩欧美电影一区| 国产精品麻豆欧美日韩ww| 一区二区三区四区中文字幕| 天堂久久久久va久久久久| 韩国精品免费视频| 91亚洲国产成人精品一区二区三| 欧美天堂一区二区三区| 欧美xxxxxxxxx| 自拍偷拍欧美激情| 欧美a级一区二区| 高清在线成人网| 欧美三级欧美一级| 国产嫩草影院久久久久| 亚洲午夜精品17c| 国产一区视频导航| 欧美少妇一区二区| 久久久高清一区二区三区| 亚洲精品网站在线观看| 久久99精品久久久| 欧美亚男人的天堂| 国产亚洲一区二区三区| 亚洲一区二区在线免费观看视频| 九九热在线视频观看这里只有精品| www.亚洲色图| 欧美成人精品福利| 亚洲一区二区三区四区五区黄 | 国产精品一区二区三区四区| 欧美在线观看视频一区二区 | 国产成人日日夜夜| 欧美高清www午色夜在线视频| 国产精品视频一二三区| 免费看欧美美女黄的网站| 99久久er热在这里只有精品66| 日韩亚洲电影在线| 亚洲观看高清完整版在线观看 | 欧美剧情电影在线观看完整版免费励志电影| 日韩欧美国产午夜精品| 一区二区三区免费观看| 国产成人在线观看免费网站| 欧美一级一区二区| 亚洲高清免费观看| 91浏览器打开| 中文无字幕一区二区三区| 毛片一区二区三区| 8v天堂国产在线一区二区| 日韩毛片在线免费观看| 国产成人精品一区二区三区四区 | 日韩一区二区三区四区| 亚洲综合在线五月| 99久久精品免费看国产免费软件| 精品处破学生在线二十三| 日本视频中文字幕一区二区三区| 欧美在线视频不卡| 亚洲免费观看视频| 99久久久久免费精品国产| 国产精品素人一区二区| 国产精品18久久久久久久久久久久| 91精品在线观看入口| 亚洲国产cao| 欧美另类变人与禽xxxxx| 亚洲一区二区三区爽爽爽爽爽 | 国产精品香蕉一区二区三区| 欧美一区二区三区视频在线观看| 亚洲成av人片| 欧美久久高跟鞋激| 日韩精品电影一区亚洲| 91精品蜜臀在线一区尤物| 天涯成人国产亚洲精品一区av| 欧美日韩三级一区二区| 亚洲成人精品一区| 欧美一二三区在线观看| 久久精品国产一区二区三| 日韩欧美激情一区| 国内精品伊人久久久久av一坑 | 国产亚洲欧美一区在线观看| 国产一区欧美二区| 国产精品网友自拍| 99re成人精品视频| 亚洲国产欧美在线| 91精品国产麻豆国产自产在线 | 在线视频国产一区| 日韩制服丝袜先锋影音| 日韩精品一区二区在线观看| 国模套图日韩精品一区二区| 国产欧美日韩一区二区三区在线观看 | 久久久精品欧美丰满| 成人黄色国产精品网站大全在线免费观看 | 国产成人av电影在线播放| 中文一区二区完整视频在线观看| 91麻豆.com| 男男成人高潮片免费网站| 久久久午夜电影| 91在线视频在线| 日本中文一区二区三区| 久久精品一区二区三区不卡牛牛| 91视视频在线观看入口直接观看www|