summaryrefslogtreecommitdiff
path: root/ecp/test/vid/display.c
diff options
context:
space:
mode:
Diffstat (limited to 'ecp/test/vid/display.c')
-rw-r--r--ecp/test/vid/display.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/ecp/test/vid/display.c b/ecp/test/vid/display.c
new file mode 100644
index 0000000..d378431
--- /dev/null
+++ b/ecp/test/vid/display.c
@@ -0,0 +1,68 @@
+#include <stdio.h>
+
+#include "display.h"
+
+void sdl_open(SDLCanvas *o, int img_width, int img_height) {
+ // Initialize the SDL
+ if (SDL_Init(SDL_INIT_VIDEO) != 0) {
+ fprintf(stderr, "SDL_Init() Failed: %s\n", SDL_GetError());
+ exit(1);
+ }
+
+ o->display = SDL_CreateWindow("SDL Tutorial",
+ SDL_WINDOWPOS_UNDEFINED,
+ SDL_WINDOWPOS_UNDEFINED,
+ img_width, img_height, 0);
+ if (o->display == NULL) {
+ fprintf(stderr, "SDL_SetVideoMode() Failed: %s\n", SDL_GetError());
+ exit(1);
+ }
+
+ o->renderer = SDL_CreateRenderer(o->display, -1, 0);
+ if (o->renderer == NULL) {
+ fprintf(stderr, "SDL_CreateRenderer() Failed: %s\n", SDL_GetError());
+ exit(1);
+ }
+
+ o->texture = SDL_CreateTexture(o->renderer, SDL_PIXELFORMAT_YV12, SDL_TEXTUREACCESS_STREAMING, img_width, img_height);
+ if (o->texture == NULL) {
+ fprintf(stderr, "SDL_CreateTextureFromSurface() Failed: %s\n", SDL_GetError());
+ exit(1);
+ }
+
+ o->yPlaneSz = img_width * img_height;
+ o->uvPlaneSz = img_width * img_height / 4;
+ o->yuvBuffer = (Uint8*)malloc(o->yPlaneSz + 2 * o->uvPlaneSz);
+ o->yPitch = img_width;
+ o->uvPitch = img_width / 2;
+}
+
+void sdl_close(SDLCanvas *o) {
+ free(o->yuvBuffer);
+ SDL_DestroyTexture(o->texture);
+ SDL_DestroyRenderer(o->renderer);
+ SDL_DestroyWindow(o->display);
+ SDL_Quit();
+}
+
+void sdl_display_frame(SDLCanvas *o) {
+ SDL_UpdateYUVTexture(o->texture, NULL, o->yuvBuffer, o->yPitch, o->yuvBuffer + o->yPlaneSz, o->uvPitch, o->yuvBuffer + o->yPlaneSz + o->uvPlaneSz, o->uvPitch);
+ SDL_RenderClear(o->renderer);
+ SDL_RenderCopy(o->renderer, o->texture, NULL, NULL);
+ SDL_RenderPresent(o->renderer);
+}
+
+void sdl_loop(void) {
+ SDL_Event event;
+
+ while(1) {
+ // Check for messages
+ if (SDL_PollEvent(&event)) {
+ // Check for the quit message
+ if (event.type == SDL_QUIT) {
+ // Quit the program
+ break;
+ }
+ }
+ }
+}