summaryrefslogtreecommitdiff
path: root/code/test/vid/display.c
blob: d378431923b5356f089f1eddba7889ed1bb16b3b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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;
            }
        }
    }
}