|
@@ -1,6 +1,10 @@
|
|
#include <stdio.h>
|
|
#include <stdio.h>
|
|
#include <GLFW/glfw3.h>
|
|
#include <GLFW/glfw3.h>
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+bool load_frame(const char* filename, int* width, int* height, unsigned char** data);
|
|
|
|
+
|
|
int main (int argc, char** argv)
|
|
int main (int argc, char** argv)
|
|
{
|
|
{
|
|
GLFWwindow* window;
|
|
GLFWwindow* window;
|
|
@@ -18,43 +22,51 @@ int main (int argc, char** argv)
|
|
|
|
|
|
glfwMakeContextCurrent(window);
|
|
glfwMakeContextCurrent(window);
|
|
|
|
|
|
-
|
|
|
|
- unsigned char* data = new unsigned char [100 * 100 * 3];
|
|
|
|
- for (int y=0; y < 100; y++) {
|
|
|
|
- for (int x = 0; x < 100; x++) {
|
|
|
|
- data[y * 100 * 3 + x * 3] = 0xff;
|
|
|
|
- data[y * 100 * 3 + x * 3 + 1] = 0x00;
|
|
|
|
- data[y * 100 * 3 + x * 3 + 2] = 0x00;
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+ int frame_w, frame_h;
|
|
|
|
+ unsigned char* frame_data;
|
|
|
|
+ if (!load_frame("/home/cmte/output.mkv", &frame_w, &frame_h, &frame_data)) {
|
|
|
|
+ fprintf(stderr, "could not load video frame.\n");
|
|
|
|
+ return 1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ printf("Got frame size: %d x %d\n", frame_w, frame_h);
|
|
|
|
+
|
|
GLuint texture_handle;
|
|
GLuint texture_handle;
|
|
glGenTextures(1, &texture_handle);
|
|
glGenTextures(1, &texture_handle);
|
|
glBindTexture(GL_TEXTURE_2D, texture_handle);
|
|
glBindTexture(GL_TEXTURE_2D, texture_handle);
|
|
- glTexImage2D(texture_handle, 0, GL_RGB, 100, 100, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
|
|
|
|
|
|
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
|
|
|
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
|
|
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
|
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
|
|
+
|
|
|
|
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, frame_w, frame_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, frame_data);
|
|
|
|
|
|
|
|
|
|
while (!glfwWindowShouldClose(window)) {
|
|
while (!glfwWindowShouldClose(window)) {
|
|
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
- glDrawPixels(100, 100, GL_RGB, GL_UNSIGNED_BYTE, data);
|
|
|
|
|
|
+
|
|
|
|
|
|
int window_width, window_height;
|
|
int window_width, window_height;
|
|
glfwGetFramebufferSize(window, &window_width, &window_height);
|
|
glfwGetFramebufferSize(window, &window_width, &window_height);
|
|
glMatrixMode(GL_PROJECTION);
|
|
glMatrixMode(GL_PROJECTION);
|
|
-
|
|
|
|
glLoadIdentity();
|
|
glLoadIdentity();
|
|
glOrtho(0, window_width, 0, window_height, -1, 1);
|
|
glOrtho(0, window_width, 0, window_height, -1, 1);
|
|
|
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
glMatrixMode(GL_MODELVIEW);
|
|
|
|
+
|
|
|
|
+ glBindTexture(GL_TEXTURE_2D, texture_handle);
|
|
|
|
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, frame_w, frame_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, frame_data);
|
|
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
glEnable(GL_TEXTURE_2D);
|
|
glBindTexture(GL_TEXTURE_2D, texture_handle);
|
|
glBindTexture(GL_TEXTURE_2D, texture_handle);
|
|
glBegin(GL_QUADS);
|
|
glBegin(GL_QUADS);
|
|
- glTexCoord2d(0,0);glTexCoord2d(0,0);
|
|
|
|
- glTexCoord2d(1,0);glTexCoord2d(100,0);
|
|
|
|
- glTexCoord2d(1,1);glTexCoord2d(100,100);
|
|
|
|
- glTexCoord2d(0,1);glTexCoord2d(0,100);
|
|
|
|
|
|
+ glTexCoord2d(0,0); glVertex2i(200, 200);
|
|
|
|
+ glTexCoord2d(1,0); glVertex2i(200 + frame_w, 200);
|
|
|
|
+ glTexCoord2d(1,1); glVertex2i(200 + frame_w, 200 + frame_h);
|
|
|
|
+ glTexCoord2d(0,1); glVertex2i(200, 200 + frame_h);
|
|
glEnd();
|
|
glEnd();
|
|
glDisable(GL_TEXTURE_2D);
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
|