some fixes/improvements to emotion -> foound some buggers in xine -
tried making gst do it - should kind of work. i think gst is broken tho. SVN revision: 52800
This commit is contained in:
parent
b04f0b0360
commit
2d488b5d32
|
@ -118,6 +118,8 @@ EAPI void _emotion_frame_new(Evas_Object *obj);
|
||||||
EAPI void _emotion_video_pos_update(Evas_Object *obj, double pos, double len);
|
EAPI void _emotion_video_pos_update(Evas_Object *obj, double pos, double len);
|
||||||
EAPI void _emotion_frame_resize(Evas_Object *obj, int w, int h, double ratio);
|
EAPI void _emotion_frame_resize(Evas_Object *obj, int w, int h, double ratio);
|
||||||
EAPI void _emotion_decode_stop(Evas_Object *obj);
|
EAPI void _emotion_decode_stop(Evas_Object *obj);
|
||||||
|
EAPI void _emotion_open_done(Evas_Object *obj);
|
||||||
|
EAPI void _emotion_playback_started(Evas_Object *obj);
|
||||||
EAPI void _emotion_playback_finished(Evas_Object *obj);
|
EAPI void _emotion_playback_finished(Evas_Object *obj);
|
||||||
EAPI void _emotion_audio_level_change(Evas_Object *obj);
|
EAPI void _emotion_audio_level_change(Evas_Object *obj);
|
||||||
EAPI void _emotion_channels_change(Evas_Object *obj);
|
EAPI void _emotion_channels_change(Evas_Object *obj);
|
||||||
|
|
|
@ -47,6 +47,7 @@ struct _Smart_Data
|
||||||
|
|
||||||
unsigned char play : 1;
|
unsigned char play : 1;
|
||||||
unsigned char seek : 1;
|
unsigned char seek : 1;
|
||||||
|
unsigned char seeking : 1;
|
||||||
|
|
||||||
char *title;
|
char *title;
|
||||||
struct {
|
struct {
|
||||||
|
@ -99,6 +100,7 @@ static const char SIG_POSITION_UPDATE[] = "position_update";
|
||||||
static const char SIG_LENGTH_CHANGE[] = "length_change";
|
static const char SIG_LENGTH_CHANGE[] = "length_change";
|
||||||
static const char SIG_FRAME_RESIZE[] = "frame_resize";
|
static const char SIG_FRAME_RESIZE[] = "frame_resize";
|
||||||
static const char SIG_DECODE_STOP[] = "decode_stop";
|
static const char SIG_DECODE_STOP[] = "decode_stop";
|
||||||
|
static const char SIG_PLAYBACK_STARTED[] = "playback_started";
|
||||||
static const char SIG_PLAYBACK_FINISHED[] = "playback_finished";
|
static const char SIG_PLAYBACK_FINISHED[] = "playback_finished";
|
||||||
static const char SIG_AUDIO_LEVEL_CHANGE[] = "audio_level_change";
|
static const char SIG_AUDIO_LEVEL_CHANGE[] = "audio_level_change";
|
||||||
static const char SIG_CHANNELS_CHANGE[] = "channels_change";
|
static const char SIG_CHANNELS_CHANGE[] = "channels_change";
|
||||||
|
@ -107,12 +109,14 @@ static const char SIG_PROGRESS_CHANGE[] = "progress_change";
|
||||||
static const char SIG_REF_CHANGE[] = "ref_change";
|
static const char SIG_REF_CHANGE[] = "ref_change";
|
||||||
static const char SIG_BUTTON_NUM_CHANGE[] = "button_num_change";
|
static const char SIG_BUTTON_NUM_CHANGE[] = "button_num_change";
|
||||||
static const char SIG_BUTTON_CHANGE[] = "button_change";
|
static const char SIG_BUTTON_CHANGE[] = "button_change";
|
||||||
|
static const char SIG_OPEN_DONE[] = "open_done";
|
||||||
static const Evas_Smart_Cb_Description _smart_callbacks[] = {
|
static const Evas_Smart_Cb_Description _smart_callbacks[] = {
|
||||||
{SIG_FRAME_DECODE, ""},
|
{SIG_FRAME_DECODE, ""},
|
||||||
{SIG_POSITION_UPDATE, ""},
|
{SIG_POSITION_UPDATE, ""},
|
||||||
{SIG_LENGTH_CHANGE, ""},
|
{SIG_LENGTH_CHANGE, ""},
|
||||||
{SIG_FRAME_RESIZE, ""},
|
{SIG_FRAME_RESIZE, ""},
|
||||||
{SIG_DECODE_STOP, ""},
|
{SIG_DECODE_STOP, ""},
|
||||||
|
{SIG_PLAYBACK_STARTED, ""},
|
||||||
{SIG_PLAYBACK_FINISHED, ""},
|
{SIG_PLAYBACK_FINISHED, ""},
|
||||||
{SIG_AUDIO_LEVEL_CHANGE, ""},
|
{SIG_AUDIO_LEVEL_CHANGE, ""},
|
||||||
{SIG_CHANNELS_CHANGE, ""},
|
{SIG_CHANNELS_CHANGE, ""},
|
||||||
|
@ -121,6 +125,7 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
|
||||||
{SIG_REF_CHANGE, ""},
|
{SIG_REF_CHANGE, ""},
|
||||||
{SIG_BUTTON_NUM_CHANGE, ""},
|
{SIG_BUTTON_NUM_CHANGE, ""},
|
||||||
{SIG_BUTTON_CHANGE, ""},
|
{SIG_BUTTON_CHANGE, ""},
|
||||||
|
{SIG_OPEN_DONE, ""},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1013,6 +1018,18 @@ _emotion_decode_stop(Evas_Object *obj)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EAPI void
|
||||||
|
_emotion_open_done(Evas_Object *obj)
|
||||||
|
{
|
||||||
|
evas_object_smart_callback_call(obj, SIG_OPEN_DONE, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI void
|
||||||
|
_emotion_playback_started(Evas_Object *obj)
|
||||||
|
{
|
||||||
|
evas_object_smart_callback_call(obj, SIG_PLAYBACK_STARTED, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
_emotion_playback_finished(Evas_Object *obj)
|
_emotion_playback_finished(Evas_Object *obj)
|
||||||
{
|
{
|
||||||
|
@ -1089,6 +1106,20 @@ _emotion_spu_button_set(Evas_Object *obj, int button)
|
||||||
evas_object_smart_callback_call(obj, SIG_BUTTON_CHANGE, NULL);
|
evas_object_smart_callback_call(obj, SIG_BUTTON_CHANGE, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EAPI void
|
||||||
|
_emotion_seek_done(Evas_Object *obj)
|
||||||
|
{
|
||||||
|
Smart_Data *sd;
|
||||||
|
|
||||||
|
E_SMART_OBJ_GET(sd, obj, E_OBJ_NAME);
|
||||||
|
if (sd->seeking)
|
||||||
|
{
|
||||||
|
sd->seeking = 0;
|
||||||
|
if (sd->seek) emotion_object_position_set(obj, sd->seek_pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/****************************/
|
/****************************/
|
||||||
/* Internal object routines */
|
/* Internal object routines */
|
||||||
|
@ -1143,8 +1174,10 @@ _pos_set_job(void *data)
|
||||||
obj = data;
|
obj = data;
|
||||||
E_SMART_OBJ_GET(sd, obj, E_OBJ_NAME);
|
E_SMART_OBJ_GET(sd, obj, E_OBJ_NAME);
|
||||||
sd->job = NULL;
|
sd->job = NULL;
|
||||||
|
if (sd->seeking) return;
|
||||||
if (sd->seek)
|
if (sd->seek)
|
||||||
{
|
{
|
||||||
|
sd->seeking = 1;
|
||||||
sd->module->pos_set(sd->video, sd->seek_pos);
|
sd->module->pos_set(sd->video, sd->seek_pos);
|
||||||
sd->seek = 0;
|
sd->seek = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -441,6 +441,7 @@ em_file_open(const char *file,
|
||||||
em_audio_channel_volume_set(ev, ev->volume);
|
em_audio_channel_volume_set(ev, ev->volume);
|
||||||
|
|
||||||
_eos_timer_fct(ev);
|
_eos_timer_fct(ev);
|
||||||
|
_emotion_open_done(ev->obj);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -498,6 +499,7 @@ em_play(void *video,
|
||||||
ev = (Emotion_Gstreamer_Video *)video;
|
ev = (Emotion_Gstreamer_Video *)video;
|
||||||
gst_element_set_state(ev->pipeline, GST_STATE_PLAYING);
|
gst_element_set_state(ev->pipeline, GST_STATE_PLAYING);
|
||||||
ev->play = 1;
|
ev->play = 1;
|
||||||
|
ev->play_started = 1;
|
||||||
|
|
||||||
/* eos */
|
/* eos */
|
||||||
ev->eos_timer = ecore_timer_add(0.1, _eos_timer_fct, ev);
|
ev->eos_timer = ecore_timer_add(0.1, _eos_timer_fct, ev);
|
||||||
|
@ -1385,6 +1387,11 @@ _eos_timer_fct(void *data)
|
||||||
GstMessage *msg;
|
GstMessage *msg;
|
||||||
|
|
||||||
ev = (Emotion_Gstreamer_Video *)data;
|
ev = (Emotion_Gstreamer_Video *)data;
|
||||||
|
if (ev->play_started)
|
||||||
|
{
|
||||||
|
_emotion_playback_started(ev->obj);
|
||||||
|
ev->play_started = 0;
|
||||||
|
}
|
||||||
while ((msg = gst_bus_poll(ev->eos_bus, GST_MESSAGE_ERROR | GST_MESSAGE_EOS | GST_MESSAGE_TAG, 0)))
|
while ((msg = gst_bus_poll(ev->eos_bus, GST_MESSAGE_ERROR | GST_MESSAGE_EOS | GST_MESSAGE_TAG, 0)))
|
||||||
{
|
{
|
||||||
switch (GST_MESSAGE_TYPE(msg))
|
switch (GST_MESSAGE_TYPE(msg))
|
||||||
|
|
|
@ -87,6 +87,7 @@ struct _Emotion_Gstreamer_Video
|
||||||
Emotion_Vis vis;
|
Emotion_Vis vis;
|
||||||
|
|
||||||
unsigned char play : 1;
|
unsigned char play : 1;
|
||||||
|
unsigned char play_started : 1;
|
||||||
unsigned char video_mute : 1;
|
unsigned char video_mute : 1;
|
||||||
unsigned char audio_mute : 1;
|
unsigned char audio_mute : 1;
|
||||||
};
|
};
|
||||||
|
|
|
@ -430,7 +430,14 @@ em_shutdown(void *ef)
|
||||||
ev->delete_me = 1;
|
ev->delete_me = 1;
|
||||||
printf("EXM del fds %p\n", ev);
|
printf("EXM del fds %p\n", ev);
|
||||||
ecore_main_fd_handler_del(ev->fd_handler);
|
ecore_main_fd_handler_del(ev->fd_handler);
|
||||||
|
ev->fd_handler = NULL;
|
||||||
ecore_main_fd_handler_del(ev->fd_ev_handler);
|
ecore_main_fd_handler_del(ev->fd_ev_handler);
|
||||||
|
ev->fd_ev_handler = NULL;
|
||||||
|
if (ev->anim)
|
||||||
|
{
|
||||||
|
ecore_animator_del(ev->anim);
|
||||||
|
ev->anim = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ev->closing = 1;
|
ev->closing = 1;
|
||||||
_em_slave_event(ev, 3, NULL);
|
_em_slave_event(ev, 3, NULL);
|
||||||
|
@ -1218,6 +1225,16 @@ _em_module_event(void *data, int type)
|
||||||
write(ev->fd_ev_write, buf, sizeof(buf));
|
write(ev->fd_ev_write, buf, sizeof(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Eina_Bool
|
||||||
|
_em_audio_only_poller(void *data)
|
||||||
|
{
|
||||||
|
Emotion_Xine_Video *ev;
|
||||||
|
|
||||||
|
ev = data;
|
||||||
|
_em_get_pos_len(ev);
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_em_fd_ev_active(void *data, Ecore_Fd_Handler *fdh)
|
_em_fd_ev_active(void *data, Ecore_Fd_Handler *fdh)
|
||||||
{
|
{
|
||||||
|
@ -1243,20 +1260,55 @@ _em_fd_ev_active(void *data, Ecore_Fd_Handler *fdh)
|
||||||
break;
|
break;
|
||||||
case 2: /* open done */
|
case 2: /* open done */
|
||||||
ev->play_ok = 1;
|
ev->play_ok = 1;
|
||||||
|
if (ev->anim)
|
||||||
|
{
|
||||||
|
ecore_animator_del(ev->anim);
|
||||||
|
ev->anim = NULL;
|
||||||
|
}
|
||||||
|
_emotion_open_done(ev->obj);
|
||||||
break;
|
break;
|
||||||
case 3: /* shutdown done */
|
case 3: /* shutdown done */
|
||||||
|
if (ev->anim)
|
||||||
|
{
|
||||||
|
ecore_animator_del(ev->anim);
|
||||||
|
ev->anim = NULL;
|
||||||
|
}
|
||||||
ev->play_ok = 1;
|
ev->play_ok = 1;
|
||||||
break;
|
break;
|
||||||
case 4: /* play done */
|
case 4: /* play done */
|
||||||
ev->play_ok = 1;
|
ev->play_ok = 1;
|
||||||
|
if (ev->anim)
|
||||||
|
{
|
||||||
|
ecore_animator_del(ev->anim);
|
||||||
|
ev->anim = NULL;
|
||||||
|
}
|
||||||
|
if ((!(xine_get_stream_info(ev->stream, XINE_STREAM_INFO_HAS_VIDEO) &&
|
||||||
|
xine_get_stream_info(ev->stream, XINE_STREAM_INFO_VIDEO_HANDLED))) &&
|
||||||
|
(xine_get_stream_info(ev->stream, XINE_STREAM_INFO_HAS_AUDIO) &&
|
||||||
|
xine_get_stream_info(ev->stream, XINE_STREAM_INFO_AUDIO_HANDLED)))
|
||||||
|
ev->anim = ecore_animator_add(_em_audio_only_poller, ev);
|
||||||
|
_emotion_playback_started(ev->obj);
|
||||||
break;
|
break;
|
||||||
case 5: /* stop done */
|
case 5: /* stop done */
|
||||||
|
if (ev->anim)
|
||||||
|
{
|
||||||
|
ecore_animator_del(ev->anim);
|
||||||
|
ev->anim = NULL;
|
||||||
|
}
|
||||||
ev->play_ok = 1;
|
ev->play_ok = 1;
|
||||||
break;
|
break;
|
||||||
case 6: /* seek done */
|
case 6: /* seek done */
|
||||||
ev->play_ok = 1;
|
ev->play_ok = 1;
|
||||||
|
_emotion_seek_done(ev->obj);
|
||||||
|
_em_get_pos_len(ev);
|
||||||
|
_emotion_video_pos_update(ev->obj, ev->pos, ev->len);
|
||||||
break;
|
break;
|
||||||
case 7: /* eject done */
|
case 7: /* eject done */
|
||||||
|
if (ev->anim)
|
||||||
|
{
|
||||||
|
ecore_animator_del(ev->anim);
|
||||||
|
ev->anim = NULL;
|
||||||
|
}
|
||||||
ev->play_ok = 1;
|
ev->play_ok = 1;
|
||||||
break;
|
break;
|
||||||
case 8: /* spu mute done */
|
case 8: /* spu mute done */
|
||||||
|
@ -1269,8 +1321,20 @@ _em_fd_ev_active(void *data, Ecore_Fd_Handler *fdh)
|
||||||
ev->play_ok = 1;
|
ev->play_ok = 1;
|
||||||
break;
|
break;
|
||||||
case 11: /* close done */
|
case 11: /* close done */
|
||||||
|
if (ev->anim)
|
||||||
|
{
|
||||||
|
ecore_animator_del(ev->anim);
|
||||||
|
ev->anim = NULL;
|
||||||
|
}
|
||||||
ev->play_ok = 1;
|
ev->play_ok = 1;
|
||||||
break;
|
break;
|
||||||
|
case 15: /* get pos done */
|
||||||
|
if (ev->last_pos != ev->pos)
|
||||||
|
{
|
||||||
|
ev->last_pos = ev->pos;
|
||||||
|
_emotion_video_pos_update(ev->obj, ev->pos, ev->len);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1409,6 +1473,7 @@ _em_get_pos_len_th(void *par)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ev->get_poslen = 0;
|
ev->get_poslen = 0;
|
||||||
|
_em_module_event(ev, 15); /* event - getpos done */
|
||||||
//printf("get pos %3.3f\n", ev->pos);
|
//printf("get pos %3.3f\n", ev->pos);
|
||||||
}
|
}
|
||||||
if (ev->delete_me)
|
if (ev->delete_me)
|
||||||
|
@ -1424,7 +1489,6 @@ static void
|
||||||
_em_get_pos_len(Emotion_Xine_Video *ev)
|
_em_get_pos_len(Emotion_Xine_Video *ev)
|
||||||
{
|
{
|
||||||
if (!ev->play_ok) return;
|
if (!ev->play_ok) return;
|
||||||
if (ev->get_poslen) return;
|
|
||||||
ev->get_poslen = 1;
|
ev->get_poslen = 1;
|
||||||
pthread_mutex_lock(&(ev->get_pos_len_mutex));
|
pthread_mutex_lock(&(ev->get_pos_len_mutex));
|
||||||
pthread_cond_broadcast(&(ev->get_pos_len_cond));
|
pthread_cond_broadcast(&(ev->get_pos_len_cond));
|
||||||
|
|
|
@ -20,6 +20,7 @@ struct _Emotion_Xine_Video
|
||||||
xine_event_queue_t *queue;
|
xine_event_queue_t *queue;
|
||||||
volatile double len;
|
volatile double len;
|
||||||
volatile double pos;
|
volatile double pos;
|
||||||
|
volatile double last_pos;
|
||||||
volatile double volume;
|
volatile double volume;
|
||||||
double fps;
|
double fps;
|
||||||
double ratio;
|
double ratio;
|
||||||
|
@ -32,12 +33,13 @@ struct _Emotion_Xine_Video
|
||||||
volatile int video_channel;
|
volatile int video_channel;
|
||||||
volatile int fq;
|
volatile int fq;
|
||||||
Emotion_Vis vis;
|
Emotion_Vis vis;
|
||||||
int fd_read;
|
int fd_read;
|
||||||
int fd_write;
|
int fd_write;
|
||||||
Ecore_Fd_Handler *fd_handler;
|
Ecore_Fd_Handler *fd_handler;
|
||||||
int fd_ev_read;
|
int fd_ev_read;
|
||||||
int fd_ev_write;
|
int fd_ev_write;
|
||||||
Ecore_Fd_Handler *fd_ev_handler;
|
Ecore_Fd_Handler *fd_ev_handler;
|
||||||
|
Ecore_Animator *anim;
|
||||||
unsigned char play : 1;
|
unsigned char play : 1;
|
||||||
unsigned char just_loaded : 1;
|
unsigned char just_loaded : 1;
|
||||||
unsigned char video_mute : 1;
|
unsigned char video_mute : 1;
|
||||||
|
|
Loading…
Reference in New Issue