%PDF- %PDF-
| Direktori : /data/old/usr/local/share/gpac/gui/extensions/player/ |
| Current File : //data/old/usr/local/share/gpac/gui/extensions/player/stats.js |
extension.reload_stats = function () {
if (this.stats_wnd) {
this.stats_wnd.reload_request = true;
this.stats_wnd.close();
}
}
extension.view_stats = function () {
if (this.stats_wnd) {
this.stats_wnd.close();
this.stats_wnd = null;
return;
}
var wnd = gw_new_window_full(null, true, 'Stats');
gw_object_set_dragable(wnd);
this.stats_wnd = wnd;
wnd.extension = this;
wnd.reload_request = false;
wnd.area = gw_new_grid_container(wnd);
wnd.area.break_at_hidden = true;
wnd.area.spread_h = false;
wnd.area.spread_v = true;
var root_odm = this.root_odm;
var nb_http = root_odm.nb_http;
var nb_buffering = 0;
var nb_ntp_diff = 0;
var srd_obj = null;
wnd.has_select = false;
for (var res_i = 0; res_i < wnd.extension.stats_resources.length; res_i++) {
var m = wnd.extension.stats_resources[res_i];
var num_qualities;
var odm_srd = m.get_srd();
m.gui = {};
if (!srd_obj && odm_srd) srd_obj = m;
if (m.dependent_group_id) {
srd_obj = m;
odm_srd = m.get_srd(m.dependent_group_id);
}
var label = '' + m.type;
if (m.dependent_group_id) label += '(Dep. Group)';
else if (m.scalable_enhancement) label += ' (Enh. Layer)';
else if (m.width) label += ' (' + m.width + 'x' + m.height + ')';
else if (m.samplerate) label += ' (' + m.samplerate + ' Hz ' + m.channels + ' channels)';
if (odm_srd) {
label += ' (SRD ' + odm_srd.x + ',' + odm_srd.y + ',' + odm_srd.w + ',' + odm_srd.h + ')';
}
m.gui.txt = gw_new_text(wnd.area, label, 'lefttext');
num_qualities = m.nb_qualities;
if (m.dependent_group_id) {
var q = m.get_quality(1, m.dependent_group_id);
if (q) num_qualities=2;
}
if (num_qualities > 1) {
wnd.has_select = true;
m.gui.select_label = gw_new_button(wnd.area, 'Quality');
m.gui.select_label.odm = m;
m.gui.select_label.on_click = function () {
var idx = this.odm.gui.select.value;
if (this.odm.gui.selected_idx == idx) {
this.on_long_click();
return;
}
if (idx) {
if (this.odm.gui.qualities[idx - 1].disabled) {
var notif = gw_new_message(null, 'Cannot select representation', 'Representation has been disabled');
notif.set_size(20 * gwskin.default_text_font_size, (2 * gwskin.default_icon_height + gwskin.default_text_font_size));
notif.show();
return;
}
this.odm.select_quality(this.odm.gui.qualities[idx - 1].ID, this.odm.dependent_group_id);
} else {
this.odm.select_quality('auto', this.odm.dependent_group_id);
this.odm.update_qualities();
}
}
m.gui.select_label.on_long_click = function () {
var idx = this.odm.gui.select.value;
if (!idx) return;
var q = this.odm.gui.qualities[idx - 1];
var iw = gw_new_window_full(null, true, 'Representation ' + q.ID + ' info');
gw_object_set_dragable(iw);
iw.area = gw_new_text_area(iw, '');
var label = 'Mime ' + q.mime + ' - codecs ' + q.codec;
label += '\n';
label += 'Bandwidth: ' + q.bandwidth;
label += '\n';
label += 'Enabled: ' + !q.disabled;
label += '\n';
if (q.width) {
label += 'Size ' + q.width + 'x' + q.height + (q.interlaced ? ' interlaced @' : ' progressive @') + q.fps + ' FPS - SAR ' + q.par_num + '/' + q.par_den;
} else if (q.samplerate) {
label += 'Samplerate ' + q.samplerate + ' Hz - ' + q.channels + ' channels';
}
iw.area.set_content(label);
iw.on_display_size = function (width, height) {
var w = 25 * gwskin.default_text_font_size;
var h = 2 * gwskin.default_icon_height + 5 * gwskin.default_text_font_size;
this.set_size(w, h);
}
iw.on_display_size(gw_display_width, gw_display_height);
iw.set_alpha(0.9);
iw.show();
}
m.gui.select = gw_new_spincontrol(wnd.area, true);
m.gui.select.odm = m;
m.gui.select.on_click = function (val) {
this.odm.show_select(val);
}
m.update_qualities = function () {
var sel_idx = 0;
this.gui.qualities = [];
if (this.dependent_group_id) {
var dqidx=0;
while (1) {
var q = this.get_quality(dqidx, this.dependent_group_id);
if (!q) break;
this.gui.qualities.push(q);
dqidx++;
}
} else {
for (i = 0; i < this.nb_qualities; i++) {
var q = this.get_quality(i);
if (q) {
this.gui.qualities.push(q);
}
}
}
this.gui.qualities.sort(function (a, b) { return a.bandwidth - b.bandwidth });
for (i = 0; i < this.gui.qualities.length; i++) {
if (this.gui.qualities[i].is_selected)
sel_idx = i + 1;
}
this.gui.select.min = 0;
this.gui.select.max = this.gui.qualities.length;
if (this.gui.selected_idx != sel_idx) {
this.show_select(sel_idx);
this.gui.selected_idx = sel_idx;
this.gui.select.value = sel_idx;
}
}
m.show_select = function (idx) {
if (!idx) {
this.gui.select_label.set_label('Auto');
} else {
var label = '';
var q = this.gui.qualities[idx - 1];
if (!q) return;
if (q.is_selected) label += '*';
if (q.width) {
label += q.height + (q.interlaced ? 'i' : 'p');
} else if (q.samplerate) {
label += q.samplerate;
if (q.channels) label += '/' + q.channels;
}
label += '@' + Math.round(q.bandwidth / 1000) + 'Kbps';
this.gui.select_label.set_label(label);
}
}
m.update_qualities();
} else {
m.gui.select = null;
m.gui.select_label = null;
m.update_qualities = function () { }
}
m.gui.info = null;
if (!m.dependent_group_id) {
m.gui.info = gw_new_icon(wnd.area, 'information');
m.gui.info.odm = m;
m.gui.info.on_click = function () {
if (this.odm.gui.info_wnd) {
this.odm.gui.info_wnd.close();
return;
}
var odm = this.odm;
var iw = gw_new_window_full(null, true, '' + odm.type + ' ' + odm.ID + ' statistics:');
odm.gui.info_wnd = iw;
gw_object_set_dragable(iw);
iw.odm = odm;
iw.on_close = function (width, height) {
this.timer.stop();
this.odm.gui.info_wnd = null;
}
iw.area = gw_new_text_area(iw, '');
iw.on_display_size = function (width, height) {
var w = 30 * gwskin.default_text_font_size;
var h = 2 * gwskin.default_icon_height + 11 * gwskin.default_text_font_size;
this.set_size(w, h);
}
iw.timer = gw_new_timer(false);
iw.timer.wnd = iw;
iw.timer.set_timeout(0.1, true);
iw.timer.on_event = function (val) {
var bw;
var m = this.wnd.odm;
if (!m) return;
var label = '';
this.wnd.children[0].spacing = 1.2;
if (m.width) {
var fps = m.frame_duration;
label += 'Size:' + m.width + 'x' + m.height;
if (m.pixelformat) label += ' (' + m.par + ' ' + m.pixelformat + ')';
} else if (m.samplerate) {
label += '' + m.samplerate + 'Hz ' + m.channels + ' channels';
}
label += '\n'
label += 'Status: ' + m.status + ' - clock time: ' + m.clock_time + ' (drift ' + m.clock_drift + ')';
label += '\n'
label += 'Composition Memory: ' + m.cb_unit_count + '/' + m.cb_capacity;
label += '\n'
label += 'Buffer: ' + m.buffer + ' ms (min ' + m.min_buffer + ' - max ' + m.max_buffer + ') ' + m.db_unit_count + ' AUs in DB';
label += '\n'
var dec_time = m.total_dec_time / m.dec_frames / 1000;
var max_time = m.max_dec_time / 1000;
label += '' + m.dec_frames + ' frames (' + m.drop_frames + ' dropped) - ' + Math.round(100 * dec_time) / 100 + ' ms/frame (max ' + Math.round(m.max_dec_time / 10) / 100 + ') ';
if (m.irap_frames && (m.dec_frames != m.irap_frames)) {
label += '\n'
dec_time = m.irap_dec_time / m.irap_frames / 1000;
label += 'Average GOP size: ' + Math.round(m.dec_frames / m.irap_frames) + ' - ' + Math.round(100 * dec_time) / 100 + ' ms/irap (max ' + Math.round(m.irap_max_time / 10) / 100 + ') ';
}
label += '\n'
label += 'Average bitrate: ';
bw = m.avg_bitrate;
if (bw < 8000000) label += '' + Math.round(bw / 1000) + ' Kbps';
else label += '' + Math.round(bw / 1000 / 1000) + ' Mbps';
label += ' - Maximum ';
bw = m.max_bitrate;
if (bw < 8000000) label += '' + Math.round(bw / 1000) + ' Kbps';
else label += '' + Math.round(bw / 1000 / 1000) + ' Mbps';
label += '\n'
label += 'Download bandwidth: ';
var bw = m.bandwidth_down;
if (bw < 8000) label += '' + bw + ' Kbps';
else label += '' + Math.round(bw / 1000) + ' Mbps';
label += '\n'
label += 'Codec: ' + m.codec;
label += '\n'
var myurl;
if (m.service_url.indexOf('\\') >= 0) {
myurl = m.service_url.split('\\');
} else {
myurl = m.service_url.split('/');
}
label += 'Service: ' + myurl.pop();
if (m.service_id)
label += ' - ID ' + m.service_id;
this.wnd.area.set_content(label);
}
odm.gui.info_wnd.on_display_size(gw_display_width, gw_display_height);
odm.gui.info_wnd.set_alpha(0.9);
odm.gui.info_wnd.show();
}
}
m.gui.buffer = null;
m.gui.play = null;
if (m.selected_service == m.service_id) {
if (m.max_buffer && !m.dependent_group_id) {
nb_buffering++;
m.gui.buffer = gw_new_gauge(wnd.area, 'Buffer');
}
if (m.ntp_diff) nb_ntp_diff++;
} else if (!m.is_addon) {
m.gui.play = gw_new_icon(wnd.area, 'play');
m.gui.play.odm = m;
m.gui.play.wnd = wnd;
m.gui.play.on_click = function () {
this.odm.select_service(this.odm.service_id);
this.wnd.close_all();
}
}
nb_http += m.nb_http;
gw_new_separator(wnd.area);
}
wnd.http_control = null;
if (nb_http || wnd.has_select) {
wnd.http_text = gw_new_text(wnd.area, 'HTTP rate', 'lefttext');
wnd.http_control = gw_new_slider(wnd.area);
if (gpac.http_max_bitrate) {
var br = Math.round(100 * gpac.http_max_bitrate / 1000 / 1000) / 100;
if (br > 200) br = 200;
if (br <= 1) {
v = 30 * br;
} else if (br <= 10) {
v = 30 + 30 * br / 10;
} else if (br < 50) {
v = 60 + 20 * (br - 10) / 40;
} else {
v = 80 + 20 * (br - 50) / 150;
}
wnd.http_control.set_value(v);
wnd.http_text.set_label('HTTP cap ' + Math.round(gpac.http_max_bitrate / 10000)/100 + ' Mbps');
} else {
wnd.http_control.set_value(100);
wnd.http_text.set_label('HTTP cap off');
}
wnd.http_control.text = wnd.http_text;
wnd.http_control.on_slide = function (val) {
var br = 0;
if (val <= 30) {
br = val / 30;
} else if (val <= 60) {
br = 1 + 10 * (val - 30) / 30;
} else if (val < 80) {
br = 10 + 40 * (val - 60) / 20;
} else {
br = 50 + 150 * (val - 80) / 20;
}
if (br == 200) {
this.text.set_label('HTTP cap off');
gpac.http_max_bitrate = Math.round(0);
} else if (br == 0) {
this.text.set_label('HTTP disable');
gpac.http_max_bitrate = -1;
} else {
this.text.set_label('HTTP cap ' + Math.round(100 * br) / 100 + ' Mbps');
gpac.http_max_bitrate = Math.round(br * 1000000);
}
}
gw_new_separator(wnd.area);
}
wnd.srd_modes = null;
if (srd_obj) {
wnd.srd_text = gw_new_text(wnd.area, 'SRD Control', 'lefttext');
wnd.srd_modes = gw_new_button(wnd.area, 'Modes');
wnd.srd_modes.wnd = wnd;
wnd.srd_modes.srd_obj = srd_obj;
wnd.srd_modes.on_click = function() {
this.wnd.srd_selected_mode = this.wnd.srd_current_mode;
this.wnd.srd_set_mode(this.wnd.srd_current_mode);
this.srd_obj.select_quality(this.wnd.srd_selected_mode);
}
wnd.srd_select = gw_new_spincontrol(wnd.area, true);
wnd.srd_select.wnd = wnd;
wnd.srd_select.on_click = function (val) {
this.wnd.srd_set_mode(val);
}
wnd.srd_select.min = 0;
wnd.srd_select.max = 8;
wnd.srd_selected_mode = 0;
if (srd_obj.gui.qualities != null)
srd_obj.gui.qualities[0].tile_mode;
wnd.srd_current_mode = 0;
wnd.srd_set_mode = function(mode) {
var label = '';
this.srd_current_mode = mode;
if (this.srd_current_mode == this.srd_selected_mode) label='* ';
switch (mode) {
case 0: label+='Equal'; break;
case 1: label+='Top Rows'; break;
case 2: label+='Bottom Rows'; break;
case 3: label+='Middle Rows'; break;
case 4: label+='Left Column'; break;
case 5: label+='Right Column'; break;
case 6: label+='Middle Column'; break;
case 7: label+='Center'; break;
case 8: label+='Edges'; break;
}
this.srd_modes.set_label(label);
}
wnd.srd_set_mode(wnd.srd_selected_mode);
}
wnd.plot = gw_new_plotter(wnd.area);
wnd.on_display_size = function (width, height) {
var w;
var h = 2 * gwskin.default_icon_height;
w = 20 * gwskin.default_text_font_size;
w += 4 * gwskin.default_icon_height;
if (this.has_select)
w += 6 * gwskin.default_icon_height;
for (var i = 0; i < this.extension.stats_resources.length; i++) {
var res = this.extension.stats_resources[i];
var aw = w;
if (res.gui.info) {
res.gui.info.set_size(1.5 * gwskin.default_icon_height, gwskin.default_icon_height);
aw -= res.gui.info.width;
}
if (res.gui.buffer) {
res.gui.buffer.set_size(2 * gwskin.default_icon_height, 0.75 * gwskin.default_icon_height);
}
if (res.gui.play) {
res.gui.play.set_size(gwskin.default_icon_height, gwskin.default_icon_height);
}
aw -= 4 * gwskin.default_icon_height;
if (res.gui.select) {
res.gui.select.set_size(gwskin.default_icon_height, gwskin.default_icon_height);
aw -= gwskin.default_icon_height;
res.gui.select_label.set_size(6 * gwskin.default_icon_height, 0.75 * gwskin.default_icon_height);
aw -= 4 * gwskin.default_icon_height;
}
res.gui.txt.set_size(aw, gwskin.default_icon_height);
res.gui.txt.set_width(aw);
h += gwskin.default_icon_height;
}
if (this.plot) {
this.plot.set_size(w, 8 * gwskin.default_icon_height);
h += 8 * gwskin.default_icon_height;
}
if (this.http_control) {
this.http_text.set_size(11 * gwskin.default_text_font_size, gwskin.default_icon_height);
var ch = 0.5 * gwskin.default_icon_height;
this.http_control.set_size(w - 11 * gwskin.default_text_font_size, ch, ch, ch);
h += gwskin.default_icon_height;
}
if (this.srd_modes) {
var cw = 0.75 * gwskin.default_icon_height;
this.srd_text.set_size(12 * gwskin.default_text_font_size, gwskin.default_icon_height);
this.srd_modes.set_size(w - 12 * gwskin.default_text_font_size - gwskin.default_icon_height, cw);
this.srd_select.set_size(gwskin.default_icon_height, cw);
}
this.set_size(w, h);
this.move((w - width) / 2, (height - h) / 2);
}
wnd.on_close = function () {
//this.timer.stop();
//this.objs = [];
if (this.reload_request) {
var translation = this.extension.stats_wnd.translation;
this.extension.stats_wnd = null;
this.extension.view_stats();
this.extension.stats_wnd.translation = translation;
} else {
this.extension.stats_wnd = null;
}
}
var label = 'Statistics (' + gpac.nb_cores + ' cores - ';
if (gpac.system_memory > 1000000000) label += '' + Math.round(gpac.system_memory / 1000 / 1000 / 1000) + ' GB RAM)';
else label += '' + Math.round(gpac.system_memory / 1000 / 1000) + ' MB RAM)';
wnd.set_label(label);
if (wnd.plot) {
wnd.s_fps = wnd.plot.add_serie('FPS', 'Hz', 0.8, 0, 0);
if (nb_http) {
wnd.s_bw = wnd.plot.add_serie('BW', 'Kbps', 0.8, 0, 0.8);
} else {
wnd.s_bw = null;
}
wnd.s_bitrate = wnd.plot.add_serie('Rate', 'Kbps', 0, 0.8, 0);
wnd.s_quality = wnd.plot.add_serie('Quality', 'Kbps', 1, 0.65, 0);
if (nb_buffering)
wnd.s_buf = wnd.plot.add_serie('Buffer', 'ms', 0, 0, 0.8);
else
wnd.s_buf = null;
if (nb_ntp_diff)
wnd.s_ntp = wnd.plot.add_serie('E2E delay', 's', 0, 0.3, 0.8);
else
wnd.s_ntp = null;
wnd.s_cpu = wnd.plot.add_serie('CPU', '%', 0, 0.5, 0.5);
wnd.s_mem = wnd.plot.add_serie('MEM', 'MB', 0.5, 0.5, 0);
}
wnd.update_series = function() {
var ext = this.extension;
var length = (ext.stats_data.length > ext.stats_window ? stats_window : ext.stats_data.length);
this.s_fps.refresh_serie(ext.stats_data, 'time', 'fps', length, 4);
if (this.s_bw) {
this.s_bw.refresh_serie(ext.stats_data, 'time', 'http_bandwidth', length, 1);
}
if (this.s_buf) {
this.s_buf.refresh_serie(ext.stats_data, 'time', 'buffer', length, 1.5);
}
var stat_obj = ext.stats_data[ext.stats_data.length-1];
if (stat_obj.bitrate) {
this.s_bitrate.refresh_serie(ext.stats_data, 'time', 'bitrate', length, 2);
}
if (this.s_ntp) {
this.s_ntp.refresh_serie(ext.stats_data, 'time', 'ntp_diff', length, 3);
}
this.s_cpu.refresh_serie(ext.stats_data, 'time', 'cpu', length, 10);
this.s_mem.refresh_serie(ext.stats_data, 'time', 'memory', length, 6);
this.s_quality.refresh_serie(ext.stats_data, 'time', 'quality', length, 2.5);
}
wnd.quality_changed = function () {
for (var i = 0; i < this.extension.stats_resources.length; i++) {
var m = this.extension.stats_resources[i];
m.update_qualities();
}
}
wnd.close_all = function () {
for (var i = 0; i < this.extension.stats_resources.length; i++) {
if (this.extension.stats_resources[i].gui.info_wnd) {
this.extension.stats_resources[i].gui.info_wnd.odm = null;
this.extension.stats_resources[i].gui.info_wnd.close();
}
}
this.extension.stats_resources.length = 0;
this.close();
}
wnd.update_resource_gui = function(m, bl) {
if (m.gui && m.gui.buffer) {
var odm_srd = m.get_srd();
if (m.dependent_group_id) {
odm_srd = m.get_srd(m.dependent_group_id);
}
var label = ' ' + m.type;
if (m.dependent_group_id) label += '(Dep. Group)';
else if (m.scalable_enhancement) label += ' (Enh. Layer)';
else if (m.width) label += ' (' + m.width + 'x' + m.height + ')';
else if (m.samplerate) label += ' (' + Math.round(m.samplerate / 10) / 100 + ' kHz ' + m.channels + ' ch)';
else if (m.scalable_enhancement) label += ' (Enh. Layer)';
if (odm_srd) {
label += ' (SRD ' + odm_srd.x + ',' + odm_srd.y + ',' + odm_srd.w + ',' + odm_srd.h + ')';
}
var url = m.service_url;
/*
if ((url.indexOf('udp://') >= 0) || (url.indexOf('rtp://') >= 0) || (url.indexOf('dvb://') >= 0))
label += ' Broadcast';
else if ((url.indexOf('file://') >= 0) || (url.indexOf('://') < 0))
label += ' File';
else
label += ' Broadband';
*/
m.gui.txt.set_label(label);
m.gui.buffer.set_value(bl);
m.gui.buffer.set_label('' + Math.round(m.buffer / 10) / 100 + ' s');
}
}
wnd.on_display_size(gw_display_width, gw_display_height);
wnd.set_alpha(0.9);
wnd.show();
};