UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
PreviewWidget Class Reference

#include <previewWidget.hpp>

Inheritance diagram for PreviewWidget:
Inheritance graph
Collaboration diagram for PreviewWidget:
Collaboration graph

Public Member Functions

 PreviewWidget (QWidget *parent)
 
 ~PreviewWidget ()
 
void setKey (std::string_view key)
 
void start ()
 
void stop ()
 

Protected Member Functions

void initializeGL ()
 
void paintGL ()
 
void resizeGL (int w, int h)
 

Private Member Functions

void calculateScale ()
 
bool loadFrame ()
 
void render ()
 
void setVidSize (int w, int h)
 

Private Attributes

GLuint frame_texture = 0
 
int height = 0
 
Ipc_frame_uniq ipc_frame
 
Ipc_frame_reader_uniq ipc_frame_reader
 
GLuint program = 0
 
GLfloat scaleVec [2]
 
GLuint selected_texture = 0
 
GLuint testbars_texture = 0
 
QTimer timer
 
QOpenGLVertexArrayObject vao
 
GLuint vertexBuffer = 0
 
int vidH = 0
 
int vidW = 0
 
int width = 0
 

Detailed Description

Definition at line 14 of file previewWidget.hpp.

Constructor & Destructor Documentation

◆ PreviewWidget()

PreviewWidget::PreviewWidget ( QWidget * parent)

Definition at line 81 of file previewWidget.cpp.

81 :
82 QOpenGLWidget(parent),
84{
85 connect(&timer, SIGNAL(timeout()), this, SLOT(update()));
86}
Ipc_frame_uniq ipc_frame
Ipc_frame * ipc_frame_new()
Definition ipc_frame.cpp:48
const char * parent
Definition settings.cpp:198

References timer.

◆ ~PreviewWidget()

PreviewWidget::~PreviewWidget ( )

Definition at line 88 of file previewWidget.cpp.

88 {
89 makeCurrent();
90
91 auto f = getOpenGLFuncs();
92 f->glDeleteBuffers(1, &vertexBuffer);
93 f->glDeleteProgram(program);
94 f->glDeleteTextures(1, &frame_texture);
95 f->glDeleteTextures(1, &testbars_texture);
96 vao.destroy();
97 doneCurrent();
98}
QOpenGLVertexArrayObject vao
GLuint testbars_texture
static QOpenGLFunctions_3_3_Core * getOpenGLFuncs()

References frame_texture, getOpenGLFuncs(), program, testbars_texture, vao, and vertexBuffer.

Here is the call graph for this function:

Member Function Documentation

◆ calculateScale()

void PreviewWidget::calculateScale ( )
private

Definition at line 186 of file previewWidget.cpp.

186 {
187 double videoAspect = (double) vidW / vidH;
188 double widgetAspect = (double) width / height;
189
190 if(videoAspect > widgetAspect){
191 float scale = widgetAspect / videoAspect;
192 scaleVec[0] = 1;
193 scaleVec[1] = scale;
194 } else {
195 float scale = videoAspect / widgetAspect;
196 scaleVec[0] = scale;
197 scaleVec[1] = 1;
198 }
199}
GLfloat scaleVec[2]

References height, scaleVec, vidH, vidW, and width.

Referenced by resizeGL(), and setVidSize().

◆ initializeGL()

void PreviewWidget::initializeGL ( )
protected

Definition at line 100 of file previewWidget.cpp.

100 {
101 auto f = getOpenGLFuncs();
102
103 if(!f) {
104 QMessageBox warningBox(this);
105 warningBox.setText("OpenGL 3.3 is required!");
106 warningBox.exec();
107 exit(1);
108 }
109
110 vao.create();
111 vao.bind();
112
113 f->glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
114
115 f->glDisable(GL_DEPTH_TEST);
116 f->glDisable(GL_SCISSOR_TEST);
117 f->glDisable(GL_STENCIL_TEST);
118
119 GLuint vertexShader = f->glCreateShader(GL_VERTEX_SHADER);
120 GLuint fragShader = f->glCreateShader(GL_FRAGMENT_SHADER);
121
122 f->glShaderSource(vertexShader, 1, &vert_src, NULL);
123 compileShader(vertexShader, f);
124 f->glShaderSource(fragShader, 1, &frag_src, NULL);
125 compileShader(fragShader, f);
126
127 program = f->glCreateProgram();
128 f->glAttachShader(program, vertexShader);
129 f->glAttachShader(program, fragShader);
130 f->glLinkProgram(program);
131 f->glUseProgram(program);
132
133 f->glDetachShader(program, vertexShader);
134 f->glDetachShader(program, fragShader);
135 f->glDeleteShader(vertexShader);
136 f->glDeleteShader(fragShader);
137
138 f->glGenTextures(1, &testbars_texture);
139 f->glBindTexture(GL_TEXTURE_2D, testbars_texture);
140 f->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 4, 4, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels);
141 f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
142 f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
143
144 f->glGenTextures(1, &frame_texture);
145 f->glBindTexture(GL_TEXTURE_2D, frame_texture);
146 f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
147 f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
148 f->glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //UltraGrid formats dont have padding between rows
149
150 f->glBindTexture(GL_TEXTURE_2D, 0);
151
152 f->glGenBuffers(1, &vertexBuffer);
153 f->glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
154 f->glBufferData(GL_ARRAY_BUFFER, sizeof(rectangle), rectangle, GL_STATIC_DRAW);
155
156 f->glEnableVertexAttribArray(0);
157 f->glVertexAttribPointer(
158 0,
159 2,
160 GL_FLOAT,
161 GL_FALSE,
162 4 * sizeof(float),
163 (void*)0
164 );
165 f->glEnableVertexAttribArray(1);
166 f->glVertexAttribPointer(
167 1,
168 2,
169 GL_FLOAT,
170 GL_FALSE,
171 4 * sizeof(float),
172 (void*)(2 * sizeof(float))
173 );
174
175 f->glBindBuffer(GL_ARRAY_BUFFER, 0);
176
177 vao.release();
178
179 scaleVec[0] = 0.75f;
180 scaleVec[1] = 0.5;
181
182 vidW = 1280;
183 vidH = 720;
184}
static const GLfloat rectangle[]
static const char * vert_src
static void compileShader(GLuint shaderId, QOpenGLFunctions_3_3_Core *f)
static unsigned char pixels[]
static const char * frag_src

References compileShader(), frag_src, frame_texture, getOpenGLFuncs(), pixels, program, rectangle, scaleVec, testbars_texture, vao, vert_src, vertexBuffer, vidH, and vidW.

Here is the call graph for this function:

◆ loadFrame()

bool PreviewWidget::loadFrame ( )
private

Definition at line 217 of file previewWidget.cpp.

217 {
218 auto f = getOpenGLFuncs();
219
222 return true;
223 }
224
225
228 return false;
229
230 assert(ipc_frame->header.color_spec == IPC_FRAME_COLOR_RGB);
232 f->glBindTexture(GL_TEXTURE_2D, frame_texture);
233 f->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
234 ipc_frame->header.width, ipc_frame->header.height,
235 0, GL_RGB, GL_UNSIGNED_BYTE, ipc_frame->data);
236 setVidSize(ipc_frame->header.width, ipc_frame->header.height);
237 }
238
239 return true;
240}
void setVidSize(int w, int h)
Ipc_frame_reader_uniq ipc_frame_reader
GLuint selected_texture
@ IPC_FRAME_COLOR_RGB
Definition ipc_frame.h:13
bool ipc_frame_reader_has_frame(struct Ipc_frame_reader *reader)
bool ipc_frame_reader_is_connected(struct Ipc_frame_reader *reader)
bool ipc_frame_reader_read(Ipc_frame_reader *reader, Ipc_frame *dst)

References frame_texture, getOpenGLFuncs(), ipc_frame, IPC_FRAME_COLOR_RGB, ipc_frame_reader, ipc_frame_reader_has_frame(), ipc_frame_reader_is_connected(), ipc_frame_reader_read(), selected_texture, setVidSize(), and testbars_texture.

Referenced by paintGL().

Here is the call graph for this function:

◆ paintGL()

void PreviewWidget::paintGL ( )
protected

Definition at line 260 of file previewWidget.cpp.

260 {
261 loadFrame();
262 render();
263}

References loadFrame(), and render().

Here is the call graph for this function:

◆ render()

void PreviewWidget::render ( )
private

Definition at line 242 of file previewWidget.cpp.

242 {
243 auto f = getOpenGLFuncs();
244
245 vao.bind();
246 f->glClear(GL_COLOR_BUFFER_BIT);
247
248 f->glUseProgram(program);
249
250 f->glBindTexture(GL_TEXTURE_2D, selected_texture);
251 GLuint loc;
252 loc = f->glGetUniformLocation(program, "scale_vec");
253 f->glUniform2fv(loc, 1, scaleVec);
254
255 f->glDrawArrays(GL_TRIANGLES, 0, 6);
256
257 vao.release();
258}

References getOpenGLFuncs(), program, scaleVec, selected_texture, and vao.

Referenced by paintGL().

Here is the call graph for this function:

◆ resizeGL()

void PreviewWidget::resizeGL ( int w,
int h )
protected

Definition at line 201 of file previewWidget.cpp.

201 {
202 width = w;
203 height = h;
204
206}

References calculateScale(), height, and width.

Here is the call graph for this function:

◆ setKey()

void PreviewWidget::setKey ( std::string_view key)

Definition at line 286 of file previewWidget.cpp.

286 {
287 std::string path = get_temp_dir();
288 path += key;
289 ipc_frame_reader.reset(ipc_frame_reader_new(path.c_str()));
290}
Ipc_frame_reader * ipc_frame_reader_new(const char *path)
static const char * get_temp_dir(void)
const char * key
Definition cineform.cpp:125

References get_temp_dir(), ipc_frame_reader, ipc_frame_reader_new(), and key.

Here is the call graph for this function:

◆ setVidSize()

void PreviewWidget::setVidSize ( int w,
int h )
private

Definition at line 208 of file previewWidget.cpp.

208 {
209 if(vidW == w && vidH == h)
210 return;
211
212 vidW = w;
213 vidH = h;
215}

References calculateScale(), vidH, and vidW.

Referenced by loadFrame().

Here is the call graph for this function:

◆ start()

void PreviewWidget::start ( )

Definition at line 292 of file previewWidget.cpp.

292 {
293 timer.start(1000/24);
294}

References timer.

◆ stop()

void PreviewWidget::stop ( )

Definition at line 296 of file previewWidget.cpp.

296 {
297 timer.stop();
298}

References timer.

Member Data Documentation

◆ frame_texture

GLuint PreviewWidget::frame_texture = 0
private

Definition at line 34 of file previewWidget.hpp.

Referenced by ~PreviewWidget(), initializeGL(), and loadFrame().

◆ height

int PreviewWidget::height = 0
private

Definition at line 45 of file previewWidget.hpp.

Referenced by calculateScale(), and resizeGL().

◆ ipc_frame

Ipc_frame_uniq PreviewWidget::ipc_frame
private

Definition at line 50 of file previewWidget.hpp.

Referenced by loadFrame().

◆ ipc_frame_reader

Ipc_frame_reader_uniq PreviewWidget::ipc_frame_reader
private

Definition at line 51 of file previewWidget.hpp.

Referenced by loadFrame(), and setKey().

◆ program

GLuint PreviewWidget::program = 0
private

Definition at line 33 of file previewWidget.hpp.

Referenced by ~PreviewWidget(), initializeGL(), and render().

◆ scaleVec

GLfloat PreviewWidget::scaleVec[2]
private

Definition at line 41 of file previewWidget.hpp.

Referenced by calculateScale(), initializeGL(), and render().

◆ selected_texture

GLuint PreviewWidget::selected_texture = 0
private

Definition at line 37 of file previewWidget.hpp.

Referenced by loadFrame(), and render().

◆ testbars_texture

GLuint PreviewWidget::testbars_texture = 0
private

Definition at line 35 of file previewWidget.hpp.

Referenced by ~PreviewWidget(), initializeGL(), and loadFrame().

◆ timer

QTimer PreviewWidget::timer
private

Definition at line 52 of file previewWidget.hpp.

Referenced by PreviewWidget(), start(), and stop().

◆ vao

QOpenGLVertexArrayObject PreviewWidget::vao
private

Definition at line 39 of file previewWidget.hpp.

Referenced by ~PreviewWidget(), initializeGL(), and render().

◆ vertexBuffer

GLuint PreviewWidget::vertexBuffer = 0
private

Definition at line 32 of file previewWidget.hpp.

Referenced by ~PreviewWidget(), and initializeGL().

◆ vidH

int PreviewWidget::vidH = 0
private

Definition at line 43 of file previewWidget.hpp.

Referenced by calculateScale(), initializeGL(), and setVidSize().

◆ vidW

int PreviewWidget::vidW = 0
private

Definition at line 42 of file previewWidget.hpp.

Referenced by calculateScale(), initializeGL(), and setVidSize().

◆ width

int PreviewWidget::width = 0
private

Definition at line 44 of file previewWidget.hpp.

Referenced by calculateScale(), and resizeGL().


The documentation for this class was generated from the following files: