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
{
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,22 +371,47 @@ _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;
Eet_File *file = eet_open(_src_filename, EET_FILE_MODE_READ);
if (!file)
{
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
{
_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 > _events_list->first_timestamp)
diff_time = (current_event_time - _events_list->first_timestamp) / 1000.0;
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__, _events_list->first_timestamp, current_event_time);
_printf(2, "%s first_time_stamp=<%u> current_event_time=<%u>\n", __func__, first_tm, current_event_time);
if (diff_time)
{
@ -395,11 +422,10 @@ _rec_open()
{
_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,10 +449,11 @@ _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 (_src_open())
{
if (efl_main)
{
elm_init(argc, argv);
@ -451,6 +478,9 @@ _prg_invoke(const char *full_path, int argc, char **argv)
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"))
{
_dest_type = DEST_DIR;
_src_type = FTYPE_REC;
if (_dest_type == FTYPE_UNKNOWN)
{
_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;
}