From 45a8c3f1dcb1cd4e746707990a04709e1da6a90e Mon Sep 17 00:00:00 2001 From: David Lukava Date: Mon, 21 Nov 2022 02:46:28 +0300 Subject: [PATCH 1/2] Fix Element(Segment and Cluster) size unknown error. It is not a full fix It's just a hack for one Segment and one Cluster videos. For full fix we need to (for Segment and Cluster) rewrite element.end to waiting for next element to be next Segment(0x18538067) or Cluster(0x1F43B675) --- src/JsWebm.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/JsWebm.js b/src/JsWebm.js index 8d20819..59113f4 100644 --- a/src/JsWebm.js +++ b/src/JsWebm.js @@ -284,6 +284,9 @@ class JsWebm { this.validateMetadata(); return true; } + // this hack only works for one Cluster webm videos. We need to remove from library element size dependence due to https://w3c.github.io/mse-byte-stream-format-webm/#webm-init-segments + if(this.tempElementHeader.size===-1)this.tempElementHeader.size = this.dataInterface.currentBuffer.byteLength-this.dataInterface.offset; + if(this.tempElementHeader.end-this.dataInterface.offset===-1)this.tempElementHeader.end = this.dataInterface.currentBuffer.byteLength; if (!this.currentCluster) { this.currentCluster = new Cluster( this.tempElementHeader.offset, @@ -422,6 +425,9 @@ class JsWebm { switch (this.currentElement.id) { case 0x18538067: // Segment + // this hack only works for one segment webm videos. We need to remove from library element size dependence due to https://w3c.github.io/mse-byte-stream-format-webm/#webm-init-segments + if(this.currentElement.size===-1)this.currentElement.size = dataInterface.currentBuffer.byteLength-dataInterface.offset; + if(this.currentElement.end-dataInterface.offset===-1)this.currentElement.end = dataInterface.currentBuffer.byteLength; this.segment = this.currentElement; break; case 0xEC: // void From d4f782405aa2630e4e2ab5beeb04cdaa3381e27c Mon Sep 17 00:00:00 2001 From: David Lukava Date: Mon, 21 Nov 2022 02:47:11 +0300 Subject: [PATCH 2/2] Fix unknown tags wasn't skipped --- src/Tracks.js | 4 ++++ src/VideoTrack.js | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/Tracks.js b/src/Tracks.js index 67d0f52..26490e6 100644 --- a/src/Tracks.js +++ b/src/Tracks.js @@ -46,6 +46,10 @@ class Tracks { return null; break; default: + if (!this.dataInterface.peekBytes(this.currentElement.size)) + return false; + else + this.dataInterface.skipBytes(this.currentElement.size); console.warn("track element not found, skipping : " + this.currentElement.id.toString(16)); break; } diff --git a/src/VideoTrack.js b/src/VideoTrack.js index abf4851..fb2e56b 100644 --- a/src/VideoTrack.js +++ b/src/VideoTrack.js @@ -106,6 +106,10 @@ class VideoTrack extends Track { break; } default: + if (!this.dataInterface.peekBytes(this.currentElement.size)) + return false; + else + this.dataInterface.skipBytes(this.currentElement.size); console.warn(`Info element not found, skipping: ${this.currentElement.id.toString(16)}`); break; }