function createLoadBar(parent, label, id, fileobj, finalizeUI) { var loadbar = $('
'); loadbar.css('clear', 'both'); loadbar.css('width', '100%'); parent.append(loadbar); var selectdiv = $('
'); selectdiv.css('width', '15%').css('float', 'left'); loadbar.append(selectdiv); var loadbarlabel = $(''); selectdiv.append(loadbarlabel); var loadbarHTML = ''; var loadbarselect = $(loadbarHTML); selectdiv.append(loadbarselect); var loadbarswitch = $('
'); loadbarswitch.css('width', '45%').css('float', 'left'); loadbar.append(loadbarswitch); var loadbarfileswitch = $('
'); loadbarfileswitch.attr('id', id + '_tabs-file'); loadbarswitch.append(loadbarfileswitch); loadbarfileswitch.show(); var loadbarfileinput = $(''); loadbarfileinput[0].onchange = function (e) { fileobj.objectToLoad = loadbarfileinput[0].files[0]; fileobj.objectIsFile = true; }; loadbarfileinput.width(500); loadbarfileinput.button(); loadbarfileswitch.append(loadbarfileinput); var loadbarurlswitch = $('
'); loadbarurlswitch.attr('id', id + '_tabs-url'); loadbarswitch.append(loadbarurlswitch); loadbarurlswitch.hide(); var loadbarurlinput = $(''); loadbarurlinput.width(500); loadbarurlinput.addClass('ui-widget ui-widget-content ui-corner-all'); loadbarurlinput[0].onchange = function (e) { fileobj.objectToLoad = loadbarurlinput.val(); fileobj.objectIsFile = false; }; loadbarurlswitch.append(loadbarurlinput); var loadbarexampleswitch = $('
'); loadbarexampleswitch.attr('id', id + '_tabs-example'); loadbarswitch.append(loadbarexampleswitch); loadbarexampleswitch.hide(); var loadbarexampleselect = $(''); loadbarexampleswitch.append(loadbarexampleselect); loadbarexampleselect.selectmenu({ width: 500, change: function (e) { fileobj.objectIsFile = false; fileobj.objectToLoad = loadbarexampleselect.find(':selected').val(); }, }); buildUrlList(loadbarexampleselect[0], true); fileobj.objectToLoad = loadbarexampleselect.find(':selected').val(); loadbarexampleselect.val(fileobj.objectToLoad); loadbarexampleselect.selectmenu('refresh'); var loadbarbutton = $( '', ); loadbarbutton.button(); loadbar.append(loadbarbutton); var loadbarprogressbar = $( '
', ); var loadbarprogressbarlabel = $( '
0%
', ); loadbarprogressbar.append(loadbarprogressbarlabel); loadbar.append(loadbarprogressbar); loadbarselect.selectmenu({ width: 150, change: function (e) { switch (e.target.selectedOptions[0].value) { case 'File': loadbarfileswitch.show(); loadbarurlswitch.hide(); loadbarexampleswitch.hide(); break; case 'URL': loadbarfileswitch.hide(); loadbarurlswitch.show(); loadbarexampleswitch.hide(); break; case 'Example': loadbarfileswitch.hide(); loadbarurlswitch.hide(); loadbarexampleswitch.show(); break; } }, }); loadbarprogressbar.progressbar({ value: 0, change: function () { loadbarprogressbarlabel.text(loadbarprogressbar.progressbar('value') + '%'); }, complete: function () { loadbarprogressbarlabel.text('Loading Completed!'); }, }); loadbarbutton[0].onclick = loadHandler.bind( null, fileobj, loadbarbutton, loadbarprogressbar, loadbarprogressbarlabel, finalizeUI, ); } var chunkSize = 1024 * 1024; // bytes function parseFile(fileobj, progressbar, progresslabel, loadbutton, finalizeUI) { var fileSize = fileobj.objectToLoad.size; var offset = 0; var self = this; // we need a reference to the current object var readBlock = null; var startDate = new Date(); fileobj.mp4boxfile = MP4Box.createFile(false); fileobj.mp4boxfile.onError = function (module, msg) { throw new Error('Failed to parse ISOBMFF file: [' + module + '] ' + msg); }; fileobj.mp4boxfile.onSidx = function (sidx) { console.log(sidx); }; var onparsedbuffer = function (mp4boxfileobj, buffer) { console.log('Appending buffer with offset ' + offset); buffer.fileStart = offset; mp4boxfileobj.appendBuffer(buffer); }; var onBlockRead = function (evt) { if (evt.target.error == null) { onparsedbuffer(fileobj.mp4boxfile, evt.target.result); // callback for handling read chunk offset += evt.target.result.byteLength; progressbar.progressbar({ value: Math.ceil((100 * offset) / fileSize) }); } else { console.log('Read error: ' + evt.target.error); finalizeUI(fileobj, loadbutton, false); return; } if (offset >= fileSize) { progressbar.progressbar({ value: 100 }); console.log( 'Done reading file (' + fileSize + ' bytes) in ' + (new Date() - startDate) + ' ms', ); fileobj.mp4boxfile.flush(); finalizeUI(fileobj, loadbutton, true); return; } readBlock(offset, chunkSize, fileobj.objectToLoad); }; readBlock = function (_offset, length, _file) { var r = new FileReader(); var blob = _file.slice(_offset, length + _offset); r.onload = onBlockRead; r.readAsArrayBuffer(blob); }; readBlock(offset, chunkSize, fileobj.objectToLoad); } function httpload(fileobj, progressbar, progresslabel, loadbutton, finalizeUI) { var downloader = new Downloader(); var startDate = new Date(); var nextStart = 0; fileobj.mp4boxfile = MP4Box.createFile(false); downloader.setCallback(function (response, end, error) { if (response) { progressbar.progressbar({ value: Math.ceil((100 * downloader.chunkStart) / downloader.totalLength), }); fileobj.mp4boxfile.appendBuffer(response); nextStart += chunkSize; } if (end) { progressbar.progressbar({ value: 100 }); console.log( 'Done reading file (' + downloader.totalLength + ' bytes) in ' + (new Date() - startDate) + ' ms', ); fileobj.mp4boxfile.flush(); finalizeUI(fileobj, loadbutton, true); } else { downloader.setChunkStart(nextStart); } if (error) { progresslabel.text('Download error!'); finalizeUI(fileobj, loadbutton, false); } }); downloader.setInterval(10); downloader.setChunkSize(chunkSize); downloader.setUrl(fileobj.objectToLoad); downloader.start(); } function loadHandler(fileobj, loadbutton, progressbar, progresslabel, finalizeUI) { loadbutton.button('disable'); if (fileobj.objectIsFile) { parseFile(fileobj, progressbar, progresslabel, loadbutton, finalizeUI); } else { httpload(fileobj, progressbar, progresslabel, loadbutton, finalizeUI); } } function createFancyTree(parent, fileobj) { var boxtreeviewdiv = $('
'); boxtreeviewdiv.css('width', '95%'); boxtreeviewdiv.css('padding', '1%'); parent.append(boxtreeviewdiv); var boxtreediv = $('
'); boxtreeviewdiv.append(boxtreediv); var boxtreetable = $('#boxtable'); boxtreetable.html(generateBoxTable({})); var fancytree_options = {}; fancytree_options.autoScroll = true; fancytree_options.source = []; fancytree_options.activate = function (event, data) { var node = data.node; if (!$.isEmptyObject(node.data)) { boxtreetable.html(generateBoxTable(node.data.box)); } }; fancytree_options.renderTitle = function (event, data) { var box = data.node.data.box; var el = ""; var title = box.type; if (!title) { // Find index in parent. var siblings = data.node.parent.children; for (var idx = 0; idx < siblings.length; idx++) { if (siblings[idx] == data.node) break; } title = idx; } el += title + ' '; if (box.box_name) el += "(" + box.box_name + ')'; el += ''; return el; }; boxtreediv.fancytree(fancytree_options); fileobj.fancytree = boxtreediv.fancytree('getTree'); }