#include "timecode_renderer.h"
+#include <assert.h>
+#include <math.h>
+#include <stdio.h>
+#include <time.h>
+#include <epoxy/gl.h>
#include <memory>
#include <string>
#include <vector>
+#include <QFont>
#include <QImage>
+#include <QPaintDevice>
#include <QPainter>
#include <epoxy/gl.h>
-#include <movit/effect_util.h>
#include <movit/resource_pool.h>
#include <movit/util.h>
#include <sys/time.h>
#include "flags.h"
+#include "embedded_files.h"
+#include "shared/read_file.h"
using namespace std;
using namespace movit;
TimecodeRenderer::TimecodeRenderer(movit::ResourcePool *resource_pool, unsigned display_width, unsigned display_height)
: resource_pool(resource_pool), display_width(display_width), display_height(display_height), height(28)
{
- string vert_shader =
- "#version 130 \n"
- " \n"
- "in vec2 position; \n"
- "in vec2 texcoord; \n"
- "out vec2 tc0; \n"
- " \n"
- "void main() \n"
- "{ \n"
- " // The result of glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0) is: \n"
- " // \n"
- " // 2.000 0.000 0.000 -1.000 \n"
- " // 0.000 2.000 0.000 -1.000 \n"
- " // 0.000 0.000 -2.000 -1.000 \n"
- " // 0.000 0.000 0.000 1.000 \n"
- " gl_Position = vec4(2.0 * position.x - 1.0, 2.0 * position.y - 1.0, -1.0, 1.0); \n"
- " tc0 = texcoord; \n"
- "} \n";
- string frag_shader =
- "#version 130 \n"
- "in vec2 tc0; \n"
- "uniform sampler2D tex; \n"
- "out vec4 Y, CbCr, YCbCr; \n"
- "void main() { \n"
- " vec4 gray = texture(tex, tc0); \n";
- if (global_flags.ten_bit_output) {
- frag_shader +=
- " gray.r = gray.r * ((940.0-16.0)/65535.0) + 16.0/65535.0; \n" // Limited-range Y'CbCr.
- " CbCr = vec4(512.0/65535.0, 512.0/65535.0, 0.0, 1.0); \n";
+ string vert_shader = read_file("timecode.vert", _binary_timecode_vert_data, _binary_timecode_vert_size);
+ string frag_shader;
+ if (global_flags.bit_depth > 8) {
+ frag_shader = read_file("timecode_10bit.frag", _binary_timecode_10bit_frag_data, _binary_timecode_10bit_frag_size);
} else {
- frag_shader +=
- " gray.r = gray.r * ((235.0-16.0)/255.0) + 16.0/255.0; \n" // Limited-range Y'CbCr.
- " CbCr = vec4(128.0/255.0, 128.0/255.0, 0.0, 1.0); \n";
+ frag_shader = read_file("timecode.frag", _binary_timecode_frag_data, _binary_timecode_frag_size);
}
- frag_shader +=
- " Y = gray.rrra; \n"
- " YCbCr = vec4(Y.r, CbCr.r, CbCr.g, CbCr.a); \n"
- "} \n";
vector<string> frag_shader_outputs;
program_num = resource_pool->compile_glsl_program(vert_shader, frag_shader, frag_shader_outputs);
TimecodeRenderer::~TimecodeRenderer()
{
resource_pool->release_2d_texture(tex);
- check_error();
+ check_error();
resource_pool->release_glsl_program(program_num);
- check_error();
+ check_error();
glDeleteBuffers(1, &vbo);
- check_error();
+ check_error();
}
string TimecodeRenderer::get_timecode_text(double pts, unsigned frame_num)
unsigned stream_time_hour = stream_time / 60;
char timecode_text[512];
- snprintf(timecode_text, sizeof(timecode_text), "Nageru - %s.%03u UTC - Stream time %02u:%02u:%02u.%03u (frame %u)",
+ snprintf(timecode_text, sizeof(timecode_text), "Nageru " NAGERU_VERSION " - %s.%03u UTC - Stream time %02u:%02u:%02u.%03u (frame %u)",
clock_text, msecs, stream_time_hour, stream_time_min, stream_time_sec, stream_time_ms, frame_num);
return timecode_text;
}
painter.setPen(Qt::white);
QFont font = painter.font();
+ font.setFamily("Noto Sans");
font.setPointSize(16);
painter.setFont(font);
check_error();
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, display_width, height, GL_RED, GL_UNSIGNED_BYTE, image->bits());
- check_error();
+ check_error();
glUseProgram(program_num);
check_error();
glUniform1i(texture_sampler_uniform, 0);
- check_error();
+ check_error();
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- check_error();
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ check_error();
for (GLint attr_index : { position_attribute_index, texcoord_attribute_index }) {
if (attr_index == -1) continue;