// Запускает визуализацию сцены в буфере кадра в фоновом потоке // Возвращает 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(); } } }