00001 /*========================================================================= 00002 00003 Program: Medical Imaging & Interaction Toolkit 00004 Language: C++ 00005 Date: $Date$ 00006 Version: $Revision$ 00007 00008 Copyright (c) German Cancer Research Center, Division of Medical and 00009 Biological Informatics. All rights reserved. 00010 See MITKCopyright.txt or https://www.mitk.org/copyright.html for details. 00011 00012 This software is distributed WITHOUT ANY WARRANTY; without even 00013 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00014 PURPOSE. See the above copyright notices for more information. 00015 00016 =========================================================================*/ 00017 00018 #include "QmitkVideoBackground.h" 00019 // MITK includes 00020 #include "mitkVtkLayerController.h" 00021 00022 #include "mitkRenderingManager.h" 00023 // QT includes 00024 #include "qtimer.h" 00025 // VTK includes 00026 #include "vtkSystemIncludes.h" 00027 #include "vtkRenderer.h" 00028 #include "vtkMapper.h" 00029 #include "vtkObjectFactory.h" 00030 #include "vtkImageActor.h" 00031 #include "vtkRenderWindow.h" 00032 #include "vtkImageImport.h" 00033 #include "vtkCommand.h" 00034 #include "vtkCamera.h" 00035 00036 QmitkVideoBackground::QmitkVideoBackground(mitk::VideoSource* v, int TimerDelay) 00037 { 00038 m_VideoSource = v; 00039 00040 m_TimerDelay = TimerDelay; 00041 ResetVideoBackground(); 00042 } 00043 void QmitkVideoBackground::ResetVideoBackground() 00044 { 00045 m_renderWindowVectorInfo.clear(); 00046 m_QTimer = new QTimer(this); 00047 connect( m_QTimer, SIGNAL(timeout()), SLOT(UpdateVideo()) ); 00048 } 00049 00050 QmitkVideoBackground::~QmitkVideoBackground() 00051 { 00052 if ( m_renderWindowVectorInfo.size() > 0 ) 00053 if ( this->IsEnabled() ) 00054 this->Disable(); 00055 } 00061 void QmitkVideoBackground::AddRenderWindow(vtkRenderWindow* renderWindow ) 00062 { 00063 RemoveRenderWindow(renderWindow); 00064 00065 vtkRenderer* videoRenderer = vtkRenderer::New(); 00066 vtkImageActor* videoActor = vtkImageActor::New(); 00067 vtkImageImport* videoImport = vtkImageImport::New(); 00068 00069 videoImport->SetDataScalarTypeToUnsignedChar(); 00070 videoImport->SetNumberOfScalarComponents(3); 00071 00072 if(m_VideoSource->GetImageWidth() == 0) 00073 m_VideoSource->FetchFrame(); 00074 00075 videoImport->SetWholeExtent(0,m_VideoSource->GetImageWidth()-1,0,m_VideoSource->GetImageHeight()-1,0,1-1); 00076 videoImport->SetDataExtentToWholeExtent(); 00077 00078 mitk::VideoBackgroundVectorInfo v; 00079 v.renWin = renderWindow; 00080 v.videoRenderer = videoRenderer; 00081 v.videoActor = videoActor; 00082 v.videoImport = videoImport; 00083 00084 m_renderWindowVectorInfo.push_back(v); 00085 00086 Modified(); 00087 } 00088 00089 void QmitkVideoBackground::RemoveRenderWindow(vtkRenderWindow* renderWindow ) 00090 { 00091 for(RenderWindowVectorInfoType::iterator it = m_renderWindowVectorInfo.begin(); 00092 it != m_renderWindowVectorInfo.end(); it++) 00093 { 00094 if((*it).renWin == renderWindow) 00095 { 00096 // unregister video backround renderer from renderwindow 00097 mitk::VtkLayerController::GetInstance((*it).renWin)->RemoveRenderer((*it).videoRenderer); 00098 00099 (*it).videoRenderer->Delete(); 00100 (*it).videoActor->Delete(); 00101 (*it).videoImport->Delete(); 00102 m_renderWindowVectorInfo.erase(it); 00103 return; 00104 //delete &(*it); // memory leak renderwindowvectorinfo ?? 00105 } 00106 } 00107 } 00108 00109 bool QmitkVideoBackground::IsRenderWindowIncluded(vtkRenderWindow* renderWindow ) 00110 { 00111 for(RenderWindowVectorInfoType::iterator it = m_renderWindowVectorInfo.begin(); 00112 it != m_renderWindowVectorInfo.end(); it++) 00113 { 00114 if((*it).renWin == renderWindow) 00115 return true; 00116 } 00117 return false; 00118 } 00119 00124 void QmitkVideoBackground::Enable() 00125 { 00126 UpdateVideo(); 00127 Modified(); 00128 00129 m_QTimer->start(m_TimerDelay); 00130 } 00131 00136 void QmitkVideoBackground::Disable() 00137 { 00138 if ( this->IsEnabled() ) 00139 { 00140 /*for(RenderWindowVectorInfoType::iterator it = m_renderWindowVectorInfo.begin(); 00141 it != m_renderWindowVectorInfo.end(); it++) 00142 { 00143 mitk::VtkLayerController::GetInstance((*it).renWin)->RemoveRenderer((*it).videoRenderer); 00144 }*/ 00145 m_QTimer->stop(); 00146 } 00147 } 00152 bool QmitkVideoBackground::IsEnabled() 00153 { 00154 if (m_QTimer->isActive()) 00155 return true; 00156 else 00157 return false; 00158 } 00159 00160 void QmitkVideoBackground::UpdateVideo() 00161 { 00162 unsigned char *src = 0; 00163 src = m_VideoSource->GetVideoTexture(); 00164 if(src) 00165 { 00166 if(m_renderWindowVectorInfo.size()>0) 00167 { 00168 for(RenderWindowVectorInfoType::iterator it = m_renderWindowVectorInfo.begin(); 00169 it != m_renderWindowVectorInfo.end(); it++) 00170 { 00171 (*it).videoImport->SetImportVoidPointer(src); 00172 (*it).videoImport->Modified(); 00173 (*it).videoImport->Update(); 00174 mitk::RenderingManager::GetInstance()->RequestUpdate((*it).renWin); 00175 } 00176 } 00177 } 00178 emit NewFrameAvailable ( m_VideoSource ); 00179 } 00180 00181 void QmitkVideoBackground::Modified() 00182 { // ensures registration of video backrounds in each renderwindow 00183 for(RenderWindowVectorInfoType::iterator it = m_renderWindowVectorInfo.begin(); 00184 it != m_renderWindowVectorInfo.end(); it++) 00185 { 00186 (*it).videoActor->SetInput((*it).videoImport->GetOutput()); 00187 (*it).videoRenderer->AddActor2D((*it).videoActor); 00188 (*it).videoRenderer->ResetCamera(); 00189 (*it).videoRenderer->InteractiveOff(); 00190 (*it).videoRenderer->GetActiveCamera()->ParallelProjectionOn(); 00191 (*it).videoRenderer->GetActiveCamera()->SetParallelScale(m_VideoSource->GetImageHeight()/2); 00192 00193 if(!mitk::VtkLayerController::GetInstance((*it).renWin)->IsRendererInserted((*it).videoRenderer)) 00194 mitk::VtkLayerController::GetInstance((*it).renWin)->InsertBackgroundRenderer((*it).videoRenderer,true); 00195 } 00196 }