mirror of
https://github.com/arcodange-org/mediabunny.git
synced 2026-10-09 00:33:46 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bb9554df60 |
+1
-1
@@ -22,7 +22,7 @@
|
|||||||
for await (const packet of sink.packets()) {
|
for await (const packet of sink.packets()) {
|
||||||
console.log(packet);
|
console.log(packet);
|
||||||
|
|
||||||
if (packet.timestamp > 135) break;
|
//if (packet.timestamp > 135) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Generated
+6
-6
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "mediabunny",
|
"name": "mediabunny",
|
||||||
"version": "1.9.2",
|
"version": "1.9.3",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "mediabunny",
|
"name": "mediabunny",
|
||||||
"version": "1.9.2",
|
"version": "1.9.3",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"packages/*"
|
"packages/*"
|
||||||
@@ -5900,9 +5900,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/mediabunny": {
|
"node_modules/mediabunny": {
|
||||||
"version": "1.9.1",
|
"version": "1.9.2",
|
||||||
"resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.9.1.tgz",
|
"resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.9.2.tgz",
|
||||||
"integrity": "sha512-DghqcYW2s8LsZ9kErFeZdm6308BEABYs8SkY1z3Y7v3LWgPNvBmkXk7Yt+EKcpEGEFjGgDGoTapOjrrrNh7dQA==",
|
"integrity": "sha512-U3RKZVvU2O7vXVtPf6Q+4XNulkV6fdVOVYMm7V2YTr6PqyqrvUl1eUCTtcrmQESgRi9sFZeXkUR8ln5TS48M2g==",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"peer": true,
|
"peer": true,
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
@@ -9017,7 +9017,7 @@
|
|||||||
},
|
},
|
||||||
"packages/mp3-encoder": {
|
"packages/mp3-encoder": {
|
||||||
"name": "@mediabunny/mp3-encoder",
|
"name": "@mediabunny/mp3-encoder",
|
||||||
"version": "1.9.2",
|
"version": "1.9.3",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/emscripten": "^1.40.1"
|
"@types/emscripten": "^1.40.1"
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "mediabunny",
|
"name": "mediabunny",
|
||||||
"author": "Vanilagy",
|
"author": "Vanilagy",
|
||||||
"version": "1.9.2",
|
"version": "1.9.3",
|
||||||
"description": "Pure TypeScript media toolkit for reading, writing, and converting media files, directly in the browser.",
|
"description": "Pure TypeScript media toolkit for reading, writing, and converting media files, directly in the browser.",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@mediabunny/mp3-encoder",
|
"name": "@mediabunny/mp3-encoder",
|
||||||
"author": "Vanilagy",
|
"author": "Vanilagy",
|
||||||
"version": "1.9.2",
|
"version": "1.9.3",
|
||||||
"description": "MP3 encoder extension for Mediabunny, based on LAME.",
|
"description": "MP3 encoder extension for Mediabunny, based on LAME.",
|
||||||
"main": "./dist/bundles/mediabunny-mp3-encoder.mjs",
|
"main": "./dist/bundles/mediabunny-mp3-encoder.mjs",
|
||||||
"module": "./dist/bundles/mediabunny-mp3-encoder.mjs",
|
"module": "./dist/bundles/mediabunny-mp3-encoder.mjs",
|
||||||
|
|||||||
@@ -257,6 +257,9 @@ export class IsobmffDemuxer extends Demuxer {
|
|||||||
);
|
);
|
||||||
const startPos = this.metadataReader.pos;
|
const startPos = this.metadataReader.pos;
|
||||||
const boxInfo = this.metadataReader.readBoxHeader();
|
const boxInfo = this.metadataReader.readBoxHeader();
|
||||||
|
if (!boxInfo) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (boxInfo.name === 'ftyp') {
|
if (boxInfo.name === 'ftyp') {
|
||||||
const majorBrand = this.metadataReader.readAscii(4);
|
const majorBrand = this.metadataReader.readAscii(4);
|
||||||
@@ -298,7 +301,7 @@ export class IsobmffDemuxer extends Demuxer {
|
|||||||
this.metadataReader.pos = potentialMfraPos;
|
this.metadataReader.pos = potentialMfraPos;
|
||||||
const boxInfo = this.metadataReader.readBoxHeader();
|
const boxInfo = this.metadataReader.readBoxHeader();
|
||||||
|
|
||||||
if (boxInfo.name === 'mfra') {
|
if (boxInfo && boxInfo.name === 'mfra') {
|
||||||
// We found the mfra box, allowing for much better random access. Let's parse it.
|
// We found the mfra box, allowing for much better random access. Let's parse it.
|
||||||
|
|
||||||
await this.metadataReader.reader.loadRange(
|
await this.metadataReader.reader.loadRange(
|
||||||
@@ -462,7 +465,7 @@ export class IsobmffDemuxer extends Demuxer {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const moofBoxInfo = this.metadataReader.readBoxHeader();
|
const moofBoxInfo = this.metadataReader.readBoxHeader();
|
||||||
assert(moofBoxInfo.name === 'moof');
|
assert(moofBoxInfo?.name === 'moof');
|
||||||
|
|
||||||
const contentStart = this.metadataReader.pos;
|
const contentStart = this.metadataReader.pos;
|
||||||
await this.metadataReader.reader.loadRange(contentStart, contentStart + moofBoxInfo.contentSize);
|
await this.metadataReader.reader.loadRange(contentStart, contentStart + moofBoxInfo.contentSize);
|
||||||
@@ -508,7 +511,7 @@ export class IsobmffDemuxer extends Demuxer {
|
|||||||
|
|
||||||
let nextFragmentIsFirstFragment = this.metadataReader.pos === 0;
|
let nextFragmentIsFirstFragment = this.metadataReader.pos === 0;
|
||||||
|
|
||||||
while (this.metadataReader.pos < startPos) {
|
while (this.metadataReader.pos <= startPos - MIN_BOX_HEADER_SIZE) {
|
||||||
if (currentFragment?.nextFragment) {
|
if (currentFragment?.nextFragment) {
|
||||||
currentFragment = currentFragment.nextFragment;
|
currentFragment = currentFragment.nextFragment;
|
||||||
this.metadataReader.pos = currentFragment.moofOffset + currentFragment.moofSize;
|
this.metadataReader.pos = currentFragment.moofOffset + currentFragment.moofSize;
|
||||||
@@ -519,6 +522,9 @@ export class IsobmffDemuxer extends Demuxer {
|
|||||||
);
|
);
|
||||||
const startPos = this.metadataReader.pos;
|
const startPos = this.metadataReader.pos;
|
||||||
const boxInfo = this.metadataReader.readBoxHeader();
|
const boxInfo = this.metadataReader.readBoxHeader();
|
||||||
|
if (!boxInfo) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (boxInfo.name === 'moof') {
|
if (boxInfo.name === 'moof') {
|
||||||
const index = binarySearchExact(this.fragments, startPos, x => x.moofOffset);
|
const index = binarySearchExact(this.fragments, startPos, x => x.moofOffset);
|
||||||
@@ -568,13 +574,21 @@ export class IsobmffDemuxer extends Demuxer {
|
|||||||
const startIndex = this.metadataReader.pos;
|
const startIndex = this.metadataReader.pos;
|
||||||
|
|
||||||
while (this.metadataReader.pos - startIndex <= totalSize - MIN_BOX_HEADER_SIZE) {
|
while (this.metadataReader.pos - startIndex <= totalSize - MIN_BOX_HEADER_SIZE) {
|
||||||
this.traverseBox();
|
const foundBox = this.traverseBox();
|
||||||
|
|
||||||
|
if (!foundBox) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
traverseBox() {
|
traverseBox() {
|
||||||
const startPos = this.metadataReader.pos;
|
const startPos = this.metadataReader.pos;
|
||||||
const boxInfo = this.metadataReader.readBoxHeader();
|
const boxInfo = this.metadataReader.readBoxHeader();
|
||||||
|
if (!boxInfo) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const boxEndPos = startPos + boxInfo.totalSize;
|
const boxEndPos = startPos + boxInfo.totalSize;
|
||||||
|
|
||||||
switch (boxInfo.name) {
|
switch (boxInfo.name) {
|
||||||
@@ -825,6 +839,10 @@ export class IsobmffDemuxer extends Demuxer {
|
|||||||
for (let i = 0; i < entries; i++) {
|
for (let i = 0; i < entries; i++) {
|
||||||
const startPos = this.metadataReader.pos;
|
const startPos = this.metadataReader.pos;
|
||||||
const sampleBoxInfo = this.metadataReader.readBoxHeader();
|
const sampleBoxInfo = this.metadataReader.readBoxHeader();
|
||||||
|
if (!sampleBoxInfo) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
const lowercaseBoxName = sampleBoxInfo.name.toLowerCase();
|
const lowercaseBoxName = sampleBoxInfo.name.toLowerCase();
|
||||||
|
|
||||||
if (track.info.type === 'video') {
|
if (track.info.type === 'video') {
|
||||||
@@ -1904,6 +1922,7 @@ export class IsobmffDemuxer extends Demuxer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.metadataReader.pos = boxEndPos;
|
this.metadataReader.pos = boxEndPos;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2324,8 +2343,12 @@ abstract class IsobmffTrackBacking implements InputTrackBacking {
|
|||||||
|
|
||||||
/** Looks for a packet in the fragments while trying to load as few fragments as possible to retrieve it. */
|
/** Looks for a packet in the fragments while trying to load as few fragments as possible to retrieve it. */
|
||||||
private async performFragmentedLookup(
|
private async performFragmentedLookup(
|
||||||
|
// This function returns the best-matching sample that is currently loaded. Based on this information, we know
|
||||||
|
// which fragments we need to load to find the actual match.
|
||||||
getBestMatch: () => { fragmentIndex: number; sampleIndex: number; correctSampleFound: boolean },
|
getBestMatch: () => { fragmentIndex: number; sampleIndex: number; correctSampleFound: boolean },
|
||||||
|
// The timestamp with which we can search the lookup table
|
||||||
searchTimestamp: number,
|
searchTimestamp: number,
|
||||||
|
// The timestamp for which we know the correct sample will not come after it
|
||||||
latestTimestamp: number,
|
latestTimestamp: number,
|
||||||
options: PacketRetrievalOptions,
|
options: PacketRetrievalOptions,
|
||||||
): Promise<EncodedPacket | null> {
|
): Promise<EncodedPacket | null> {
|
||||||
@@ -2397,6 +2420,9 @@ abstract class IsobmffTrackBacking implements InputTrackBacking {
|
|||||||
await metadataReader.reader.loadRange(metadataReader.pos, metadataReader.pos + MAX_BOX_HEADER_SIZE);
|
await metadataReader.reader.loadRange(metadataReader.pos, metadataReader.pos + MAX_BOX_HEADER_SIZE);
|
||||||
const startPos = metadataReader.pos;
|
const startPos = metadataReader.pos;
|
||||||
const boxInfo = metadataReader.readBoxHeader();
|
const boxInfo = metadataReader.readBoxHeader();
|
||||||
|
if (!boxInfo) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (boxInfo.name === 'moof') {
|
if (boxInfo.name === 'moof') {
|
||||||
const index = binarySearchExact(demuxer.fragments, startPos, x => x.moofOffset);
|
const index = binarySearchExact(demuxer.fragments, startPos, x => x.moofOffset);
|
||||||
|
|||||||
@@ -132,6 +132,11 @@ export class IsobmffReader {
|
|||||||
headerSize = 16;
|
headerSize = 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
return { name, totalSize, headerSize, contentSize: totalSize - headerSize };
|
const contentSize = totalSize - headerSize;
|
||||||
|
if (contentSize < 0) {
|
||||||
|
return null; // Hardly a box is it
|
||||||
|
}
|
||||||
|
|
||||||
|
return { name, totalSize, headerSize, contentSize };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -760,6 +760,7 @@ export class MatroskaDemuxer extends Demuxer {
|
|||||||
|
|
||||||
while (reader.pos - startIndex <= totalSize - MIN_HEADER_SIZE) {
|
while (reader.pos - startIndex <= totalSize - MIN_HEADER_SIZE) {
|
||||||
const foundElement = this.traverseElement(reader);
|
const foundElement = this.traverseElement(reader);
|
||||||
|
|
||||||
if (!foundElement) {
|
if (!foundElement) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user