Skip to content
This repository was archived by the owner on Jan 8, 2025. It is now read-only.

Commit 0b6a830

Browse files
author
mar
committed
display images and videos from script
1 parent 0efada8 commit 0b6a830

12 files changed

+448
-145
lines changed

CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ endif()
1616

1717
add_library(${PROJECT_NAME} STATIC
1818
cdlv.c
19+
util.c
1920
parse.c
2021
resource.c
2122
scene.c

cdlv.c

+9
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "util.h"
55
#include "resource.h"
66
#include "scene.h"
7+
#include "play.h"
78

89
void cdlv_init(cdlv* base, uint16_t width, uint16_t height) {
910
base->error = 0;
@@ -79,7 +80,15 @@ cdlv_error cdlv_play(cdlv* base, SDL_Renderer* renderer) {
7980
cdlv_err(cdlv_ok);
8081
}
8182

83+
cdlv_error cdlv_event(cdlv* base, SDL_Renderer* renderer, SDL_Event event) {
84+
cdlv_error res;
85+
if((res = cdlv_key_handler(base, renderer, event)) != cdlv_ok) cdlv_err(res);
86+
cdlv_err(cdlv_ok);
87+
}
88+
8289
cdlv_error cdlv_loop(cdlv* base, SDL_Renderer* renderer) {
90+
cdlv_error res;
91+
if((res = cdlv_play_loop(base, renderer)) != cdlv_ok) cdlv_err(res);
8392
cdlv_err(cdlv_ok);
8493
}
8594

cdlv.h

+11-5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ typedef enum {
1212
cdlv_read_error,
1313
cdlv_video_error,
1414
cdlv_parse_error,
15+
cdlv_fatal_error,
1516
} cdlv_error;
1617

1718
typedef struct cdlv_text {
@@ -49,25 +50,30 @@ typedef struct cdlv {
4950
cdlv_error error;
5051
char log[cdlv_max_string_size];
5152

52-
uint64_t c_tick, l_tick;
53-
float e_ticks;
54-
float accum;
55-
5653
uint16_t width, height;
5754

5855
cdlv_config config;
59-
cdlv_text* text;
56+
6057
cdlv_dict* scenes;
6158
uint16_t scene_count;
59+
60+
uint16_t current_line;
61+
uint16_t current_scene_index;
62+
void* current_scene;
63+
void* current_bg;
64+
6265
char* resources_path;
6366
cdlv_dict* resources;
67+
68+
cdlv_text* text;
6469
} cdlv;
6570

6671
void cdlv_init(cdlv* base, uint16_t width, uint16_t height);
6772
void cdlv_set_config(cdlv* base, const cdlv_config config);
6873
cdlv_error cdlv_add_script(cdlv* base, const char* path);
6974

7075
cdlv_error cdlv_play(cdlv* base, SDL_Renderer* renderer);
76+
cdlv_error cdlv_event(cdlv* base, SDL_Renderer* renderer, SDL_Event event);
7177
cdlv_error cdlv_loop(cdlv* base, SDL_Renderer* renderer);
7278
cdlv_error cdlv_stop(cdlv* base);
7379

main.c

+47-42
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ void error(cdlv* base) {
2020
case cdlv_read_error: printf("CDLV Read error: "); break;
2121
case cdlv_parse_error: printf("CDLV Parse error: "); break;
2222
case cdlv_video_error: printf("CDLV Video error: "); break;
23+
case cdlv_fatal_error: printf("CDLV Fatal error: "); break;
2324
}
2425
printf("%s\n", base->log);
2526
exit(1);
@@ -66,47 +67,47 @@ int main(int argc, char* argv[]) {
6667
printf("scenes:\n");
6768
dic_forEach(base.scenes, foreach_scene, NULL);
6869

69-
cdlv_resource r = {
70-
.path = "",
71-
.type = cdlv_resource_video,
72-
};
73-
cdlv_resource_load(&base, &r, _renderer);
74-
error(&base);
75-
int ret = 0;
76-
bool loop = false;
77-
bool is_playing = true;
78-
while(is_playing) {
79-
if((ret = av_read_frame(r.video->format_context, r.video->packet)) == AVERROR_EOF) {
80-
if(!loop) {
81-
is_playing = false;
82-
break;
83-
}
84-
av_seek_frame(r.video->format_context, r.video->video_stream, 0, 0);
85-
av_packet_unref(r.video->packet);
86-
continue;
87-
}
88-
if(r.video->packet->stream_index == r.video->video_stream) {
89-
if((ret = avcodec_send_packet(r.video->codec_context, r.video->packet)) < 0) {
90-
char buf[cdlv_max_string_size];
91-
av_strerror(ret, buf, cdlv_max_string_size);
92-
puts(buf);
93-
puts("error sending packet for decoding"), exit(1);
94-
}
95-
while(ret >= 0) {
96-
ret = avcodec_receive_frame(r.video->codec_context,r.video->frame);
97-
if(ret==AVERROR(EAGAIN)||ret==AVERROR_EOF) break;
98-
else if(ret<0) puts("error while decoding"), exit(1);
99-
sws_scale(r.video->sws_context, (uint8_t const* const*)r.video->frame->data, r.video->frame->linesize, 0, r.video->codec_context->height, r.video->picture->data, r.video->picture->linesize);
100-
SDL_Delay((1000*r.video->sleep_time)-10);
101-
SDL_UpdateYUVTexture(r.video->texture, &r.video->rect, r.video->picture->data[0], r.video->picture->linesize[0], r.video->picture->data[1], r.video->picture->linesize[1], r.video->picture->data[2], r.video->picture->linesize[2]);
102-
SDL_RenderClear(_renderer);
103-
SDL_RenderCopy(_renderer, r.video->texture, NULL, NULL);
104-
SDL_RenderPresent(_renderer);
105-
}
106-
}
107-
av_packet_unref(r.video->packet);
108-
}
109-
cdlv_resource_unload(&r);
70+
// cdlv_resource r = {
71+
// .path = "",
72+
// .type = cdlv_resource_video,
73+
// };
74+
// cdlv_resource_load(&base, &r, _renderer);
75+
// error(&base);
76+
// int ret = 0;
77+
// bool loop = false;
78+
// bool is_playing = true;
79+
// while(is_playing) {
80+
// if((ret = av_read_frame(r.video->format_context, r.video->packet)) == AVERROR_EOF) {
81+
// if(!loop) {
82+
// is_playing = false;
83+
// break;
84+
// }
85+
// av_seek_frame(r.video->format_context, r.video->video_stream, 0, 0);
86+
// av_packet_unref(r.video->packet);
87+
// continue;
88+
// }
89+
// if(r.video->packet->stream_index == r.video->video_stream) {
90+
// if((ret = avcodec_send_packet(r.video->codec_context, r.video->packet)) < 0) {
91+
// char buf[cdlv_max_string_size];
92+
// av_strerror(ret, buf, cdlv_max_string_size);
93+
// puts(buf);
94+
// puts("error sending packet for decoding"), exit(1);
95+
// }
96+
// while(ret >= 0) {
97+
// ret = avcodec_receive_frame(r.video->codec_context,r.video->frame);
98+
// if(ret==AVERROR(EAGAIN)||ret==AVERROR_EOF) break;
99+
// else if(ret<0) puts("error while decoding"), exit(1);
100+
// sws_scale(r.video->sws_context, (uint8_t const* const*)r.video->frame->data, r.video->frame->linesize, 0, r.video->codec_context->height, r.video->picture->data, r.video->picture->linesize);
101+
// SDL_Delay((1000*r.video->sleep_time)-10);
102+
// SDL_UpdateYUVTexture(r.video->texture, &r.video->rect, r.video->picture->data[0], r.video->picture->linesize[0], r.video->picture->data[1], r.video->picture->linesize[1], r.video->picture->data[2], r.video->picture->linesize[2]);
103+
// SDL_RenderClear(_renderer);
104+
// SDL_RenderCopy(_renderer, r.video->texture, NULL, NULL);
105+
// SDL_RenderPresent(_renderer);
106+
// }
107+
// }
108+
// av_packet_unref(r.video->packet);
109+
// }
110+
// cdlv_resource_unload(&r);
110111

111112
bool _running = true;
112113
while(_running) {
@@ -115,9 +116,13 @@ int main(int argc, char* argv[]) {
115116
_running = false;
116117
break;
117118
}
119+
cdlv_event(&base, _renderer, event);
118120
}
119121
SDL_RenderClear(_renderer);
120-
if(base.is_playing) cdlv_loop(&base, _renderer);
122+
if(base.is_playing) {
123+
cdlv_loop(&base, _renderer);
124+
error(&base);
125+
}
121126
SDL_RenderPresent(_renderer);
122127
}
123128

parse.c

+16-98
Original file line numberDiff line numberDiff line change
@@ -7,99 +7,9 @@ static inline size_t strspn_whitespace(const char* line) {
77
return strspn(line, " \t");
88
}
99

10-
static inline char* find_first_whitespace(const char* line) {
11-
char* whitespace = strchr(line, ' ');
12-
if(whitespace) return whitespace;
13-
whitespace = strchr(line, '\t');
14-
if(whitespace) return whitespace;
15-
return NULL;
16-
}
17-
18-
static inline cdlv_error extract_from_quotes(cdlv* base, const char* line, char** output) {
19-
char* quote_open = strchr(line, '\"');
20-
if(!quote_open) {
21-
cdlv_logv("Did not find opening quote on line: %s", line);
22-
cdlv_err(cdlv_parse_error);
23-
}
24-
char* quote_close = strrchr(line, '\"');
25-
if(!quote_close) {
26-
cdlv_logv("Did not find closing quote on line: %s", line);
27-
cdlv_err(cdlv_parse_error);
28-
}
29-
char str_content[quote_close-quote_open];
30-
sprintf(str_content, "%.*s", (int)(quote_close-quote_open-1), quote_open+1);
31-
cdlv_strdup(output, str_content, quote_close-quote_open);
32-
cdlv_err(cdlv_ok);
33-
}
34-
35-
static inline cdlv_error extract_non_quote(cdlv* base, const char* line, char** output) {
36-
char* start_position = NULL;
37-
bool scene_name = line[0] == '!' ? true : false;
38-
if(scene_name) start_position = find_first_whitespace(line);
39-
else start_position = (char*)line;
40-
char* end_position = find_first_whitespace(start_position+1);
41-
if(!end_position) {
42-
cdlv_logv("Did not find name on line: %s", line);
43-
cdlv_err(cdlv_parse_error);
44-
}
45-
size_t size = scene_name ? end_position-start_position : end_position-start_position + 1;
46-
char str_content[size];
47-
sprintf(str_content, "%.*s", (int)size-1, scene_name ? start_position+1 : start_position);
48-
cdlv_strdup(output, str_content, size);
49-
cdlv_err(cdlv_ok);
50-
}
51-
52-
static inline cdlv_error extract_filename(cdlv* base, const char* line, char** output) {
53-
char* dot_position = strchr(line, '.');
54-
if(!dot_position) {
55-
cdlv_logv("Did not find filename on line: %s", line);
56-
cdlv_err(cdlv_parse_error);
57-
}
58-
size_t size = dot_position-line+1;
59-
char str_content[size];
60-
sprintf(str_content, "%.*s", (int)(size-1), line);
61-
cdlv_strdup(output, str_content, size);
62-
cdlv_err(cdlv_ok);
63-
}
64-
65-
static inline cdlv_error extract_resource_kv(cdlv* base, const char* line, char** key, char** value) {
66-
cdlv_error res;
67-
if(line[0] == '\"') {
68-
if((res = extract_from_quotes(base, line, value)) != cdlv_ok) cdlv_err(res);
69-
if((res = extract_filename(base, *value, key)) != cdlv_ok) cdlv_err(res);
70-
cdlv_err(cdlv_ok);
71-
} else {
72-
if((res = extract_non_quote(base, line, key)) != cdlv_ok) cdlv_err(res);
73-
if((res = extract_from_quotes(base, line, value)) != cdlv_ok) cdlv_err(res);
74-
cdlv_err(cdlv_ok);
75-
}
76-
cdlv_logv("Could not parse resource: %s", line);
77-
cdlv_err(cdlv_parse_error);
78-
}
79-
80-
static inline cdlv_error strcat_new(cdlv* base, const char* first, const char* second, char** output) {
81-
char new[strlen(first)+strlen(second)+1];
82-
sprintf(new, "%s%s", first, second);
83-
if(*output != NULL) free(*output);
84-
cdlv_strdup(output, new, strlen(new)+1);
85-
cdlv_err(cdlv_ok);
86-
}
87-
88-
static inline cdlv_error add_new_resource(cdlv* base, const char* base_path, const char* line, cdlv_dict* resources) {
89-
cdlv_error res;
90-
char* key, *path;
91-
cdlv_resource* resource;
92-
if((res = extract_resource_kv(base, line, &key, &path)) != cdlv_ok) cdlv_err(res);
93-
if((res = strcat_new(base, base_path, path, &path)) != cdlv_ok) cdlv_err(res);
94-
if((res = cdlv_resource_new(base, cdlv_resource_image, path, &resource)) != cdlv_ok) cdlv_err(res);
95-
dic_add(resources, key, strlen(key));
96-
*resources->value = resource;
97-
cdlv_err(cdlv_ok);
98-
}
99-
10010
static inline cdlv_error add_new_scene(cdlv* base, const char* line, cdlv_scene** scene) {
10111
char* name = NULL;
102-
cdlv_error result = extract_non_quote(base, line, &name);
12+
cdlv_error result = cdlv_extract_non_quote(base, line, &name);
10313
if(result != cdlv_ok) cdlv_err(result);
10414
cdlv_scene* new_scene;
10515
if((result = cdlv_scene_new(base, base->resources_path, &new_scene)) != cdlv_ok) cdlv_err(result);
@@ -117,16 +27,16 @@ static inline cdlv_error parse_global_resource(cdlv* base, cdlv_parse_mode* mode
11727
cdlv_err(cdlv_ok);
11828
}
11929
cdlv_error res;
120-
if((res = add_new_resource(base, base->resources_path, line, base->resources)) != cdlv_ok) cdlv_err(res);
30+
if((res = cdlv_add_new_resource(base, base->resources_path, line, base->resources)) != cdlv_ok) cdlv_err(res);
12131
cdlv_err(cdlv_ok);
12232
}
12333

12434
static inline cdlv_error parse_global_definition(cdlv* base, cdlv_parse_mode* mode, const char* line, cdlv_scene** scene) {
12535
if(strstr(line, cdlv_tag_define_resources_path)) {
12636
char* new_path;
127-
cdlv_error result = extract_from_quotes(base, line, &new_path);
37+
cdlv_error result = cdlv_extract_from_quotes(base, line, &new_path);
12838
if(result != cdlv_ok) cdlv_err(result);
129-
if((result = strcat_new(base, base->resources_path, new_path, &base->resources_path)) != cdlv_ok) cdlv_err(result);
39+
if((result = cdlv_strcat_new(base, base->resources_path, new_path, &base->resources_path)) != cdlv_ok) cdlv_err(result);
13040
free(new_path);
13141
cdlv_err(result);
13242
} else if(strstr(line, cdlv_tag_define_resources)) {
@@ -150,17 +60,17 @@ static inline cdlv_error parse_scene_resource(cdlv* base, cdlv_parse_mode* mode,
15060
}
15161
cdlv_scene* current_scene = *scene;
15262
cdlv_error res;
153-
if((res = add_new_resource(base, current_scene->resources_path, line, current_scene->resources)) != cdlv_ok) cdlv_err(res);
63+
if((res = cdlv_add_new_resource(base, current_scene->resources_path, line, current_scene->resources)) != cdlv_ok) cdlv_err(res);
15464
cdlv_err(cdlv_ok);
15565
}
15666

15767
static inline cdlv_error parse_scene_definition(cdlv* base, cdlv_parse_mode* mode, const char* line, cdlv_scene** scene) {
15868
cdlv_scene* current_scene = *scene;
15969
if(strstr(line, cdlv_tag_define_resources_path)) {
16070
char* new_path;
161-
cdlv_error result = extract_from_quotes(base, line, &new_path);
71+
cdlv_error result = cdlv_extract_from_quotes(base, line, &new_path);
16272
if(result != cdlv_ok) cdlv_err(result);
163-
if((result = strcat_new(base, base->resources_path, new_path, &current_scene->resources_path)) != cdlv_ok) cdlv_err(result);
73+
if((result = cdlv_strcat_new(base, base->resources_path, new_path, &current_scene->resources_path)) != cdlv_ok) cdlv_err(result);
16474
free(new_path);
16575
cdlv_err(result);
16676
} else if(strstr(line, cdlv_tag_define_resources)) {
@@ -195,6 +105,13 @@ static inline cdlv_error parse_definition(cdlv* base, cdlv_parse_mode* mode, con
195105
cdlv_err(cdlv_ok);
196106
}
197107

108+
static inline cdlv_error add_script_line(cdlv* base, cdlv_scene* scene, const char* line) {
109+
char* dup_line;
110+
cdlv_strdup(&dup_line, line, strlen(line)+1);
111+
SCL_ARRAY_ADD(scene->script, dup_line, char*);
112+
cdlv_err(cdlv_ok);
113+
}
114+
198115
static inline cdlv_error parse_nprefix_line(cdlv* base, cdlv_parse_mode* mode, const char* line, cdlv_scene** scene) {
199116
cdlv_parse_mode current_mode = *mode;
200117
cdlv_error res;
@@ -211,7 +128,8 @@ static inline cdlv_error parse_nprefix_line(cdlv* base, cdlv_parse_mode* mode, c
211128
*mode = cdlv_parse_global;
212129
cdlv_err(cdlv_ok);
213130
}
214-
SCL_ARRAY_ADD((*scene)->script, (char*)line, char*);
131+
if(!strlen(line)) break;
132+
if((res = add_script_line(base, *scene, line)) != cdlv_ok) cdlv_err(res);
215133
break;
216134
case cdlv_parse_scene_resources:
217135
if((res = parse_scene_resource(base, mode, line, scene)) != cdlv_ok) cdlv_err(res);

parse.h

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#define cdlv_tag_define_scene "!scene"
99

1010
#define cdlv_tag_prompt_bg "@bg"
11+
#define cdlv_tag_time_loop " loop"
12+
#define cdlv_tag_time_once " once"
1113

1214
#define cdlv_tag_opening "{"
1315
#define cdlv_tag_closure "}"

0 commit comments

Comments
 (0)