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