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;
}
}
}
}
|