Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkMovieGenerator.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 #include "mitkMovieGenerator.h"
14 #include "mitkConfig.h"
15 #include <mitkRenderingManager.h>
16 #include "vtk_glew.h"
17 
18 #if WIN32
19 #ifndef __GNUC__
20 //#if ! (_MSC_VER >= 1400)
22 //#endif
23 #else
24 #include "GL/glext.h"
25 #endif
26 #endif
27 #ifndef GL_BGR
28 #define GL_BGR GL_BGR_EXT
29 #endif
30 
32  : m_stepper(nullptr), m_renderer(nullptr), m_width(0), m_height(0), m_initialized(false), m_FrameRate(20)
33 {
34  m_fileName[0] = 0;
35 }
36 
37 mitk::MovieGenerator::Pointer mitk::MovieGenerator::New()
38 {
39  Pointer smartPtr;
40  MovieGenerator *rawPtr = ::itk::ObjectFactory<MovieGenerator>::Create();
41  if (rawPtr == nullptr)
42  {
43 #ifdef WIN32
44 #ifndef __GNUC__
45  //#if ! (_MSC_VER >= 1400)
46  mitk::MovieGenerator::Pointer wp = static_cast<mitk::MovieGenerator *>(mitk::MovieGeneratorWin32::New());
47  return wp;
48 //#endif
49 #endif
50 #endif
51  }
52  smartPtr = rawPtr;
53  if (rawPtr != nullptr)
54  rawPtr->UnRegister();
55  return smartPtr;
56 }
57 
59 {
60  bool ok = false;
61  if (m_stepper)
62  {
63  if (m_renderer)
64  m_renderer->GetRenderWindow()->MakeCurrent();
65  // m_stepper->First();
67 
68  ok = InitGenerator();
69  if (!ok)
70  {
72  return false;
73  }
74  int imgSize = 3 * m_width * m_height;
75  printf("Video size = %i x %i\n", m_width, m_height);
76  auto *data = new GLbyte[imgSize];
77 
78  // duplicate steps if pingPong option is switched to on.
79  unsigned int numOfSteps = m_stepper->GetSteps();
80  if (m_stepper->GetPingPong())
81  numOfSteps *= 2;
82 
83  for (unsigned int i = 0; i < numOfSteps; i++)
84  {
85  if (m_renderer)
86  m_renderer->GetRenderWindow()->MakeCurrent();
88  glReadPixels(5, 5, m_width, m_height, GL_BGR, GL_UNSIGNED_BYTE, (void *)data);
89  AddFrame(data);
90  m_stepper->Next();
91  }
92  ok = TerminateGenerator();
93  delete[] data;
94  }
95  return ok;
96 }
97 
99 {
100  if (m_renderer)
101  {
102  m_renderer->GetRenderWindow()->MakeCurrent();
103 
104  if (!m_initialized)
105  {
108  }
109  if (!m_initialized)
110  {
112  return false;
113  }
114  int imgSize = 3 * m_width * m_height;
115  auto *data = new GLbyte[imgSize];
116 
118  glReadPixels(5, 5, m_width, m_height, GL_BGR, GL_UNSIGNED_BYTE, (void *)data);
119  AddFrame(data);
120  delete[] data;
121  }
122  return true;
123 }
124 
126 {
128  m_initialized = false;
129 }
130 
131 void mitk::MovieGenerator::SetFrameRate(unsigned int rate)
132 {
133  m_FrameRate = rate;
134 }
135 
137 {
138  return m_FrameRate;
139 }
virtual void ReleaseMovieWriter()
releases a movie writer after usage of WriteCurrentFrameToMovie()
char m_fileName[1024]
stores the movie filename
virtual bool WriteMovie()
uses given stepper and filename to create a movie from the active OpenGL context
static Pointer New(void)
virtual bool InitGenerator()=0
called directly before the first frame is added, determines movie size from renderer ...
virtual bool TerminateGenerator()=0
called after the last frame is added
virtual void SetFrameRate(unsigned int rate)
virtual bool AddFrame(void *data)=0
used to add a frame
MovieGenerator()
default constructor
static RenderingManager * GetInstance()
virtual bool GetPingPong() const
#define GL_BGR
void ForceImmediateUpdate(vtkRenderWindow *renderWindow)
static Pointer New()
vtkRenderWindow * GetRenderWindow() const
Access the RenderWindow into which this renderer renders.
virtual bool WriteCurrentFrameToMovie()
alternative way, which does not use a stepper;
virtual unsigned int GetSteps() const
Stepper * m_stepper
stores the used stepper
int m_width
InitGenerator() stores movie size in those variables.
virtual void Next()
BaseRenderer * m_renderer
stores the uses renderer