From 1086aa68854b85911b42a85d00745d434a3e429e Mon Sep 17 00:00:00 2001 From: Daniel Zaoui Date: Thu, 25 Jan 2018 20:39:16 +0200 Subject: [PATCH] Player: support exu as source --- src/bin/player.c | 176 ++++++++++++++++++++++++++++------------------- 1 file changed, 106 insertions(+), 70 deletions(-) diff --git a/src/bin/player.c b/src/bin/player.c index 9e7a923..61d6987 100644 --- a/src/bin/player.c +++ b/src/bin/player.c @@ -26,16 +26,19 @@ typedef enum { - DEST_UNKNOWN, - DEST_DIR, - DEST_EXU -} Dest_Type; + FTYPE_UNKNOWN, + FTYPE_DIR, + FTYPE_REC = FTYPE_DIR, + FTYPE_EXU +} File_Type; -static Dest_Type _dest_type = DEST_UNKNOWN; +static File_Type _dest_type = FTYPE_UNKNOWN; static const char *_dest = NULL; static Exactness_Unit *_dest_unit = NULL; -static const char *_rec_filename = NULL; +static File_Type _src_type = FTYPE_UNKNOWN; +static const char *_src_filename = NULL; +static Exactness_Unit *_src_unit = NULL; static const char *_test_name = NULL; static int _verbose = 0; @@ -44,7 +47,6 @@ static Evas *(*_evas_new)(void) = NULL; static int _ignore_evas_creation = 0; static Eina_List *_evas_list = NULL; -static Lists_st *_events_list = NULL; static Eina_List *_cur_event_list = NULL; static unsigned int _last_event_time = 0; @@ -78,7 +80,7 @@ _shot_do(Evas *e) ecore_evas_geometry_get(ee_orig, NULL, NULL, &w, &h); if ((w < 1) || (h < 1)) return; - if (_dest_type == DEST_DIR) + if (_dest_type == FTYPE_DIR) { int dir_name_len; char *filename; @@ -108,7 +110,7 @@ _shot_do(Evas *e) free(filename); ecore_evas_free(ee); } - else if (_dest_type == DEST_EXU) + else if (_dest_type == FTYPE_EXU) { Exactness_Image *ex_img = malloc(sizeof(*ex_img)); ex_img->w = w; @@ -117,7 +119,7 @@ _shot_do(Evas *e) ex_img->pixels = malloc(ex_img->pixels_count); memcpy(ex_img->pixels, pixels, ex_img->pixels_count); _dest_unit->imgs = eina_list_append(_dest_unit->imgs, ex_img); - _printf(1, "Shot taken (in .exu).\n"); + _printf(1, "Shot taken (in %s).\n", _dest); } } @@ -333,7 +335,7 @@ _feed_event(void *data EINA_UNUSED) _printf(2, "%s take shot timestamp=<%u> t->n_evas=<%d>\n", __func__, t->timestamp, t->n_evas); if (rect) evas_object_color_set(rect, 0, 0, 255, 255); _cur_shot_id++; - if (_dest_type != DEST_UNKNOWN && e) _shot_do(e); + if (_dest_type != FTYPE_UNKNOWN && e) _shot_do(e); break; } default: /* All non-input events are not handeled */ @@ -369,37 +371,61 @@ _feed_event(void *data EINA_UNUSED) } static Eina_Bool -_rec_open() +_src_open() { + unsigned int first_tm = 0; double diff_time = 0; /* Time to wait before feeding the first event */ - _printf(2, "<%s> rec file is <%s>\n", __func__, _rec_filename); - _events_list = read_events(_rec_filename, NULL); - if (_events_list) + _printf(2, "<%s> Source file is <%s>\n", __func__, _src_filename); + if (_src_type == FTYPE_EXU) { - _cur_event_list = _events_list->variant_list; - Variant_st *v = eina_list_data_get(_cur_event_list); - - /* Calculate the time to wait before feeding the first event */ - unsigned int current_event_time = evt_time_get(0, v); - if (current_event_time > _events_list->first_timestamp) - diff_time = (current_event_time - _events_list->first_timestamp) / 1000.0; - - _printf(2, "%s first_time_stamp=<%u> current_event_time=<%u>\n", __func__, _events_list->first_timestamp, current_event_time); - - if (diff_time) + Eet_File *file = eet_open(_src_filename, EET_FILE_MODE_READ); + if (!file) { - _printf(2, " Waiting <%f>\n", diff_time); - ecore_timer_add(diff_time, _feed_event, NULL); + fprintf(stderr, "Impossible to extract EET from %s\n", _src_filename); + return EINA_FALSE; + } + _src_unit = eet_data_read(file, unit_desc_make(), CACHE_FILE_ENTRY); + eet_close(file); + } + else if (_src_type == FTYPE_REC) + { + _src_unit = calloc(1, sizeof(*_src_unit)); + Lists_st *events_list = read_events(_src_filename, NULL); + if (!events_list) + { + free(_src_unit); + _src_unit = NULL; } else { - _feed_event(NULL); + _src_unit->events = events_list->variant_list; + first_tm = events_list->first_timestamp; } } + if (!_src_unit) return EINA_FALSE; + _cur_event_list = _src_unit->events; + Variant_st *v = eina_list_data_get(_cur_event_list); + + /* Calculate the time to wait before feeding the first event */ + unsigned int current_event_time = evt_time_get(0, v); + if (current_event_time > first_tm) + diff_time = (current_event_time - first_tm) / 1000.0; + + _printf(2, "%s first_time_stamp=<%u> current_event_time=<%u>\n", __func__, first_tm, current_event_time); + + if (diff_time) + { + _printf(2, " Waiting <%f>\n", diff_time); + ecore_timer_add(diff_time, _feed_event, NULL); + } + else + { + _feed_event(NULL); + } return EINA_TRUE; } -static Eina_Bool +static int _prg_invoke(const char *full_path, int argc, char **argv) { Eina_Value *ret__; @@ -413,7 +439,7 @@ _prg_invoke(const char *full_path, int argc, char **argv) { fprintf(stderr, "Failed loading %s.\n", full_path); if (h) eina_module_free(h); - return EINA_FALSE; + return 1; } efl_main = eina_module_symbol_get(h, "efl_main"); elm_main = eina_module_symbol_get(h, "elm_main"); @@ -423,34 +449,38 @@ _prg_invoke(const char *full_path, int argc, char **argv) { fprintf(stderr, "Failed loading symbol 'evas_new' from %s.\n", full_path); eina_module_free(h); - return EINA_FALSE; + return 1; } - _rec_open(); - if (efl_main) + if (_src_open()) { - elm_init(argc, argv); - efl_event_callback_add(efl_main_loop_get(), EFL_LOOP_EVENT_ARGUMENTS, efl_main, NULL); - ret__ = efl_loop_begin(efl_main_loop_get()); - real__ = efl_loop_exit_code_process(ret__); - elm_shutdown(); - } - else if (elm_main) - { - elm_init(argc, argv); - real__ = elm_main(argc, argv); - elm_shutdown(); - } - else if (c_main) - { - real__ = c_main(argc, argv); - } - else - { - fprintf(stderr, "Failed loading symbol 'efl_main', 'elm_main' or 'main' from %s.\n", full_path); - eina_module_free(h); - real__ = 1; + if (efl_main) + { + elm_init(argc, argv); + efl_event_callback_add(efl_main_loop_get(), EFL_LOOP_EVENT_ARGUMENTS, efl_main, NULL); + ret__ = efl_loop_begin(efl_main_loop_get()); + real__ = efl_loop_exit_code_process(ret__); + elm_shutdown(); + } + else if (elm_main) + { + elm_init(argc, argv); + real__ = elm_main(argc, argv); + elm_shutdown(); + } + else if (c_main) + { + real__ = c_main(argc, argv); + } + else + { + fprintf(stderr, "Failed loading symbol 'efl_main', 'elm_main' or 'main' from %s.\n", full_path); + eina_module_free(h); + real__ = 1; + } } + else real__ = 1; + return real__; } @@ -541,6 +571,7 @@ int main(int argc, char **argv) const char *engine = "buffer"; eina_init(); + eet_init(); opterr = 0; for (int opt; (opt = getopt(argc, argv, "+so:vt:h")) != -1;) @@ -558,7 +589,7 @@ int main(int argc, char **argv) _dest = eina_stringshare_add(optarg); if (!strcmp(_dest + strlen(_dest) - 4,".exu")) { - _dest_type = DEST_EXU; + _dest_type = FTYPE_EXU; if (!_mkdir(_dest, EINA_TRUE)) { fprintf(stderr, "Path for %s cannot be created\n", _dest); @@ -567,7 +598,7 @@ int main(int argc, char **argv) } else { - _dest_type = DEST_DIR; + _dest_type = FTYPE_DIR; if (!_mkdir(_dest, EINA_FALSE)) { fprintf(stderr, "Directory %s cannot be created\n", _dest); @@ -578,17 +609,22 @@ int main(int argc, char **argv) } case 't': { - _rec_filename = eina_stringshare_add(optarg); - if (_dest_type == DEST_UNKNOWN) + _src_filename = eina_stringshare_add(optarg); + if (!strcmp(_src_filename + strlen(_src_filename) - 4,".exu")) { - if (!strcmp(_rec_filename + strlen(_rec_filename) - 4,".exu")) + _src_type = FTYPE_EXU; + if (_dest_type == FTYPE_UNKNOWN) { - _dest_type = DEST_EXU; + _dest_type = FTYPE_EXU; _dest = "./output.exu"; } - else if (!strcmp(_rec_filename + strlen(_rec_filename) - 4,".rec")) + } + else if (!strcmp(_src_filename + strlen(_src_filename) - 4,".rec")) + { + _src_type = FTYPE_REC; + if (_dest_type == FTYPE_UNKNOWN) { - _dest_type = DEST_DIR; + _dest_type = FTYPE_DIR; _dest = "."; } } @@ -618,21 +654,21 @@ int main(int argc, char **argv) fprintf(stderr, "no program specified\nUse -h for more information\n"); goto end; } - if (!_rec_filename) + if (!_src_filename) { fprintf(stderr, "no test file specified\n"); goto end; } else { - char *slash = strrchr(_rec_filename, '/'); + char *slash = strrchr(_src_filename, '/'); if (slash) _test_name = strdup(slash + 1); - else _test_name = strdup(_rec_filename); + else _test_name = strdup(_src_filename); char *dot = strrchr(_test_name, '.'); if (dot) *dot = '\0'; } - if (_dest_type == DEST_EXU) + if (_dest_type == FTYPE_EXU) { _dest_unit = calloc(1, sizeof(*_dest_unit)); } @@ -655,19 +691,19 @@ int main(int argc, char **argv) _printf(1, "\n"); ecore_evas_callback_new_set(_my_evas_new); - _prg_invoke(_prg_full_path_guess(argv[0]), argc - optind, argv); + pret = _prg_invoke(_prg_full_path_guess(argv[0]), argc - optind, argv); if (_dest_unit) { - _dest_unit->events = _events_list->variant_list; + _dest_unit->events = _src_unit->events; Eet_Data_Descriptor *unit_edd = unit_desc_make(); Eet_File *file = eet_open(_dest, EET_FILE_MODE_WRITE); eet_data_write(file, unit_edd, CACHE_FILE_ENTRY, _dest_unit, EINA_TRUE); eet_close(file); } - pret = 0; end: + eet_shutdown(); eina_shutdown(); return pret; }