efl/legacy/emotion/src/modules/vlc/emotion_vlc.h

185 lines
7.3 KiB
C

/*
* SICMA AERO SEAT
* code@ife-sit.info
*/
#ifndef EMOTION_VLC_H
#define EMOTION_VLC_H
#include <vlc/vlc.h>
#include <fcntl.h>
#include <pthread.h>
/* default values */
#define WIDTH 10
#define HEIGHT 10
/* internal values */
#define EVENT_BEG_ID 6
#define NB_EVENTS 14
/* checking macros */
#define ASSERT_EV(ev) if(!ev)
#define ASSERT_EV_M(ev) if(!ev->vlc_m)
#define ASSERT_EV_MP(ev) if(!ev->vlc_mp)
#define ASSERT_EV_VLC(ev) if(!ev->vlc_player)
#ifdef DEBUG
#define CATCH(ex) if(libvlc_exception_raised(ex)){ \
fprintf(stderr,"VLC EX [%s]::%s:%d %s\n", __FILE__,__func__,__LINE__, \
libvlc_exception_get_message(ex)); \
}libvlc_exception_clear(ex);
#else
#define CATCH(ex) libvlc_exception_clear(ex);
#endif
/* internal events */
#define VLC_NEW_FRAME 1
#define VLC_RESIZE 2
#define VLC_CHANGE_VOL 3
typedef struct _Emotion_Vlc_Video Emotion_Vlc_Video;
typedef struct _Emotion_Vlc_Video_Frame Emotion_Vlc_Video_Frame;
typedef struct _Emotion_Vlc_Event Emotion_Vlc_Event;
/* module api EMOTION --> VLC */
static unsigned char em_init (Evas_Object *obj, void **emotion_video, Emotion_Module_Options *opt);
static int em_shutdown (void *ef);
static unsigned char em_file_open (const char *file, Evas_Object *obj, void *ef);
static void em_file_close (void *ef);
static void em_play (void *ef, double pos);
static void em_stop (void *ef);
static void em_size_get (void *ef, int *w, int *h);
static void em_pos_set (void *ef, double pos);
static double em_len_get (void *ef);
static int em_fps_num_get (void *ef);
static int em_fps_den_get (void *ef);
static double em_fps_get (void *ef);
static double em_pos_get (void *ef);
static void em_vis_set (void *ef, Emotion_Vis vis);
static Emotion_Vis em_vis_get (void *ef);
static Eina_Bool em_vis_supported(void *ef, Emotion_Vis vis);
static double em_ratio_get (void *ef);
static int em_seekable (void *ef);
static void em_frame_done (void *ef);
static Emotion_Format em_format_get (void *ef);
static void em_video_data_size_get (void *ef, int *w, int *h);
static int em_yuv_rows_get (void *ef, int w, int h, unsigned char **yrows, unsigned char **urows, unsigned char **vrows);
static int em_bgra_data_get (void *ef, unsigned char **bgra_data);
static void em_event_feed (void *ef, int event);
static void em_event_mouse_button_feed (void *ef, int button, int x, int y);
static void em_event_mouse_move_feed (void *ef, int x, int y);
static int em_video_channel_count (void *ef);
static void em_video_channel_set (void *ef, int channel);
static int em_video_channel_get (void *ef);
static const char *em_video_channel_name_get (void *ef, int channel);
static void em_video_channel_mute_set (void *ef, int mute);
static int em_video_channel_mute_get (void *ef);
static int em_audio_channel_count (void *ef);
static void em_audio_channel_set (void *ef, int channel);
static int em_audio_channel_get (void *ef);
static const char *em_audio_channel_name_get (void *ef, int channel);
static void em_audio_channel_mute_set (void *ef, int mute);
static int em_audio_channel_mute_get (void *ef);
static void em_audio_channel_volume_set(void *ef, double vol);
static double em_audio_channel_volume_get(void *ef);
static int em_spu_channel_count (void *ef);
static void em_spu_channel_set (void *ef, int channel);
static int em_spu_channel_get (void *ef);
static const char *em_spu_channel_name_get (void *ef, int channel);
static void em_spu_channel_mute_set (void *ef, int mute);
static int em_spu_channel_mute_get (void *ef);
static int em_chapter_count (void *ef);
static void em_chapter_set (void *ef, int chapter);
static int em_chapter_get (void *ef);
static const char *em_chapter_name_get (void *ef, int chapter);
static void em_speed_set (void *ef, double speed);
static double em_speed_get (void *ef);
static int em_eject (void *ef);
static const char *em_meta_get (void *ef, int meta);
/* entry points for module */
unsigned char module_open(Evas_Object *obj, const Emotion_Video_Module **module, void **video, Emotion_Module_Options *opt);
void module_close(Emotion_Video_Module *module, void *video);
typedef struct _vlc_event_t {
libvlc_event_type_t type;
int data_length;
void * data;
} vlc_event_t;
/* emotion/vlc main structure */
struct _Emotion_Vlc_Video
{
/* vlc objects */
libvlc_instance_t * vlc_player;
libvlc_media_player_t * vlc_mp;
libvlc_media_t * vlc_m;
libvlc_exception_t * vlc_ex;
libvlc_event_manager_t * vlc_evtmngr;
/* vlc datas */
char clock[64], cunlock[64], cdata[64];
char width[32], height[32], pitch[32];
int fd_read, fd_write;
int fd_slave_read, fd_slave_write;
Ecore_Fd_Handler *fd_handler;
char *filename;
volatile double len;
volatile double pos;
double fps;
double ratio;
int w, h;
Evas_Object *obj;
Emotion_Vlc_Video_Frame *cur_frame;
volatile int spu_channel;
volatile int audio_channel;
volatile int video_channel;
volatile int fq;
Emotion_Vis vis;
unsigned char play : 1;
unsigned char just_loaded : 1;
unsigned char video_mute : 1;
unsigned char audio_mute : 1;
unsigned char spu_mute : 1;
unsigned char opt_no_video : 1;
unsigned char opt_no_audio : 1;
volatile unsigned char delete_me : 1;
volatile unsigned char opening : 1;
volatile unsigned char closing : 1;
volatile unsigned char have_vo : 1;
volatile unsigned char play_ok : 1;
};
/* structure for frames 2 buffers to keep integrity */
struct _Emotion_Vlc_Video_Frame
{
unsigned char *frame;
unsigned char *frame_A;
unsigned char *frame_B;
pthread_mutex_t frame_copy_lock;
};
/* internal util calls */
static void *_em_lock (void *par);
static void _em_unlock (void *par);
static void _em_event (const libvlc_event_t *event, void* data);
static void _em_resize (Emotion_Vlc_Video *ev, int x, int y);
static int _em_fd_active (void *data, Ecore_Fd_Handler *fdh);
static int _em_reload_vlc (Emotion_Vlc_Video *ev);
void* _em_slave_thread (void * t);
/* internal event struct */
struct _Emotion_Vlc_Event
{
int type;
int mtype;
};
#endif