MythTV  master
videovisualgoom.cpp
Go to the documentation of this file.
1 // MythTV
2 #include "libmythbase/mythconfig.h"
5 #if CONFIG_OPENGL
7 #endif
8 #include "videovisualgoom.h"
9 
10 // Goom
11 #include "goom/goom_tools.h"
12 #include "goom/goom_core.h"
13 
15  : VideoVisual(Audio, Render),
16  m_hd(HD)
17 {
18  int max_width = m_hd ? 1200 : 600;
19  int max_height = m_hd ? 800 : 400;
21  QSize sz = mw ? mw->GetUIScreenRect().size() : QSize(600, 400);
22  int width = (sz.width() > max_width) ? max_width : sz.width();
23  int height = (sz.height() > max_height) ? max_height : sz.height();
24  m_area = QRect(0, 0, width, height);
25  goom_init(static_cast<guint32>(width), static_cast<guint32>(height), 0);
26  LOG(VB_GENERAL, LOG_INFO, QString("Initialised Goom (%1x%2)").arg(width).arg(height));
27 }
28 
30 {
31 #if CONFIG_OPENGL
33  {
34  auto * glrender = dynamic_cast<MythRenderOpenGL*>(m_render);
35  if (glrender)
36  glrender->DeleteTexture(m_glSurface);
37  m_glSurface = nullptr;
38  }
39 #endif
40 
41  goom_close();
42 }
43 
44 void VideoVisualGoom::Draw(const QRect Area, MythPainter* /*Painter*/, QPaintDevice* /*Device*/)
45 {
46  if (m_disabled || !m_render || Area.isEmpty())
47  return;
48 
49  QMutexLocker lock(mutex());
50  unsigned int* last = m_buffer;
51  VisualNode* node = GetNode();
52  if (node)
53  {
54  size_t numSamps = 512;
55  if (node->m_length < 512)
56  numSamps = static_cast<size_t>(node->m_length);
57 
58  GoomDualData data {};
59  for (size_t i = 0; i < numSamps; i++)
60  {
61  data[0][i] = node->m_left[i];
62  data[1][i] = node->m_right ? node->m_right[i] : data[0][i];
63  }
64 
65  m_buffer = goom_update(data, 0);
66  }
67 
68 #if CONFIG_OPENGL
69  if ((m_render->Type() == kRenderOpenGL))
70  {
71  auto * glrender = dynamic_cast<MythRenderOpenGL*>(m_render);
72  if (glrender && m_buffer)
73  {
74  glrender->makeCurrent();
75 
76  if (!m_glSurface)
77  {
78  QImage image(m_area.size(), QImage::Format_ARGB32);
79  m_glSurface = glrender->CreateTextureFromQImage(&image);
80  }
81 
82  if (m_glSurface)
83  {
84  m_glSurface->m_crop = false;
85  if (m_buffer != last)
87  reinterpret_cast<const uint8_t *>(m_buffer));
88  // goom doesn't render properly due to changes in video alpha blending
89  // so turn blend off
90  glrender->SetBlend(false);
91  std::vector<MythGLTexture*> surfaces {m_glSurface};
92  glrender->DrawBitmap(surfaces, nullptr, m_area, Area, nullptr, 0);
93  glrender->SetBlend(true);
94  }
95  glrender->doneCurrent();
96  }
97  return;
98  }
99 #endif
100 }
101 
103 {
104  public:
105  const QString& name(void) const override
106  {
107  static QString s_name(GOOM_NAME);
108  return s_name;
109  }
110 
111  VideoVisual* Create(AudioPlayer* Audio, MythRender* Render) const override
112  {
113  return new VideoVisualGoom(Audio, Render, false);
114  }
115 
116  bool SupportedRenderer(RenderType Type) override;
118 
120 {
121  return (Type == kRenderOpenGL);
122 }
123 
125 {
126  public:
127  const QString& name(void) const override
128  {
129  static QString s_name(GOOMHD_NAME);
130  return s_name;
131  }
132 
133  VideoVisual* Create(AudioPlayer* Audio, MythRender *Render) const override
134  {
135  return new VideoVisualGoom(Audio, Render, true);
136  }
137 
138  bool SupportedRenderer(RenderType Type) override;
140 
142 {
143  return (Type == kRenderOpenGL);
144 }
GoomDualData
std::array< GoomSingleData, 2 > GoomDualData
Definition: goom_core.h:13
VideoVisualGoom::VideoVisualGoom
VideoVisualGoom(AudioPlayer *Audio, MythRender *Render, bool HD)
Definition: videovisualgoom.cpp:14
MythGLTexture::m_texture
QOpenGLTexture * m_texture
Definition: mythrenderopengl.h:65
MythUIScreenBounds::GetUIScreenRect
QRect GetUIScreenRect()
Definition: mythuiscreenbounds.cpp:198
VideoVisualGoom::m_hd
bool m_hd
Definition: videovisualgoom.h:23
AudioPlayer
Definition: audioplayer.h:22
VisualNode
Definition: videovisual.h:24
GOOMHD_NAME
#define GOOMHD_NAME
Definition: videovisualgoom.h:9
VideoVisual::m_disabled
bool m_disabled
Definition: videovisual.h:70
VideoVisualGoom::m_glSurface
MythGLTexture * m_glSurface
Definition: videovisualgoom.h:22
MythGLTexture::m_pixelFormat
QOpenGLTexture::PixelFormat m_pixelFormat
Definition: mythrenderopengl.h:66
MythGLTexture::m_crop
bool m_crop
Definition: mythrenderopengl.h:72
VideoVisualGoomHDFactory
Definition: videovisualgoom.cpp:124
kRenderOpenGL
@ kRenderOpenGL
Definition: mythrender_base.h:19
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
VideoVisualGoomHDFactory
VideoVisualGoomHDFactory VideoVisualGoomHDFactory
VisualNode::m_left
short * m_left
Definition: videovisual.h:36
VideoVisualGoomHDFactory::Create
VideoVisual * Create(AudioPlayer *Audio, MythRender *Render) const override
Definition: videovisualgoom.cpp:133
VideoVisualGoomFactory::SupportedRenderer
bool SupportedRenderer(RenderType Type) override
Definition: videovisualgoom.cpp:119
MythGLTexture::m_pixelType
QOpenGLTexture::PixelType m_pixelType
Definition: mythrenderopengl.h:67
mythrenderopengl.h
mythlogging.h
VisualNode::m_right
short * m_right
Definition: videovisual.h:37
VideoVisualGoomHDFactory::name
const QString & name(void) const override
Definition: videovisualgoom.cpp:127
goom_core.h
VideoVisualFactory
Definition: videovisual.h:77
MythTV::Visual::mutex
QMutex * mutex()
Definition: visual.h:26
RenderType
RenderType
Definition: mythrender_base.h:15
MythRenderOpenGL::makeCurrent
void makeCurrent()
Definition: mythrenderopengl.cpp:569
MythRenderOpenGL::DeleteTexture
void DeleteTexture(MythGLTexture *Texture)
Definition: mythrenderopengl.cpp:719
goom_init
void goom_init(guint32 resx, guint32 resy, int cinemascope)
Definition: goom_core.cpp:64
VideoVisualGoomFactory
Definition: videovisualgoom.cpp:102
goom_update
guint32 * goom_update(GoomDualData &data, int forceMode)
Definition: goom_core.cpp:133
goom_close
void goom_close()
Definition: goom_core.cpp:846
MythRenderOpenGL
Definition: mythrenderopengl.h:95
VisualNode::m_length
long m_length
Definition: videovisual.h:38
VideoVisualGoomHDFactory::SupportedRenderer
bool SupportedRenderer(RenderType Type) override
Definition: videovisualgoom.cpp:141
MythRender
Definition: mythrender_base.h:23
MythPainter
Definition: mythpainter.h:34
VideoVisualGoom
Definition: videovisualgoom.h:11
goom_tools.h
VideoVisual::m_render
MythRender * m_render
Definition: videovisual.h:72
VideoVisualGoom::m_buffer
unsigned int * m_buffer
Definition: videovisualgoom.h:21
GOOM_NAME
#define GOOM_NAME
Definition: videovisualgoom.h:8
VideoVisualGoom::Draw
void Draw(QRect Area, MythPainter *Painter, QPaintDevice *Device) override
Definition: videovisualgoom.cpp:44
GetMythMainWindow
MythMainWindow * GetMythMainWindow(void)
Definition: mythmainwindow.cpp:104
VideoVisualGoomFactory::Create
VideoVisual * Create(AudioPlayer *Audio, MythRender *Render) const override
Definition: videovisualgoom.cpp:111
VideoVisual
Definition: videovisual.h:42
MythRender::Type
RenderType Type(void) const
Definition: mythrender_base.h:32
guint32
#define guint32
Definition: goomconfig.h:35
videovisualgoom.h
VideoVisual::m_area
QRect m_area
Definition: videovisual.h:71
VideoVisualGoomFactory
VideoVisualGoomFactory VideoVisualGoomFactory
VideoVisual::GetNode
VisualNode * GetNode(void)
Definition: videovisual.cpp:85
mythmainwindow.h
VideoVisualGoom::~VideoVisualGoom
~VideoVisualGoom() override
Definition: videovisualgoom.cpp:29
MythMainWindow
Definition: mythmainwindow.h:28
VideoVisualGoomFactory::name
const QString & name(void) const override
Definition: videovisualgoom.cpp:105