From 4cb21b503585764ae8f5208fee6f7ffd103d70f4 Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Tue, 12 Sep 2017 18:29:14 +0200 Subject: video test passed --- code/test/vid/display.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ code/test/vid/display.h | 17 +++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 code/test/vid/display.c create mode 100644 code/test/vid/display.h (limited to 'code/test/vid') diff --git a/code/test/vid/display.c b/code/test/vid/display.c new file mode 100644 index 0000000..d378431 --- /dev/null +++ b/code/test/vid/display.c @@ -0,0 +1,68 @@ +#include + +#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; + } + } + } +} diff --git a/code/test/vid/display.h b/code/test/vid/display.h new file mode 100644 index 0000000..38e07be --- /dev/null +++ b/code/test/vid/display.h @@ -0,0 +1,17 @@ +#include "SDL.h" + +typedef struct SDLCanvas { + SDL_Window *display; + SDL_Renderer *renderer; + SDL_Texture *texture; + Uint8 *yuvBuffer; + size_t yPlaneSz; + size_t uvPlaneSz; + int yPitch; + int uvPitch; +} SDLCanvas; + +void sdl_open(SDLCanvas *o, int img_width, int img_height); +void sdl_close(SDLCanvas *o); +void sdl_display_frame(SDLCanvas *o); +void sdl_loop(void); -- cgit v1.2.3