00001 /* 00002 * Copyright (C) 2003-2009 Olivier Boudeville 00003 * 00004 * This file is part of the OSDL library. 00005 * 00006 * The OSDL library is free software: you can redistribute it and/or modify 00007 * it under the terms of either the GNU Lesser General Public License or 00008 * the GNU General Public License, as they are published by the Free Software 00009 * Foundation, either version 3 of these Licenses, or (at your option) 00010 * any later version. 00011 * 00012 * The OSDL library is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU Lesser General Public License and the GNU General Public License 00016 * for more details. 00017 * 00018 * You should have received a copy of the GNU Lesser General Public 00019 * License and of the GNU General Public License along with the OSDL library. 00020 * If not, see <http://www.gnu.org/licenses/>. 00021 * 00022 * Author: Olivier Boudeville (olivier.boudeville@esperide.com) 00023 * 00024 */ 00025 00026 00027 #include "OSDLVideoRenderer.h" 00028 00029 00030 #include "OSDLScheduler.h" // for GetExistingScheduler 00031 #include "OSDLMultimediaRenderer.h" // for MultimediaRenderer 00032 00033 //#include "OSDLCamera.h" // for Camera 00034 00035 00036 00037 using namespace OSDL::Events ; 00038 using namespace OSDL::Rendering ; 00039 using namespace OSDL::Engine ; 00040 00041 using std::string ; 00042 00043 00044 #ifdef OSDL_USES_CONFIG_H 00045 #include <OSDLConfig.h> // for OSDL_DEBUG_VIDEO_RENDERER and al 00046 #endif // OSDL_USES_CONFIG_H 00047 00048 00049 00050 #if OSDL_DEBUG_VIDEO_RENDERER 00051 00052 #define OSDL_VIDEO_RENDER_LOG(message) send( message ) ; 00053 00054 #else // OSDL_DEBUG_VIDEO_RENDERER 00055 00056 #define OSDL_VIDEO_RENDER_LOG(message) 00057 00058 #endif // OSDL_DEBUG_VIDEO_RENDERER 00059 00060 00061 00062 00063 VideoRenderingException::VideoRenderingException( const string & message ) : 00064 RenderingException( "Video rendering exception: " + message ) 00065 { 00066 00067 } 00068 00069 00070 00071 VideoRenderingException::~VideoRenderingException() throw() 00072 { 00073 00074 } 00075 00076 00077 00078 00079 00080 VideoRenderer::VideoRenderer( bool registerToRootRenderer ) : 00081 Renderer( /* registerToScheduler */ false ) 00082 //,_internalCamera( 0 ) 00083 { 00084 00085 if ( registerToRootRenderer ) 00086 { 00087 00088 Renderer * renderer ; 00089 00090 try 00091 { 00092 00093 // Retrieve the root renderer: 00094 renderer = & Renderer::GetExistingRootRenderer() ; 00095 00096 } 00097 catch( const RenderingException & e ) 00098 { 00099 throw VideoRenderingException( "VideoRenderer constructor: " 00100 "no already existing root renderer (" 00101 + e.toString() 00102 + ") whereas registering had been requested." ) ; 00103 } 00104 00105 // Check it is a multimedia renderer indeed: 00106 MultimediaRenderer * multimediaRenderer = 00107 dynamic_cast<MultimediaRenderer *>( renderer ) ; 00108 00109 if ( multimediaRenderer == 0 ) 00110 throw VideoRenderingException( "VideoRenderer constructor: " 00111 "root renderer is not a multimedia renderer, " 00112 "no registering possible." ) ; 00113 00114 multimediaRenderer->setVideoRenderer( * this ) ; 00115 00116 } 00117 00118 } 00119 00120 00121 00122 VideoRenderer::~VideoRenderer() throw() 00123 { 00124 00125 /* 00126 if ( _internalCamera != 0 ) 00127 delete _internalCamera ; 00128 */ 00129 00130 } 00131 00132 00133 00134 /* 00135 bool hasCamera() const 00136 { 00137 return ( _internalCamera != 0 ) ; 00138 } 00139 00140 00141 00142 Camera & VideoRenderer::getCamera() const 00143 { 00144 if ( _internalCamera == 0 ) 00145 return * _internalCamera ; 00146 } 00147 00148 00149 void VideoRenderer::setCamera( Camera & newCamera ) throw() 00150 { 00151 if ( _internalCamera != 0 ) 00152 delete _internalCamera ; 00153 00154 _internalCamera = & newCamera ; 00155 00156 } 00157 */ 00158 00159 00160 00161 void VideoRenderer::render( RenderingTick currentRenderingTick ) 00162 { 00163 00164 OSDL_VIDEO_RENDER_LOG( "Video rendering! " ) ; 00165 00166 /* 00167 * Beware, currentRenderingTick might be always zero if no 00168 * scheduler is used. 00169 * 00170 */ 00171 _renderingDone++ ; 00172 00173 } 00174 00175 00176 00177 void VideoRenderer::onRenderingSkipped( RenderingTick skippedRenderingTick ) 00178 { 00179 00180 OSDL_VIDEO_RENDER_LOG( "Video rendering skipped." ) ; 00181 00182 _renderingSkipped++ ; 00183 00184 } 00185 00186 00187 00188 const string VideoRenderer::toString( Ceylan::VerbosityLevels level ) const 00189 { 00190 00191 string res = "Video renderer, last rendering tick was " 00192 + Ceylan::toString( _lastRender ) 00193 + ", having performed " 00194 + Ceylan::toString( _renderingDone ) + " rendering(s) for " 00195 + Ceylan::toString( _renderingSkipped ) + " skip(s)" ; 00196 00197 if ( _renderingDone + _renderingSkipped != 0 ) 00198 res += " (rendering proportion: " 00199 + Ceylan::toString( 00200 100 * _renderingDone / ( _renderingDone + _renderingSkipped ) ) 00201 + "%)" ; 00202 00203 /* 00204 if ( _internalCamera != 0 ) 00205 res += ". Following camera is being used: " 00206 + _internalCamera->toString( level ) ; 00207 else 00208 res += ". No camera is currently used" ; 00209 */ 00210 00211 return res ; 00212 00213 } 00214