This example shows that some of the information available from the emotion object, like the media file play length, aspect ratio, etc. can be not available just after setting the file to the emotion object.
One callback is declared for each of the following signals, and some of the info about the file is displayed. Also notice that the order that these signals are emitted can change depending on the module being used. Following is the full source code of this example:
#ifndef EFL_BETA_API_SUPPORT
# define EFL_BETA_API_SUPPORT
#endif
#include <Ecore.h>
#include <Evas.h>
#include <stdio.h>
#define WIDTH (320)
#define HEIGHT (240)
static void
{
int w, h;
printf("meta title: %s\n",
printf("seek position: %0.3f\n",
printf("play length: %0.3f\n",
printf("is seekable: %d\n",
printf("video geometry: %dx%d\n", w, h);
printf("video width / height ratio: %0.3f\n",
printf("\n");
}
static void
_playback_started_cb(
void *data
EINA_UNUSED,
const Efl_Event *ev)
{
printf(">>> Emotion object started playback.\n");
_display_info(ev->object);
}
static void
_playback_finished_cb(
void *data
EINA_UNUSED,
const Efl_Event *ev)
{
printf(">>> Emotion object finished playback.\n");
_display_info(ev->object);
}
static void
_open_done_cb(
void *data
EINA_UNUSED,
const Efl_Event *ev)
{
printf(">>> Emotion object open done.\n");
_display_info(ev->object);
}
static void
_position_update_cb(
void *data
EINA_UNUSED,
const Efl_Event *ev)
{
printf(">>> Emotion object first position update.\n");
efl_event_callback_del(ev->object, EFL_CANVAS_VIDEO_EVENT_POSITION_CHANGE, _position_update_cb, NULL);
_display_info(ev->object);
}
static void
_frame_decode_cb(
void *data
EINA_UNUSED,
const Efl_Event *ev)
{
printf(">>> Emotion object first frame decode.\n");
efl_event_callback_del(ev->object, EFL_CANVAS_VIDEO_EVENT_FRAME_DECODE, _frame_decode_cb, NULL);
_display_info(ev->object);
}
static void
_decode_stop_cb(
void *data
EINA_UNUSED,
const Efl_Event *ev)
{
printf(">>> Emotion object decode stop.\n");
_display_info(ev->object);
}
static void
_frame_resize_cb(
void *data
EINA_UNUSED,
const Efl_Event *ev)
{
printf(">>> Emotion object frame resize.\n");
_display_info(ev->object);
}
EFL_CALLBACKS_ARRAY_DEFINE(emotion_object_example_callbacks,
{ EFL_CANVAS_VIDEO_EVENT_PLAYBACK_START, _playback_started_cb },
{ EFL_CANVAS_VIDEO_EVENT_PLAYBACK_STOP, _playback_finished_cb },
{ EFL_CANVAS_VIDEO_EVENT_OPEN_DONE, _open_done_cb },
{ EFL_CANVAS_VIDEO_EVENT_POSITION_CHANGE, _position_update_cb },
{ EFL_CANVAS_VIDEO_EVENT_FRAME_DECODE, _frame_decode_cb },
{ EFL_CANVAS_VIDEO_EVENT_PLAYBACK_STOP, _decode_stop_cb },
{ EFL_CANVAS_VIDEO_EVENT_FRAME_RESIZE, _frame_resize_cb });
int
main(int argc, const char *argv[])
{
Ecore_Evas *ee;
const char *filename = NULL;
const char *module = NULL;
if (argc < 2)
{
printf("At least one argument is necessary. Usage:\n");
printf("\t%s <filename> [module_name]\n", argv[0]);
goto error;
}
filename = argv[1];
if (argc >= 3)
module = argv[2];
return EXIT_FAILURE;
if (!ee)
goto error;
if (!emotion_object_init(em, module))
fprintf(stderr, "Emotion: \"%s\" module could not be initialized.\n", module);
_display_info(em);
efl_event_callback_array_add(em, emotion_object_example_callbacks(), NULL);
fprintf(stderr, "Emotion: Could not load the file \"%s\"\n", filename);
return 0;
error:
return -1;
}