예제 #1
0
// Запускает визуализацию сцены в буфере кадра в фоновом потоке
// Возвращает false, если еще не была завершена работа ранее запущенного потока
bool CRenderer::Render(CScene const& scene, CRenderContext const & context, CFrameBuffer & frameBuffer)
{
	// Пытаемся перейти в режим рендеринга
	if (!SetRendering(true))
	{
		// В данный момент еще идет построение изображения в параллельном потоке
		return false;
	}

	// Блокируем доступ к общим (для фонового и основного потока) данным класса
	// вплоть до завершения работа метода Render
	mutex::scoped_lock lock(m_mutex);
	m_renderingTime = 0;

	// Очищаем буфер кадра
	frameBuffer.Clear();

	// Сбрасываем количество обработанных и общее количество блоков изображения
	// сигнализируя о том, что еще ничего не сделано	
	atomic_write32(&m_totalChunks, 0);
	atomic_write32(&m_renderedChunks, 0);

	// Сбрасываем запрос на остановку построения изображения
	if (SetStopping(false))
	{
		// Если еще до запуска рабочего потока пришел запрос на остановку,
		// выходим, сбрасывая флаг "идет построение изображения"
		SetRendering(false);
		return false;
	}

	// Запускаем метод RenderFrame в параллельном потоке, передавая ему
	// необходимый набор параметров
	m_thread = boost::thread(
		&CRenderer::RenderFrame,	// Адрес метода RenderFrame
		this, 						// Указатель this
		boost::ref(scene), 			// Ссылка на scene
		boost::ref(context), 		// Ссылка на context
		boost::ref(frameBuffer));	// Ссылка на frameBuffer

	// Выходим, сообщая о том, что процесс построения изображения запущен
	return true;
}
void COsdHelpers::changeOsdResolution(uint32_t mode, bool automode/*=false*/, bool forceOsdReset/*=false*/)
{
	size_t idx = 0;
	bool resetOsd = false;
	uint32_t modeNew;

	CFrameBuffer *frameBuffer = CFrameBuffer::getInstance();

	if (automode) {
		if (g_settings.video_Mode == VIDEO_STD_AUTO)
			modeNew = OSDMODE_1080;
		else
			modeNew = g_settings_osd_resolution_save;
	}
	else {
		modeNew = mode;
	}

	int videoSystem = getVideoSystem();

	if ((g_settings.video_Mode == VIDEO_STD_AUTO) &&
	    (g_settings.enabled_auto_modes[videoSystem] == 1) &&
	    (!isVideoSystem1080(videoSystem)))
		modeNew = OSDMODE_720;

//	if (!isVideoSystem1080(videoSystem))
//		modeNew = OSDMODE_720;

	idx = frameBuffer->getIndexOsdResolution(modeNew);
	resetOsd = (modeNew != getOsdResolution()) ? true : false;
#if 1
	printf(">>>>>[%s:%d] osd mode: %s => %s, automode: %s, forceOsdReset: %s\n", __func__, __LINE__,
		(g_settings.osd_resolution == OSDMODE_720)?"OSDMODE_720":"OSDMODE_1080",
		(modeNew == OSDMODE_720)?"OSDMODE_720":"OSDMODE_1080",
		(automode)?"true":"false",
		(forceOsdReset)?"true":"false");
#endif
	if (forceOsdReset)
		resetOsd = true;

	if (frameBuffer->fullHdAvailable()) {
		if (frameBuffer->osd_resolutions.empty())
			return;

		bool ivVisible = false;
		if (g_InfoViewer && g_InfoViewer->is_visible) {
			g_InfoViewer->killTitle();
			ivVisible = true;
		}

		int switchFB = frameBuffer->setMode(frameBuffer->osd_resolutions[idx].xRes,
						    frameBuffer->osd_resolutions[idx].yRes,
						    frameBuffer->osd_resolutions[idx].bpp);

		if (switchFB == 0) {
//printf("\n>>>>>[%s:%d] New res: %dx%dx%d\n \n", __func__, __LINE__, resW, resH, bpp);
			g_settings.osd_resolution = modeNew;
			if (InfoClock)
				InfoClock->enableInfoClock(false);
			frameBuffer->Clear();
			if (resetOsd) {
				CNeutrinoApp::getInstance()->setScreenSettings();
				CNeutrinoApp::getInstance()->SetupFonts(CNeutrinoFonts::FONTSETUP_NEUTRINO_FONT);
				CVolumeHelper::getInstance()->refresh();
				if (InfoClock)
					CInfoClock::getInstance()->ClearDisplay();
				if (FileTimeOSD)
					FileTimeOSD->Init();
				if (CNeutrinoApp::getInstance()->channelList)
					CNeutrinoApp::getInstance()->channelList->ResetModules();
			}
			if (InfoClock)
				InfoClock->enableInfoClock(true);
		}
		if (g_InfoViewer) {
			g_InfoViewer->ResetModules();
			g_InfoViewer->start();
		}
		if (ivVisible) {
			CNeutrinoApp::getInstance()->StopSubtitles();
			g_InfoViewer->showTitle(CNeutrinoApp::getInstance()->channelList->getActiveChannel(), true, 0, true);
			CNeutrinoApp::getInstance()->StartSubtitles();
		}
	}
}