gui/extensions/player/player.js (1,226 lines of code) (raw):

extension = { GF_STATE_PLAY: 0, GF_STATE_PAUSE: 1, GF_STATE_STOP: 2, GF_STATE_TRICK: 3, movie: null, movie_control: null, movie_sensor: null, UPnP_Enabled: false, dynamic_scene: false, movie_connected: false, controlled_renderer: null, current_url: null, local_url: false, initial_play_done: false, dictionary: null, icon_pause: 1, icon_play: 0, controler: null, stat_wnd: null, buffer_wnd: null, current_time: 0, duration: 0, timeshift_depth: 0, time_in_tsb: 0, muted: 0, file_open_dlg: false, stoped_url: null, initial_service_id: 0, default_addon: null, history: [], bookmarks: [], root_odm: null, navigation_wnd: null, initial_loop: false, initial_speed: 1, initial_start: 0, show_stats_init: 0, services: [], channels_wnd: null, reverse_playback_supported: false, do_show_controler: function () { if (this.file_open_dlg) { alert('Cannot show - File dialog is open'); return false; } gw_hide_dock(); if (this.controler.visible) { this.controler.hide(); } else { this.controler.show(); } }, ext_filter_event: function (evt) { switch (evt.type) { case GF_EVENT_MOUSEUP: this.do_show_controler(); return true; case GF_EVENT_KEYUP: if (evt.keycode == gwskin.keys.close) { this.do_show_controler(); return true; } return false; case GF_EVENT_QUALITY_SWITCHED: if (this.stat_wnd) { this.stat_wnd.quality_changed(); } return true; case GF_EVENT_TIMESHIFT_UPDATE: if (this.timeshift_depth) { this.set_time(0); } return true; case GF_EVENT_TIMESHIFT_OVERFLOW: var msg = ''; if ((this.state == this.GF_STATE_PAUSE) || (this.movie_control.mediaSpeed != 1)) { this.set_state(this.GF_STATE_PLAY); this.set_speed(1); msg = gw_new_message(null, 'Timeshift Overflow', 'Falling outside of timeshift buffer: resuming playback'); msg.set_size(380, gwskin.default_icon_height + 2 * gwskin.default_text_font_size); msg.show(); } return true; case GF_EVENT_TIMESHIFT_UNDERRUN: if (this.movie_control.mediaSpeed > 1) { this.set_speed(1); var msg = gw_new_message(null, 'Timeshift Underrun', 'Resuming to normal speed'); msg.set_size(380, gwskin.default_icon_height + 2 * gwskin.default_text_font_size); msg.show(); } return true; case GF_EVENT_NAVIGATE: this.set_movie_url(evt.target_url); return true; case GF_EVENT_KEYDOWN: //alert('key is '+evt.keycode); if (evt.keycode == 'U+004A') { this.controler.rewind.on_click(); return true; } if (evt.keycode == 'U+004B') { this.controler.play.on_click(); return true; } if (evt.keycode == 'U+004C') { this.controler.forward.on_click(); return true; } if (evt.keycode == 'U+004D') { this.back_live.forward.on_click(); return true; } return false; default: return false; } }, init_extension: function () { /*create media nodes element for playback*/ var a_movie = new SFNode('OrderedGroup'); this.movie = new SFNode('Transform2D'); a_movie.children[0] = this.movie; a_movie.children[0].children[0] = new SFNode('Inline'); a_movie.children[0].children[0].url[0] = ''; this.movie_control = new SFNode('MediaControl') a_movie.children[0].children[1] = this.movie_control; this.movie_sensor = new SFNode('MediaSensor') a_movie.children[0].children[2] = this.movie_sensor; gw_insert_media_node(a_movie); //dictionary of resources to load this.dictionary = gw_new_container(null); this.dictionary.hide(); this.movie.children[0].extension = this; this.movie.children[0].on_scene_size = function (evt) { var ext = this.extension; if (!this.callback_done) { this.callback_done = true; //process the error or connect service if (evt.error) { var notif = gw_new_message(null, 'Error opening file!', 'Failed to open ' + this.url[0] + '\n\nReason: ' + gpac.error_string(evt.error)); notif.show(); var url = ext.movie.children[0].url.length ? ext.movie.children[0].url[0] : ''; //reassign old inline URL this.url[0] = url; if (url == '') { ext.controler.show(); } else { this.movie_connected = true; } } //switch back inline nodes and remove from dictionary gw_detach_child(this); //force detach, we don't know when GC will be done ext.movie.children[0].url[0] = ''; ext.movie.children[0] = this; if (evt.error) return; //success ! ext.current_url = this.url[0]; ext.set_speed(ext.initial_speed); if (ext.initial_start >= 0) { ext.movie_control.mediaStartTime = ext.initial_start; } else { ext.movie_control.mediaStartTime = 0; ext.movie_control.mediaStopTime = ext.initial_start; } ext.movie_control.loop = ext.initial_loop; ext.movie_control.url[0] = ext.current_url; ext.movie_sensor.url[0] = ext.current_url; ext.timeshift_depth = 0; ext.time_in_tsb = 0; ext.initial_loop = false; ext.initial_speed = 1; ext.initial_start = 0; if ((ext.current_url.indexOf('gpac://') == 0) && ((ext.current_url.indexOf('://') < 0) || (ext.current_url.indexOf('file://') == 0))) { ext.local_url = true; } else { ext.local_url = false; } ext.root_odm = gpac.get_object_manager(ext.current_url); ext.reverse_playback_supported = ext.root_odm.reverse_playback_supported; gw_background_control(false); ext.controler.hide(); gpac.caption = ext.current_url; ext.add_bookmark(ext.current_url, true); ext.declare_addons(); if (ext.initial_service_id) { var odm = gpac.get_object_manager(ext.current_url); if (odm) odm.select_service(ext.initial_service_id); ext.initial_service_id = 0; } if (ext.show_stats_init) { ext.view_stats(); } } if (!ext.movie_connected) { ext.movie_connected = true; gpac.set_3d(evt.type3d ? 1 : 0); ext.controler.play.switch_icon(ext.icon_pause); ext.dynamic_scene = evt.dynamic_scene; //force display size notif on controler to trigger resize of the window ext.controler.on_display_size(ext.controler.width, ext.controler.height); } if (!gpac.fullscreen && evt.width && evt.height) { var w, h, r_w, r_h; w = evt.width; h = evt.height; if (w > gpac.screen_width) w = gpac.screen_width; if (h > gpac.screen_height) h = gpac.screen_height; r_w = r_h = 1; // if (w < min_width) r_w = Math.ceil(min_width / w); // if (h < min_height) r_h = Math.ceil(min_height / h); if (r_w < r_h) r_w = r_h; w = r_w * w; h = r_w * h; gpac.set_size(w, h); } else { gpac.set_size(evt.width, evt.height, true); } ext.streamlist_changed(); if (evt.width) { var e = {}; e.type = GF_EVENT_SCENE_SIZE; e.width = evt.width; e.height = evt.height; gwlib_filter_event(e); } } this.movie.children[0].on_addon_found = function (evt) { var e = {}; e.type = GF_EVENT_ADDON_DETECTED; e.addon_url = evt.url; e.scene_url = this.url[0]; e.discarded = false; gwlib_filter_event(e); } this.movie.children[0].on_streamlist_changed = function (evt) { this.extension.streamlist_changed(); } this.movie.children[0].on_scene_size_modify = function (evt) { var e = {}; e.type = GF_EVENT_SCENE_SIZE; e.width = evt.width; e.height = evt.height; gwlib_filter_event(e); } this.movie.children[0].addEventListener('gpac_scene_attached', this.movie.children[0].on_scene_size, 0); this.movie.children[0].addEventListener('gpac_addon_found', this.movie.children[0].on_addon_found, 0); this.movie.children[0].addEventListener('gpac_streamlist_changed', this.movie.children[0].on_streamlist_changed, 0); this.movie.children[0].addEventListener('gpac_scene_size', this.movie.children[0].on_scene_size_modify, 0); this.movie.children[0].on_media_progress = function (evt) { if (evt.buffering) { this.extension.show_buffer(evt.bufferLevel); this.extension.controler.layout(); } if (evt.total) { var percent_dload = 100 * evt.loaded / evt.total; if (percent_dload >= 100) percent_dload = 0; this.extension.controler.media_line.set_progress(percent_dload); } } this.movie.children[0].on_media_playing = function (evt) { this.extension.show_buffer(-1); if (!this.extension.initial_play_done) { this.extension.initial_play_done = true; this.extension.controler.play.switch_icon(this.extension.icon_pause); if (!this.extension.root_odm) { this.extension.root_odm = gpac.get_object_manager(this.extension.current_url); } if (this.extension.root_odm) { this.extension.declare_addons(); } } if (this.extension.root_odm) { this.extension.set_timeshift_depth(this.extension.root_odm.timeshift_depth); } } this.movie.children[0].on_media_end = function (evt) { if (this.extension.duration) { if (this.extension.movie_control.loop) { this.extension.movie_control.mediaStartTime = 0; this.extension.current_time = 0; } else if (this.extension.playlist_mode && (this.extension.playlist_idx + 1 < this.extension.playlist.length)) { this.extension.playlist_next(); } else { this.extension.set_state(this.extension.GF_STATE_STOP); } } } this.movie.children[0].on_media_waiting = function (evt) { // alert('URL is now buffering'); } this.movie.children[0].on_tsb_change = function (evt) { if (this.extension.root_odm) { this.extension.set_timeshift_depth(this.extension.root_odm.timeshift_depth); var main_addon_url = this.extension.root_odm.main_addon_url; if (main_addon_url != null) gwskin.pvr_url = main_addon_url; } } this.movie.children[0].on_main_addon = function (evt) { this.extension.reload_stats(); this.extension.controler.layout(); } this.movie.children[0].addEventListener('progress', this.movie.children[0].on_media_progress, 0); this.movie.children[0].addEventListener('playing', this.movie.children[0].on_media_playing, 0); this.movie.children[0].addEventListener('canplay', this.movie.children[0].on_media_playing, 0); this.movie.children[0].addEventListener('waiting', this.movie.children[0].on_media_waiting, 0); this.movie.children[0].addEventListener('ended', this.movie.children[0].on_media_end, 0); this.movie.children[0].addEventListener('gpac_timeshift_depth_changed', this.movie.children[0].on_tsb_change, 0); this.movie.children[0].addEventListener('gpac_main_addon_state', this.movie.children[0].on_main_addon, 0); this.on_movie_duration = function (value) { if (value < 0) value = 0; this.current_duration = value; this.set_duration(value); if (this.UPnP_Enabled) UPnP.MovieDuration = value; } this.on_movie_active = function (value) { if (!value) { this.movie_control.mediaStartTime = -1; } } this.on_movie_time = function (value) { var diff = this.current_time - value; if (diff < 0) diff = -diff; /*filter out every 1/2 seconds*/ if (diff < 0.5) return; this.current_time = value; this.set_time(value); if (this.UPnP_Enabled) UPnP.MovieTime = value; } Browser.addRoute(this.movie_sensor, 'mediaDuration', this, this.on_movie_duration); Browser.addRoute(this.movie_sensor, 'mediaCurrentTime', this, this.on_movie_time); Browser.addRoute(this.movie_sensor, 'isActive', this, this.on_movie_active); var hist = this.get_option('PlaybackHistory'); if ((hist != null) && (hist != '')) { this.history = gwskin.parse(hist); } var bmarks = this.get_option('Bookmarks'); if ((bmarks != null) && (bmarks != '')) { this.bookmarks = gwskin.parse(bmarks); } /*create player control UI*/ var wnd = gw_new_window(null, true, true); //remember it ! this.controler = wnd; wnd.extension = this; wnd.set_corners(true, true, false, false); wnd.set_alpha(0.95); /*first set of controls*/ wnd.infobar = gw_new_grid_container(wnd); wnd.infobar.spread_h = true; /*add our controls in order*/ wnd.media_line = gw_new_progress_bar(wnd.infobar, false, true); wnd.media_line.extension = this; wnd.media_line.on_slide = function (value, type) { if (!this.extension.movie_connected && !this.extension.controlled_renderer) { this.set_value(0); return; } var duration = this.extension.duration; var time; if (duration) { time = value * duration / 100; } else if (this.extension.timeshift_depth) { time = (100 - value) * this.extension.timeshift_depth / 100; if (this.extension.controlled_renderer) { return; } if (type != 2) return; this.extension.movie_control.mediaStopTime = -time; this.extension.controler.layout(); return; } if (this.extension.controlled_renderer) { this.extension.controlled_renderer.Seek(time); return; } gw_background_control(false); switch (type) { //start sliding case 1: this.extension.set_state(this.extension.GF_STATE_PAUSE); this.extension.set_speed(0); break; //done sliding case 2: this.extension.set_state(this.extension.GF_STATE_PLAY); this.extension.movie_control.mediaStartTime = time; this.extension.set_speed(1); break; //init slide, go in play mode default: if (this.extension.state == this.extension.GF_STATE_STOP) this.extension.set_state(this.extension.GF_STATE_PLAY); this.extension.set_state(this.extension.GF_STATE_PAUSE); break; } } wnd.time = gw_new_text(wnd.infobar, '00:00:00'); gw_object_set_hitable(wnd.time); wnd.time.extension = this; wnd.time.reversed = false; wnd.time.on_down = function (val) { if (!val) return; if (this.extension.timeshift_depth) { return; // if (this.extension.movie_control.mediaStopTime < 0) // this.extension.movie_control.mediaStopTime = 0; } else { this.reversed = !this.reversed; this.extension.set_time(this.extension.current_time); } } wnd.back_live = gw_new_icon(wnd.infobar, 'live'); wnd.back_live.extension = this; wnd.back_live.on_click = function () { if (this.extension.movie_control.mediaStopTime < 0) { this.extension.set_time(0); this.extension.movie_control.mediaStopTime = 0; this.extension.set_state(this.extension.GF_STATE_PLAY); //this.extension.controler.layout(); } } gw_new_separator(wnd.infobar); wnd.stop = gw_new_icon(wnd.infobar, 'stop'); wnd.stop.extension = this; wnd.stop.on_click = function () { this.extension.set_state(this.extension.GF_STATE_STOP); } wnd.rewind = gw_new_icon(wnd.infobar, 'rewind'); wnd.rewind.extension = this; wnd.rewind.on_click = function () { if (!this.extension.movie_control.mediaSpeed) { this.extension.set_state(this.extension.GF_STATE_PLAY); } this.extension.set_state(this.extension.GF_STATE_TRICK); if (this.extension.movie_control.mediaSpeed > 0) { this.extension.set_speed(-1.0); this.extension.controler.layout(); } else { this.extension.set_speed(2 * this.extension.movie_control.mediaSpeed); } } wnd.play = gw_new_icon(wnd.infobar, 'play'); wnd.play.extension = this; this.state = this.GF_STATE_PLAY; wnd.play.add_icon(gwskin.images.pause); wnd.play.on_click = function () { this.extension.set_state((this.extension.state == this.extension.GF_STATE_PLAY) ? this.extension.GF_STATE_PAUSE : this.extension.GF_STATE_PLAY); } wnd.forward = gw_new_icon_button(wnd.infobar, 'seek_forward', '', true, 'icon_label'); wnd.forward.extension = this; wnd.forward.on_click = function () { if (!this.extension.movie_control.mediaSpeed) { this.extension.set_state(this.extension.GF_STATE_PLAY); } this.extension.set_state(this.extension.GF_STATE_TRICK); if (this.extension.movie_control.mediaSpeed < 0) { this.extension.set_speed(1.0); } else { this.extension.set_speed(2 * this.extension.movie_control.mediaSpeed); } } wnd.forward.on_long_click = function () { if (this.extension.movie_control.mediaSpeed > 0) { this.extension.set_state(this.extension.GF_STATE_TRICK); this.extension.set_speed(this.extension.movie_control.mediaSpeed / 2); } } wnd.loop = gw_new_icon(wnd.infobar, 'play_once'); wnd.loop.extension = this; wnd.loop.add_icon(gwskin.images.play_loop); // wnd.loop.add_icon(gwskin.images.play_shuffle); wnd.loop.on_click = function () { this.extension.movie_control.loop = this.extension.movie_control.loop ? FALSE : TRUE; this.switch_icon(this.extension.movie_control.loop ? 1 : 0); } wnd.media_list = gw_new_icon(wnd.infobar, 'media'); wnd.media_list.extension = this; wnd.media_list.hide(); wnd.channels = gw_new_icon(wnd.infobar, 'channels'); wnd.channels.extension = this; wnd.channels.hide(); wnd.navigate = gw_new_icon(wnd.infobar, 'navigation'); wnd.navigate.extension = this; wnd.navigate.on_click = function () { this.extension.select_navigation_type(); } wnd.stats = gw_new_icon(wnd.infobar, 'statistics'); wnd.stats.extension = this; wnd.stats.on_click = function () { this.extension.view_stats(); } gw_new_separator(wnd.infobar); wnd.snd_low = gw_new_icon(wnd.infobar, 'audio'); wnd.snd_low.extension = this; wnd.snd_ctrl = gw_new_slider(wnd.infobar); wnd.snd_ctrl.extension = this; wnd.snd_ctrl.stick_to_previous = true; wnd.snd_low.add_icon('audio_mute'); wnd.snd_low.on_click = function () { if (this.extension.muted) { gpac.volume = this.extension.muted; this.extension.muted = 0; this.switch_icon(0); } else { this.extension.muted = gpac.volume ? gpac.volume : 1; gpac.volume = 0; this.switch_icon(1); } } wnd.snd_ctrl.on_slide = function (value, type) { if (this.extension.muted) this.extension.controler.snd_low.on_click(); gpac.volume = value; } wnd.snd_ctrl.set_value(gpac.volume); wnd.open = null; if (!gwskin.browser_mode) { wnd.open = gw_new_icon(wnd.infobar, 'file_open'); wnd.open.extension = this; wnd.open.on_click = function () { this.extension.open_local_file(); } } wnd.playlist = gw_new_icon(wnd.infobar, 'playlist'); wnd.playlist.extension = this; wnd.playlist.on_click = function () { this.extension.view_playlist(); } wnd.playlist_prev = gw_new_icon(wnd.infobar, 'playlist_prev'); wnd.playlist_prev.extension = this; wnd.playlist_prev.on_click = function () { this.extension.playlist_prev(); } wnd.playlist_next = gw_new_icon(wnd.infobar, 'playlist_next'); wnd.playlist_next.extension = this; wnd.playlist_next.on_click = function () { this.extension.playlist_next(); } wnd.home = null; if (!gwskin.browser_mode) { wnd.home = gw_new_icon(wnd.infobar, 'osmo'); wnd.home.extension = this; wnd.home.on_click = function () { this.extension.controler.hide(); if (this.extension._evt_filter != null) { gwlib_remove_event_filter(this.extension._evt_filter); this.extension._evt_filter = null; } gw_show_dock(); } } if (this.UPnP_Enabled) { wnd.remote = gw_new_icon(wnd.infobar, 'remote_display'); wnd.remote.on_click = function () { select_remote_display('push'); } } else { wnd.remote = null; } if (gwskin.mobile_device) { wnd.fullscreen = null; wnd.exit = null; } else { wnd.fullscreen = gw_new_icon(wnd.infobar, 'fullscreen'); wnd.fullscreen.add_icon(gwskin.images.fullscreen_back); wnd.fullscreen.on_click = function () { gpac.fullscreen = !gpac.fullscreen; } wnd.fullscreen.switch_icon(gpac.fullscreen ? 1 : 0); if (!gwskin.browser_mode) { wnd.exit = gw_new_icon(wnd.infobar, 'exit'); wnd.exit.on_click = function () { gpac.exit(); } } else { wnd.exit = null; } } wnd.on_size = function (width, height) { var control_icon_size = gwskin.default_icon_height; var children = this.infobar.get_children(); for (i = 0; i < children.length; i++) { children[i].set_size(control_icon_size, control_icon_size); } if (this.time) this.time.set_size(4 * wnd.time.font_size(), control_icon_size); if (this.snd_ctrl) { this.snd_ctrl.set_size(2 * control_icon_size, control_icon_size / 2, control_icon_size / 3, control_icon_size / 2); this.snd_ctrl.set_value(gpac.volume); } var speed = this.extension.movie_control.mediaSpeed; if (speed < 0) speed = -speed; if (speed && (speed != 1)) { if ((speed > 100) || (speed < 1)) this.forward.set_size(3 * control_icon_size, control_icon_size); else this.forward.set_size(2 * control_icon_size, control_icon_size); } else { this.forward.set_size(control_icon_size, control_icon_size); } } wnd.layout = function (width, height) { var min_w, full_w, time_w; var control_icon_size = gwskin.default_icon_height; var is_over = true; var show_navigate = false; if (arguments.length == 0) { width = this.width; height = this.height; } this.move(0, Math.floor((height - gw_display_height) / 2)); this.on_size(width, height); if (this.fullscreen) this.fullscreen.switch_icon(gpac.fullscreen ? 1 : 0); width -= control_icon_size / 2; min_w = control_icon_size; if (this.time.visible) min_w += this.time.width; if (this.open) min_w += control_icon_size; if (this.home) min_w += control_icon_size; if (this.exit && gpac.fullscreen) min_w += control_icon_size; full_w = 0; if (this.snd_low) full_w += control_icon_size; if (this.snd_ctrl) full_w += this.snd_ctrl.width; if (this.fullscreen) full_w += control_icon_size; if (this.navigate) { this.navigate.hide(); if (!this.extension.dynamic_scene && this.extension.movie_connected && (gpac.navigation_type != GF_NAVIGATE_TYPE_NONE)) { show_navigate = true; full_w += control_icon_size; } } if (this.extension.movie_connected) { if (this.extension.state == this.extension.GF_STATE_STOP) { this.stats.hide(); } else { full_w += control_icon_size; this.stats.show(); } if (this.extension.duration || this.extension.timeshift_depth) { full_w += control_icon_size; this.stop.show(); full_w += control_icon_size; this.play.show(); } else { full_w += control_icon_size; //this.play.show(); if (this.extension.state == this.extension.GF_STATE_STOP) { this.stop.hide(); this.play.show(); } else { this.play.hide(); this.stop.show(); } } if (this.extension.root_odm && !this.extension.dynamic_scene && !this.extension.root_odm.is_over) is_over = false; // this.media_list.show(); } else { this.stats.hide(); this.stop.hide(); this.play.hide(); this.media_list.hide(); } if (this.extension.duration) { if (this.extension.reverse_playback_supported && this.rewind) full_w += control_icon_size; if (this.forward) full_w += control_icon_size; if (this.loop) full_w += control_icon_size; } else if (this.extension.movie_control.mediaStopTime < 0) { if (this.forward) full_w += control_icon_size; } else if (!is_over) { if (this.forward) full_w += control_icon_size; } if ((this.extension.root_odm && this.extension.root_odm.main_addon_on) || this.extension.movie_control.mediaStopTime < 0) { full_w += control_icon_size; this.back_live.show(); } else { this.back_live.hide(); } if (this.remote && UPnP.MediaRenderersCount && (this.extension.current_url != '')) { full_w += control_icon_size; } time_w = this.media_line.visible ? 2 * control_icon_size : 0; if (this.exit) { if (gpac.fullscreen) { this.exit.show(); } else { this.exit.hide(); } } if (this.media_line.visible) this.media_line.set_size(width - min_w - full_w, control_icon_size / 3); if (this.snd_low) this.snd_low.show(); if (this.snd_ctrl) this.snd_ctrl.show(); this.rewind.hide(); if (this.extension.reverse_playback_supported) this.rewind.show(); if (this.extension.duration) { if (this.forward) this.forward.show(); if (this.loop) this.loop.show(); if (this.stop) this.stop.show(); } else if ((this.extension.movie_control.mediaStopTime < 0) || (this.extension.movie_control.mediaSpeed < 0)) { if (this.extension.time_in_tsb > 2) { if (this.forward) this.forward.show(); } else { if (this.forward) this.forward.hide(); } } else if (!is_over) { if (this.forward) this.forward.show(); } else { if (this.forward) this.forward.hide(); } if (wnd.fullscreen) wnd.fullscreen.show(); if (this.remote) { if (UPnP.MediaRenderersCount && (this.extension.current_url != '')) { this.remote.show(); } else { this.remote.hide(); } } if (show_navigate) { this.navigate.show(); } if (this.extension.duration || this.extension.timeshift_depth) { this.media_line.show(); this.time.show(); } else { this.media_line.hide(); this.time.hide(); } //this.time.set_size(width - 6*control_icon_size, control_icon_size / 3); this.media_line.set_size(width - this.time.width - 2 * control_icon_size, control_icon_size / 3); // this.infobar.set_size(width, control_icon_size); this.infobar.set_size(width, height); this.infobar.move(0, -0.1 * control_icon_size); } wnd.on_display_size = function (w, h) { var def_width = 640; if (!gpac.fullscreen) { if (w < def_width) { gpac.set_size(480, h); return; } } else { if (w < def_width) { def_width = w; } } // this.set_size(w, 1.2 * gwskin.default_icon_height); if (this.extension.movie_connected) { h = 3.3 * gwskin.default_icon_height; if (!this.media_line.visible) { h -= gwskin.default_icon_height; } } else h = 1.1 * gwskin.default_icon_height; this.set_size(def_width, h); this.layout(); } wnd.on_event = function (evt) { if (this.infobar.on_event(evt)) return true; return false; } //make the bar hitable so that clicking on it does not make it disappear gw_object_set_hitable(wnd); wnd.set_size(gw_display_width, 2.2 * gwskin.default_icon_height); this.set_duration(0); this.set_time(0); this._evt_filter = null; }, start: function () { if (!this._evt_filter) { this._evt_filter = this.create_event_filter(this); gwlib_add_event_filter(this._evt_filter); } if (!this.movie) { this.init_extension(); //check our args var i, argc = gpac.argc; var url_arg = null; for (i = 1; i < argc; i++) { var arg = gpac.get_arg(i); if (!arg) break; //that's our file if (arg.charAt(0) != '-') { //do not reopen ourselves ! if (arg.indexOf('gui.bt') >= 0) continue; url_arg if (arg.indexOf('://') < 0) url_arg = 'gpac://' + arg; else url_arg = arg; } //MP4Client options taking 2 args else if ((arg == '-rti') || (arg == '-rtix') || (arg == '-c') || (arg == '-cfg') || (arg == '-size') || (arg == '-lf') || (arg == '-log-file') || (arg == '-logs') || (arg == '-opt') || (arg == '-ifce') || (arg == '-views') || (arg == '-run-for') ) { i++; } else if (arg == '-service') { this.initial_service_id = parseInt(gpac.get_arg(i + 1)); i++; } else if (arg == '-com') { arg = gpac.get_arg(i + 1); var idx = arg.indexOf('gpac add '); if (idx == 0) { this.default_addon = arg.substring(9); } i++; } else if (arg == '-addon') { this.default_addon = gpac.get_arg(i + 1); i++; } else if (arg == '-loop') { this.initial_loop = true; } else if (arg == '-stats') { this.show_stats_init = true; } else if (arg == '-speed') { this.initial_speed = Number(gpac.get_arg(i + 1)); i++; } else if (arg == '-play-from') { this.initial_start = Number(gpac.get_arg(i + 1)); i++; } } gwskin.media_url = ''; gwskin.pvr_url = ''; gwskin.media_time = 0; gwskin.media_clock = 0; gwskin.restore_session = this.create_restore_session(this); if (url_arg != null) { this.set_playlist_mode(false); var def_addon = this.default_addon; this.set_movie_url(url_arg); gw_hide_dock(); this.default_addon = def_addon; return; } this.set_playlist_mode(true); /* var label = ''; for (i = 1; i < argc; i++) { label += '#'+i + ': ' + gpac.get_arg(i) + '\n'; } var notif = gw_new_message(null, 'GPAC Arguments', label); notif.show(); */ } this.controler.show(); gw_hide_dock(); }, create_event_filter: function (__anobj) { return function (evt) { return __anobj.ext_filter_event(evt); } }, create_restore_session: function (__anobj) { return function (url, media_time, media_clock) { __anobj.set_movie_url(url); if (media_clock) { var time_in_tsb = (new Date()).getTime() - media_clock; if (time_in_tsb >= 0) { __anobj.initial_start = -time_in_tsb / 1000; } } else { __anobj.initial_start = media_time; } } }, declare_addons: function () { if (this.default_addon && (this.default_addon != '')) { var addon_url = this.default_addon; if (addon_url.indexOf('://') < 0) addon_url = 'gpac://' + addon_url; this.root_odm.declare_addon(addon_url); } }, set_time: function (value) { var h, m, s, str; str = ''; if (this.timeshift_depth) { var pos = 100; this.time_in_tsb = 0; if ((this.movie_control.mediaStopTime < 0) || (this.movie_control.mediaSpeed <= 0)) { this.time_in_tsb = this.root_odm.timeshift_time; if (this.timeshift_depth > this.time_in_tsb) { pos = 100 * (this.timeshift_depth - this.time_in_tsb) / this.timeshift_depth; } else if (this.time_in_tsb) { pos = 0; } } this.controler.media_line.set_value(pos); gwskin.media_clock = (new Date()).getTime() - this.time_in_tsb * 1000; if (!this.time_in_tsb) { this.controler.time.set_label(''); this.controler.time.hide(); this.controler.layout(); return; } if (!this.controler.time.visible) { this.controler.time.show(); this.controler.layout(); } if (!this.controler.forward.visible) { this.controler.forward.show(); this.controler.layout(); } str = '-'; value = this.time_in_tsb; } else { if (!this.duration) { if (this.controler.time.visible) { this.controler.time.hide(); this.controler.layout(); } return; } this.current_time = value; gwskin.media_time = value; if (this.duration) { this.controler.media_line.set_value(100 * value / this.duration); } if (this.controler.time.reversed) { value = this.duration - value; str = '-'; } } h = Math.floor(value / 3600); value -= h * 3600; m = Math.floor(value / 60); value -= m * 60; s = Math.floor(value); if (h) { if (h < 10) str += '0'; str += h + ':'; } if (m < 10) str += '0'; str += m + ':'; if (s < 10) str += '0'; str += s; this.controler.time.set_label(str); }, set_duration: function (value) { this.duration = value; var dlg = this.controler; if (!value) { if (this.timeshift_depth > 0) { return; } dlg.time.hide(); dlg.media_line.hide(); dlg.rewind.hide(); dlg.play.hide(); dlg.forward.hide(); dlg.loop.hide(); dlg.time.set_size(0, gwskin.default_icon_height); dlg.time.set_width(0); } else { dlg.time.show(); dlg.media_line.show(); if (this.reverse_playback_supported) dlg.rewind.show(); dlg.stop.show(); dlg.forward.show(); dlg.loop.show(); if (value < 3600) { dlg.time.set_size(gwskin.default_icon_height / 2, gwskin.default_icon_height); dlg.time.set_width(3 * dlg.time.font_size()); } else { dlg.time.set_size(gwskin.default_icon_height, gwskin.default_icon_height); dlg.time.set_width(4 * dlg.time.font_size()); } } dlg.on_display_size(gw_display_width, gw_display_height); }, set_timeshift_depth: function (value) { if (this.timeshift_depth == value) return; this.timeshift_depth = value; var dlg = this.controler; this.reverse_playback_supported = this.root_odm.reverse_playback_supported; if (!value) { dlg.time.hide(); dlg.media_line.hide(); if (dlg.rewind) dlg.rewind.hide(); if (dlg.forward) dlg.forward.hide(); dlg.time.set_size(0, gwskin.default_icon_height); dlg.time.set_width(0); } else { dlg.time.show(); dlg.media_line.show(); var w = 3 * dlg.time.font_size(); if (value > 3600) w += dlg.time.font_size(); dlg.time.set_size(w, gwskin.default_icon_height); dlg.time.set_width(w); } dlg.on_display_size(gw_display_width, gw_display_height); }, set_state: function (state) { if (!this.movie_connected && !this.controlled_renderer) return; if (state == this.state) return; if (state == this.GF_STATE_STOP) { if (this.stat_wnd) this.stat_wnd.close_all(); this.stoped_url = '' + this.current_url; if (this.controlled_renderer) this.controlled_renderer.Stop(); else { this.set_movie_url(''); /*override movie_connected to avoid auto-resizing*/ this.movie_connected = true; } this.movie_control.mediaStartTime = 0; this.controler.media_line.set_value(0); this.controler.play.switch_icon(this.icon_play); this.state = this.GF_STATE_STOP; this.set_speed(1); this.root_odm = null; return; } if (state == this.GF_STATE_PAUSE) { if (this.state == this.GF_STATE_STOP) return; if (this.controlled_renderer) this.controlled_renderer.Pause(); this.state = this.GF_STATE_PAUSE; this.controler.play.switch_icon(this.icon_play); this.set_speed(0); return; } //we are playing, resume from stop if needed if (this.stoped_url) { if (this.controlled_renderer) { this.controlled_renderer.Play(); } else { this.set_movie_url(this.stoped_url, true); } this.stoped_url = null; //not in trick mode, next pause/play will restart from current time if (state != this.GF_STATE_TRICK) this.movie_control.mediaStartTime = -1; } if (state == this.GF_STATE_PLAY) { if (this.controlled_renderer) this.controlled_renderer.Play(); this.state = state; this.controler.play.switch_icon(this.icon_pause); if (this.movie_control.mediaSpeed != 1) this.movie_control.mediaStartTime = -1; if (this.timeshift_depth && (this.movie_control.mediaSpeed < 0)) { this.movie_control.mediaStopTime = -this.root_odm.timeshift_time; } this.set_speed(1); return; } if (state == this.GF_STATE_TRICK) { this.state = state; this.controler.play.switch_icon(this.icon_play); this.movie_control.mediaStartTime = -1; return; } }, set_speed: function (value) { this.movie_control.mediaSpeed = value; if (!this.duration && this.timeshift_depth && !value) { this.movie_control.mediaStopTime = -0.1; // this.movie_control.mediaStartTime = -1; } if (value && value != 1) { if (value > 1) this.controler.forward.set_label('x' + value); else this.controler.forward.set_label('x' + Math.round(100 * value) / 100); } else { this.controler.forward.set_label(''); } this.controler.layout(); }, set_movie_url: function (url) { this.initial_play_done = false; gwskin.media_url = url; gwskin.pvr_url = ''; if ((url == '') || (url == this.current_url)) { this.movie.children[0].url[0] = url; this.movie_control.url[0] = url; this.movie_sensor.url[0] = url; if (this.UPnP_Enabled) UPnP.MovieURL = url; this.movie_connected = (url == '') ? false : true; gw_background_control(this.movie_connected ? false : true); gpac.caption = url; } else if (this.controlled_renderer == null) { //resume from stop if ((arguments.length == 2) && (arguments[1] == true)) { this.current_url = url; this.set_speed(1); this.movie_control.mediaStartTime = 0; this.movie_control.url[0] = url; this.movie_sensor.url[0] = url; this.movie.children[0].url[0] = url; gw_background_control(false); return; } this.default_addon = null; this.root_odm = null; /*create a temp inline holding the previous scene, use it as the main movie and use the old inline to test the resource. This avoids messing up with event targets already setup*/ var movie_inline = this.movie.children[0]; var temp_inline = new SFNode('Inline'); if (typeof movie_inline.url[0] != 'undefined') temp_inline.url[0] = movie_inline.url[0]; this.movie.children[0] = temp_inline; movie_inline.callback_done = false; this.movie_connected = false; /*handle navigation between local files*/ if ((this.current_url && this.current_url.indexOf('gpac://') >= 0) && (url.indexOf('://') < 0)) { movie_inline.url[0] = "gpac://" + url; } else { movie_inline.url[0] = url; } if (!movie_inline.callback_done) { gw_add_child(this.dictionary, movie_inline); } return; } else { var uri = UPnP.ShareResource(url); this.controlled_renderer.Open(uri); } this.current_url = url; if (url == '') this.controler.show(); else this.controler.hide(); }, show_buffer: function (level) { if (level < 0) return; if (level >= 98) { if (this.buffer_wnd) { this.buffer_wnd.close(); this.buffer_wnd = null; } return; } if (!this.buffer_wnd) { this.buffer_wnd = gw_new_window(null, true, true); this.buffer_wnd.show_effect = 'notif'; this.buffer_wnd.txt = gw_new_text(this.buffer_wnd, ''); this.buffer_wnd.on_display_size = function (w, h) { this.set_size(20 * gwskin.default_text_font_size, 2 * gwskin.default_text_font_size); this.txt.set_width(20 * gwskin.default_text_font_size); this.move(0, h / 2 - gwskin.default_text_font_size); } this.buffer_wnd.on_display_size(gw_display_width, gw_display_height); this.buffer_wnd.set_alpha(0.9); this.buffer_wnd.show(); this.buffer_wnd.timer = gw_new_timer(false); this.buffer_wnd.timer.wnd = this.buffer_wnd; this.buffer_wnd.timer.set_timeout(gwskin.default_message_timeout, false); this.buffer_wnd.timer.start(0); this.buffer_wnd.ext = this; this.buffer_wnd.timer.on_active = function (val) { if (!val) { this.wnd.ext.buffer_wnd = null; this.wnd.close(); } } } this.buffer_wnd.timer.stop(gwskin.default_message_timeout); this.buffer_wnd.txt.set_label('Buffering ' + level + ' %'); }, select_navigation_type: function () { var nb_items = 0; var type = gpac.navigation; if (this.navigation_wnd) { this.navigation_wnd.close(); return; } var wnd = gw_new_popup(this.controler.navigate, 'up'); this.navigation_wnd = wnd; wnd.extension = this; wnd.on_close = function () { this.extension.navigation_wnd = null; } wnd.select = function (type) { this.extension.navigation_wnd = null; if (type == 'reset') { gpac.navigation_type = 0; } else { gpac.navigation = type; } } wnd.make_select_item = function (text, type, current_type) { if (current_type == type) text = '* ' + text; wnd.add_menu_item(text, function () { this.select(type); }); } wnd.add_menu_item('Reset', function () { this.select('reset'); }); wnd.make_select_item('None', GF_NAVIGATE_NONE, type); wnd.make_select_item('Slide', GF_NAVIGATE_SLIDE, type); wnd.make_select_item('Examine', GF_NAVIGATE_EXAMINE, type); if (gpac.navigation_type == GF_NAVIGATE_TYPE_3D) { wnd.make_select_item('Walk', GF_NAVIGATE_WALK, type); wnd.make_select_item('Fly', GF_NAVIGATE_FLY, type); wnd.make_select_item('Pan', GF_NAVIGATE_PAN, type); wnd.make_select_item('Game', GF_NAVIGATE_GAME, type); wnd.make_select_item('Orbit', GF_NAVIGATE_ORBIT, type); wnd.make_select_item('VR', GF_NAVIGATE_VR, type); } wnd.on_display_size(gw_display_width, gw_display_height); wnd.show(); }, streamlist_changed: function () { this.services = []; var root_odm = this.root_odm; if (root_odm) { for (var res_i = 0; res_i < root_odm.nb_resources; res_i++) { var m = root_odm.get_resource(res_i); if (!m || !m.service_id) continue; var res = null; for (var k = 0; k < this.services.length; k++) { if (this.services[k].service_id == m.service_id) { res = this.services[k]; break; } } if (res == null) { this.services.push(m); } } } if (this.services.length <= 1) { this.controler.channels.hide(); this.controler.channels.on_click = function () { } this.controler.layout(); return; } if (!this.controler.channels.visible) { this.controler.channels.show(); this.controler.layout(); } this.controler.channels.on_click = function () { if (this.extension.channels_wnd) { this.extension.channels_wnd.close(); return; } var wnd = gw_new_popup(this.extension.controler.channels, 'up'); this.extension.channels_wnd = wnd; wnd.extension = this.extension; wnd.on_close = function () { this.extension.channels_wnd = null; } wnd.make_item = function (text, i) { wnd.add_menu_item(text, function () { this.extension.root_odm.select_service(this.extension.services[i].service_id); }); } for (var i = 0; i < this.extension.services.length; i++) { var text = ''; var n = this.extension.services[i].service_name; if (this.extension.root_odm.selected_service == this.extension.services[i].service_id) text += '* '; if (n == null) n = 'Service ' + this.extension.services[i].service_id; text += n; wnd.make_item(text, i); } wnd.on_display_size(gw_display_width, gw_display_height); wnd.show(); } } };