Player: support exu as source

This commit is contained in:
Daniel Zaoui 2018-01-25 20:39:16 +02:00
parent 5555a38c1e
commit 1086aa6885
1 changed files with 106 additions and 70 deletions

View File

@ -26,16 +26,19 @@
typedef enum typedef enum
{ {
DEST_UNKNOWN, FTYPE_UNKNOWN,
DEST_DIR, FTYPE_DIR,
DEST_EXU FTYPE_REC = FTYPE_DIR,
} Dest_Type; FTYPE_EXU
} File_Type;
static Dest_Type _dest_type = DEST_UNKNOWN; static File_Type _dest_type = FTYPE_UNKNOWN;
static const char *_dest = NULL; static const char *_dest = NULL;
static Exactness_Unit *_dest_unit = 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 const char *_test_name = NULL;
static int _verbose = 0; static int _verbose = 0;
@ -44,7 +47,6 @@ static Evas *(*_evas_new)(void) = NULL;
static int _ignore_evas_creation = 0; static int _ignore_evas_creation = 0;
static Eina_List *_evas_list = NULL; static Eina_List *_evas_list = NULL;
static Lists_st *_events_list = NULL;
static Eina_List *_cur_event_list = NULL; static Eina_List *_cur_event_list = NULL;
static unsigned int _last_event_time = 0; 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); ecore_evas_geometry_get(ee_orig, NULL, NULL, &w, &h);
if ((w < 1) || (h < 1)) return; if ((w < 1) || (h < 1)) return;
if (_dest_type == DEST_DIR) if (_dest_type == FTYPE_DIR)
{ {
int dir_name_len; int dir_name_len;
char *filename; char *filename;
@ -108,7 +110,7 @@ _shot_do(Evas *e)
free(filename); free(filename);
ecore_evas_free(ee); ecore_evas_free(ee);
} }
else if (_dest_type == DEST_EXU) else if (_dest_type == FTYPE_EXU)
{ {
Exactness_Image *ex_img = malloc(sizeof(*ex_img)); Exactness_Image *ex_img = malloc(sizeof(*ex_img));
ex_img->w = w; ex_img->w = w;
@ -117,7 +119,7 @@ _shot_do(Evas *e)
ex_img->pixels = malloc(ex_img->pixels_count); ex_img->pixels = malloc(ex_img->pixels_count);
memcpy(ex_img->pixels, pixels, ex_img->pixels_count); memcpy(ex_img->pixels, pixels, ex_img->pixels_count);
_dest_unit->imgs = eina_list_append(_dest_unit->imgs, ex_img); _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); _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); if (rect) evas_object_color_set(rect, 0, 0, 255, 255);
_cur_shot_id++; _cur_shot_id++;
if (_dest_type != DEST_UNKNOWN && e) _shot_do(e); if (_dest_type != FTYPE_UNKNOWN && e) _shot_do(e);
break; break;
} }
default: /* All non-input events are not handeled */ default: /* All non-input events are not handeled */
@ -369,37 +371,61 @@ _feed_event(void *data EINA_UNUSED)
} }
static Eina_Bool static Eina_Bool
_rec_open() _src_open()
{ {
unsigned int first_tm = 0;
double diff_time = 0; /* Time to wait before feeding the first event */ double diff_time = 0; /* Time to wait before feeding the first event */
_printf(2, "<%s> rec file is <%s>\n", __func__, _rec_filename); _printf(2, "<%s> Source file is <%s>\n", __func__, _src_filename);
_events_list = read_events(_rec_filename, NULL); if (_src_type == FTYPE_EXU)
if (_events_list)
{ {
_cur_event_list = _events_list->variant_list; Eet_File *file = eet_open(_src_filename, EET_FILE_MODE_READ);
Variant_st *v = eina_list_data_get(_cur_event_list); if (!file)
/* 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)
{ {
_printf(2, " Waiting <%f>\n", diff_time); fprintf(stderr, "Impossible to extract EET from %s\n", _src_filename);
ecore_timer_add(diff_time, _feed_event, NULL); 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 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; return EINA_TRUE;
} }
static Eina_Bool static int
_prg_invoke(const char *full_path, int argc, char **argv) _prg_invoke(const char *full_path, int argc, char **argv)
{ {
Eina_Value *ret__; 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); fprintf(stderr, "Failed loading %s.\n", full_path);
if (h) eina_module_free(h); if (h) eina_module_free(h);
return EINA_FALSE; return 1;
} }
efl_main = eina_module_symbol_get(h, "efl_main"); efl_main = eina_module_symbol_get(h, "efl_main");
elm_main = eina_module_symbol_get(h, "elm_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); fprintf(stderr, "Failed loading symbol 'evas_new' from %s.\n", full_path);
eina_module_free(h); eina_module_free(h);
return EINA_FALSE; return 1;
} }
_rec_open(); if (_src_open())
if (efl_main)
{ {
elm_init(argc, argv); if (efl_main)
efl_event_callback_add(efl_main_loop_get(), EFL_LOOP_EVENT_ARGUMENTS, efl_main, NULL); {
ret__ = efl_loop_begin(efl_main_loop_get()); elm_init(argc, argv);
real__ = efl_loop_exit_code_process(ret__); efl_event_callback_add(efl_main_loop_get(), EFL_LOOP_EVENT_ARGUMENTS, efl_main, NULL);
elm_shutdown(); ret__ = efl_loop_begin(efl_main_loop_get());
} real__ = efl_loop_exit_code_process(ret__);
else if (elm_main) elm_shutdown();
{ }
elm_init(argc, argv); else if (elm_main)
real__ = elm_main(argc, argv); {
elm_shutdown(); elm_init(argc, argv);
} real__ = elm_main(argc, argv);
else if (c_main) elm_shutdown();
{ }
real__ = c_main(argc, argv); else if (c_main)
} {
else real__ = c_main(argc, argv);
{ }
fprintf(stderr, "Failed loading symbol 'efl_main', 'elm_main' or 'main' from %s.\n", full_path); else
eina_module_free(h); {
real__ = 1; 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__; return real__;
} }
@ -541,6 +571,7 @@ int main(int argc, char **argv)
const char *engine = "buffer"; const char *engine = "buffer";
eina_init(); eina_init();
eet_init();
opterr = 0; opterr = 0;
for (int opt; (opt = getopt(argc, argv, "+so:vt:h")) != -1;) 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); _dest = eina_stringshare_add(optarg);
if (!strcmp(_dest + strlen(_dest) - 4,".exu")) if (!strcmp(_dest + strlen(_dest) - 4,".exu"))
{ {
_dest_type = DEST_EXU; _dest_type = FTYPE_EXU;
if (!_mkdir(_dest, EINA_TRUE)) if (!_mkdir(_dest, EINA_TRUE))
{ {
fprintf(stderr, "Path for %s cannot be created\n", _dest); fprintf(stderr, "Path for %s cannot be created\n", _dest);
@ -567,7 +598,7 @@ int main(int argc, char **argv)
} }
else else
{ {
_dest_type = DEST_DIR; _dest_type = FTYPE_DIR;
if (!_mkdir(_dest, EINA_FALSE)) if (!_mkdir(_dest, EINA_FALSE))
{ {
fprintf(stderr, "Directory %s cannot be created\n", _dest); fprintf(stderr, "Directory %s cannot be created\n", _dest);
@ -578,17 +609,22 @@ int main(int argc, char **argv)
} }
case 't': case 't':
{ {
_rec_filename = eina_stringshare_add(optarg); _src_filename = eina_stringshare_add(optarg);
if (_dest_type == DEST_UNKNOWN) 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"; _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 = "."; _dest = ".";
} }
} }
@ -618,21 +654,21 @@ int main(int argc, char **argv)
fprintf(stderr, "no program specified\nUse -h for more information\n"); fprintf(stderr, "no program specified\nUse -h for more information\n");
goto end; goto end;
} }
if (!_rec_filename) if (!_src_filename)
{ {
fprintf(stderr, "no test file specified\n"); fprintf(stderr, "no test file specified\n");
goto end; goto end;
} }
else else
{ {
char *slash = strrchr(_rec_filename, '/'); char *slash = strrchr(_src_filename, '/');
if (slash) _test_name = strdup(slash + 1); if (slash) _test_name = strdup(slash + 1);
else _test_name = strdup(_rec_filename); else _test_name = strdup(_src_filename);
char *dot = strrchr(_test_name, '.'); char *dot = strrchr(_test_name, '.');
if (dot) *dot = '\0'; if (dot) *dot = '\0';
} }
if (_dest_type == DEST_EXU) if (_dest_type == FTYPE_EXU)
{ {
_dest_unit = calloc(1, sizeof(*_dest_unit)); _dest_unit = calloc(1, sizeof(*_dest_unit));
} }
@ -655,19 +691,19 @@ int main(int argc, char **argv)
_printf(1, "\n"); _printf(1, "\n");
ecore_evas_callback_new_set(_my_evas_new); 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) 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_Data_Descriptor *unit_edd = unit_desc_make();
Eet_File *file = eet_open(_dest, EET_FILE_MODE_WRITE); Eet_File *file = eet_open(_dest, EET_FILE_MODE_WRITE);
eet_data_write(file, unit_edd, CACHE_FILE_ENTRY, _dest_unit, EINA_TRUE); eet_data_write(file, unit_edd, CACHE_FILE_ENTRY, _dest_unit, EINA_TRUE);
eet_close(file); eet_close(file);
} }
pret = 0;
end: end:
eet_shutdown();
eina_shutdown(); eina_shutdown();
return pret; return pret;
} }