From 35ab02456d8526c091bce1fb1e1fcbfca53f88a2 Mon Sep 17 00:00:00 2001 From: ThaUnknown Date: Wed, 10 Mar 2021 11:29:07 +0100 Subject: [PATCH] codec support tables, squeezing every last bit out of canvas rendering --- app/js/playerHandler.js | 6 +- app/js/subtitles-octopus-worker.js | 23 ++- app/js/torrentHandler.js | 11 +- app/test2.html | 65 ------- support.html | 272 +++++++++++++++++++++++++++++ 5 files changed, 291 insertions(+), 86 deletions(-) delete mode 100644 app/test2.html create mode 100644 support.html diff --git a/app/js/playerHandler.js b/app/js/playerHandler.js index c586461..956bd6f 100644 --- a/app/js/playerHandler.js +++ b/app/js/playerHandler.js @@ -477,9 +477,9 @@ async function btnpip() { function renderFrame() { if (running === true) { - context.drawImage(video, 0, 0) - context.drawImage(subtitleCanvas, 0, 0, canvas.width, canvas.height) - window.requestAnimationFrame(renderFrame) + context.drawImage(video, 0, 0); + context.drawImage(subtitleCanvas, 0, 0, canvas.width, canvas.height); + window.requestAnimationFrame(renderFrame); } } canvasVideo.srcObject = canvas.captureStream() diff --git a/app/js/subtitles-octopus-worker.js b/app/js/subtitles-octopus-worker.js index 78fe9b8..807a94a 100644 --- a/app/js/subtitles-octopus-worker.js +++ b/app/js/subtitles-octopus-worker.js @@ -9064,27 +9064,27 @@ self.fastRender = function (force) { self.offscreenRender = function (force) { self.rafId = 0; self.renderPending = false; - // var startTime = performance.now(); + // let startTime = performance.now(); let result = self.octObj.renderImage(self.getCurrentTime() + self.delay, self.changed), changed = Module.getValue(self.changed, "i32"); if ((changed != 0 || force) && self.offscreenCanvas) { let images = self.buildResultImage(result); - // var newTime = performance.now(); - // var libassTime = newTime - startTime; + // let newTime = performance.now(), + // libassTime = newTime - startTime; let promises = []; for (var i = 0; i < images.length; i++) { promises[i] = createImageBitmap(images[i].image) } Promise.all(promises).then(function (bitmaps) { - // var decodeTime = performance.now() - newTime; + // let decodeTime = performance.now() - newTime; function renderFastFrames() { - // var beforeDrawTime = performance.now(); + // let beforeDrawTime = performance.now(); self.offscreenCanvasCtx.clearRect(0, 0, self.offscreenCanvas.width, self.offscreenCanvas.height); for (var i = 0; i < bitmaps.length; i++) { self.offscreenCanvasCtx.drawImage(bitmaps[i], images[i].x, images[i].y); - // var drawTime = Math.round(performance.now() - beforeDrawTime); - // console.log(bitmaps.length + ' bitmaps, libass: ' + Math.round(libassTime) + 'ms, decode: ' + Math.round(decodeTime) + 'ms, draw: ' + drawTime + 'ms'); } + // let drawTime = performance.now() - beforeDrawTime; + // console.log(bitmaps.length + ' bitmaps, libass: ' + libassTime + 'ms, decode: ' + decodeTime + 'ms, draw: ' + drawTime + 'ms'); } self.requestAnimationFrame(renderFastFrames); }) @@ -9124,15 +9124,14 @@ self.buildResultImageItem = function (ptr) { data = new Uint32Array(buf); let bitmapPosition = 0, resultPosition = 0; - for (var y = 0; y < h; ++y) { - for (var x = 0; x < w; ++x) { - const k = Module.HEAPU8[bitmap + bitmapPosition + x]; + for (let y = h; y--; bitmapPosition += stride) { + const offset = bitmap + bitmapPosition; + for (let x = 0, z = w; z--; ++x, resultPosition++) { + const k = Module.HEAPU8[offset + x]; if (k !== 0) { data[resultPosition] = a * k << 24 | c; } - resultPosition++; } - bitmapPosition += stride; } const image = new ImageData(buf8, w, h); x = ptr.dst_x; diff --git a/app/js/torrentHandler.js b/app/js/torrentHandler.js index 656e578..8477d73 100644 --- a/app/js/torrentHandler.js +++ b/app/js/torrentHandler.js @@ -26,7 +26,7 @@ const announceList = [ // ['ws://tracker.btsync.cf:6969/announce'], // ['ws://hub.bugout.link:80/announce'] ], - videoExtensions = ['.avi', '.mp4', '.m4v', '.webm', '.mov', '.mkv', '.mpg', '.mpeg', '.ogv', '.wmv', '.m2ts'], + videoExtensions = [".3g2", ".3gp", ".asf", ".avi", ".dv", ".flv", ".gxf", ".m2ts", ".m4a", ".m4b", ".m4p", ".m4r", ".m4v", ".mkv", ".mov", ".mp4", ".mpd", ".mpeg", ".mpg", ".mxf", ".nut", ".ogm", ".ogv", ".swf", ".ts", ".vob", ".webm", ".wmv", ".wtv"], scope = "/app/", sw = navigator.serviceWorker.register('sw.js', { scope }).then(e => { if (searchParams.get("file")) addTorrent(searchParams.get("file"), {}) // add a torrent if its in the link params @@ -84,6 +84,7 @@ loadOfflineStorage() function cleanupTorrents() { // creates an array of all non-offline store torrents and removes them client.torrents.filter(torrent => !offlineTorrents[torrent.infoHash]).forEach(torrent => torrent.destroy({ destroyStore: true })) + document.querySelector(".playlist").innerHTML = "" } // manually add trackers @@ -104,10 +105,8 @@ async function playTorrent(torrent, opts) { await sw videoFiles = torrent.files.filter(file => videoExtensions.some(ext => file.name.endsWith(ext))) if (videoFiles.length > 1) { - if (!torrent.store.store._idbkvStore) { - torrent.files.forEach(file => file.deselect()); - torrent.deselect(0, torrent.pieces.length - 1, false); - } + torrent.files.forEach(file => file.deselect()); + torrent.deselect(0, torrent.pieces.length - 1, false); let frag = document.createDocumentFragment() for (let file of videoFiles) { let mediaInformation = await resolveFileMedia({ fileName: file.name, method: "SearchName" }) @@ -153,7 +152,7 @@ function serveFile(file, req) { const res = { status: 200, headers: { - 'Content-Type': file._getMimeType() || 'video/webm', // lazy workaround for some browsers getting upset about no mime type + 'Content-Type': file._getMimeType(), // Support range-requests 'Accept-Ranges': 'bytes' } diff --git a/app/test2.html b/app/test2.html deleted file mode 100644 index 2fa0f5d..0000000 --- a/app/test2.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/support.html b/support.html new file mode 100644 index 0000000..626f302 --- /dev/null +++ b/support.html @@ -0,0 +1,272 @@ + + + + + + + + + + + + + + + + + + + Miru - FAQ + + + + +
+
+ logo +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ContainersChromiumMobile ChromiumEdge ChromiumFirefox
3g2
3gp
avi
m2ts✓**
m4v etc.✓*✓*✓*✓*
mp4
mpeg
mov
ogm ogv
webm
mkv
+ * Container might be supported, but the container's codecs might not be.
+ ** Documented as working, but can't reproduce.
+ Full list of all tested video extensions:
+ .3g2 .3gp .asf .avi .dv .flv .gxf .m2ts .m4a .m4b .m4p .m4r .m4v .mkv .mov .mp4 .mpd .mpeg .mpg .mxf + .nut .ogm .ogv .swf .ts .vob .webm .wmv .wtv
+ Are any missing? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Video CodecsChromiumMobile ChromiumEdge ChromiumFirefox
AV1
H.263
H.264
H.265✓*
MPEG-2/4
Theora
VP8/9
+ * Requires MSStore extension which you can get by clicking this link while using Edge. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Audio CodecsChromiumMobile ChromiumEdge ChromiumFirefox
AAC
AC3✓**
DTS
EAC3✓**
FLAC✓*
MP3
Opus
TrueHD
Vorbis✓*
+ * Might not work in some video containers.
+ ** Documented as working, but can't reproduce.

+
+
+
+ + + + \ No newline at end of file