1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3  * gmtk_media_player.h
4  * Copyright (C) Kevin DeKorte 2009 <kdekorte@gmail.com>
5  *
6  * gmtk_media_player.h is free software.
7  *
8  * You may redistribute it and/or modify it under the terms of the
9  * GNU General Public License, as published by the Free Software
10  * Foundation; either version 2 of the License, or (at your option)
11  * any later version.
12  *
13  * gmtk_media_tracker.h is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16  * See the GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with playlist.c.  If not, write to:
20  * 	The Free Software Foundation, Inc.,
21  * 	51 Franklin Street, Fifth Floor
22  * 	Boston, MA  02110-1301, USA.
23  */
24 
25 #ifdef HAVE_CONFIG_H
26 #include <config.h>
27 #endif
28 #include <gtk/gtk.h>
29 #include <gdk/gdk.h>
30 #ifdef X11_ENABLED
31 #include <gdk/gdkx.h>
32 #ifdef GTK3_ENABLED
33 #include <gtk/gtkx.h>
34 #endif
35 #endif
36 #ifdef GTK3_ENABLED
37 #include <gdk/gdkkeysyms-compat.h>
38 #include <cairo.h>
39 #else
40 #include <gdk/gdkkeysyms.h>
41 #endif
42 #include <glib/gstdio.h>
43 #include <glib/gi18n.h>
44 #include <math.h>
45 
46 #ifndef __GMTK_MEDIA_PLAYER_H__
47 #define __GMTK_MEDIA_PLAYER_H__
48 
49 #ifndef GSEAL
50 #ifdef GSEAL_ENABLE
51 #define GSEAL(ident)      _g_sealed__ ## ident
52 #else
53 #define GSEAL(ident)      ident
54 #endif
55 #endif
56 
57 G_BEGIN_DECLS
58 #define GMTK_TYPE_MEDIA_PLAYER		(gmtk_media_player_get_type ())
59 #define GMTK_MEDIA_PLAYER(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), GMTK_TYPE_MEDIA_PLAYER, GmtkMediaPlayer))
60 #define GMTK_MEDIA_PLAYER_CLASS(obj)	(G_TYPE_CHECK_CLASS_CAST ((obj), GMTK_MEDIA_PLAYER, GmtkMediaPlayerClass))
61 #define GMTK_IS_MEDIA_PLAYER(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMTK_TYPE_MEDIA_PLAYER))
62 #define GMTK_IS_MEDIA_PLAYER_CLASS(obj)	(G_TYPE_CHECK_CLASS_TYPE ((obj), GMTK_TYPE_MEDIA_PLAYER))
63 #define GMTK_MEDIA_PLAYER_GET_CLASS	(G_TYPE_INSTANCE_GET_CLASS ((obj), GMTK_TYPE_MEDIA_PLAYER, GmtkMediaPlayerClass))
64     typedef enum {
65     PLAYER_STATE_DEAD,
66     PLAYER_STATE_RUNNING
67 } GmtkMediaPlayerPlayerState;
68 
69 typedef enum {
70     NO_ERROR,
71     ERROR_RETRY_WITH_PLAYLIST,
72     ERROR_RETRY_WITH_HTTP,
73     ERROR_RETRY_WITH_HTTP_AND_PLAYLIST,
74     ERROR_RETRY_WITH_MMSHTTP,
75     ERROR_RETRY_WITHOUT_DIVX_VDPAU,
76     ERROR_RETRY_WITHOUT_XVMC,
77     ERROR_RETRY_ALSA_BUSY,
78     ERROR_RETRY_VDPAU,
79     ERROR_RETRY_WITHOUT_HARDWARE_CODECS,
80     ERROR_RETRY,
81     ERROR_RETRY_WITHOUT_AF_EXPORT
82 } GmtkMediaPlayerPlaybackError;
83 
84 typedef enum {
85     MEDIA_STATE_UNKNOWN,
86     MEDIA_STATE_PLAY,
87     MEDIA_STATE_PAUSE,
88     MEDIA_STATE_STOP,
89     MEDIA_STATE_QUIT,
90     MEDIA_STATE_BUFFERING
91 } GmtkMediaPlayerMediaState;
92 
93 typedef enum {
94     ASPECT_DEFAULT,
95     ASPECT_4X3,
96     ASPECT_16X9,
97     ASPECT_16X10,
98     ASPECT_WINDOW,
99     ASPECT_ANAMORPHIC           // 2.39:1
100 } GmtkMediaPlayerAspectRatio;
101 
102 typedef enum {
103     ATTRIBUTE_LENGTH,
104     ATTRIBUTE_POSITION,
105     ATTRIBUTE_POSITION_PERCENT,
106     ATTRIBUTE_CACHE_PERCENT,
107     ATTRIBUTE_START_TIME,
108     ATTRIBUTE_RUN_TIME,
109     ATTRIBUTE_SIZE,
110     ATTRIBUTE_WIDTH,
111     ATTRIBUTE_HEIGHT,
112     ATTRIBUTE_VIDEO_PRESENT,
113     ATTRIBUTE_VO,
114     ATTRIBUTE_AO,
115     ATTRIBUTE_AUDIO_CHANNELS,
116     ATTRIBUTE_MEDIA_DEVICE,
117     ATTRIBUTE_EXTRA_OPTS,
118     ATTRIBUTE_ALSA_MIXER,
119     ATTRIBUTE_HARDWARE_AC3,
120     ATTRIBUTE_SOFTVOL,
121     ATTRIBUTE_VOLUME_GAIN,
122     ATTRIBUTE_MUTED,
123     ATTRIBUTE_CACHE_SIZE,
124     ATTRIBUTE_FORCE_CACHE,
125     ATTRIBUTE_SUB_VISIBLE,
126     ATTRIBUTE_SUBS_EXIST,
127     ATTRIBUTE_SUB_COUNT,
128     ATTRIBUTE_AUDIO_TRACK_COUNT,
129     ATTRIBUTE_AF_EXPORT_FILENAME,
130     ATTRIBUTE_BRIGHTNESS,
131     ATTRIBUTE_CONTRAST,
132     ATTRIBUTE_GAMMA,
133     ATTRIBUTE_HUE,
134     ATTRIBUTE_SATURATION,
135     ATTRIBUTE_SEEKABLE,
136     ATTRIBUTE_CHAPTERS,
137     ATTRIBUTE_HAS_CHAPTERS,
138     ATTRIBUTE_TITLE_IS_MENU,
139     ATTRIBUTE_AUDIO_TRACK,
140     ATTRIBUTE_SUBTITLE,
141     ATTRIBUTE_VIDEO_FORMAT,
142     ATTRIBUTE_VIDEO_CODEC,
143     ATTRIBUTE_VIDEO_FPS,
144     ATTRIBUTE_VIDEO_BITRATE,
145     ATTRIBUTE_AUDIO_FORMAT,
146     ATTRIBUTE_AUDIO_CODEC,
147     ATTRIBUTE_AUDIO_BITRATE,
148     ATTRIBUTE_AUDIO_RATE,
149     ATTRIBUTE_AUDIO_NCH,
150     ATTRIBUTE_AUDIO_DELAY,
151     ATTRIBUTE_DISABLE_UPSCALING,
152     ATTRIBUTE_MPLAYER_BINARY,
153     ATTRIBUTE_ZOOM,
154     ATTRIBUTE_SPEED_MULTIPLIER,
155     ATTRIBUTE_DEINTERLACE,
156     ATTRIBUTE_OSDLEVEL,
157     ATTRIBUTE_POST_PROCESSING_LEVEL,
158     ATTRIBUTE_AUDIO_TRACK_FILE,
159     ATTRIBUTE_SUBTITLE_FILE,
160     ATTRIBUTE_ENABLE_ADVANCED_SUBTITLES,
161     ATTRIBUTE_SUBTITLE_MARGIN,
162     ATTRIBUTE_ENABLE_EMBEDDED_FONTS,
163     ATTRIBUTE_SUBTITLE_FONT,
164     ATTRIBUTE_SUBTITLE_OUTLINE,
165     ATTRIBUTE_SUBTITLE_SHADOW,
166     ATTRIBUTE_SUBTITLE_SCALE,
167     ATTRIBUTE_SUBTITLE_COLOR,
168     ATTRIBUTE_SUBTITLE_CODEPAGE,
169     ATTRIBUTE_SUBTITLE_DELAY,
170     ATTRIBUTE_SUBTITLE_POSITION,
171     ATTRIBUTE_SUBTITLE_FUZZINESS,
172     ATTRIBUTE_PLAYLIST,
173     ATTRIBUTE_MESSAGE,
174     ATTRIBUTE_ENABLE_DEBUG,
175     ATTRIBUTE_ENABLE_FRAME_DROP,
176     ATTRIBUTE_TITLE,
177     ATTRIBUTE_ARTIST,
178     ATTRIBUTE_ALBUM,
179     ATTRIBUTE_RETRY_ON_FULL_CACHE,
180     ATTRIBUTE_ENABLE_HARDWARE_CODECS,
181     ATTRIBUTE_ENABLE_CRYSTALHD_CODECS,
182     ATTRIBUTE_PROFILE,
183     ATTRIBUTE_PREFERRED_AUDIO_LANGUAGE,
184     ATTRIBUTE_PREFERRED_SUBTITLE_LANGUAGE,
185     ATTRIBUTE_SPEED_SET,
186     ATTRIBUTE_GENRE
187 } GmtkMediaPlayerMediaAttributes;
188 
189 typedef enum {
190     SEEK_RELATIVE,
191     SEEK_PERCENT,
192     SEEK_ABSOLUTE
193 } GmtkMediaPlayerSeekType;
194 
195 typedef enum {
196     TYPE_FILE,
197     TYPE_CD,
198     TYPE_DVD,
199     TYPE_VCD,
200     TYPE_TV,
201     TYPE_PVR,
202     TYPE_DVB,
203     TYPE_CUE,
204     TYPE_NETWORK
205 } GmtkMediaPlayerMediaType;
206 
207 typedef enum {
208     COMMAND_SHOW_DVD_MENU,
209     COMMAND_TAKE_SCREENSHOT,
210     COMMAND_SWITCH_ANGLE,
211     COMMAND_SWITCH_AUDIO,
212     COMMAND_FRAME_STEP,
213     COMMAND_SUBTITLE_SELECT,
214     COMMAND_SWITCH_FRAME_DROP,
215     COMMAND_SUBTITLE_STEP_FORWARD,
216     COMMAND_SUBTITLE_STEP_BACKWARD
217 } GmtkMediaPlayerCommand;
218 
219 typedef enum {
220     EVENT_TYPE_INT,
221     EVENT_TYPE_DOUBLE,
222     EVENT_TYPE_BOOLEAN,
223     EVENT_TYPE_ALLOCATION,
224     EVENT_TYPE_STRING
225 } GmtkMediaPlayerEventType;
226 
227 typedef struct _GmtkMediaPlayer GmtkMediaPlayer;
228 typedef struct _GmtkMediaPlayerClass GmtkMediaPlayerClass;
229 
230 typedef struct _GmtkMediaPlayerSubtitle {
231     gint id;
232     gboolean is_file;
233     gchar *lang;
234     gchar *name;
235     gchar *label;
236 } GmtkMediaPlayerSubtitle;
237 
238 typedef struct _GmtkMediaPlayerAudioTrack {
239     gint id;
240     gboolean is_file;
241     gchar *lang;
242     gchar *name;
243     gchar *label;
244 } GmtkMediaPlayerAudioTrack;
245 
246 typedef struct _GmtkMediaPlayerEvent {
247     GmtkMediaPlayer *player;
248     GmtkMediaPlayerEventType type;
249     gchar *event_name;
250     gint event_data_int;
251     gdouble event_data_double;
252     gboolean event_data_boolean;
253     GtkAllocation *event_allocation;
254     gchar *event_data_string;
255 } GmtkMediaPlayerEvent;
256 
257 struct _GmtkMediaPlayer {
258     GtkEventBox parent;
259 
260     /*
261        GtkWidget *GSEAL(scale);
262        GtkWidget *GSEAL(hbox);
263        GtkWidget *GSEAL(message);
264        GtkWidget *GSEAL(timer);
265        GtkTooltips *GSEAL(progress_tip);
266      */
267     GtkWidget *alignment;
268     GtkWidget *socket;
269     gint socket_id;
270     gchar *uri;
271     gchar *message;
272     gdouble position;
273     gint video_width;
274     gint video_height;
275     gboolean video_present;
276     gint top, left;
277     gdouble length;
278     gdouble start_time;
279     gdouble run_time;
280     gdouble volume;
281     gboolean muted;
282     gchar *media_device;
283     gchar *extra_opts;
284     gboolean title_is_menu;
285     gchar *vo;
286     gchar *ao;
287     gchar *alsa_mixer;
288     gint audio_channels;
289     gboolean softvol;
290     gdouble volume_gain;
291     gdouble cache_size;
292     gdouble cache_percent;
293     gboolean force_cache;
294     gboolean sub_visible;
295     GList *subtitles;
296     GList *audio_tracks;
297     gint audio_track_id;
298     gint subtitle_source;
299     gint subtitle_id;
300     gint subtitle_is_file;
301     gchar *af_export_filename;
302     gchar *audio_track_file;
303     gchar *subtitle_file;
304     gint brightness;
305     gint contrast;
306     gint hue;
307     gint gamma;
308     gint saturation;
309     gint osdlevel;
310     gint post_processing_level;
311     gboolean seekable;
312     gint chapters;
313     gboolean has_chapters;
314     gchar *video_format;
315     gchar *video_codec;
316     gint video_bitrate;
317     gdouble video_fps;
318     gchar *audio_format;
319     gchar *audio_codec;
320     gint audio_bitrate;
321     gint audio_rate;
322     gint audio_nch;
323     gdouble audio_delay;
324     gboolean disable_upscaling;
325     gdouble zoom;
326     gdouble speed_multiplier;
327     gboolean playlist;
328     gchar *artist;
329     gchar *title;
330     gchar *album;
331     gchar *genre;
332     gboolean enable_divx;
333     gboolean disable_xvmc;
334     gboolean retry_on_full_cache;
335     gboolean enable_hardware_codecs;
336     gboolean enable_crystalhd_codecs;
337     gchar *profile;
338     gchar *alang;
339     gchar *slang;
340 
341     gboolean deinterlace;
342     gboolean frame_drop;
343     gboolean debug;
344     gboolean hardware_ac3;
345 
346     gboolean enable_advanced_subtitles;
347     gboolean subtitle_outline;
348     gboolean subtitle_shadow;
349     gboolean enable_embedded_fonts;
350     gdouble subtitle_scale;
351     gdouble subtitle_delay;
352     gint subtitle_margin;
353     gint subtitle_position;
354     gchar *subtitle_color;
355     gchar *subtitle_codepage;
356     gchar *subtitle_font;
357     gint subtitle_fuzziness;
358 
359     gchar *tv_device;
360     gchar *tv_driver;
361     gchar *tv_input;
362     gint tv_width;
363     gint tv_height;
364     gint tv_fps;
365 
366     GmtkMediaPlayerPlaybackError playback_error;
367     GmtkMediaPlayerPlayerState player_state;
368     GmtkMediaPlayerMediaState media_state;
369     GThread *mplayer_thread;
370     GmtkMediaPlayerAspectRatio aspect_ratio;
371     GmtkMediaPlayerMediaType type;
372 
373     GMutex *thread_running;
374     GCond *mplayer_complete_cond;
375     gchar *mplayer_binary;
376     gboolean use_mplayer2;
377     gboolean features_detected;
378     gboolean minimum_mplayer;
379 
380     gint std_in;
381     gint std_out;
382     gint std_err;
383 
384     GIOChannel *channel_out;
385     GIOChannel *channel_in;
386     GIOChannel *channel_err;
387 
388     guint watch_in_id;
389     guint watch_err_id;
390     guint watch_in_hup_id;
391 
392     gboolean restart;
393     gdouble restart_position;
394     GmtkMediaPlayerMediaState restart_state;
395 
396     GdkColor *default_background;
397 
398     gboolean has_metadata;
399     gdouble speed;
400 
401     gboolean disposed;
402     GMutex *player_lock;
403     GRegex *name_regex;
404     GRegex *genre_regex;
405     GRegex *title_regex;
406     GRegex *artist_regex;
407     GRegex *album_regex;
408     GRegex *deintN_regex;
409 
410 };
411 
412 struct _GmtkMediaPlayerClass {
413     GtkEventBoxClass parent_class;
414     void (*position_changed) (GmtkMediaPlayer * player);
415     void (*cache_percent_changed) (GmtkMediaPlayer * player);
416     void (*attribute_changed) (GmtkMediaPlayer * player);
417     void (*player_state_changed) (GmtkMediaPlayer * player);
418     void (*media_state_changed) (GmtkMediaPlayer * player);
419     void (*subtitles_changed) (GmtkMediaPlayer * player);
420     void (*audio_tracks_changed) (GmtkMediaPlayer * player);
421     void (*restart_shutdown_complete) (GmtkMediaPlayer * player);
422     void (*restart_complete) (GmtkMediaPlayer * player);
423     void (*error_message) (GmtkMediaPlayer * player);
424 };
425 
426 GType gmtk_media_player_get_type(void);
427 GtkWidget *gmtk_media_player_new();
428 
429 void gmtk_media_player_set_uri(GmtkMediaPlayer * player, const gchar * uri);
430 const gchar *gmtk_media_player_get_uri(GmtkMediaPlayer * player);
431 
432 void gmtk_media_player_set_state(GmtkMediaPlayer * player, const GmtkMediaPlayerMediaState new_state);
433 GmtkMediaPlayerMediaState gmtk_media_player_get_media_state(GmtkMediaPlayer * player);
434 
435 void gmtk_media_player_set_attribute_boolean(GmtkMediaPlayer * player,
436                                              GmtkMediaPlayerMediaAttributes attribute, gboolean value);
437 gboolean gmtk_media_player_get_attribute_boolean(GmtkMediaPlayer * player, GmtkMediaPlayerMediaAttributes attribute);
438 
439 void gmtk_media_player_set_attribute_double(GmtkMediaPlayer * player,
440                                             GmtkMediaPlayerMediaAttributes attribute, gdouble value);
441 gdouble gmtk_media_player_get_attribute_double(GmtkMediaPlayer * player, GmtkMediaPlayerMediaAttributes attribute);
442 
443 void gmtk_media_player_set_attribute_string(GmtkMediaPlayer * player,
444                                             GmtkMediaPlayerMediaAttributes attribute, const gchar * value);
445 const gchar *gmtk_media_player_get_attribute_string(GmtkMediaPlayer * player, GmtkMediaPlayerMediaAttributes attribute);
446 
447 void gmtk_media_player_set_attribute_integer(GmtkMediaPlayer * player, GmtkMediaPlayerMediaAttributes attribute,
448                                              gint value);
449 void gmtk_media_player_set_attribute_integer_delta(GmtkMediaPlayer * player, GmtkMediaPlayerMediaAttributes attribute,
450                                                    gint delta);
451 gint gmtk_media_player_get_attribute_integer(GmtkMediaPlayer * player, GmtkMediaPlayerMediaAttributes attribute);
452 
453 void gmtk_media_player_seek(GmtkMediaPlayer * player, gdouble value, GmtkMediaPlayerSeekType seek_type);
454 void gmtk_media_player_seek_chapter(GmtkMediaPlayer * player, int value, GmtkMediaPlayerSeekType seek_type);
455 
456 void gmtk_media_player_set_volume(GmtkMediaPlayer * player, gdouble value);
457 gdouble gmtk_media_player_get_volume(GmtkMediaPlayer * player);
458 
459 void gmtk_media_player_set_media_device(GmtkMediaPlayer * player, gchar * media_device);
460 void gmtk_media_player_set_media_type(GmtkMediaPlayer * player, GmtkMediaPlayerMediaType type);
461 GmtkMediaPlayerMediaType gmtk_media_player_get_media_type(GmtkMediaPlayer * player);
462 
463 gboolean gmtk_media_player_send_key_press_event(GmtkMediaPlayer * widget, GdkEventKey * event, gpointer data);
464 
465 void gmtk_media_player_select_subtitle(GmtkMediaPlayer * player, const gchar * label);
466 void gmtk_media_player_select_audio_track(GmtkMediaPlayer * player, const gchar * label);
467 void gmtk_media_player_select_subtitle_by_id(GmtkMediaPlayer * player, gint id);
468 void gmtk_media_player_select_audio_track_by_id(GmtkMediaPlayer * player, gint id);
469 
470 void gmtk_media_player_restart(GmtkMediaPlayer * player);
471 void gmtk_media_player_send_command(GmtkMediaPlayer * player, GmtkMediaPlayerCommand command);
472 
473 void gmtk_media_player_set_aspect(GmtkMediaPlayer * player, GmtkMediaPlayerAspectRatio aspect);
474 GmtkMediaPlayerAspectRatio gmtk_media_player_get_aspect(GmtkMediaPlayer * player);
475 const gchar *gmtk_media_state_to_string(const GmtkMediaPlayerMediaState media_state);
476 
477 
478 G_END_DECLS
479 #endif
480