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
44void 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}
QOpenGLTexture::PixelType m_pixelType
QOpenGLTexture::PixelFormat m_pixelFormat
QOpenGLTexture * m_texture
void DeleteTexture(MythGLTexture *Texture)
RenderType Type(void) const
QMutex * mutex()
Definition: visual.h:26
VideoVisual * Create(AudioPlayer *Audio, MythRender *Render) const override
const QString & name(void) const override
bool SupportedRenderer(RenderType Type) override
const QString & name(void) const override
VideoVisual * Create(AudioPlayer *Audio, MythRender *Render) const override
bool SupportedRenderer(RenderType Type) override
VideoVisualGoom(AudioPlayer *Audio, MythRender *Render, bool HD)
void Draw(QRect Area, MythPainter *Painter, QPaintDevice *Device) override
~VideoVisualGoom() override
unsigned int * m_buffer
MythGLTexture * m_glSurface
MythRender * m_render
Definition: videovisual.h:72
VisualNode * GetNode(void)
Definition: videovisual.cpp:85
bool m_disabled
Definition: videovisual.h:70
QRect m_area
Definition: videovisual.h:71
long m_length
Definition: videovisual.h:38
short * m_left
Definition: videovisual.h:36
short * m_right
Definition: videovisual.h:37
void goom_init(guint32 resx, guint32 resy, int cinemascope)
Definition: goom_core.cpp:64
void goom_close()
Definition: goom_core.cpp:846
guint32 * goom_update(GoomDualData &data, int forceMode)
Definition: goom_core.cpp:133
std::array< GoomSingleData, 2 > GoomDualData
Definition: goom_core.h:13
#define guint32
Definition: goomconfig.h:35
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
MythMainWindow * GetMythMainWindow(void)
RenderType
@ kRenderOpenGL
VideoVisualGoomHDFactory VideoVisualGoomHDFactory
VideoVisualGoomFactory VideoVisualGoomFactory
#define GOOMHD_NAME
#define GOOM_NAME