Esempio n. 1
0
////////////////////////////////////////////////////////////
/// Show the initial video
////////////////////////////////////////////////////////////
void IntroShow()
{
	struct Video VideoIntro;

	VideoLoad(&VideoIntro, INTRO_VIDEO_THEME);
	
	SoundBufferPlay(INTRO_SOUND_THEME, false, 0, 0, 0);

	while (VideoIntro.Loaded && !VideoIntro.Finished)
	{
		// Render it
		VideoRender(&VideoIntro, false, 0, 0, WindowWidth, WindowHeight);

		// Display on window handle
		WindowDisplay();

		// Process input events
		WindowProcessEvents();
	}

	// Stop music
	SoundBufferStop();

	// Delete the video
	VideoDelete(&VideoIntro);
}
void CMultimediaRender::Render(CSampleData* data, bool bAudioDisabled)
{
	m_lock.Lock();
	data->AddRef();

	bool bNeedConvert = false;
	if (m_bInteraction && data->cx < data->cy && data->colorType == ColorType_I420 && !data->bAudio)
	{
		bNeedConvert = true;
		if (Width != data->cx || Height != data->cy)
		{
			if (LpConverData)
				delete[] LpConverData;

			LpConverData = new unsigned char[data->cx * data->cy * 3 / 2];

			//先置成黑色
			memset(LpConverData, 0x00, data->cx * data->cy);
			memset(LpConverData + data->cx * data->cy, 0x80, data->cx * data->cy / 2);

			if (LpTemData)
				delete[] LpTemData;

			LpTemData = new unsigned char[data->cx * data->cx  * data->cx / data->cy * 3 / 2];

			Width = data->cx;
			Height = data->cy;
		}

		CopyDataI420(LpConverData, data->lpData, data->cx, data->cy, data->cy, data->cx, data->cx * data->cx / data->cy, LpTemData);
	}

	int DesWidth, DesHeight;

	SDIMutex.Lock();
	BlackMagic* blackMagic = BlackMagic::Instance();
	for (auto& id : SIDIDs)
	{
		if (id.enable && blackMagic->AllEnable())
		{
//			GetDisPlayMode((SDIOUT_DISPLAYMODE)id.displayMode, DesWidth, DesHeight);

// 			bool bConvert = false;
// 
// 			if (LpConverData && bNeedConvert)
// 			{
// 				if (DesWidth != data->cy || DesHeight != data->cx)
// 				{
// 					bConvert = true;
// 				}
// 			}
// 			else if (!data->bAudio)
// 			{
// 				if (DesWidth != data->cx || DesHeight != data->cy)
// 				{
// 					bConvert = true;
// 				}
// 			}
// 
// 			if (!bConvert)
			{
				if (id.colorFormat != (SDIOUT_COLORFORMAT)data->colorType && (!data->bAudio))
				{
					blackMagic->SDI_StopOut(id.id);
					blackMagic->SDI_StartOut(id.id, (SDIOUT_DISPLAYMODE)id.displayMode, (SDIOUT_COLORFORMAT)data->colorType, 0);
					id.colorFormat = (SDIOUT_COLORFORMAT)data->colorType;
				}
			}
// 			else if (SDID3DResize)
// 			{
// 
// 				if (id.colorFormat != ColorFormat_RGBA32REVERSE && (!data->bAudio))
// 				{
// 					blackMagic->SDI_StopOut(id.id);
// 					blackMagic->SDI_StartOut(id.id, (SDIOUT_DISPLAYMODE)id.displayMode, ColorFormat_RGBA32REVERSE, 0);
// 					id.colorFormat = ColorFormat_RGBA32REVERSE;
// 				}
// 			}
			

			if (LpConverData && bNeedConvert)
			{
// 				if (bConvert && SDID3DResize) //进来一定不是音频
// 				{
// 					m_previewlock.Lock();
// 					unsigned char *ResizeBuf = SDID3DResize->Resize(LpConverData, data->cy, data->cx, (TColorType)data->colorType, DesWidth, DesHeight, data->bFieldSignal);
// 					if (ResizeBuf)
// 					{
// 						blackMagic->SDI_RenderDevice(id, ResizeBuf, DesWidth, DesHeight, ColorFormat_RGBA32REVERSE, data->bAudio, data->pAudioFormat, DesWidth * DesHeight * 4, false);
// 						SDID3DResize->UnMap();
// 					}
// 					m_previewlock.UnLock();
// 
// 				}
// 				else
				{
					blackMagic->SDI_RenderDevice(id, LpConverData, data->cy, data->cx, (SDIOUT_COLORFORMAT)data->colorType, data->bAudio, data->pAudioFormat, data->dataLength, false);
				}

			}
			else
			{
// 				if (bConvert && SDID3DResize)
// 				{
// 					//进来一定不是音频
// 					m_previewlock.Lock();
// 					unsigned char *ResizeBuf = SDID3DResize->Resize(data->lpData, data->cx, data->cy, (TColorType)data->colorType, DesWidth, DesHeight, data->bFieldSignal);
// 					//QWORD Start = GetQPCMS();
// 					if (ResizeBuf)
// 					{
// 						blackMagic->SDI_RenderDevice(id, ResizeBuf, DesWidth, DesHeight, ColorFormat_RGBA32REVERSE, data->bAudio, data->pAudioFormat, DesWidth * DesHeight * 4, false);
// 						SDID3DResize->UnMap();
// 					}
// 					m_previewlock.UnLock();
// 				}
// 				else
				{
					blackMagic->SDI_RenderDevice(id, data->lpData, data->cx, data->cy, (SDIOUT_COLORFORMAT)data->colorType, data->bAudio, data->pAudioFormat, data->dataLength, false);
				}
				
			}
		}
	}
	SDIMutex.UnLock();

	if (data->bAudio)
	{
		WAVEFORMATEX* pAudioFormat = (WAVEFORMATEX*)(data->pAudioFormat);
		if (AudioOut == NULL || WaveFormat.nChannels != pAudioFormat->nChannels || 
			WaveFormat.nSamplesPerSec != pAudioFormat->nSamplesPerSec  ||
			WaveFormat.wBitsPerSample != pAudioFormat->wBitsPerSample)
		{
			SetAudioRender(pAudioFormat->nChannels, pAudioFormat->nSamplesPerSec, pAudioFormat->wBitsPerSample);
			WaveFormat = *pAudioFormat;
			Log::writeMessage(LOG_RTSPSERV, 1, "WaveFormat 成功!");
		}	

		AudioRender(data->lpData, data->dataLength);
	}
	else
	{
		if (bAudioDisabled)
			AudioDestroy();
		if (LpConverData && bNeedConvert)
		{
			VideoRender(LpConverData, data->cy, data->cx, data->colorType);
		}
		else
		{
			VideoRender(data->lpData, data->cx, data->cy, data->colorType);
		}
		
	}
	data->Release();
	m_lock.UnLock();
}