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 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; }