diff --git a/packages/docs/docs/media-parser/fetch-reader.mdx b/packages/docs/docs/media-parser/fetch-reader.mdx index db7c781b04e..c8fd5c1b470 100644 --- a/packages/docs/docs/media-parser/fetch-reader.mdx +++ b/packages/docs/docs/media-parser/fetch-reader.mdx @@ -1,4 +1,5 @@ --- +image: /generated/articles-docs-media-parser-fetch-reader.png id: fetch-reader title: fetchReader slug: /media-parser/fetch-reader diff --git a/packages/docs/docs/media-parser/node-reader.mdx b/packages/docs/docs/media-parser/node-reader.mdx index f9d28e70c80..299e9a8f98a 100644 --- a/packages/docs/docs/media-parser/node-reader.mdx +++ b/packages/docs/docs/media-parser/node-reader.mdx @@ -1,4 +1,5 @@ --- +image: /generated/articles-docs-media-parser-node-reader.png id: node-reader title: nodeReader slug: /media-parser/node-reader diff --git a/packages/docs/docs/media-parser/support.mdx b/packages/docs/docs/media-parser/support.mdx new file mode 100644 index 00000000000..75798152d9f --- /dev/null +++ b/packages/docs/docs/media-parser/support.mdx @@ -0,0 +1,77 @@ +--- +image: /generated/articles-docs-media-parser-support.png +id: support +title: Runtime support +slug: /media-parser/support +crumb: "@remotion/media-parser" +--- + +`@remotion/media-parser` works in the Browser, Node.js and Bun. + +However, all of these require some quite modern versions (considered modern as of August 2024). + +## For parsing + +For parsing a video, the following minimum versions are required: + +- Node.js: 20.0.0 +- Bun 1.0.0 +- Chrome 111 +- Edge 111 +- Safari 16.4 +- Firefox 128 + +## For using WebCodecs + +WebCodecs support is not tied to `@remotion/media-parser` itself, but if you use it to extract samples, you need to use the following minimum versions: + +- Chrome 94 +- Edge 94 +- Safari 16.4 - No support for `AudioDecoder` +- Firefox - No support, but in development + +To check for `AudioDecoder` support, use + +```ts +const audioDecoderSupported = typeof AudioDecoder !== 'undefined'; +``` + +To check if a video track can be decoded with WebCodecs, use + +```ts twoslash title="Checking if a video track can be decoded" +import {OnVideoTrack} from '@remotion/media-parser'; + +const onVideoTrack: OnVideoTrack = async (track) => { + const {supported} = await VideoDecoder.isConfigSupported(track); + + if (!supported) { + // Don't receive unsupported video samples + return null; + } + + return (videoSample) => { + console.log('New video sample !', videoSample); + // Accept video sample + } +} +``` + + +```ts twoslash title="Checking if a audio track can be decoded" +// @noErrors +import {OnAudioTrack} from '@remotion/media-parser'; + +const onAudioTrack: OnAudioTrack = async (track) => { + const {supported} = await AudioDecoder.isConfigSupported(track); + + if (!supported) { + // Don't receive unsupported audio samples + return null; + } + + return (audioSample) => { + console.log('New audio sample!', audioSample); + // Accept audio sample + } +} +``` diff --git a/packages/docs/docs/media-parser/web-file-reader.mdx b/packages/docs/docs/media-parser/web-file-reader.mdx index 4542f8ed610..ab5f0afd0b1 100644 --- a/packages/docs/docs/media-parser/web-file-reader.mdx +++ b/packages/docs/docs/media-parser/web-file-reader.mdx @@ -1,4 +1,5 @@ --- +image: /generated/articles-docs-media-parser-web-file-reader.png id: web-file-reader title: webFileReader slug: /media-parser/web-file-reader diff --git a/packages/docs/docs/media-parser/webcodecs.mdx b/packages/docs/docs/media-parser/webcodecs.mdx index def5a275782..36d7fef619e 100644 --- a/packages/docs/docs/media-parser/webcodecs.mdx +++ b/packages/docs/docs/media-parser/webcodecs.mdx @@ -1,4 +1,5 @@ --- +image: /generated/articles-docs-media-parser-webcodecs.png id: webcodecs title: WebCodecs slug: /media-parser/webcodecs @@ -21,21 +22,20 @@ From MP4 videos: - [x] h.264 - [x] h.265 - [x] AV1 -- [ ] AAC -- [ ] MP3 -- [ ] PCM +- [x] AAC +- [x] MP3 -From WebM videos: +From Matroska videos: -- [ ] h.264 -- [ ] h.265 +- [x] h.264 +- [x] h.265 - [x] vp8 - [x] vp9 - [x] AV1 -- [ ] AAC -- [ ] MP3 -- [ ] Opus -- [ ] PCM +- [x] AAC +- [x] MP3 +- [x] Opus +- [x] PCM (No browser supports it yet) - [x] Vorbis ## API diff --git a/packages/docs/sidebars.js b/packages/docs/sidebars.js index 18ec398a271..6afc941b2f1 100644 --- a/packages/docs/sidebars.js +++ b/packages/docs/sidebars.js @@ -564,6 +564,7 @@ module.exports = { 'media-parser/fetch-reader', 'media-parser/web-file-reader', 'media-parser/webcodecs', + 'media-parser/support', ], }, { diff --git a/packages/docs/src/data/articles.ts b/packages/docs/src/data/articles.ts index 16518a7e749..fdbdd9dd90b 100644 --- a/packages/docs/src/data/articles.ts +++ b/packages/docs/src/data/articles.ts @@ -3338,6 +3338,20 @@ export const articles = [ compId: 'articles-docs-media-parser-parse-media', crumb: '@remotion/media-parser', }, + { + id: 'node-reader', + title: 'nodeReader', + relativePath: 'docs/media-parser/node-reader.mdx', + compId: 'articles-docs-media-parser-node-reader', + crumb: '@remotion/media-parser', + }, + { + id: 'web-file-reader', + title: 'webFileReader', + relativePath: 'docs/media-parser/web-file-reader.mdx', + compId: 'articles-docs-media-parser-web-file-reader', + crumb: '@remotion/media-parser', + }, { id: 'media-parser/index', title: '@remotion/media-parser', @@ -3345,6 +3359,27 @@ export const articles = [ compId: 'articles-docs-media-parser-index', crumb: null, }, + { + id: 'support', + title: 'Runtime support', + relativePath: 'docs/media-parser/support.mdx', + compId: 'articles-docs-media-parser-support', + crumb: '@remotion/media-parser', + }, + { + id: 'webcodecs', + title: 'WebCodecs', + relativePath: 'docs/media-parser/webcodecs.mdx', + compId: 'articles-docs-media-parser-webcodecs', + crumb: '@remotion/media-parser', + }, + { + id: 'fetch-reader', + title: 'fetchReader', + relativePath: 'docs/media-parser/fetch-reader.mdx', + compId: 'articles-docs-media-parser-fetch-reader', + crumb: '@remotion/media-parser', + }, { id: 'measure-spring', title: 'measureSpring()', diff --git a/packages/docs/static/generated/articles-docs-media-parser-fetch-reader.png b/packages/docs/static/generated/articles-docs-media-parser-fetch-reader.png new file mode 100644 index 00000000000..188107b9352 Binary files /dev/null and b/packages/docs/static/generated/articles-docs-media-parser-fetch-reader.png differ diff --git a/packages/docs/static/generated/articles-docs-media-parser-node-reader.png b/packages/docs/static/generated/articles-docs-media-parser-node-reader.png new file mode 100644 index 00000000000..adadf94c925 Binary files /dev/null and b/packages/docs/static/generated/articles-docs-media-parser-node-reader.png differ diff --git a/packages/docs/static/generated/articles-docs-media-parser-support.png b/packages/docs/static/generated/articles-docs-media-parser-support.png new file mode 100644 index 00000000000..009371bcde4 Binary files /dev/null and b/packages/docs/static/generated/articles-docs-media-parser-support.png differ diff --git a/packages/docs/static/generated/articles-docs-media-parser-web-file-reader.png b/packages/docs/static/generated/articles-docs-media-parser-web-file-reader.png new file mode 100644 index 00000000000..ffa333af77d Binary files /dev/null and b/packages/docs/static/generated/articles-docs-media-parser-web-file-reader.png differ diff --git a/packages/docs/static/generated/articles-docs-media-parser-webcodecs.png b/packages/docs/static/generated/articles-docs-media-parser-webcodecs.png new file mode 100644 index 00000000000..4d8d0cd135c Binary files /dev/null and b/packages/docs/static/generated/articles-docs-media-parser-webcodecs.png differ diff --git a/packages/docusaurus-plugin/package.json b/packages/docusaurus-plugin/package.json index 79dcb27c6f4..ddeab24c73f 100644 --- a/packages/docusaurus-plugin/package.json +++ b/packages/docusaurus-plugin/package.json @@ -19,7 +19,8 @@ "fenceparser": "^2.2.0", "shiki": "0.10.1", "@typescript/twoslash": "3.2.1", - "@docusaurus/types": "3.4.0" + "@docusaurus/types": "3.4.0", + "@types/dom-webcodecs": "0.1.11" }, "private": true, "repository": { diff --git a/packages/example/package.json b/packages/example/package.json index 9aa174293cd..44674d7b674 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -92,7 +92,8 @@ }, "devDependencies": { "prettier-plugin-organize-imports": "3.2.4", - "sharp": "0.32.6" + "sharp": "0.32.6", + "@types/dom-webcodecs": "0.1.11" }, "publishConfig": { "access": "public" diff --git a/packages/example/public/bigbuckbunny.aac b/packages/example/public/bigbuckbunny.aac deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/packages/example/public/matroska-h265-aac.mkv b/packages/example/public/matroska-h265-aac.mkv new file mode 100644 index 00000000000..b52a4c09fae Binary files /dev/null and b/packages/example/public/matroska-h265-aac.mkv differ diff --git a/packages/example/public/matroska-mp3.mkv b/packages/example/public/matroska-mp3.mkv new file mode 100644 index 00000000000..21737782857 Binary files /dev/null and b/packages/example/public/matroska-mp3.mkv differ diff --git a/packages/example/public/opus.webm b/packages/example/public/opus.webm new file mode 100644 index 00000000000..6d06b2f1aaf Binary files /dev/null and b/packages/example/public/opus.webm differ diff --git a/packages/example/public/sample.aac b/packages/example/public/sample.aac new file mode 100644 index 00000000000..6ac801196dd Binary files /dev/null and b/packages/example/public/sample.aac differ diff --git a/packages/example/src/Encoder/SrcEncoder.tsx b/packages/example/src/Encoder/SrcEncoder.tsx new file mode 100644 index 00000000000..cd2f99ca482 --- /dev/null +++ b/packages/example/src/Encoder/SrcEncoder.tsx @@ -0,0 +1,135 @@ +import {OnAudioTrack, OnVideoTrack, parseMedia} from '@remotion/media-parser'; +import React, {useCallback, useRef} from 'react'; +import {flushSync} from 'react-dom'; + +export const SrcEncoder: React.FC<{ + src: string; +}> = ({src}) => { + const [samples, setSamples] = React.useState(0); + const [videoFrames, setVideoFrames] = React.useState(0); + const [audioFrames, setAudioFrames] = React.useState(0); + + const ref = useRef(null); + + const onVideoTrack: OnVideoTrack = useCallback(async (track) => { + const decoder = await VideoDecoder.isConfigSupported(track); + + if (!decoder.supported) { + return null; + } + + const videoDecoder = new VideoDecoder({ + async output(inputFrame) { + const image = await createImageBitmap(inputFrame, { + resizeHeight: 100, + resizeWidth: 100, + }); + + ref.current?.getContext('2d')?.drawImage(image, 0, 0); + flushSync(() => { + setVideoFrames((prev) => prev + 1); + }); + inputFrame.close(); + }, + error(error) { + console.error(error); + }, + }); + videoDecoder.configure(track); + + return async (chunk) => { + flushSync(() => { + setSamples((s) => s + 1); + }); + if (videoDecoder.decodeQueueSize > 10) { + let resolve = () => {}; + + const cb = () => { + resolve(); + }; + + await new Promise((r) => { + resolve = r; + videoDecoder.addEventListener('dequeue', cb); + }); + videoDecoder.removeEventListener('dequeue', cb); + } + videoDecoder.decode(new EncodedVideoChunk(chunk)); + }; + }, []); + + const onAudioTrack: OnAudioTrack = useCallback(async (track) => { + console.log(track); + + const {supported} = await AudioDecoder.isConfigSupported(track); + + if (!supported) { + return null; + } + + if (typeof AudioDecoder === 'undefined') { + return null; + } + + const audioDecoder = new AudioDecoder({ + output(inputFrame) { + flushSync(() => { + setAudioFrames((prev) => prev + 1); + }); + inputFrame.close(); + }, + error(error) { + console.error(error); + }, + }); + + audioDecoder.configure(track); + + return async (audioSample) => { + flushSync(() => { + setSamples((s) => s + 1); + }); + if (audioDecoder.decodeQueueSize > 10) { + console.log('audio decoder queue size', audioDecoder.decodeQueueSize); + let resolve = () => {}; + + const cb = () => { + resolve(); + }; + + await new Promise((r) => { + resolve = r; + // @ts-expect-error exists + audioDecoder.addEventListener('dequeue', cb); + }); + // @ts-expect-error exists + audioDecoder.removeEventListener('dequeue', cb); + } + audioDecoder.decode(new EncodedAudioChunk(audioSample)); + }; + }, []); + + const onClick = useCallback(() => { + console.time('done'); + parseMedia({ + src, + onVideoTrack, + onAudioTrack, + }).then(() => { + console.timeEnd('done'); + }); + }, [onAudioTrack, onVideoTrack, src]); + + return ( +
+ {src}{' '} + + {samples > 0 &&
{samples} samples
} + {videoFrames > 0 &&
{videoFrames} video frames
} + {audioFrames > 0 &&
{audioFrames} audio frames
} + +
+ ); +}; diff --git a/packages/example/src/EncoderDemo.tsx b/packages/example/src/EncoderDemo.tsx index 296d9017b8d..a3e328a37a7 100644 --- a/packages/example/src/EncoderDemo.tsx +++ b/packages/example/src/EncoderDemo.tsx @@ -1,17 +1,42 @@ import {parseVideo, reencodeVideo} from '@remotion/browser-renderer'; import React from 'react'; +import {staticFile} from 'remotion'; +import {SrcEncoder} from './Encoder/SrcEncoder'; export const EncoderDemo: React.FC = () => { return ( <> - parseVideo(e.target.files?.[0] as File)} - /> - reencodeVideo(e.target.files?.[0] as File)} - /> +
+
+ parseVideo(e.target.files?.[0] as File)} + /> + reencodeVideo(e.target.files?.[0] as File)} + /> +
+ + + + + + + + + + + + + + + +
); }; diff --git a/packages/example/src/Root.tsx b/packages/example/src/Root.tsx index 7ac0f2711a5..9958661b9ba 100644 --- a/packages/example/src/Root.tsx +++ b/packages/example/src/Root.tsx @@ -1444,7 +1444,7 @@ export const Index: React.FC = () => { id="EncoderDemo" component={EncoderDemo} height={500} - width={500} + width={800} /> ); diff --git a/packages/media-parser/boxes.json b/packages/media-parser/boxes.json deleted file mode 100644 index 808dcd3b100..00000000000 --- a/packages/media-parser/boxes.json +++ /dev/null @@ -1,17272 +0,0 @@ -[ - { - "type": "main-segment", - "children": [ - { - "type": "seek-head-segment", - "length": 45, - "children": [ - { - "type": "seek-segment", - "children": [ - { - "type": "seek-id-segment", - "seekId": "0x1549a966" - }, - { - "type": "seek-position-segment", - "seekPosition": 223 - } - ] - }, - { - "type": "seek-segment", - "children": [ - { - "type": "seek-id-segment", - "seekId": "0x1654ae6b" - }, - { - "type": "seek-position-segment", - "seekPosition": 304 - } - ] - }, - { - "type": "seek-segment", - "children": [ - { - "type": "seek-id-segment", - "seekId": "0x1c53bb6b" - }, - { - "type": "seek-position-segment", - "seekPosition": 13195235 - } - ] - } - ] - }, - { - "type": "void-segment", - "length": 163 - }, - { - "type": "info-segment", - "length": 69, - "children": [ - { - "type": "timestamp-scale-segment", - "timestampScale": 1000000 - }, - { - "type": "muxing-app-segment", - "value": "Lavf55.19.104" - }, - { - "type": "writing-app-segment", - "value": "Lavf55.19.104" - }, - { - "type": "segment-uuid-segment", - "segmentUUID": "109,141,199,38,123,198,107,104,42,243,137,21,120,42,180,46" - }, - { - "type": "duration-segment", - "duration": 12044 - } - ] - }, - { - "type": "tracks-segment", - "children": [ - { - "type": "track-entry-segment", - "children": [ - { - "type": "track-number-segment", - "trackNumber": 1 - }, - { - "type": "track-uid-segment", - "trackUid": "01" - }, - { - "type": "flag-lacing-segment", - "lacing": false - }, - { - "type": "language-segment", - "language": "und" - }, - { - "type": "codec-segment", - "codec": "V_VP8" - }, - { - "type": "track-type-segment", - "trackType": "video" - }, - { - "type": "default-duration-segment", - "defaultDuration": 40000000 - }, - { - "type": "video-segment", - "children": [ - { - "type": "width-segment", - "width": 1440 - }, - { - "type": "height-segment", - "height": 1080 - }, - { - "type": "display-width-segment", - "displayWidth": 1920 - }, - { - "type": "display-height-segment", - "displayHeight": 1080 - } - ] - } - ] - }, - { - "type": "track-entry-segment", - "children": [ - { - "type": "track-number-segment", - "trackNumber": 2 - }, - { - "type": "track-uid-segment", - "trackUid": "02" - }, - { - "type": "flag-lacing-segment", - "lacing": false - }, - { - "type": "language-segment", - "language": "und" - }, - { - "type": "codec-segment", - "codec": "A_VORBIS" - }, - { - "type": "track-type-segment", - "trackType": "audio" - }, - { - "type": "audio-segment", - "children": [ - { - "type": "channels-segment", - "channels": 2 - }, - { - "type": "sampling-frequency-segment", - "samplingFrequency": 44100 - }, - { - "type": "bit-depth-segment", - "bitDepth": 32 - } - ] - }, - { - "type": "codec-private-segment", - "codecPrivateData": { - "0": 2, - "1": 30, - "2": 88, - "3": 1, - "4": 118, - "5": 111, - "6": 114, - "7": 98, - "8": 105, - "9": 115, - "10": 0, - "11": 0, - "12": 0, - "13": 0, - "14": 2, - "15": 68, - "16": 172, - "17": 0, - "18": 0, - "19": 0, - "20": 0, - "21": 0, - "22": 0, - "23": 109, - "24": 160, - "25": 7, - "26": 0, - "27": 0, - "28": 0, - "29": 0, - "30": 0, - "31": 184, - "32": 1, - "33": 3, - "34": 118, - "35": 111, - "36": 114, - "37": 98, - "38": 105, - "39": 115, - "40": 47, - "41": 0, - "42": 0, - "43": 0, - "44": 88, - "45": 105, - "46": 112, - "47": 104, - "48": 46, - "49": 79, - "50": 114, - "51": 103, - "52": 32, - "53": 108, - "54": 105, - "55": 98, - "56": 86, - "57": 111, - "58": 114, - "59": 98, - "60": 105, - "61": 115, - "62": 32, - "63": 73, - "64": 32, - "65": 50, - "66": 48, - "67": 49, - "68": 52, - "69": 48, - "70": 49, - "71": 50, - "72": 50, - "73": 32, - "74": 40, - "75": 84, - "76": 117, - "77": 114, - "78": 112, - "79": 97, - "80": 107, - "81": 195, - "82": 164, - "83": 114, - "84": 195, - "85": 164, - "86": 106, - "87": 105, - "88": 105, - "89": 110, - "90": 41, - "91": 1, - "92": 0, - "93": 0, - "94": 0, - "95": 21, - "96": 0, - "97": 0, - "98": 0, - "99": 101, - "100": 110, - "101": 99, - "102": 111, - "103": 100, - "104": 101, - "105": 114, - "106": 61, - "107": 76, - "108": 97, - "109": 118, - "110": 99, - "111": 53, - "112": 53, - "113": 46, - "114": 51, - "115": 57, - "116": 46, - "117": 49, - "118": 48, - "119": 49, - "120": 1, - "121": 5, - "122": 118, - "123": 111, - "124": 114, - "125": 98, - "126": 105, - "127": 115, - "128": 43, - "129": 66, - "130": 67, - "131": 86, - "132": 1, - "133": 0, - "134": 8, - "135": 0, - "136": 0, - "137": 0, - "138": 49, - "139": 76, - "140": 32, - "141": 197, - "142": 128, - "143": 208, - "144": 144, - "145": 85, - "146": 0, - "147": 0, - "148": 16, - "149": 0, - "150": 0, - "151": 96, - "152": 36, - "153": 41, - "154": 14, - "155": 147, - "156": 102, - "157": 73, - "158": 41, - "159": 165, - "160": 148, - "161": 161, - "162": 40, - "163": 121, - "164": 152, - "165": 148, - "166": 72, - "167": 73, - "168": 41, - "169": 165, - "170": 148, - "171": 197, - "172": 48, - "173": 137, - "174": 152, - "175": 148, - "176": 137, - "177": 197, - "178": 24, - "179": 99, - "180": 140, - "181": 49, - "182": 198, - "183": 24, - "184": 99, - "185": 140, - "186": 49, - "187": 198, - "188": 24, - "189": 99, - "190": 140, - "191": 32, - "192": 52, - "193": 100, - "194": 21, - "195": 0, - "196": 0, - "197": 4, - "198": 0, - "199": 128, - "200": 40, - "201": 9, - "202": 142, - "203": 163, - "204": 230, - "205": 73, - "206": 106, - "207": 206, - "208": 57, - "209": 103, - "210": 24, - "211": 39, - "212": 142, - "213": 114, - "214": 160, - "215": 57, - "216": 105, - "217": 78, - "218": 56, - "219": 167, - "220": 32, - "221": 7, - "222": 138, - "223": 81, - "224": 224, - "225": 57, - "226": 9, - "227": 194, - "228": 245, - "229": 38, - "230": 99, - "231": 110, - "232": 166, - "233": 180, - "234": 166, - "235": 107, - "236": 110, - "237": 206, - "238": 41, - "239": 37, - "240": 8, - "241": 13, - "242": 89, - "243": 5, - "244": 0, - "245": 0, - "246": 2, - "247": 0, - "248": 64, - "249": 72, - "250": 33, - "251": 133, - "252": 20, - "253": 82, - "254": 72, - "255": 33, - "256": 133, - "257": 20, - "258": 98, - "259": 136, - "260": 33, - "261": 134, - "262": 24, - "263": 98, - "264": 136, - "265": 33, - "266": 135, - "267": 28, - "268": 114, - "269": 200, - "270": 33, - "271": 167, - "272": 156, - "273": 114, - "274": 10, - "275": 42, - "276": 168, - "277": 160, - "278": 130, - "279": 10, - "280": 50, - "281": 200, - "282": 32, - "283": 131, - "284": 76, - "285": 50, - "286": 233, - "287": 164, - "288": 147, - "289": 78, - "290": 58, - "291": 233, - "292": 168, - "293": 163, - "294": 142, - "295": 58, - "296": 234, - "297": 40, - "298": 180, - "299": 208, - "300": 66, - "301": 11, - "302": 45, - "303": 180, - "304": 210, - "305": 74, - "306": 76, - "307": 49, - "308": 213, - "309": 86, - "310": 99, - "311": 174, - "312": 189, - "313": 6, - "314": 93, - "315": 124, - "316": 115, - "317": 206, - "318": 57, - "319": 231, - "320": 156, - "321": 115, - "322": 206, - "323": 57, - "324": 231, - "325": 156, - "326": 115, - "327": 206, - "328": 9, - "329": 66, - "330": 67, - "331": 86, - "332": 1, - "333": 0, - "334": 32, - "335": 0, - "336": 0, - "337": 4, - "338": 66, - "339": 6, - "340": 25, - "341": 100, - "342": 16, - "343": 66, - "344": 8, - "345": 33, - "346": 133, - "347": 20, - "348": 82, - "349": 136, - "350": 41, - "351": 166, - "352": 152, - "353": 114, - "354": 10, - "355": 50, - "356": 200, - "357": 128, - "358": 208, - "359": 144, - "360": 85, - "361": 0, - "362": 0, - "363": 32, - "364": 0, - "365": 128, - "366": 0, - "367": 0, - "368": 0, - "369": 0, - "370": 71, - "371": 145, - "372": 20, - "373": 73, - "374": 177, - "375": 20, - "376": 203, - "377": 177, - "378": 28, - "379": 205, - "380": 209, - "381": 36, - "382": 79, - "383": 242, - "384": 44, - "385": 81, - "386": 19, - "387": 53, - "388": 209, - "389": 51, - "390": 69, - "391": 83, - "392": 84, - "393": 77, - "394": 85, - "395": 85, - "396": 85, - "397": 85, - "398": 117, - "399": 93, - "400": 87, - "401": 118, - "402": 101, - "403": 215, - "404": 118, - "405": 117, - "406": 215, - "407": 118, - "408": 125, - "409": 89, - "410": 152, - "411": 133, - "412": 91, - "413": 184, - "414": 125, - "415": 89, - "416": 184, - "417": 133, - "418": 91, - "419": 216, - "420": 133, - "421": 93, - "422": 247, - "423": 133, - "424": 97, - "425": 24, - "426": 134, - "427": 97, - "428": 24, - "429": 134, - "430": 97, - "431": 24, - "432": 134, - "433": 97, - "434": 248, - "435": 125, - "436": 223, - "437": 247, - "438": 125, - "439": 223, - "440": 247, - "441": 125, - "442": 32, - "443": 52, - "444": 100, - "445": 21, - "446": 0, - "447": 32, - "448": 1, - "449": 0, - "450": 160, - "451": 35, - "452": 57, - "453": 150, - "454": 227, - "455": 41, - "456": 162, - "457": 34, - "458": 26, - "459": 162, - "460": 226, - "461": 57, - "462": 162, - "463": 3, - "464": 132, - "465": 134, - "466": 172, - "467": 2, - "468": 0, - "469": 100, - "470": 0, - "471": 0, - "472": 4, - "473": 0, - "474": 32, - "475": 9, - "476": 146, - "477": 34, - "478": 41, - "479": 146, - "480": 163, - "481": 73, - "482": 166, - "483": 102, - "484": 106, - "485": 174, - "486": 105, - "487": 155, - "488": 182, - "489": 104, - "490": 171, - "491": 182, - "492": 109, - "493": 203, - "494": 178, - "495": 44, - "496": 203, - "497": 178, - "498": 12, - "499": 132, - "500": 134, - "501": 172, - "502": 2, - "503": 0, - "504": 0, - "505": 1, - "506": 0, - "507": 4, - "508": 0, - "509": 0, - "510": 0, - "511": 0, - "512": 0, - "513": 160, - "514": 105, - "515": 154, - "516": 166, - "517": 105, - "518": 154, - "519": 166, - "520": 105, - "521": 154, - "522": 166, - "523": 105, - "524": 154, - "525": 166, - "526": 105, - "527": 154, - "528": 166, - "529": 105, - "530": 154, - "531": 166, - "532": 105, - "533": 154, - "534": 102, - "535": 89, - "536": 150, - "537": 101, - "538": 89, - "539": 150, - "540": 101, - "541": 89, - "542": 150, - "543": 101, - "544": 89, - "545": 150, - "546": 101, - "547": 89, - "548": 150, - "549": 101, - "550": 89, - "551": 150, - "552": 101, - "553": 89, - "554": 150, - "555": 101, - "556": 89, - "557": 150, - "558": 101, - "559": 89, - "560": 150, - "561": 101, - "562": 89, - "563": 150, - "564": 101, - "565": 89, - "566": 150, - "567": 101, - "568": 89, - "569": 150, - "570": 101, - "571": 89, - "572": 64, - "573": 104, - "574": 200, - "575": 42, - "576": 0, - "577": 64, - "578": 2, - "579": 0, - "580": 64, - "581": 199, - "582": 113, - "583": 28, - "584": 199, - "585": 113, - "586": 36, - "587": 69, - "588": 82, - "589": 36, - "590": 199, - "591": 114, - "592": 44, - "593": 7, - "594": 8, - "595": 13, - "596": 89, - "597": 5, - "598": 0, - "599": 200, - "600": 0, - "601": 0, - "602": 8, - "603": 0, - "604": 64, - "605": 82, - "606": 44, - "607": 197, - "608": 114, - "609": 52, - "610": 71, - "611": 115, - "612": 52, - "613": 199, - "614": 115, - "615": 60, - "616": 199, - "617": 115, - "618": 60, - "619": 71, - "620": 116, - "621": 68, - "622": 201, - "623": 148, - "624": 76, - "625": 205, - "626": 244, - "627": 76, - "628": 15, - "629": 8, - "630": 13, - "631": 89, - "632": 5, - "633": 0, - "634": 0, - "635": 2, - "636": 0, - "637": 8, - "638": 0, - "639": 0, - "640": 0, - "641": 0, - "642": 0, - "643": 64, - "644": 49, - "645": 28, - "646": 197, - "647": 113, - "648": 28, - "649": 201, - "650": 209, - "651": 36, - "652": 79, - "653": 82, - "654": 45, - "655": 211, - "656": 114, - "657": 53, - "658": 87, - "659": 115, - "660": 61, - "661": 215, - "662": 115, - "663": 77, - "664": 215, - "665": 117, - "666": 93, - "667": 87, - "668": 85, - "669": 85, - "670": 85, - "671": 85, - "672": 85, - "673": 85, - "674": 85, - "675": 85, - "676": 85, - "677": 85, - "678": 85, - "679": 85, - "680": 85, - "681": 85, - "682": 85, - "683": 85, - "684": 85, - "685": 85, - "686": 85, - "687": 85, - "688": 85, - "689": 85, - "690": 85, - "691": 85, - "692": 85, - "693": 85, - "694": 85, - "695": 85, - "696": 85, - "697": 85, - "698": 85, - "699": 85, - "700": 85, - "701": 85, - "702": 129, - "703": 208, - "704": 144, - "705": 85, - "706": 0, - "707": 0, - "708": 4, - "709": 0, - "710": 0, - "711": 33, - "712": 157, - "713": 102, - "714": 150, - "715": 106, - "716": 128, - "717": 8, - "718": 51, - "719": 144, - "720": 97, - "721": 32, - "722": 52, - "723": 100, - "724": 21, - "725": 0, - "726": 128, - "727": 0, - "728": 0, - "729": 0, - "730": 24, - "731": 161, - "732": 8, - "733": 67, - "734": 12, - "735": 8, - "736": 13, - "737": 89, - "738": 5, - "739": 0, - "740": 0, - "741": 4, - "742": 0, - "743": 0, - "744": 136, - "745": 161, - "746": 228, - "747": 32, - "748": 154, - "749": 208, - "750": 154, - "751": 243, - "752": 205, - "753": 57, - "754": 14, - "755": 154, - "756": 229, - "757": 160, - "758": 169, - "759": 20, - "760": 155, - "761": 211, - "762": 193, - "763": 137, - "764": 84, - "765": 155, - "766": 39, - "767": 185, - "768": 169, - "769": 152, - "770": 155, - "771": 115, - "772": 206, - "773": 57, - "774": 231, - "775": 156, - "776": 108, - "777": 206, - "778": 25, - "779": 227, - "780": 156, - "781": 115, - "782": 206, - "783": 41, - "784": 202, - "785": 153, - "786": 197, - "787": 160, - "788": 153, - "789": 208, - "790": 154, - "791": 115, - "792": 206, - "793": 73, - "794": 12, - "795": 154, - "796": 165, - "797": 160, - "798": 153, - "799": 208, - "800": 154, - "801": 115, - "802": 206, - "803": 121, - "804": 18, - "805": 155, - "806": 7, - "807": 173, - "808": 169, - "809": 210, - "810": 154, - "811": 115, - "812": 206, - "813": 25, - "814": 231, - "815": 156, - "816": 14, - "817": 198, - "818": 25, - "819": 97, - "820": 156, - "821": 115, - "822": 206, - "823": 105, - "824": 210, - "825": 154, - "826": 7, - "827": 169, - "828": 217, - "829": 88, - "830": 155, - "831": 115, - "832": 206, - "833": 89, - "834": 208, - "835": 154, - "836": 230, - "837": 168, - "838": 185, - "839": 20, - "840": 155, - "841": 115, - "842": 206, - "843": 137, - "844": 148, - "845": 155, - "846": 39, - "847": 181, - "848": 185, - "849": 84, - "850": 155, - "851": 115, - "852": 206, - "853": 57, - "854": 231, - "855": 156, - "856": 115, - "857": 206, - "858": 57, - "859": 231, - "860": 156, - "861": 115, - "862": 206, - "863": 169, - "864": 94, - "865": 156, - "866": 206, - "867": 193, - "868": 57, - "869": 225, - "870": 156, - "871": 115, - "872": 206, - "873": 137, - "874": 218, - "875": 155, - "876": 107, - "877": 185, - "878": 9, - "879": 93, - "880": 156, - "881": 115, - "882": 206, - "883": 249, - "884": 100, - "885": 156, - "886": 238, - "887": 205, - "888": 9, - "889": 225, - "890": 156, - "891": 115, - "892": 206, - "893": 57, - "894": 231, - "895": 156, - "896": 115, - "897": 206, - "898": 57, - "899": 231, - "900": 156, - "901": 115, - "902": 206, - "903": 9, - "904": 66, - "905": 67, - "906": 86, - "907": 1, - "908": 0, - "909": 64, - "910": 0, - "911": 0, - "912": 4, - "913": 97, - "914": 216, - "915": 24, - "916": 198, - "917": 157, - "918": 130, - "919": 32, - "920": 125, - "921": 142, - "922": 6, - "923": 98, - "924": 20, - "925": 33, - "926": 166, - "927": 33, - "928": 147, - "929": 30, - "930": 116, - "931": 143, - "932": 14, - "933": 147, - "934": 160, - "935": 49, - "936": 200, - "937": 41, - "938": 164, - "939": 30, - "940": 141, - "941": 142, - "942": 70, - "943": 74, - "944": 169, - "945": 131, - "946": 80, - "947": 82, - "948": 25, - "949": 39, - "950": 165, - "951": 116, - "952": 130, - "953": 208, - "954": 144, - "955": 85, - "956": 0, - "957": 0, - "958": 32, - "959": 0, - "960": 0, - "961": 132, - "962": 16, - "963": 82, - "964": 72, - "965": 33, - "966": 133, - "967": 20, - "968": 82, - "969": 72, - "970": 33, - "971": 133, - "972": 20, - "973": 82, - "974": 72, - "975": 33, - "976": 134, - "977": 24, - "978": 98, - "979": 136, - "980": 33, - "981": 167, - "982": 156, - "983": 114, - "984": 10, - "985": 42, - "986": 168, - "987": 164, - "988": 146, - "989": 138, - "990": 42, - "991": 202, - "992": 40, - "993": 179, - "994": 204, - "995": 50, - "996": 203, - "997": 44, - "998": 179, - "999": 204, - "1000": 50, - "1001": 203, - "1002": 172, - "1003": 195, - "1004": 206, - "1005": 58, - "1006": 235, - "1007": 176, - "1008": 195, - "1009": 16, - "1010": 67, - "1011": 12, - "1012": 49, - "1013": 180, - "1014": 210, - "1015": 74, - "1016": 44, - "1017": 53, - "1018": 213, - "1019": 86, - "1020": 99, - "1021": 141, - "1022": 181, - "1023": 230, - "1024": 158, - "1025": 115, - "1026": 174, - "1027": 57, - "1028": 72, - "1029": 107, - "1030": 165, - "1031": 181, - "1032": 214, - "1033": 90, - "1034": 43, - "1035": 165, - "1036": 148, - "1037": 82, - "1038": 74, - "1039": 41, - "1040": 165, - "1041": 32, - "1042": 52, - "1043": 100, - "1044": 21, - "1045": 0, - "1046": 0, - "1047": 2, - "1048": 0, - "1049": 64, - "1050": 32, - "1051": 100, - "1052": 144, - "1053": 65, - "1054": 6, - "1055": 25, - "1056": 133, - "1057": 20, - "1058": 82, - "1059": 72, - "1060": 33, - "1061": 134, - "1062": 152, - "1063": 114, - "1064": 202, - "1065": 41, - "1066": 167, - "1067": 160, - "1068": 130, - "1069": 10, - "1070": 8, - "1071": 13, - "1072": 89, - "1073": 5, - "1074": 0, - "1075": 0, - "1076": 2, - "1077": 0, - "1078": 8, - "1079": 0, - "1080": 0, - "1081": 0, - "1082": 240, - "1083": 36, - "1084": 207, - "1085": 17, - "1086": 29, - "1087": 209, - "1088": 17, - "1089": 29, - "1090": 209, - "1091": 17, - "1092": 29, - "1093": 209, - "1094": 17, - "1095": 29, - "1096": 209, - "1097": 17, - "1098": 29, - "1099": 207, - "1100": 241, - "1101": 28, - "1102": 81, - "1103": 18, - "1104": 37, - "1105": 81, - "1106": 18, - "1107": 37, - "1108": 209, - "1109": 50, - "1110": 45, - "1111": 83, - "1112": 51, - "1113": 61, - "1114": 85, - "1115": 84, - "1116": 85, - "1117": 87, - "1118": 118, - "1119": 109, - "1120": 89, - "1121": 151, - "1122": 117, - "1123": 219, - "1124": 183, - "1125": 133, - "1126": 93, - "1127": 216, - "1128": 117, - "1129": 223, - "1130": 215, - "1131": 125, - "1132": 223, - "1133": 215, - "1134": 141, - "1135": 95, - "1136": 23, - "1137": 134, - "1138": 101, - "1139": 89, - "1140": 150, - "1141": 101, - "1142": 89, - "1143": 150, - "1144": 101, - "1145": 89, - "1146": 150, - "1147": 101, - "1148": 89, - "1149": 150, - "1150": 101, - "1151": 89, - "1152": 150, - "1153": 101, - "1154": 9, - "1155": 66, - "1156": 67, - "1157": 86, - "1158": 1, - "1159": 0, - "1160": 32, - "1161": 0, - "1162": 0, - "1163": 0, - "1164": 66, - "1165": 8, - "1166": 33, - "1167": 132, - "1168": 20, - "1169": 82, - "1170": 72, - "1171": 33, - "1172": 133, - "1173": 148, - "1174": 98, - "1175": 140, - "1176": 49, - "1177": 199, - "1178": 156, - "1179": 131, - "1180": 78, - "1181": 66, - "1182": 9, - "1183": 129, - "1184": 208, - "1185": 144, - "1186": 85, - "1187": 0, - "1188": 0, - "1189": 32, - "1190": 0, - "1191": 128, - "1192": 0, - "1193": 0, - "1194": 0, - "1195": 0, - "1196": 71, - "1197": 113, - "1198": 20, - "1199": 199, - "1200": 145, - "1201": 28, - "1202": 201, - "1203": 145, - "1204": 36, - "1205": 75, - "1206": 178, - "1207": 36, - "1208": 77, - "1209": 210, - "1210": 44, - "1211": 205, - "1212": 242, - "1213": 52, - "1214": 79, - "1215": 243, - "1216": 52, - "1217": 209, - "1218": 19, - "1219": 69, - "1220": 81, - "1221": 52, - "1222": 77, - "1223": 83, - "1224": 21, - "1225": 93, - "1226": 209, - "1227": 21, - "1228": 117, - "1229": 211, - "1230": 22, - "1231": 101, - "1232": 83, - "1233": 54, - "1234": 93, - "1235": 211, - "1236": 53, - "1237": 101, - "1238": 211, - "1239": 85, - "1240": 101, - "1241": 213, - "1242": 118, - "1243": 101, - "1244": 217, - "1245": 182, - "1246": 101, - "1247": 91, - "1248": 183, - "1249": 125, - "1250": 89, - "1251": 182, - "1252": 125, - "1253": 223, - "1254": 247, - "1255": 125, - "1256": 223, - "1257": 247, - "1258": 125, - "1259": 223, - "1260": 247, - "1261": 125, - "1262": 223, - "1263": 247, - "1264": 125, - "1265": 223, - "1266": 215, - "1267": 117, - "1268": 32, - "1269": 52, - "1270": 100, - "1271": 21, - "1272": 0, - "1273": 32, - "1274": 1, - "1275": 0, - "1276": 160, - "1277": 35, - "1278": 57, - "1279": 146, - "1280": 34, - "1281": 41, - "1282": 146, - "1283": 34, - "1284": 57, - "1285": 142, - "1286": 227, - "1287": 72, - "1288": 146, - "1289": 4, - "1290": 132, - "1291": 134, - "1292": 172, - "1293": 2, - "1294": 0, - "1295": 100, - "1296": 0, - "1297": 0, - "1298": 4, - "1299": 0, - "1300": 160, - "1301": 40, - "1302": 142, - "1303": 226, - "1304": 56, - "1305": 142, - "1306": 35, - "1307": 73, - "1308": 146, - "1309": 36, - "1310": 89, - "1311": 146, - "1312": 38, - "1313": 121, - "1314": 150, - "1315": 103, - "1316": 137, - "1317": 154, - "1318": 169, - "1319": 153, - "1320": 158, - "1321": 233, - "1322": 169, - "1323": 162, - "1324": 10, - "1325": 132, - "1326": 134, - "1327": 172, - "1328": 2, - "1329": 0, - "1330": 0, - "1331": 1, - "1332": 0, - "1333": 4, - "1334": 0, - "1335": 0, - "1336": 0, - "1337": 0, - "1338": 0, - "1339": 160, - "1340": 104, - "1341": 138, - "1342": 167, - "1343": 152, - "1344": 138, - "1345": 167, - "1346": 136, - "1347": 138, - "1348": 231, - "1349": 136, - "1350": 142, - "1351": 40, - "1352": 137, - "1353": 150, - "1354": 105, - "1355": 137, - "1356": 154, - "1357": 170, - "1358": 185, - "1359": 162, - "1360": 108, - "1361": 202, - "1362": 174, - "1363": 235, - "1364": 186, - "1365": 174, - "1366": 235, - "1367": 186, - "1368": 174, - "1369": 235, - "1370": 186, - "1371": 174, - "1372": 235, - "1373": 186, - "1374": 174, - "1375": 235, - "1376": 186, - "1377": 174, - "1378": 235, - "1379": 186, - "1380": 174, - "1381": 235, - "1382": 186, - "1383": 174, - "1384": 235, - "1385": 186, - "1386": 174, - "1387": 235, - "1388": 186, - "1389": 174, - "1390": 235, - "1391": 186, - "1392": 174, - "1393": 235, - "1394": 186, - "1395": 174, - "1396": 235, - "1397": 186, - "1398": 64, - "1399": 104, - "1400": 200, - "1401": 42, - "1402": 0, - "1403": 64, - "1404": 2, - "1405": 0, - "1406": 64, - "1407": 71, - "1408": 114, - "1409": 36, - "1410": 71, - "1411": 114, - "1412": 36, - "1413": 69, - "1414": 82, - "1415": 36, - "1416": 69, - "1417": 114, - "1418": 36, - "1419": 7, - "1420": 8, - "1421": 13, - "1422": 89, - "1423": 5, - "1424": 0, - "1425": 200, - "1426": 0, - "1427": 0, - "1428": 8, - "1429": 0, - "1430": 192, - "1431": 49, - "1432": 28, - "1433": 67, - "1434": 82, - "1435": 36, - "1436": 199, - "1437": 178, - "1438": 44, - "1439": 77, - "1440": 243, - "1441": 52, - "1442": 79, - "1443": 243, - "1444": 52, - "1445": 209, - "1446": 19, - "1447": 61, - "1448": 209, - "1449": 51, - "1450": 61, - "1451": 85, - "1452": 116, - "1453": 69, - "1454": 23, - "1455": 8, - "1456": 13, - "1457": 89, - "1458": 5, - "1459": 0, - "1460": 0, - "1461": 2, - "1462": 0, - "1463": 8, - "1464": 0, - "1465": 0, - "1466": 0, - "1467": 0, - "1468": 0, - "1469": 192, - "1470": 144, - "1471": 12, - "1472": 75, - "1473": 177, - "1474": 28, - "1475": 205, - "1476": 209, - "1477": 36, - "1478": 81, - "1479": 82, - "1480": 45, - "1481": 213, - "1482": 82, - "1483": 53, - "1484": 213, - "1485": 82, - "1486": 45, - "1487": 85, - "1488": 84, - "1489": 61, - "1490": 85, - "1491": 85, - "1492": 85, - "1493": 85, - "1494": 85, - "1495": 85, - "1496": 85, - "1497": 85, - "1498": 85, - "1499": 85, - "1500": 85, - "1501": 85, - "1502": 85, - "1503": 85, - "1504": 85, - "1505": 85, - "1506": 85, - "1507": 85, - "1508": 85, - "1509": 85, - "1510": 85, - "1511": 85, - "1512": 85, - "1513": 85, - "1514": 85, - "1515": 85, - "1516": 85, - "1517": 85, - "1518": 85, - "1519": 85, - "1520": 85, - "1521": 85, - "1522": 85, - "1523": 213, - "1524": 52, - "1525": 77, - "1526": 211, - "1527": 52, - "1528": 129, - "1529": 208, - "1530": 144, - "1531": 149, - "1532": 0, - "1533": 0, - "1534": 25, - "1535": 0, - "1536": 0, - "1537": 132, - "1538": 197, - "1539": 7, - "1540": 161, - "1541": 140, - "1542": 82, - "1543": 18, - "1544": 147, - "1545": 212, - "1546": 90, - "1547": 236, - "1548": 193, - "1549": 88, - "1550": 138, - "1551": 49, - "1552": 8, - "1553": 165, - "1554": 6, - "1555": 229, - "1556": 49, - "1557": 133, - "1558": 20, - "1559": 131, - "1560": 150, - "1561": 132, - "1562": 199, - "1563": 152, - "1564": 66, - "1565": 202, - "1566": 81, - "1567": 78, - "1568": 162, - "1569": 99, - "1570": 10, - "1571": 33, - "1572": 229, - "1573": 48, - "1574": 167, - "1575": 210, - "1576": 57, - "1577": 134, - "1578": 140, - "1579": 145, - "1580": 218, - "1581": 98, - "1582": 10, - "1583": 153, - "1584": 50, - "1585": 66, - "1586": 89, - "1587": 241, - "1588": 61, - "1589": 118, - "1590": 140, - "1591": 33, - "1592": 135, - "1593": 61, - "1594": 24, - "1595": 157, - "1596": 66, - "1597": 232, - "1598": 36, - "1599": 6, - "1600": 66, - "1601": 67, - "1602": 86, - "1603": 4, - "1604": 0, - "1605": 81, - "1606": 0, - "1607": 0, - "1608": 6, - "1609": 73, - "1610": 34, - "1611": 73, - "1612": 36, - "1613": 201, - "1614": 242, - "1615": 60, - "1616": 162, - "1617": 71, - "1618": 244, - "1619": 44, - "1620": 207, - "1621": 227, - "1622": 137, - "1623": 60, - "1624": 17, - "1625": 128, - "1626": 228, - "1627": 121, - "1628": 52, - "1629": 141, - "1630": 231, - "1631": 73, - "1632": 158, - "1633": 71, - "1634": 243, - "1635": 120, - "1636": 30, - "1637": 0, - "1638": 73, - "1639": 244, - "1640": 120, - "1641": 30, - "1642": 77, - "1643": 147, - "1644": 60, - "1645": 145, - "1646": 231, - "1647": 209, - "1648": 52, - "1649": 1, - "1650": 0, - "1651": 0, - "1652": 1, - "1653": 14, - "1654": 0, - "1655": 0, - "1656": 1, - "1657": 22, - "1658": 66, - "1659": 161, - "1660": 33, - "1661": 43, - "1662": 2, - "1663": 128, - "1664": 56, - "1665": 1, - "1666": 0, - "1667": 139, - "1668": 36, - "1669": 121, - "1670": 30, - "1671": 73, - "1672": 242, - "1673": 60, - "1674": 146, - "1675": 228, - "1676": 121, - "1677": 52, - "1678": 77, - "1679": 20, - "1680": 33, - "1681": 138, - "1682": 150, - "1683": 166, - "1684": 137, - "1685": 30, - "1686": 207, - "1687": 19, - "1688": 69, - "1689": 158, - "1690": 38, - "1691": 138, - "1692": 68, - "1693": 211, - "1694": 52, - "1695": 161, - "1696": 154, - "1697": 150, - "1698": 166, - "1699": 121, - "1700": 34, - "1701": 207, - "1702": 19, - "1703": 69, - "1704": 154, - "1705": 39, - "1706": 138, - "1707": 76, - "1708": 81, - "1709": 53, - "1710": 97, - "1711": 154, - "1712": 158, - "1713": 232, - "1714": 153, - "1715": 38, - "1716": 211, - "1717": 116, - "1718": 85, - "1719": 166, - "1720": 169, - "1721": 170, - "1722": 92, - "1723": 89, - "1724": 150, - "1725": 33, - "1726": 187, - "1727": 158, - "1728": 39, - "1729": 154, - "1730": 38, - "1731": 211, - "1732": 84, - "1733": 93, - "1734": 166, - "1735": 169, - "1736": 170, - "1737": 100, - "1738": 87, - "1739": 150, - "1740": 33, - "1741": 203, - "1742": 0, - "1743": 0, - "1744": 0, - "1745": 44, - "1746": 79, - "1747": 51, - "1748": 77, - "1749": 154, - "1750": 102, - "1751": 138, - "1752": 52, - "1753": 205, - "1754": 52, - "1755": 137, - "1756": 162, - "1757": 105, - "1758": 194, - "1759": 52, - "1760": 45, - "1761": 205, - "1762": 51, - "1763": 77, - "1764": 154, - "1765": 38, - "1766": 154, - "1767": 52, - "1768": 205, - "1769": 52, - "1770": 137, - "1771": 162, - "1772": 105, - "1773": 194, - "1774": 52, - "1775": 61, - "1776": 81, - "1777": 84, - "1778": 85, - "1779": 166, - "1780": 169, - "1781": 170, - "1782": 76, - "1783": 83, - "1784": 85, - "1785": 185, - "1786": 174, - "1787": 235, - "1788": 194, - "1789": 117, - "1790": 61, - "1791": 209, - "1792": 84, - "1793": 85, - "1794": 162, - "1795": 169, - "1796": 170, - "1797": 76, - "1798": 83, - "1799": 85, - "1800": 185, - "1801": 174, - "1802": 235, - "1803": 194, - "1804": 117, - "1805": 1, - "1806": 0, - "1807": 0, - "1808": 72, - "1809": 158, - "1810": 102, - "1811": 154, - "1812": 52, - "1813": 205, - "1814": 52, - "1815": 105, - "1816": 154, - "1817": 41, - "1818": 18, - "1819": 69, - "1820": 211, - "1821": 132, - "1822": 105, - "1823": 90, - "1824": 154, - "1825": 103, - "1826": 154, - "1827": 52, - "1828": 205, - "1829": 52, - "1830": 105, - "1831": 154, - "1832": 104, - "1833": 18, - "1834": 69, - "1835": 211, - "1836": 132, - "1837": 105, - "1838": 122, - "1839": 166, - "1840": 232, - "1841": 170, - "1842": 76, - "1843": 211, - "1844": 85, - "1845": 153, - "1846": 162, - "1847": 170, - "1848": 82, - "1849": 93, - "1850": 215, - "1851": 133, - "1852": 235, - "1853": 122, - "1854": 162, - "1855": 169, - "1856": 186, - "1857": 76, - "1858": 83, - "1859": 85, - "1860": 137, - "1861": 166, - "1862": 170, - "1863": 114, - "1864": 85, - "1865": 215, - "1866": 133, - "1867": 235, - "1868": 2, - "1869": 0, - "1870": 0, - "1871": 208, - "1872": 76, - "1873": 209, - "1874": 117, - "1875": 137, - "1876": 162, - "1877": 171, - "1878": 18, - "1879": 69, - "1880": 85, - "1881": 101, - "1882": 154, - "1883": 174, - "1884": 10, - "1885": 213, - "1886": 213, - "1887": 68, - "1888": 211, - "1889": 117, - "1890": 137, - "1891": 162, - "1892": 234, - "1893": 18, - "1894": 69, - "1895": 85, - "1896": 101, - "1897": 154, - "1898": 170, - "1899": 11, - "1900": 85, - "1901": 21, - "1902": 85, - "1903": 83, - "1904": 118, - "1905": 153, - "1906": 166, - "1907": 235, - "1908": 50, - "1909": 77, - "1910": 215, - "1911": 165, - "1912": 170, - "1913": 174, - "1914": 11, - "1915": 217, - "1916": 21, - "1917": 77, - "1918": 213, - "1919": 149, - "1920": 153, - "1921": 166, - "1922": 235, - "1923": 50, - "1924": 77, - "1925": 215, - "1926": 165, - "1927": 186, - "1928": 174, - "1929": 11, - "1930": 87, - "1931": 6, - "1932": 0, - "1933": 0, - "1934": 0, - "1935": 0, - "1936": 0, - "1937": 0, - "1938": 0, - "1939": 0, - "1940": 128, - "1941": 168, - "1942": 154, - "1943": 178, - "1944": 204, - "1945": 52, - "1946": 93, - "1947": 151, - "1948": 105, - "1949": 186, - "1950": 46, - "1951": 213, - "1952": 117, - "1953": 93, - "1954": 184, - "1955": 174, - "1956": 104, - "1957": 170, - "1958": 178, - "1959": 204, - "1960": 52, - "1961": 93, - "1962": 151, - "1963": 105, - "1964": 186, - "1965": 46, - "1966": 87, - "1967": 149, - "1968": 93, - "1969": 184, - "1970": 174, - "1971": 0, - "1972": 0, - "1973": 128, - "1974": 1, - "1975": 7, - "1976": 0, - "1977": 128, - "1978": 0, - "1979": 19, - "1980": 202, - "1981": 64, - "1982": 161, - "1983": 33, - "1984": 43, - "1985": 1, - "1986": 128, - "1987": 40, - "1988": 0, - "1989": 0, - "1990": 139, - "1991": 227, - "1992": 72, - "1993": 146, - "1994": 101, - "1995": 121, - "1996": 30, - "1997": 199, - "1998": 145, - "1999": 36, - "2000": 75, - "2001": 243, - "2002": 60, - "2003": 142, - "2004": 35, - "2005": 73, - "2006": 154, - "2007": 230, - "2008": 121, - "2009": 36, - "2010": 201, - "2011": 178, - "2012": 52, - "2013": 77, - "2014": 20, - "2015": 97, - "2016": 89, - "2017": 154, - "2018": 38, - "2019": 138, - "2020": 208, - "2021": 52, - "2022": 207, - "2023": 19, - "2024": 69, - "2025": 104, - "2026": 154, - "2027": 231, - "2028": 137, - "2029": 34, - "2030": 0, - "2031": 0, - "2032": 2, - "2033": 0, - "2034": 0, - "2035": 10, - "2036": 28, - "2037": 0, - "2038": 0, - "2039": 2, - "2040": 108, - "2041": 208, - "2042": 148, - "2043": 88, - "2044": 28, - "2045": 160, - "2046": 208, - "2047": 144, - "2048": 149, - "2049": 0, - "2050": 64, - "2051": 72, - "2052": 0, - "2053": 128, - "2054": 197, - "2055": 113, - "2056": 36, - "2057": 201, - "2058": 178, - "2059": 52, - "2060": 205, - "2061": 243, - "2062": 68, - "2063": 209, - "2064": 52, - "2065": 77, - "2066": 147, - "2067": 228, - "2068": 72, - "2069": 146, - "2070": 166, - "2071": 121, - "2072": 158, - "2073": 231, - "2074": 137, - "2075": 162, - "2076": 105, - "2077": 170, - "2078": 42, - "2079": 73, - "2080": 178, - "2081": 44, - "2082": 77, - "2083": 243, - "2084": 60, - "2085": 207, - "2086": 19, - "2087": 69, - "2088": 211, - "2089": 84, - "2090": 85, - "2091": 150, - "2092": 100, - "2093": 89, - "2094": 154, - "2095": 230, - "2096": 121, - "2097": 162, - "2098": 104, - "2099": 154, - "2100": 170, - "2101": 170, - "2102": 186, - "2103": 176, - "2104": 44, - "2105": 77, - "2106": 243, - "2107": 60, - "2108": 81, - "2109": 52, - "2110": 77, - "2111": 85, - "2112": 117, - "2113": 93, - "2114": 104, - "2115": 154, - "2116": 166, - "2117": 137, - "2118": 162, - "2119": 40, - "2120": 154, - "2121": 166, - "2122": 170, - "2123": 186, - "2124": 46, - "2125": 52, - "2126": 77, - "2127": 243, - "2128": 68, - "2129": 81, - "2130": 20, - "2131": 77, - "2132": 83, - "2133": 85, - "2134": 93, - "2135": 23, - "2136": 154, - "2137": 230, - "2138": 121, - "2139": 162, - "2140": 104, - "2141": 154, - "2142": 170, - "2143": 234, - "2144": 186, - "2145": 178, - "2146": 12, - "2147": 60, - "2148": 79, - "2149": 20, - "2150": 77, - "2151": 83, - "2152": 85, - "2153": 93, - "2154": 215, - "2155": 117, - "2156": 1, - "2157": 0, - "2158": 0, - "2159": 0, - "2160": 0, - "2161": 0, - "2162": 0, - "2163": 0, - "2164": 0, - "2165": 0, - "2166": 0, - "2167": 0, - "2168": 0, - "2169": 0, - "2170": 0, - "2171": 0, - "2172": 0, - "2173": 4, - "2174": 0, - "2175": 0, - "2176": 28, - "2177": 56, - "2178": 0, - "2179": 0, - "2180": 4, - "2181": 24, - "2182": 65, - "2183": 39, - "2184": 25, - "2185": 85, - "2186": 22, - "2187": 97, - "2188": 163, - "2189": 9, - "2190": 23, - "2191": 30, - "2192": 128, - "2193": 66, - "2194": 67, - "2195": 86, - "2196": 4, - "2197": 0, - "2198": 81, - "2199": 0, - "2200": 0, - "2201": 128, - "2202": 49, - "2203": 136, - "2204": 49, - "2205": 197, - "2206": 152, - "2207": 97, - "2208": 10, - "2209": 74, - "2210": 41, - "2211": 37, - "2212": 52, - "2213": 138, - "2214": 65, - "2215": 41, - "2216": 37, - "2217": 148, - "2218": 8, - "2219": 66, - "2220": 72, - "2221": 169, - "2222": 164, - "2223": 148, - "2224": 73, - "2225": 72, - "2226": 45, - "2227": 181, - "2228": 214, - "2229": 50, - "2230": 40, - "2231": 41, - "2232": 181, - "2233": 214, - "2234": 90, - "2235": 37, - "2236": 165, - "2237": 180, - "2238": 86, - "2239": 90, - "2240": 202, - "2241": 164, - "2242": 164, - "2243": 214, - "2244": 82, - "2245": 107, - "2246": 153, - "2247": 148, - "2248": 212, - "2249": 90, - "2250": 107, - "2251": 173, - "2252": 0, - "2253": 0, - "2254": 176, - "2255": 3, - "2256": 7, - "2257": 0, - "2258": 176, - "2259": 3, - "2260": 11, - "2261": 161, - "2262": 208, - "2263": 144, - "2264": 149, - "2265": 0, - "2266": 64, - "2267": 30, - "2268": 0, - "2269": 0, - "2270": 131, - "2271": 144, - "2272": 82, - "2273": 140, - "2274": 49, - "2275": 198, - "2276": 24, - "2277": 69, - "2278": 72, - "2279": 41, - "2280": 198, - "2281": 24, - "2282": 115, - "2283": 142, - "2284": 34, - "2285": 164, - "2286": 20, - "2287": 99, - "2288": 140, - "2289": 57, - "2290": 71, - "2291": 17, - "2292": 82, - "2293": 138, - "2294": 49, - "2295": 231, - "2296": 156, - "2297": 163, - "2298": 148, - "2299": 42, - "2300": 197, - "2301": 24, - "2302": 115, - "2303": 206, - "2304": 81, - "2305": 74, - "2306": 149, - "2307": 98, - "2308": 140, - "2309": 57, - "2310": 231, - "2311": 40, - "2312": 165, - "2313": 74, - "2314": 49, - "2315": 198, - "2316": 152, - "2317": 115, - "2318": 148, - "2319": 82, - "2320": 198, - "2321": 24, - "2322": 99, - "2323": 204, - "2324": 57, - "2325": 74, - "2326": 169, - "2327": 148, - "2328": 140, - "2329": 49, - "2330": 230, - "2331": 28, - "2332": 165, - "2333": 148, - "2334": 82, - "2335": 198, - "2336": 24, - "2337": 99, - "2338": 140, - "2339": 82, - "2340": 74, - "2341": 41, - "2342": 99, - "2343": 140, - "2344": 49, - "2345": 38, - "2346": 0, - "2347": 0, - "2348": 168, - "2349": 192, - "2350": 1, - "2351": 0, - "2352": 32, - "2353": 192, - "2354": 70, - "2355": 145, - "2356": 205, - "2357": 9, - "2358": 70, - "2359": 130, - "2360": 10, - "2361": 13, - "2362": 89, - "2363": 9, - "2364": 0, - "2365": 164, - "2366": 2, - "2367": 0, - "2368": 56, - "2369": 28, - "2370": 199, - "2371": 178, - "2372": 52, - "2373": 77, - "2374": 211, - "2375": 60, - "2376": 79, - "2377": 20, - "2378": 37, - "2379": 199, - "2380": 177, - "2381": 44, - "2382": 207, - "2383": 19, - "2384": 69, - "2385": 81, - "2386": 52, - "2387": 77, - "2388": 203, - "2389": 113, - "2390": 44, - "2391": 203, - "2392": 243, - "2393": 68, - "2394": 81, - "2395": 20, - "2396": 77, - "2397": 147, - "2398": 101, - "2399": 105, - "2400": 154, - "2401": 231, - "2402": 137, - "2403": 162, - "2404": 105, - "2405": 170, - "2406": 42, - "2407": 203, - "2408": 210, - "2409": 52, - "2410": 207, - "2411": 19, - "2412": 69, - "2413": 211, - "2414": 84, - "2415": 85, - "2416": 166, - "2417": 233, - "2418": 121, - "2419": 162, - "2420": 104, - "2421": 154, - "2422": 170, - "2423": 234, - "2424": 186, - "2425": 84, - "2426": 213, - "2427": 243, - "2428": 68, - "2429": 209, - "2430": 52, - "2431": 85, - "2432": 213, - "2433": 117, - "2434": 1, - "2435": 0, - "2436": 0, - "2437": 0, - "2438": 0, - "2439": 0, - "2440": 0, - "2441": 0, - "2442": 0, - "2443": 0, - "2444": 1, - "2445": 0, - "2446": 224, - "2447": 9, - "2448": 14, - "2449": 0, - "2450": 64, - "2451": 5, - "2452": 54, - "2453": 172, - "2454": 142, - "2455": 112, - "2456": 82, - "2457": 52, - "2458": 22, - "2459": 88, - "2460": 104, - "2461": 200, - "2462": 74, - "2463": 0, - "2464": 32, - "2465": 3, - "2466": 0, - "2467": 128, - "2468": 49, - "2469": 6, - "2470": 33, - "2471": 100, - "2472": 12, - "2473": 66, - "2474": 200, - "2475": 24, - "2476": 132, - "2477": 16, - "2478": 66, - "2479": 8, - "2480": 33, - "2481": 132, - "2482": 16, - "2483": 18, - "2484": 0, - "2485": 0, - "2486": 48, - "2487": 224, - "2488": 0, - "2489": 0, - "2490": 16, - "2491": 96, - "2492": 66, - "2493": 25, - "2494": 40, - "2495": 52, - "2496": 100, - "2497": 37, - "2498": 0, - "2499": 144, - "2500": 10, - "2501": 0, - "2502": 64, - "2503": 24, - "2504": 163, - "2505": 20, - "2506": 99, - "2507": 206, - "2508": 73, - "2509": 73, - "2510": 169, - "2511": 50, - "2512": 70, - "2513": 41, - "2514": 231, - "2515": 32, - "2516": 148, - "2517": 210, - "2518": 90, - "2519": 101, - "2520": 144, - "2521": 82, - "2522": 206, - "2523": 65, - "2524": 40, - "2525": 165, - "2526": 181, - "2527": 102, - "2528": 41, - "2529": 165, - "2530": 156, - "2531": 131, - "2532": 146, - "2533": 82, - "2534": 107, - "2535": 205, - "2536": 82, - "2537": 74, - "2538": 57, - "2539": 39, - "2540": 37, - "2541": 165, - "2542": 214, - "2543": 154, - "2544": 41, - "2545": 25, - "2546": 131, - "2547": 80, - "2548": 74, - "2549": 74, - "2550": 173, - "2551": 53, - "2552": 149, - "2553": 50, - "2554": 6, - "2555": 161, - "2556": 148, - "2557": 148, - "2558": 90, - "2559": 107, - "2560": 206, - "2561": 137, - "2562": 16, - "2563": 66, - "2564": 74, - "2565": 173, - "2566": 197, - "2567": 216, - "2568": 156, - "2569": 19, - "2570": 33, - "2571": 132, - "2572": 148, - "2573": 90, - "2574": 139, - "2575": 177, - "2576": 57, - "2577": 39, - "2578": 99, - "2579": 41, - "2580": 41, - "2581": 181, - "2582": 24, - "2583": 99, - "2584": 115, - "2585": 78, - "2586": 198, - "2587": 82, - "2588": 82, - "2589": 106, - "2590": 49, - "2591": 198, - "2592": 230, - "2593": 156, - "2594": 83, - "2595": 174, - "2596": 181, - "2597": 22, - "2598": 99, - "2599": 205, - "2600": 73, - "2601": 41, - "2602": 165, - "2603": 92, - "2604": 107, - "2605": 45, - "2606": 198, - "2607": 90, - "2608": 11, - "2609": 0, - "2610": 64, - "2611": 104, - "2612": 112, - "2613": 0, - "2614": 0, - "2615": 59, - "2616": 176, - "2617": 97, - "2618": 117, - "2619": 132, - "2620": 147, - "2621": 162, - "2622": 177, - "2623": 192, - "2624": 66, - "2625": 67, - "2626": 86, - "2627": 2, - "2628": 0, - "2629": 121, - "2630": 0, - "2631": 0, - "2632": 144, - "2633": 82, - "2634": 74, - "2635": 49, - "2636": 198, - "2637": 24, - "2638": 99, - "2639": 76, - "2640": 41, - "2641": 165, - "2642": 24, - "2643": 99, - "2644": 140, - "2645": 49, - "2646": 166, - "2647": 148, - "2648": 82, - "2649": 140, - "2650": 49, - "2651": 198, - "2652": 152, - "2653": 83, - "2654": 74, - "2655": 41, - "2656": 198, - "2657": 24, - "2658": 99, - "2659": 204, - "2660": 57, - "2661": 167, - "2662": 20, - "2663": 99, - "2664": 140, - "2665": 49, - "2666": 230, - "2667": 156, - "2668": 99, - "2669": 140, - "2670": 49, - "2671": 198, - "2672": 24, - "2673": 115, - "2674": 206, - "2675": 49, - "2676": 198, - "2677": 24, - "2678": 99, - "2679": 140, - "2680": 57, - "2681": 231, - "2682": 24, - "2683": 99, - "2684": 140, - "2685": 49, - "2686": 198, - "2687": 156, - "2688": 115, - "2689": 206, - "2690": 49, - "2691": 198, - "2692": 24, - "2693": 99, - "2694": 206, - "2695": 57, - "2696": 231, - "2697": 24, - "2698": 99, - "2699": 140, - "2700": 49, - "2701": 231, - "2702": 156, - "2703": 115, - "2704": 140, - "2705": 49, - "2706": 198, - "2707": 152, - "2708": 0, - "2709": 0, - "2710": 160, - "2711": 2, - "2712": 7, - "2713": 0, - "2714": 128, - "2715": 0, - "2716": 27, - "2717": 69, - "2718": 54, - "2719": 39, - "2720": 24, - "2721": 9, - "2722": 42, - "2723": 52, - "2724": 100, - "2725": 37, - "2726": 0, - "2727": 16, - "2728": 14, - "2729": 0, - "2730": 0, - "2731": 24, - "2732": 195, - "2733": 148, - "2734": 115, - "2735": 206, - "2736": 65, - "2737": 40, - "2738": 37, - "2739": 149, - "2740": 10, - "2741": 33, - "2742": 198, - "2743": 32, - "2744": 116, - "2745": 80, - "2746": 74, - "2747": 74, - "2748": 173, - "2749": 85, - "2750": 8, - "2751": 49, - "2752": 6, - "2753": 33, - "2754": 132, - "2755": 82, - "2756": 82, - "2757": 106, - "2758": 45, - "2759": 106, - "2760": 206, - "2761": 57, - "2762": 8, - "2763": 33, - "2764": 148, - "2765": 146, - "2766": 82, - "2767": 107, - "2768": 209, - "2769": 115, - "2770": 206, - "2771": 65, - "2772": 8, - "2773": 161, - "2774": 148, - "2775": 148, - "2776": 90, - "2777": 139, - "2778": 170, - "2779": 133, - "2780": 80, - "2781": 74, - "2782": 41, - "2783": 37, - "2784": 165, - "2785": 214, - "2786": 90, - "2787": 116, - "2788": 45, - "2789": 116, - "2790": 82, - "2791": 74, - "2792": 73, - "2793": 169, - "2794": 181, - "2795": 24, - "2796": 163, - "2797": 148, - "2798": 34, - "2799": 132, - "2800": 144, - "2801": 82, - "2802": 74, - "2803": 173, - "2804": 181, - "2805": 24, - "2806": 157, - "2807": 19, - "2808": 33, - "2809": 132, - "2810": 146, - "2811": 82, - "2812": 106, - "2813": 45, - "2814": 198, - "2815": 230, - "2816": 156, - "2817": 140, - "2818": 165, - "2819": 164, - "2820": 212, - "2821": 90, - "2822": 140, - "2823": 49, - "2824": 54, - "2825": 231, - "2826": 100, - "2827": 44, - "2828": 37, - "2829": 165, - "2830": 214, - "2831": 98, - "2832": 140, - "2833": 177, - "2834": 57, - "2835": 231, - "2836": 156, - "2837": 107, - "2838": 173, - "2839": 181, - "2840": 22, - "2841": 99, - "2842": 173, - "2843": 205, - "2844": 57, - "2845": 231, - "2846": 92, - "2847": 107, - "2848": 41, - "2849": 182, - "2850": 24, - "2851": 107, - "2852": 109, - "2853": 206, - "2854": 57, - "2855": 167, - "2856": 123, - "2857": 108, - "2858": 49, - "2859": 214, - "2860": 88, - "2861": 107, - "2862": 115, - "2863": 206, - "2864": 57, - "2865": 159, - "2866": 91, - "2867": 139, - "2868": 173, - "2869": 198, - "2870": 90, - "2871": 11, - "2872": 0, - "2873": 48, - "2874": 121, - "2875": 112, - "2876": 0, - "2877": 128, - "2878": 74, - "2879": 176, - "2880": 113, - "2881": 134, - "2882": 149, - "2883": 164, - "2884": 179, - "2885": 194, - "2886": 209, - "2887": 224, - "2888": 66, - "2889": 67, - "2890": 86, - "2891": 2, - "2892": 0, - "2893": 185, - "2894": 1, - "2895": 0, - "2896": 140, - "2897": 82, - "2898": 140, - "2899": 49, - "2900": 230, - "2901": 156, - "2902": 115, - "2903": 206, - "2904": 57, - "2905": 231, - "2906": 156, - "2907": 115, - "2908": 206, - "2909": 73, - "2910": 165, - "2911": 24, - "2912": 115, - "2913": 206, - "2914": 57, - "2915": 8, - "2916": 33, - "2917": 132, - "2918": 16, - "2919": 66, - "2920": 8, - "2921": 33, - "2922": 148, - "2923": 74, - "2924": 49, - "2925": 230, - "2926": 156, - "2927": 115, - "2928": 16, - "2929": 66, - "2930": 8, - "2931": 33, - "2932": 132, - "2933": 16, - "2934": 66, - "2935": 40, - "2936": 25, - "2937": 115, - "2938": 206, - "2939": 57, - "2940": 7, - "2941": 33, - "2942": 132, - "2943": 16, - "2944": 66, - "2945": 8, - "2946": 33, - "2947": 132, - "2948": 80, - "2949": 74, - "2950": 233, - "2951": 156, - "2952": 115, - "2953": 16, - "2954": 66, - "2955": 8, - "2956": 33, - "2957": 132, - "2958": 16, - "2959": 66, - "2960": 8, - "2961": 161, - "2962": 148, - "2963": 210, - "2964": 57, - "2965": 231, - "2966": 32, - "2967": 132, - "2968": 16, - "2969": 66, - "2970": 8, - "2971": 33, - "2972": 132, - "2973": 16, - "2974": 66, - "2975": 41, - "2976": 165, - "2977": 115, - "2978": 206, - "2979": 65, - "2980": 8, - "2981": 33, - "2982": 132, - "2983": 16, - "2984": 66, - "2985": 8, - "2986": 33, - "2987": 132, - "2988": 82, - "2989": 74, - "2990": 8, - "2991": 33, - "2992": 132, - "2993": 16, - "2994": 66, - "2995": 8, - "2996": 33, - "2997": 132, - "2998": 16, - "2999": 66, - "3000": 8, - "3001": 165, - "3002": 148, - "3003": 82, - "3004": 66, - "3005": 8, - "3006": 33, - "3007": 132, - "3008": 16, - "3009": 66, - "3010": 8, - "3011": 33, - "3012": 132, - "3013": 16, - "3014": 74, - "3015": 41, - "3016": 165, - "3017": 132, - "3018": 16, - "3019": 66, - "3020": 8, - "3021": 33, - "3022": 132, - "3023": 16, - "3024": 66, - "3025": 8, - "3026": 33, - "3027": 148, - "3028": 82, - "3029": 74, - "3030": 9, - "3031": 33, - "3032": 132, - "3033": 16, - "3034": 66, - "3035": 8, - "3036": 33, - "3037": 132, - "3038": 16, - "3039": 66, - "3040": 40, - "3041": 165, - "3042": 148, - "3043": 18, - "3044": 66, - "3045": 8, - "3046": 33, - "3047": 132, - "3048": 16, - "3049": 66, - "3050": 8, - "3051": 37, - "3052": 132, - "3053": 80, - "3054": 74, - "3055": 41, - "3056": 165, - "3057": 148, - "3058": 16, - "3059": 66, - "3060": 8, - "3061": 161, - "3062": 132, - "3063": 16, - "3064": 66, - "3065": 8, - "3066": 161, - "3067": 148, - "3068": 82, - "3069": 74, - "3070": 41, - "3071": 33, - "3072": 132, - "3073": 82, - "3074": 74, - "3075": 41, - "3076": 33, - "3077": 132, - "3078": 16, - "3079": 66, - "3080": 41, - "3081": 165, - "3082": 148, - "3083": 82, - "3084": 66, - "3085": 40, - "3086": 161, - "3087": 132, - "3088": 16, - "3089": 66, - "3090": 8, - "3091": 33, - "3092": 148, - "3093": 82, - "3094": 74, - "3095": 41, - "3096": 165, - "3097": 148, - "3098": 18, - "3099": 66, - "3100": 41, - "3101": 33, - "3102": 132, - "3103": 16, - "3104": 66, - "3105": 8, - "3106": 165, - "3107": 148, - "3108": 82, - "3109": 74, - "3110": 41, - "3111": 165, - "3112": 148, - "3113": 82, - "3114": 66, - "3115": 8, - "3116": 33, - "3117": 132, - "3118": 16, - "3119": 74, - "3120": 41, - "3121": 165, - "3122": 148, - "3123": 82, - "3124": 74, - "3125": 41, - "3126": 165, - "3127": 132, - "3128": 80, - "3129": 66, - "3130": 8, - "3131": 33, - "3132": 148, - "3133": 82, - "3134": 74, - "3135": 41, - "3136": 165, - "3137": 148, - "3138": 82, - "3139": 66, - "3140": 40, - "3141": 37, - "3142": 132, - "3143": 18, - "3144": 66, - "3145": 40, - "3146": 165, - "3147": 148, - "3148": 82, - "3149": 74, - "3150": 41, - "3151": 165, - "3152": 132, - "3153": 80, - "3154": 66, - "3155": 8, - "3156": 33, - "3157": 132, - "3158": 80, - "3159": 74, - "3160": 41, - "3161": 165, - "3162": 148, - "3163": 82, - "3164": 74, - "3165": 9, - "3166": 33, - "3167": 132, - "3168": 18, - "3169": 66, - "3170": 8, - "3171": 161, - "3172": 0, - "3173": 0, - "3174": 160, - "3175": 3, - "3176": 7, - "3177": 0, - "3178": 128, - "3179": 0, - "3180": 35, - "3181": 42, - "3182": 45, - "3183": 196, - "3184": 78, - "3185": 51, - "3186": 174, - "3187": 60, - "3188": 2, - "3189": 71, - "3190": 20, - "3191": 50, - "3192": 76, - "3193": 64, - "3194": 133, - "3195": 134, - "3196": 172, - "3197": 4, - "3198": 0, - "3199": 210, - "3200": 2, - "3201": 0, - "3202": 0, - "3203": 67, - "3204": 172, - "3205": 181, - "3206": 214, - "3207": 90, - "3208": 107, - "3209": 173, - "3210": 181, - "3211": 214, - "3212": 90, - "3213": 107, - "3214": 13, - "3215": 82, - "3216": 214, - "3217": 90, - "3218": 107, - "3219": 173, - "3220": 181, - "3221": 214, - "3222": 90, - "3223": 107, - "3224": 173, - "3225": 181, - "3226": 70, - "3227": 41, - "3228": 107, - "3229": 173, - "3230": 181, - "3231": 214, - "3232": 90, - "3233": 107, - "3234": 173, - "3235": 181, - "3236": 214, - "3237": 90, - "3238": 107, - "3239": 169, - "3240": 181, - "3241": 214, - "3242": 90, - "3243": 107, - "3244": 173, - "3245": 181, - "3246": 214, - "3247": 90, - "3248": 107, - "3249": 173, - "3250": 181, - "3251": 214, - "3252": 90, - "3253": 107, - "3254": 173, - "3255": 181, - "3256": 214, - "3257": 90, - "3258": 107, - "3259": 173, - "3260": 181, - "3261": 214, - "3262": 90, - "3263": 107, - "3264": 173, - "3265": 181, - "3266": 214, - "3267": 90, - "3268": 107, - "3269": 173, - "3270": 181, - "3271": 214, - "3272": 90, - "3273": 107, - "3274": 173, - "3275": 181, - "3276": 214, - "3277": 90, - "3278": 107, - "3279": 173, - "3280": 181, - "3281": 214, - "3282": 90, - "3283": 107, - "3284": 173, - "3285": 181, - "3286": 214, - "3287": 90, - "3288": 107, - "3289": 173, - "3290": 181, - "3291": 214, - "3292": 90, - "3293": 107, - "3294": 173, - "3295": 181, - "3296": 214, - "3297": 90, - "3298": 107, - "3299": 173, - "3300": 181, - "3301": 214, - "3302": 90, - "3303": 107, - "3304": 173, - "3305": 181, - "3306": 214, - "3307": 90, - "3308": 107, - "3309": 173, - "3310": 181, - "3311": 214, - "3312": 90, - "3313": 107, - "3314": 173, - "3315": 181, - "3316": 214, - "3317": 90, - "3318": 107, - "3319": 173, - "3320": 181, - "3321": 214, - "3322": 90, - "3323": 107, - "3324": 173, - "3325": 181, - "3326": 214, - "3327": 90, - "3328": 107, - "3329": 173, - "3330": 181, - "3331": 214, - "3332": 90, - "3333": 107, - "3334": 173, - "3335": 181, - "3336": 214, - "3337": 90, - "3338": 107, - "3339": 173, - "3340": 181, - "3341": 214, - "3342": 90, - "3343": 107, - "3344": 173, - "3345": 181, - "3346": 214, - "3347": 90, - "3348": 107, - "3349": 173, - "3350": 181, - "3351": 214, - "3352": 90, - "3353": 107, - "3354": 173, - "3355": 181, - "3356": 214, - "3357": 90, - "3358": 107, - "3359": 173, - "3360": 181, - "3361": 214, - "3362": 90, - "3363": 107, - "3364": 173, - "3365": 181, - "3366": 214, - "3367": 90, - "3368": 75, - "3369": 41, - "3370": 165, - "3371": 148, - "3372": 82, - "3373": 74, - "3374": 41, - "3375": 165, - "3376": 148, - "3377": 82, - "3378": 74, - "3379": 41, - "3380": 165, - "3381": 148, - "3382": 82, - "3383": 74, - "3384": 41, - "3385": 165, - "3386": 148, - "3387": 82, - "3388": 74, - "3389": 41, - "3390": 165, - "3391": 148, - "3392": 82, - "3393": 74, - "3394": 41, - "3395": 165, - "3396": 148, - "3397": 82, - "3398": 74, - "3399": 41, - "3400": 165, - "3401": 148, - "3402": 82, - "3403": 74, - "3404": 41, - "3405": 165, - "3406": 148, - "3407": 82, - "3408": 74, - "3409": 41, - "3410": 165, - "3411": 148, - "3412": 82, - "3413": 74, - "3414": 41, - "3415": 165, - "3416": 148, - "3417": 82, - "3418": 74, - "3419": 41, - "3420": 165, - "3421": 148, - "3422": 82, - "3423": 74, - "3424": 41, - "3425": 165, - "3426": 148, - "3427": 82, - "3428": 1, - "3429": 216, - "3430": 5, - "3431": 27, - "3432": 14, - "3433": 128, - "3434": 209, - "3435": 19, - "3436": 70, - "3437": 18, - "3438": 82, - "3439": 103, - "3440": 25, - "3441": 86, - "3442": 26, - "3443": 113, - "3444": 227, - "3445": 9, - "3446": 24, - "3447": 34, - "3448": 144, - "3449": 66, - "3450": 67, - "3451": 86, - "3452": 2, - "3453": 0, - "3454": 105, - "3455": 1, - "3456": 0, - "3457": 128, - "3458": 49, - "3459": 140, - "3460": 49, - "3461": 230, - "3462": 24, - "3463": 116, - "3464": 16, - "3465": 74, - "3466": 73, - "3467": 41, - "3468": 165, - "3469": 10, - "3470": 33, - "3471": 231, - "3472": 32, - "3473": 132, - "3474": 78, - "3475": 66, - "3476": 42, - "3477": 173, - "3478": 197, - "3479": 22, - "3480": 99, - "3481": 132, - "3482": 144, - "3483": 115, - "3484": 16, - "3485": 66, - "3486": 40, - "3487": 37, - "3488": 165, - "3489": 214, - "3490": 98, - "3491": 139, - "3492": 49, - "3493": 120, - "3494": 14, - "3495": 66, - "3496": 8, - "3497": 33, - "3498": 148, - "3499": 210, - "3500": 82, - "3501": 108, - "3502": 49, - "3503": 198, - "3504": 88, - "3505": 60, - "3506": 7, - "3507": 33, - "3508": 132, - "3509": 16, - "3510": 82, - "3511": 106, - "3512": 45, - "3513": 198, - "3514": 24, - "3515": 99, - "3516": 12, - "3517": 178, - "3518": 133, - "3519": 80, - "3520": 74, - "3521": 41, - "3522": 41, - "3523": 181, - "3524": 214, - "3525": 98, - "3526": 140, - "3527": 181, - "3528": 22, - "3529": 217, - "3530": 66, - "3531": 40, - "3532": 165, - "3533": 148, - "3534": 148, - "3535": 90, - "3536": 139, - "3537": 49, - "3538": 214, - "3539": 90, - "3540": 131, - "3541": 49, - "3542": 166, - "3543": 148, - "3544": 146, - "3545": 82, - "3546": 106, - "3547": 173, - "3548": 213, - "3549": 88, - "3550": 99, - "3551": 172, - "3552": 197, - "3553": 24, - "3554": 19, - "3555": 74, - "3556": 72, - "3557": 169, - "3558": 181, - "3559": 214, - "3560": 98, - "3561": 204, - "3562": 181, - "3563": 214, - "3564": 98, - "3565": 124, - "3566": 172, - "3567": 37, - "3568": 165, - "3569": 212, - "3570": 98, - "3571": 140, - "3572": 177, - "3573": 198, - "3574": 88, - "3575": 107, - "3576": 49, - "3577": 198, - "3578": 182, - "3579": 20, - "3580": 82, - "3581": 137, - "3582": 45, - "3583": 198, - "3584": 88, - "3585": 107, - "3586": 141, - "3587": 181, - "3588": 24, - "3589": 97, - "3590": 140, - "3591": 106, - "3592": 173, - "3593": 197, - "3594": 88, - "3595": 99, - "3596": 173, - "3597": 177, - "3598": 214, - "3599": 90, - "3600": 140, - "3601": 49, - "3602": 194, - "3603": 149, - "3604": 22, - "3605": 98, - "3606": 138, - "3607": 181, - "3608": 214, - "3609": 90, - "3610": 115, - "3611": 45, - "3612": 70, - "3613": 8, - "3614": 99, - "3615": 115, - "3616": 139, - "3617": 49, - "3618": 214, - "3619": 88, - "3620": 107, - "3621": 174, - "3622": 185, - "3623": 22, - "3624": 97, - "3625": 140, - "3626": 209, - "3627": 185, - "3628": 149, - "3629": 90, - "3630": 106, - "3631": 141, - "3632": 177, - "3633": 214, - "3634": 90, - "3635": 139, - "3636": 47, - "3637": 198, - "3638": 24, - "3639": 97, - "3640": 107, - "3641": 172, - "3642": 53, - "3643": 198, - "3644": 90, - "3645": 107, - "3646": 206, - "3647": 197, - "3648": 24, - "3649": 35, - "3650": 132, - "3651": 176, - "3652": 181, - "3653": 182, - "3654": 26, - "3655": 107, - "3656": 205, - "3657": 53, - "3658": 215, - "3659": 98, - "3660": 140, - "3661": 49, - "3662": 198, - "3663": 8, - "3664": 31, - "3665": 99, - "3666": 172, - "3667": 181, - "3668": 214, - "3669": 220, - "3670": 115, - "3671": 49, - "3672": 198, - "3673": 24, - "3674": 99, - "3675": 132, - "3676": 144, - "3677": 49, - "3678": 198, - "3679": 26, - "3680": 107, - "3681": 206, - "3682": 185, - "3683": 0, - "3684": 128, - "3685": 220, - "3686": 8, - "3687": 7, - "3688": 0, - "3689": 196, - "3690": 5, - "3691": 35, - "3692": 9, - "3693": 169, - "3694": 179, - "3695": 12, - "3696": 43, - "3697": 141, - "3698": 184, - "3699": 241, - "3700": 4, - "3701": 12, - "3702": 17, - "3703": 72, - "3704": 161, - "3705": 33, - "3706": 171, - "3707": 0, - "3708": 128, - "3709": 24, - "3710": 0, - "3711": 128, - "3712": 33, - "3713": 0, - "3714": 132, - "3715": 98, - "3716": 178, - "3717": 1, - "3718": 0, - "3719": 128, - "3720": 9, - "3721": 14, - "3722": 0, - "3723": 0, - "3724": 1, - "3725": 86, - "3726": 176, - "3727": 43, - "3728": 179, - "3729": 180, - "3730": 106, - "3731": 163, - "3732": 184, - "3733": 169, - "3734": 147, - "3735": 188, - "3736": 232, - "3737": 131, - "3738": 192, - "3739": 39, - "3740": 116, - "3741": 196, - "3742": 102, - "3743": 100, - "3744": 200, - "3745": 165, - "3746": 84, - "3747": 204, - "3748": 228, - "3749": 68, - "3750": 208, - "3751": 35, - "3752": 53, - "3753": 212, - "3754": 98, - "3755": 37, - "3756": 216, - "3757": 161, - "3758": 21, - "3759": 220, - "3760": 224, - "3761": 5, - "3762": 96, - "3763": 161, - "3764": 33, - "3765": 43, - "3766": 1, - "3767": 0, - "3768": 50, - "3769": 0, - "3770": 0, - "3771": 196, - "3772": 89, - "3773": 205, - "3774": 57, - "3775": 199, - "3776": 156, - "3777": 43, - "3778": 228, - "3779": 164, - "3780": 181, - "3781": 216, - "3782": 106, - "3783": 44, - "3784": 21, - "3785": 82, - "3786": 14, - "3787": 82, - "3788": 138, - "3789": 49, - "3790": 118, - "3791": 200, - "3792": 32, - "3793": 229, - "3794": 36, - "3795": 197, - "3796": 90, - "3797": 50, - "3798": 100, - "3799": 16, - "3800": 131, - "3801": 212, - "3802": 98, - "3803": 234, - "3804": 20, - "3805": 50, - "3806": 136, - "3807": 65, - "3808": 106, - "3809": 169, - "3810": 116, - "3811": 12, - "3812": 25, - "3813": 4, - "3814": 37, - "3815": 198, - "3816": 84, - "3817": 58, - "3818": 133, - "3819": 12, - "3820": 131, - "3821": 92, - "3822": 99, - "3823": 43, - "3824": 161, - "3825": 99, - "3826": 14, - "3827": 90, - "3828": 171, - "3829": 177, - "3830": 165, - "3831": 18, - "3832": 58, - "3833": 8, - "3834": 0, - "3835": 0, - "3836": 128, - "3837": 32, - "3838": 0, - "3839": 192, - "3840": 64, - "3841": 132, - "3842": 204, - "3843": 4, - "3844": 2, - "3845": 5, - "3846": 80, - "3847": 96, - "3848": 32, - "3849": 3, - "3850": 0, - "3851": 14, - "3852": 16, - "3853": 18, - "3854": 164, - "3855": 0, - "3856": 128, - "3857": 194, - "3858": 2, - "3859": 67, - "3860": 199, - "3861": 112, - "3862": 17, - "3863": 16, - "3864": 144, - "3865": 75, - "3866": 200, - "3867": 40, - "3868": 48, - "3869": 40, - "3870": 28, - "3871": 19, - "3872": 206, - "3873": 73, - "3874": 167, - "3875": 13, - "3876": 0, - "3877": 64, - "3878": 16, - "3879": 34, - "3880": 51, - "3881": 68, - "3882": 34, - "3883": 98, - "3884": 49, - "3885": 72, - "3886": 76, - "3887": 168, - "3888": 6, - "3889": 138, - "3890": 138, - "3891": 233, - "3892": 0, - "3893": 96, - "3894": 113, - "3895": 129, - "3896": 33, - "3897": 31, - "3898": 0, - "3899": 50, - "3900": 52, - "3901": 54, - "3902": 210, - "3903": 46, - "3904": 46, - "3905": 160, - "3906": 203, - "3907": 0, - "3908": 23, - "3909": 116, - "3910": 113, - "3911": 215, - "3912": 129, - "3913": 16, - "3914": 130, - "3915": 16, - "3916": 132, - "3917": 32, - "3918": 22, - "3919": 7, - "3920": 80, - "3921": 64, - "3922": 2, - "3923": 14, - "3924": 78, - "3925": 184, - "3926": 225, - "3927": 137, - "3928": 55, - "3929": 60, - "3930": 225, - "3931": 6, - "3932": 39, - "3933": 232, - "3934": 20, - "3935": 149, - "3936": 58, - "3937": 16, - "3938": 0, - "3939": 0, - "3940": 0, - "3941": 0, - "3942": 0, - "3943": 8, - "3944": 0, - "3945": 120, - "3946": 0, - "3947": 0, - "3948": 72, - "3949": 54, - "3950": 128, - "3951": 136, - "3952": 104, - "3953": 102, - "3954": 230, - "3955": 56, - "3956": 58, - "3957": 60, - "3958": 62, - "3959": 64, - "3960": 66, - "3961": 68, - "3962": 70, - "3963": 72, - "3964": 74, - "3965": 76, - "3966": 78, - "3967": 80, - "3968": 82, - "3969": 84, - "3970": 4, - "3971": 0, - "3972": 0, - "3973": 0, - "3974": 0, - "3975": 0, - "3976": 16, - "3977": 0, - "3978": 62, - "3979": 0, - "3980": 0, - "3981": 146, - "3982": 21, - "3983": 32, - "3984": 34, - "3985": 154, - "3986": 153, - "3987": 57, - "3988": 142, - "3989": 14, - "3990": 143, - "3991": 15, - "3992": 144, - "3993": 16, - "3994": 145, - "3995": 17, - "3996": 146, - "3997": 18, - "3998": 147, - "3999": 19, - "4000": 148, - "4001": 20, - "4002": 149, - "4003": 0, - "4004": 0, - "4005": 64, - "4006": 0, - "4007": 1, - "4008": 0, - "4009": 0, - "4010": 0, - "4011": 0, - "4012": 16, - "4013": 64, - "4014": 0, - "4015": 2, - "4016": 2, - "4017": 2, - "4018": 0, - "4019": 0, - "4020": 0, - "4021": 0, - "4022": 0, - "4023": 1, - "4024": 0, - "4025": 0, - "4026": 0, - "4027": 2, - "4028": 2 - } - } - ] - } - ] - }, - { - "type": "cluster-segment", - "children": [ - { - "type": "timestamp-segment", - "timestamp": 0 - }, - { - "type": "simple-block-segment", - "length": 5, - "trackNumber": 2, - "timecode": 0, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 321336, - "trackNumber": 1, - "timecode": 3, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 5, - "trackNumber": 2, - "timecode": 3, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 5, - "trackNumber": 2, - "timecode": 16, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 5, - "trackNumber": 2, - "timecode": 29, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 5, - "trackNumber": 2, - "timecode": 32, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 5, - "trackNumber": 2, - "timecode": 35, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 183, - "trackNumber": 2, - "timecode": 38, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 190, - "trackNumber": 2, - "timecode": 41, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 12609, - "trackNumber": 1, - "timecode": 43, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 173, - "trackNumber": 2, - "timecode": 44, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1059, - "trackNumber": 2, - "timecode": 47, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 151, - "trackNumber": 2, - "timecode": 60, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 151, - "trackNumber": 2, - "timecode": 73, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 147, - "trackNumber": 2, - "timecode": 76, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 185, - "trackNumber": 2, - "timecode": 78, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 186, - "trackNumber": 2, - "timecode": 81, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 14808, - "trackNumber": 1, - "timecode": 83, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 170, - "trackNumber": 2, - "timecode": 84, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 172, - "trackNumber": 2, - "timecode": 87, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 172, - "trackNumber": 2, - "timecode": 90, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1053, - "trackNumber": 2, - "timecode": 93, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 971, - "trackNumber": 2, - "timecode": 106, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1327, - "trackNumber": 1, - "timecode": 123, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 947, - "trackNumber": 2, - "timecode": 129, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 970, - "trackNumber": 2, - "timecode": 152, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 18621, - "trackNumber": 1, - "timecode": 163, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 943, - "trackNumber": 2, - "timecode": 176, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 960, - "trackNumber": 2, - "timecode": 199, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 24269, - "trackNumber": 1, - "timecode": 203, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 961, - "trackNumber": 2, - "timecode": 222, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 22698, - "trackNumber": 1, - "timecode": 243, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 944, - "trackNumber": 2, - "timecode": 245, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 950, - "trackNumber": 2, - "timecode": 269, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 121594, - "trackNumber": 1, - "timecode": 283, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 948, - "trackNumber": 2, - "timecode": 292, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 958, - "trackNumber": 2, - "timecode": 315, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 157, - "trackNumber": 1, - "timecode": 323, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 946, - "trackNumber": 2, - "timecode": 338, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 957, - "trackNumber": 2, - "timecode": 361, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 18193, - "trackNumber": 1, - "timecode": 363, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 954, - "trackNumber": 2, - "timecode": 385, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 24471, - "trackNumber": 1, - "timecode": 403, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 951, - "trackNumber": 2, - "timecode": 408, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1036, - "trackNumber": 2, - "timecode": 431, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 22894, - "trackNumber": 1, - "timecode": 443, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 146, - "trackNumber": 2, - "timecode": 454, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 153, - "trackNumber": 2, - "timecode": 467, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 148, - "trackNumber": 2, - "timecode": 470, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 153, - "trackNumber": 2, - "timecode": 473, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 148, - "trackNumber": 2, - "timecode": 476, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 151, - "trackNumber": 2, - "timecode": 479, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 173, - "trackNumber": 2, - "timecode": 482, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 83855, - "trackNumber": 1, - "timecode": 483, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 171, - "trackNumber": 2, - "timecode": 485, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 151, - "trackNumber": 2, - "timecode": 488, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 173, - "trackNumber": 2, - "timecode": 491, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 165, - "trackNumber": 2, - "timecode": 494, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1050, - "trackNumber": 2, - "timecode": 496, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 959, - "trackNumber": 2, - "timecode": 509, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 162, - "trackNumber": 1, - "timecode": 523, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 970, - "trackNumber": 2, - "timecode": 533, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 958, - "trackNumber": 2, - "timecode": 556, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 20107, - "trackNumber": 1, - "timecode": 563, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 953, - "trackNumber": 2, - "timecode": 579, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 941, - "trackNumber": 2, - "timecode": 602, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 86673, - "trackNumber": 1, - "timecode": 603, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 955, - "trackNumber": 2, - "timecode": 626, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 30660, - "trackNumber": 1, - "timecode": 643, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 947, - "trackNumber": 2, - "timecode": 649, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 951, - "trackNumber": 2, - "timecode": 672, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 31620, - "trackNumber": 1, - "timecode": 683, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 957, - "trackNumber": 2, - "timecode": 695, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 945, - "trackNumber": 2, - "timecode": 718, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1860, - "trackNumber": 1, - "timecode": 723, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 947, - "trackNumber": 2, - "timecode": 742, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 55689, - "trackNumber": 1, - "timecode": 763, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 963, - "trackNumber": 2, - "timecode": 765, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 944, - "trackNumber": 2, - "timecode": 788, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 31783, - "trackNumber": 1, - "timecode": 803, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 970, - "trackNumber": 2, - "timecode": 811, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 963, - "trackNumber": 2, - "timecode": 835, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 30451, - "trackNumber": 1, - "timecode": 843, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 948, - "trackNumber": 2, - "timecode": 858, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 950, - "trackNumber": 2, - "timecode": 881, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 92563, - "trackNumber": 1, - "timecode": 883, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 947, - "trackNumber": 2, - "timecode": 904, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 175, - "trackNumber": 1, - "timecode": 923, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 939, - "trackNumber": 2, - "timecode": 927, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 958, - "trackNumber": 2, - "timecode": 951, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 46109, - "trackNumber": 1, - "timecode": 963, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 970, - "trackNumber": 2, - "timecode": 974, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 958, - "trackNumber": 2, - "timecode": 997, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 40021, - "trackNumber": 1, - "timecode": 1003, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 958, - "trackNumber": 2, - "timecode": 1020, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 24624, - "trackNumber": 1, - "timecode": 1043, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 974, - "trackNumber": 2, - "timecode": 1044, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 957, - "trackNumber": 2, - "timecode": 1067, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 29826, - "trackNumber": 1, - "timecode": 1083, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 938, - "trackNumber": 2, - "timecode": 1090, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 971, - "trackNumber": 2, - "timecode": 1113, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1331, - "trackNumber": 1, - "timecode": 1123, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 969, - "trackNumber": 2, - "timecode": 1136, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 968, - "trackNumber": 2, - "timecode": 1160, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 133446, - "trackNumber": 1, - "timecode": 1163, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 972, - "trackNumber": 2, - "timecode": 1183, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 24657, - "trackNumber": 1, - "timecode": 1203, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 955, - "trackNumber": 2, - "timecode": 1206, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 957, - "trackNumber": 2, - "timecode": 1229, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 27076, - "trackNumber": 1, - "timecode": 1243, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 944, - "trackNumber": 2, - "timecode": 1253, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 957, - "trackNumber": 2, - "timecode": 1276, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 23317, - "trackNumber": 1, - "timecode": 1283, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 955, - "trackNumber": 2, - "timecode": 1299, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 959, - "trackNumber": 2, - "timecode": 1322, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1800, - "trackNumber": 1, - "timecode": 1323, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 957, - "trackNumber": 2, - "timecode": 1345, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 36858, - "trackNumber": 1, - "timecode": 1363, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 972, - "trackNumber": 2, - "timecode": 1369, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 984, - "trackNumber": 2, - "timecode": 1392, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 25142, - "trackNumber": 1, - "timecode": 1403, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 985, - "trackNumber": 2, - "timecode": 1415, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 964, - "trackNumber": 2, - "timecode": 1438, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 73918, - "trackNumber": 1, - "timecode": 1443, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 979, - "trackNumber": 2, - "timecode": 1462, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 42415, - "trackNumber": 1, - "timecode": 1483, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 969, - "trackNumber": 2, - "timecode": 1485, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 977, - "trackNumber": 2, - "timecode": 1508, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 917, - "trackNumber": 1, - "timecode": 1523, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 951, - "trackNumber": 2, - "timecode": 1531, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 952, - "trackNumber": 2, - "timecode": 1554, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 50459, - "trackNumber": 1, - "timecode": 1563, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 975, - "trackNumber": 2, - "timecode": 1578, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 975, - "trackNumber": 2, - "timecode": 1601, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35437, - "trackNumber": 1, - "timecode": 1603, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 971, - "trackNumber": 2, - "timecode": 1624, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 33900, - "trackNumber": 1, - "timecode": 1643, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 986, - "trackNumber": 2, - "timecode": 1647, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 968, - "trackNumber": 2, - "timecode": 1670, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 28971, - "trackNumber": 1, - "timecode": 1683, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 973, - "trackNumber": 2, - "timecode": 1694, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 977, - "trackNumber": 2, - "timecode": 1717, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 101168, - "trackNumber": 1, - "timecode": 1723, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 957, - "trackNumber": 2, - "timecode": 1740, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 19853, - "trackNumber": 1, - "timecode": 1763, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 948, - "trackNumber": 2, - "timecode": 1763, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 990, - "trackNumber": 2, - "timecode": 1787, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 26769, - "trackNumber": 1, - "timecode": 1803, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 941, - "trackNumber": 2, - "timecode": 1810, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 968, - "trackNumber": 2, - "timecode": 1833, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 24447, - "trackNumber": 1, - "timecode": 1843, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 980, - "trackNumber": 2, - "timecode": 1856, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 992, - "trackNumber": 2, - "timecode": 1879, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 25033, - "trackNumber": 1, - "timecode": 1883, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 979, - "trackNumber": 2, - "timecode": 1903, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 3047, - "trackNumber": 1, - "timecode": 1923, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 977, - "trackNumber": 2, - "timecode": 1926, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 969, - "trackNumber": 2, - "timecode": 1949, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 79041, - "trackNumber": 1, - "timecode": 1963, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 958, - "trackNumber": 2, - "timecode": 1972, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 952, - "trackNumber": 2, - "timecode": 1996, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 65768, - "trackNumber": 1, - "timecode": 2003, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1000, - "trackNumber": 2, - "timecode": 2019, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 988, - "trackNumber": 2, - "timecode": 2042, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 29412, - "trackNumber": 1, - "timecode": 2043, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 976, - "trackNumber": 2, - "timecode": 2065, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 43188, - "trackNumber": 1, - "timecode": 2083, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 965, - "trackNumber": 2, - "timecode": 2088, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 954, - "trackNumber": 2, - "timecode": 2112, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 2165, - "trackNumber": 1, - "timecode": 2123, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 988, - "trackNumber": 2, - "timecode": 2135, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 976, - "trackNumber": 2, - "timecode": 2158, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 59725, - "trackNumber": 1, - "timecode": 2163, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 949, - "trackNumber": 2, - "timecode": 2181, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 43780, - "trackNumber": 1, - "timecode": 2203, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 974, - "trackNumber": 2, - "timecode": 2205, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 977, - "trackNumber": 2, - "timecode": 2228, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 37886, - "trackNumber": 1, - "timecode": 2243, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 994, - "trackNumber": 2, - "timecode": 2251, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 971, - "trackNumber": 2, - "timecode": 2274, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 108747, - "trackNumber": 1, - "timecode": 2283, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 2297, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 973, - "trackNumber": 2, - "timecode": 2321, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 162, - "trackNumber": 1, - "timecode": 2323, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 2344, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 44783, - "trackNumber": 1, - "timecode": 2363, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 982, - "trackNumber": 2, - "timecode": 2367, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 2390, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 36936, - "trackNumber": 1, - "timecode": 2403, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 989, - "trackNumber": 2, - "timecode": 2414, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 972, - "trackNumber": 2, - "timecode": 2437, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35720, - "trackNumber": 1, - "timecode": 2443, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 981, - "trackNumber": 2, - "timecode": 2460, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35750, - "trackNumber": 1, - "timecode": 2483, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 2483, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 2506, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 2326, - "trackNumber": 1, - "timecode": 2523, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 996, - "trackNumber": 2, - "timecode": 2530, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 2553, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 143585, - "trackNumber": 1, - "timecode": 2563, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 962, - "trackNumber": 2, - "timecode": 2576, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 974, - "trackNumber": 2, - "timecode": 2599, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 24989, - "trackNumber": 1, - "timecode": 2603, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 981, - "trackNumber": 2, - "timecode": 2623, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 29754, - "trackNumber": 1, - "timecode": 2643, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 982, - "trackNumber": 2, - "timecode": 2646, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1004, - "trackNumber": 2, - "timecode": 2669, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 26737, - "trackNumber": 1, - "timecode": 2683, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 979, - "trackNumber": 2, - "timecode": 2692, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 964, - "trackNumber": 2, - "timecode": 2715, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 3197, - "trackNumber": 1, - "timecode": 2723, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 984, - "trackNumber": 2, - "timecode": 2739, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 971, - "trackNumber": 2, - "timecode": 2762, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 40694, - "trackNumber": 1, - "timecode": 2763, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 996, - "trackNumber": 2, - "timecode": 2785, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 28694, - "trackNumber": 1, - "timecode": 2803, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 970, - "trackNumber": 2, - "timecode": 2808, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 2831, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 95031, - "trackNumber": 1, - "timecode": 2843, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 981, - "trackNumber": 2, - "timecode": 2855, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 994, - "trackNumber": 2, - "timecode": 2878, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 33924, - "trackNumber": 1, - "timecode": 2883, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 2901, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 3022, - "trackNumber": 1, - "timecode": 2923, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 977, - "trackNumber": 2, - "timecode": 2924, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 970, - "trackNumber": 2, - "timecode": 2948, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 57280, - "trackNumber": 1, - "timecode": 2963, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 972, - "trackNumber": 2, - "timecode": 2971, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 970, - "trackNumber": 2, - "timecode": 2994, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 40996, - "trackNumber": 1, - "timecode": 3003, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 3017, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 3040, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 32315, - "trackNumber": 1, - "timecode": 3043, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 3064, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 33877, - "trackNumber": 1, - "timecode": 3083, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 3087, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 3110, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 112424, - "trackNumber": 1, - "timecode": 3123, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1005, - "trackNumber": 2, - "timecode": 3133, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 3157, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 23360, - "trackNumber": 1, - "timecode": 3163, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1006, - "trackNumber": 2, - "timecode": 3180, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 31269, - "trackNumber": 1, - "timecode": 3203, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 3203, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 983, - "trackNumber": 2, - "timecode": 3226, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 29823, - "trackNumber": 1, - "timecode": 3243, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 3249, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 981, - "trackNumber": 2, - "timecode": 3273, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 30936, - "trackNumber": 1, - "timecode": 3283, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 985, - "trackNumber": 2, - "timecode": 3296, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1008, - "trackNumber": 2, - "timecode": 3319, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 3288, - "trackNumber": 1, - "timecode": 3323, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 3342, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 47558, - "trackNumber": 1, - "timecode": 3363, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 979, - "trackNumber": 2, - "timecode": 3366, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1002, - "trackNumber": 2, - "timecode": 3389, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 83391, - "trackNumber": 1, - "timecode": 3403, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1131, - "trackNumber": 2, - "timecode": 3412, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 154, - "trackNumber": 2, - "timecode": 3435, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 37833, - "trackNumber": 1, - "timecode": 3443, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 159, - "trackNumber": 2, - "timecode": 3448, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 156, - "trackNumber": 2, - "timecode": 3451, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 156, - "trackNumber": 2, - "timecode": 3454, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 184, - "trackNumber": 2, - "timecode": 3457, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 187, - "trackNumber": 2, - "timecode": 3460, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1085, - "trackNumber": 2, - "timecode": 3463, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1004, - "trackNumber": 2, - "timecode": 3476, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 39846, - "trackNumber": 1, - "timecode": 3483, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 992, - "trackNumber": 2, - "timecode": 3499, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 3522, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 2973, - "trackNumber": 1, - "timecode": 3523, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1025, - "trackNumber": 2, - "timecode": 3545, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 51298, - "trackNumber": 1, - "timecode": 3563, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 984, - "trackNumber": 2, - "timecode": 3569, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 996, - "trackNumber": 2, - "timecode": 3592, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 42165, - "trackNumber": 1, - "timecode": 3603, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 995, - "trackNumber": 2, - "timecode": 3615, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1000, - "trackNumber": 2, - "timecode": 3638, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35806, - "trackNumber": 1, - "timecode": 3643, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 3662, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 94557, - "trackNumber": 1, - "timecode": 3683, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 3685, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1008, - "trackNumber": 2, - "timecode": 3708, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 179, - "trackNumber": 1, - "timecode": 3723, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 955, - "trackNumber": 2, - "timecode": 3731, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 968, - "trackNumber": 2, - "timecode": 3754, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 46173, - "trackNumber": 1, - "timecode": 3763, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 977, - "trackNumber": 2, - "timecode": 3778, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 984, - "trackNumber": 2, - "timecode": 3801, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 41490, - "trackNumber": 1, - "timecode": 3803, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 985, - "trackNumber": 2, - "timecode": 3824, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 36973, - "trackNumber": 1, - "timecode": 3843, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 3847, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 3871, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 33974, - "trackNumber": 1, - "timecode": 3883, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 3894, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 986, - "trackNumber": 2, - "timecode": 3917, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 3308, - "trackNumber": 1, - "timecode": 3923, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 982, - "trackNumber": 2, - "timecode": 3940, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 142488, - "trackNumber": 1, - "timecode": 3963, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1004, - "trackNumber": 2, - "timecode": 3963, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 986, - "trackNumber": 2, - "timecode": 3987, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 31038, - "trackNumber": 1, - "timecode": 4003, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1004, - "trackNumber": 2, - "timecode": 4010, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 987, - "trackNumber": 2, - "timecode": 4033, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 26774, - "trackNumber": 1, - "timecode": 4043, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 4056, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1017, - "trackNumber": 2, - "timecode": 4080, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 26185, - "trackNumber": 1, - "timecode": 4083, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 988, - "trackNumber": 2, - "timecode": 4103, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 2960, - "trackNumber": 1, - "timecode": 4123, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 986, - "trackNumber": 2, - "timecode": 4126, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 4149, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 44208, - "trackNumber": 1, - "timecode": 4163, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1007, - "trackNumber": 2, - "timecode": 4172, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1011, - "trackNumber": 2, - "timecode": 4196, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 28554, - "trackNumber": 1, - "timecode": 4203, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 4219, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1020, - "trackNumber": 2, - "timecode": 4242, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 88779, - "trackNumber": 1, - "timecode": 4243, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1012, - "trackNumber": 2, - "timecode": 4265, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35798, - "trackNumber": 1, - "timecode": 4283, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1026, - "trackNumber": 2, - "timecode": 4289, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 992, - "trackNumber": 2, - "timecode": 4312, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1842, - "trackNumber": 1, - "timecode": 4323, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 4335, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1011, - "trackNumber": 2, - "timecode": 4358, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 59762, - "trackNumber": 1, - "timecode": 4363, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 4381, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 39255, - "trackNumber": 1, - "timecode": 4403, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 4405, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 983, - "trackNumber": 2, - "timecode": 4428, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 36711, - "trackNumber": 1, - "timecode": 4443, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 4451, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1011, - "trackNumber": 2, - "timecode": 4474, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 36163, - "trackNumber": 1, - "timecode": 4483, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1002, - "trackNumber": 2, - "timecode": 4498, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1010, - "trackNumber": 2, - "timecode": 4521, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 89604, - "trackNumber": 1, - "timecode": 4523, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 981, - "trackNumber": 2, - "timecode": 4544, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 28272, - "trackNumber": 1, - "timecode": 4563, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 995, - "trackNumber": 2, - "timecode": 4567, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1000, - "trackNumber": 2, - "timecode": 4590, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35206, - "trackNumber": 1, - "timecode": 4603, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 984, - "trackNumber": 2, - "timecode": 4614, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 978, - "trackNumber": 2, - "timecode": 4637, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 30510, - "trackNumber": 1, - "timecode": 4643, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 987, - "trackNumber": 2, - "timecode": 4660, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 33264, - "trackNumber": 1, - "timecode": 4683, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 987, - "trackNumber": 2, - "timecode": 4683, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 986, - "trackNumber": 2, - "timecode": 4706, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 4397, - "trackNumber": 1, - "timecode": 4723, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1011, - "trackNumber": 2, - "timecode": 4730, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 982, - "trackNumber": 2, - "timecode": 4753, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 53353, - "trackNumber": 1, - "timecode": 4763, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1005, - "trackNumber": 2, - "timecode": 4776, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - } - ] - }, - { - "type": "cluster-segment", - "children": [ - { - "type": "timestamp-segment", - "timestamp": 4799 - }, - { - "type": "simple-block-segment", - "length": 1009, - "trackNumber": 2, - "timecode": 0, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 197961, - "trackNumber": 1, - "timecode": 4, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1018, - "trackNumber": 2, - "timecode": 24, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 47126, - "trackNumber": 1, - "timecode": 44, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 988, - "trackNumber": 2, - "timecode": 47, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1012, - "trackNumber": 2, - "timecode": 70, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 39295, - "trackNumber": 1, - "timecode": 84, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 93, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 985, - "trackNumber": 2, - "timecode": 116, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 4093, - "trackNumber": 1, - "timecode": 124, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1009, - "trackNumber": 2, - "timecode": 140, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 163, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 62471, - "trackNumber": 1, - "timecode": 164, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 186, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 43035, - "trackNumber": 1, - "timecode": 204, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1017, - "trackNumber": 2, - "timecode": 209, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1016, - "trackNumber": 2, - "timecode": 233, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 37760, - "trackNumber": 1, - "timecode": 244, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 989, - "trackNumber": 2, - "timecode": 256, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 279, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 86082, - "trackNumber": 1, - "timecode": 284, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 302, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 177, - "trackNumber": 1, - "timecode": 324, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 325, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1005, - "trackNumber": 2, - "timecode": 349, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 45666, - "trackNumber": 1, - "timecode": 364, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1013, - "trackNumber": 2, - "timecode": 372, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 395, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35937, - "trackNumber": 1, - "timecode": 404, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1116, - "trackNumber": 2, - "timecode": 418, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 154, - "trackNumber": 2, - "timecode": 442, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 49144, - "trackNumber": 1, - "timecode": 444, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 159, - "trackNumber": 2, - "timecode": 455, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 158, - "trackNumber": 2, - "timecode": 458, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 155, - "trackNumber": 2, - "timecode": 460, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 157, - "trackNumber": 2, - "timecode": 463, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 154, - "trackNumber": 2, - "timecode": 466, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 180, - "trackNumber": 2, - "timecode": 469, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 182, - "trackNumber": 2, - "timecode": 472, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 182, - "trackNumber": 2, - "timecode": 475, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 155, - "trackNumber": 2, - "timecode": 478, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 178, - "trackNumber": 2, - "timecode": 481, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 26458, - "trackNumber": 1, - "timecode": 484, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 179, - "trackNumber": 2, - "timecode": 484, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1079, - "trackNumber": 2, - "timecode": 487, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 159, - "trackNumber": 2, - "timecode": 500, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 157, - "trackNumber": 2, - "timecode": 513, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 184, - "trackNumber": 2, - "timecode": 516, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 174, - "trackNumber": 2, - "timecode": 518, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1112, - "trackNumber": 2, - "timecode": 521, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 4973, - "trackNumber": 1, - "timecode": 524, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 534, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1004, - "trackNumber": 2, - "timecode": 558, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 130053, - "trackNumber": 1, - "timecode": 564, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 989, - "trackNumber": 2, - "timecode": 581, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 32019, - "trackNumber": 1, - "timecode": 604, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 604, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1011, - "trackNumber": 2, - "timecode": 627, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 29209, - "trackNumber": 1, - "timecode": 644, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 651, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1009, - "trackNumber": 2, - "timecode": 674, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 30775, - "trackNumber": 1, - "timecode": 684, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 996, - "trackNumber": 2, - "timecode": 697, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 988, - "trackNumber": 2, - "timecode": 720, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 2577, - "trackNumber": 1, - "timecode": 724, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 979, - "trackNumber": 2, - "timecode": 743, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 43794, - "trackNumber": 1, - "timecode": 764, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 767, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 996, - "trackNumber": 2, - "timecode": 790, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 22762, - "trackNumber": 1, - "timecode": 804, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 987, - "trackNumber": 2, - "timecode": 813, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1000, - "trackNumber": 2, - "timecode": 836, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 88973, - "trackNumber": 1, - "timecode": 844, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 976, - "trackNumber": 2, - "timecode": 860, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 883, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 40368, - "trackNumber": 1, - "timecode": 884, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1094, - "trackNumber": 2, - "timecode": 906, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 2843, - "trackNumber": 1, - "timecode": 924, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 161, - "trackNumber": 2, - "timecode": 929, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 159, - "trackNumber": 2, - "timecode": 942, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 160, - "trackNumber": 2, - "timecode": 945, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 161, - "trackNumber": 2, - "timecode": 948, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 160, - "trackNumber": 2, - "timecode": 951, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 160, - "trackNumber": 2, - "timecode": 954, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 160, - "trackNumber": 2, - "timecode": 957, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 175, - "trackNumber": 2, - "timecode": 960, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 175, - "trackNumber": 2, - "timecode": 963, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 48583, - "trackNumber": 1, - "timecode": 964, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 175, - "trackNumber": 2, - "timecode": 965, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1073, - "trackNumber": 2, - "timecode": 968, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 990, - "trackNumber": 2, - "timecode": 981, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 42378, - "trackNumber": 1, - "timecode": 1004, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 990, - "trackNumber": 2, - "timecode": 1005, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1102, - "trackNumber": 2, - "timecode": 1028, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 26285, - "trackNumber": 1, - "timecode": 1044, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 170, - "trackNumber": 2, - "timecode": 1051, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 177, - "trackNumber": 2, - "timecode": 1064, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 177, - "trackNumber": 2, - "timecode": 1067, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 171, - "trackNumber": 2, - "timecode": 1070, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 177, - "trackNumber": 2, - "timecode": 1073, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1078, - "trackNumber": 2, - "timecode": 1076, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 36805, - "trackNumber": 1, - "timecode": 1084, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 984, - "trackNumber": 2, - "timecode": 1089, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 1112, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 107159, - "trackNumber": 1, - "timecode": 1124, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 995, - "trackNumber": 2, - "timecode": 1135, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 987, - "trackNumber": 2, - "timecode": 1158, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 17903, - "trackNumber": 1, - "timecode": 1164, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 989, - "trackNumber": 2, - "timecode": 1182, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 29192, - "trackNumber": 1, - "timecode": 1204, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 966, - "trackNumber": 2, - "timecode": 1205, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 1228, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 25343, - "trackNumber": 1, - "timecode": 1244, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 1251, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1009, - "trackNumber": 2, - "timecode": 1275, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 25710, - "trackNumber": 1, - "timecode": 1284, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 986, - "trackNumber": 2, - "timecode": 1298, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 1321, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 4994, - "trackNumber": 1, - "timecode": 1324, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 996, - "trackNumber": 2, - "timecode": 1344, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 41531, - "trackNumber": 1, - "timecode": 1364, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1014, - "trackNumber": 2, - "timecode": 1367, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1012, - "trackNumber": 2, - "timecode": 1391, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 100733, - "trackNumber": 1, - "timecode": 1404, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1010, - "trackNumber": 2, - "timecode": 1414, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1016, - "trackNumber": 2, - "timecode": 1437, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 27466, - "trackNumber": 1, - "timecode": 1444, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 996, - "trackNumber": 2, - "timecode": 1460, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 30499, - "trackNumber": 1, - "timecode": 1484, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 984, - "trackNumber": 2, - "timecode": 1484, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1005, - "trackNumber": 2, - "timecode": 1507, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 3895, - "trackNumber": 1, - "timecode": 1524, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1013, - "trackNumber": 2, - "timecode": 1530, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1012, - "trackNumber": 2, - "timecode": 1553, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 42621, - "trackNumber": 1, - "timecode": 1564, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 1576, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 1600, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 33753, - "trackNumber": 1, - "timecode": 1604, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 992, - "trackNumber": 2, - "timecode": 1623, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 31319, - "trackNumber": 1, - "timecode": 1644, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1010, - "trackNumber": 2, - "timecode": 1646, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1020, - "trackNumber": 2, - "timecode": 1669, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 94595, - "trackNumber": 1, - "timecode": 1684, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 1693, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1010, - "trackNumber": 2, - "timecode": 1716, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 177, - "trackNumber": 1, - "timecode": 1724, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 987, - "trackNumber": 2, - "timecode": 1739, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 1762, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 41555, - "trackNumber": 1, - "timecode": 1764, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1010, - "trackNumber": 2, - "timecode": 1785, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 37851, - "trackNumber": 1, - "timecode": 1804, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1006, - "trackNumber": 2, - "timecode": 1809, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1017, - "trackNumber": 2, - "timecode": 1832, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 32926, - "trackNumber": 1, - "timecode": 1844, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 1855, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 1878, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 36767, - "trackNumber": 1, - "timecode": 1884, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1022, - "trackNumber": 2, - "timecode": 1902, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 3955, - "trackNumber": 1, - "timecode": 1924, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 995, - "trackNumber": 2, - "timecode": 1925, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 981, - "trackNumber": 2, - "timecode": 1948, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 140409, - "trackNumber": 1, - "timecode": 1964, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1008, - "trackNumber": 2, - "timecode": 1971, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1012, - "trackNumber": 2, - "timecode": 1994, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 20450, - "trackNumber": 1, - "timecode": 2004, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1006, - "trackNumber": 2, - "timecode": 2018, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1015, - "trackNumber": 2, - "timecode": 2041, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 30710, - "trackNumber": 1, - "timecode": 2044, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1010, - "trackNumber": 2, - "timecode": 2064, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 24255, - "trackNumber": 1, - "timecode": 2084, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1012, - "trackNumber": 2, - "timecode": 2087, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 2110, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 2245, - "trackNumber": 1, - "timecode": 2124, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 996, - "trackNumber": 2, - "timecode": 2134, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 996, - "trackNumber": 2, - "timecode": 2157, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35918, - "trackNumber": 1, - "timecode": 2164, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1000, - "trackNumber": 2, - "timecode": 2180, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 2203, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 28690, - "trackNumber": 1, - "timecode": 2204, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 2227, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 89199, - "trackNumber": 1, - "timecode": 2244, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 992, - "trackNumber": 2, - "timecode": 2250, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 979, - "trackNumber": 2, - "timecode": 2273, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 28017, - "trackNumber": 1, - "timecode": 2284, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 987, - "trackNumber": 2, - "timecode": 2296, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1010, - "trackNumber": 2, - "timecode": 2319, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 2975, - "trackNumber": 1, - "timecode": 2324, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 992, - "trackNumber": 2, - "timecode": 2343, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 55349, - "trackNumber": 1, - "timecode": 2364, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 2366, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1004, - "trackNumber": 2, - "timecode": 2389, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35011, - "trackNumber": 1, - "timecode": 2404, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1014, - "trackNumber": 2, - "timecode": 2412, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 995, - "trackNumber": 2, - "timecode": 2436, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 32380, - "trackNumber": 1, - "timecode": 2444, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1024, - "trackNumber": 2, - "timecode": 2459, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 2482, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 34074, - "trackNumber": 1, - "timecode": 2484, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 978, - "trackNumber": 2, - "timecode": 2505, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 96418, - "trackNumber": 1, - "timecode": 2524, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1019, - "trackNumber": 2, - "timecode": 2528, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1011, - "trackNumber": 2, - "timecode": 2552, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 41670, - "trackNumber": 1, - "timecode": 2564, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1002, - "trackNumber": 2, - "timecode": 2575, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 992, - "trackNumber": 2, - "timecode": 2598, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 39108, - "trackNumber": 1, - "timecode": 2604, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 990, - "trackNumber": 2, - "timecode": 2621, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 36873, - "trackNumber": 1, - "timecode": 2644, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 994, - "trackNumber": 2, - "timecode": 2645, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1005, - "trackNumber": 2, - "timecode": 2668, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 40381, - "trackNumber": 1, - "timecode": 2684, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 989, - "trackNumber": 2, - "timecode": 2691, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1017, - "trackNumber": 2, - "timecode": 2714, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 5567, - "trackNumber": 1, - "timecode": 2724, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 2737, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1002, - "trackNumber": 2, - "timecode": 2761, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 37830, - "trackNumber": 1, - "timecode": 2764, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 990, - "trackNumber": 2, - "timecode": 2784, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 101889, - "trackNumber": 1, - "timecode": 2804, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1014, - "trackNumber": 2, - "timecode": 2807, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 976, - "trackNumber": 2, - "timecode": 2830, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 34503, - "trackNumber": 1, - "timecode": 2844, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 2854, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1008, - "trackNumber": 2, - "timecode": 2877, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35787, - "trackNumber": 1, - "timecode": 2884, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 2900, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 2923, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 4786, - "trackNumber": 1, - "timecode": 2924, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 995, - "trackNumber": 2, - "timecode": 2946, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 44644, - "trackNumber": 1, - "timecode": 2964, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1019, - "trackNumber": 2, - "timecode": 2970, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 996, - "trackNumber": 2, - "timecode": 2993, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 32764, - "trackNumber": 1, - "timecode": 3004, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 3016, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 3039, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35689, - "trackNumber": 1, - "timecode": 3044, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 983, - "trackNumber": 2, - "timecode": 3063, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 100936, - "trackNumber": 1, - "timecode": 3084, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 990, - "trackNumber": 2, - "timecode": 3086, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 3109, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 183, - "trackNumber": 1, - "timecode": 3124, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 985, - "trackNumber": 2, - "timecode": 3132, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 983, - "trackNumber": 2, - "timecode": 3155, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 46310, - "trackNumber": 1, - "timecode": 3164, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 3179, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 986, - "trackNumber": 2, - "timecode": 3202, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 42976, - "trackNumber": 1, - "timecode": 3204, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 978, - "trackNumber": 2, - "timecode": 3225, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 32588, - "trackNumber": 1, - "timecode": 3244, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 3248, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 3271, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 32598, - "trackNumber": 1, - "timecode": 3284, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1008, - "trackNumber": 2, - "timecode": 3295, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 985, - "trackNumber": 2, - "timecode": 3318, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 5201, - "trackNumber": 1, - "timecode": 3324, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 3341, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 140643, - "trackNumber": 1, - "timecode": 3364, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1008, - "trackNumber": 2, - "timecode": 3364, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1008, - "trackNumber": 2, - "timecode": 3388, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 26068, - "trackNumber": 1, - "timecode": 3404, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1021, - "trackNumber": 2, - "timecode": 3411, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 995, - "trackNumber": 2, - "timecode": 3434, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 32825, - "trackNumber": 1, - "timecode": 3444, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1020, - "trackNumber": 2, - "timecode": 3457, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 3480, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 32583, - "trackNumber": 1, - "timecode": 3484, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 3504, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 4785, - "trackNumber": 1, - "timecode": 3524, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1009, - "trackNumber": 2, - "timecode": 3527, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 985, - "trackNumber": 2, - "timecode": 3550, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 40866, - "trackNumber": 1, - "timecode": 3564, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1007, - "trackNumber": 2, - "timecode": 3573, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 3597, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 33721, - "trackNumber": 1, - "timecode": 3604, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1008, - "trackNumber": 2, - "timecode": 3620, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 994, - "trackNumber": 2, - "timecode": 3643, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 81734, - "trackNumber": 1, - "timecode": 3644, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 978, - "trackNumber": 2, - "timecode": 3666, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 45677, - "trackNumber": 1, - "timecode": 3684, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 990, - "trackNumber": 2, - "timecode": 3689, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 978, - "trackNumber": 2, - "timecode": 3713, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 964, - "trackNumber": 1, - "timecode": 3724, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 990, - "trackNumber": 2, - "timecode": 3736, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 3759, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 56346, - "trackNumber": 1, - "timecode": 3764, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1000, - "trackNumber": 2, - "timecode": 3782, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 37930, - "trackNumber": 1, - "timecode": 3804, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 3806, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1005, - "trackNumber": 2, - "timecode": 3829, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 37714, - "trackNumber": 1, - "timecode": 3844, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 3852, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1002, - "trackNumber": 2, - "timecode": 3875, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 33898, - "trackNumber": 1, - "timecode": 3884, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 981, - "trackNumber": 2, - "timecode": 3898, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 3922, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 94252, - "trackNumber": 1, - "timecode": 3924, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1019, - "trackNumber": 2, - "timecode": 3945, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 28338, - "trackNumber": 1, - "timecode": 3964, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1014, - "trackNumber": 2, - "timecode": 3968, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1005, - "trackNumber": 2, - "timecode": 3991, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 32937, - "trackNumber": 1, - "timecode": 4004, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1010, - "trackNumber": 2, - "timecode": 4015, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1002, - "trackNumber": 2, - "timecode": 4038, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 34319, - "trackNumber": 1, - "timecode": 4044, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 4061, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35334, - "trackNumber": 1, - "timecode": 4084, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 990, - "trackNumber": 2, - "timecode": 4084, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1002, - "trackNumber": 2, - "timecode": 4107, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 4750, - "trackNumber": 1, - "timecode": 4124, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 4131, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1019, - "trackNumber": 2, - "timecode": 4154, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 45416, - "trackNumber": 1, - "timecode": 4164, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 4177, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 996, - "trackNumber": 2, - "timecode": 4200, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 91614, - "trackNumber": 1, - "timecode": 4204, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 4224, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 36130, - "trackNumber": 1, - "timecode": 4244, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 4247, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1006, - "trackNumber": 2, - "timecode": 4270, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 37449, - "trackNumber": 1, - "timecode": 4284, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 4293, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1004, - "trackNumber": 2, - "timecode": 4316, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 4267, - "trackNumber": 1, - "timecode": 4324, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1016, - "trackNumber": 2, - "timecode": 4340, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 990, - "trackNumber": 2, - "timecode": 4363, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 58742, - "trackNumber": 1, - "timecode": 4364, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 988, - "trackNumber": 2, - "timecode": 4386, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35725, - "trackNumber": 1, - "timecode": 4404, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 992, - "trackNumber": 2, - "timecode": 4409, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 4432, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 36251, - "trackNumber": 1, - "timecode": 4444, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1004, - "trackNumber": 2, - "timecode": 4456, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1011, - "trackNumber": 2, - "timecode": 4479, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 93770, - "trackNumber": 1, - "timecode": 4484, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 4502, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 175, - "trackNumber": 1, - "timecode": 4524, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 985, - "trackNumber": 2, - "timecode": 4525, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 4549, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 47415, - "trackNumber": 1, - "timecode": 4564, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1002, - "trackNumber": 2, - "timecode": 4572, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 4595, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 43921, - "trackNumber": 1, - "timecode": 4604, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1005, - "trackNumber": 2, - "timecode": 4618, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1000, - "trackNumber": 2, - "timecode": 4641, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 38532, - "trackNumber": 1, - "timecode": 4644, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1002, - "trackNumber": 2, - "timecode": 4665, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 38268, - "trackNumber": 1, - "timecode": 4684, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1000, - "trackNumber": 2, - "timecode": 4688, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 4711, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 5420, - "trackNumber": 1, - "timecode": 4724, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 994, - "trackNumber": 2, - "timecode": 4734, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 4758, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 143427, - "trackNumber": 1, - "timecode": 4764, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - } - ] - }, - { - "type": "cluster-segment", - "children": [ - { - "type": "timestamp-segment", - "timestamp": 9580 - }, - { - "type": "simple-block-segment", - "length": 988, - "trackNumber": 2, - "timecode": 0, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 220694, - "trackNumber": 1, - "timecode": 23, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1006, - "trackNumber": 2, - "timecode": 23, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1011, - "trackNumber": 2, - "timecode": 46, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 33676, - "trackNumber": 1, - "timecode": 63, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 69, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 994, - "trackNumber": 2, - "timecode": 93, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 39579, - "trackNumber": 1, - "timecode": 103, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1017, - "trackNumber": 2, - "timecode": 116, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 985, - "trackNumber": 2, - "timecode": 139, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 6462, - "trackNumber": 1, - "timecode": 143, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 162, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 41812, - "trackNumber": 1, - "timecode": 183, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 186, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 995, - "trackNumber": 2, - "timecode": 209, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 38777, - "trackNumber": 1, - "timecode": 223, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 992, - "trackNumber": 2, - "timecode": 232, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1014, - "trackNumber": 2, - "timecode": 255, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 38528, - "trackNumber": 1, - "timecode": 263, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 278, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1006, - "trackNumber": 2, - "timecode": 302, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 52272, - "trackNumber": 1, - "timecode": 303, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 325, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 39940, - "trackNumber": 1, - "timecode": 343, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 348, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1005, - "trackNumber": 2, - "timecode": 371, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 69088, - "trackNumber": 1, - "timecode": 383, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 996, - "trackNumber": 2, - "timecode": 395, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 418, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 50367, - "trackNumber": 1, - "timecode": 423, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 441, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35042, - "trackNumber": 1, - "timecode": 463, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1012, - "trackNumber": 2, - "timecode": 464, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 995, - "trackNumber": 2, - "timecode": 487, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35789, - "trackNumber": 1, - "timecode": 503, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 992, - "trackNumber": 2, - "timecode": 511, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 534, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 4881, - "trackNumber": 1, - "timecode": 543, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 557, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1022, - "trackNumber": 2, - "timecode": 580, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 161312, - "trackNumber": 1, - "timecode": 583, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 992, - "trackNumber": 2, - "timecode": 603, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 27073, - "trackNumber": 1, - "timecode": 623, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 627, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 650, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 33163, - "trackNumber": 1, - "timecode": 663, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1015, - "trackNumber": 2, - "timecode": 673, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1023, - "trackNumber": 2, - "timecode": 696, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 34569, - "trackNumber": 1, - "timecode": 703, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 985, - "trackNumber": 2, - "timecode": 720, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 4703, - "trackNumber": 1, - "timecode": 743, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1010, - "trackNumber": 2, - "timecode": 743, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 766, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 33195, - "trackNumber": 1, - "timecode": 783, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 789, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1126, - "trackNumber": 2, - "timecode": 812, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 31862, - "trackNumber": 1, - "timecode": 823, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 160, - "trackNumber": 2, - "timecode": 836, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 161, - "trackNumber": 2, - "timecode": 849, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 158, - "trackNumber": 2, - "timecode": 852, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 154, - "trackNumber": 2, - "timecode": 855, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 158, - "trackNumber": 2, - "timecode": 857, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 164, - "trackNumber": 2, - "timecode": 860, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 74323, - "trackNumber": 1, - "timecode": 863, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 178, - "trackNumber": 2, - "timecode": 863, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 187, - "trackNumber": 2, - "timecode": 866, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1116, - "trackNumber": 2, - "timecode": 869, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 996, - "trackNumber": 2, - "timecode": 882, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 74462, - "trackNumber": 1, - "timecode": 903, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 905, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1010, - "trackNumber": 2, - "timecode": 929, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 372, - "trackNumber": 1, - "timecode": 943, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1000, - "trackNumber": 2, - "timecode": 952, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 975, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 59590, - "trackNumber": 1, - "timecode": 983, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 986, - "trackNumber": 2, - "timecode": 998, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1000, - "trackNumber": 2, - "timecode": 1021, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 40229, - "trackNumber": 1, - "timecode": 1023, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1008, - "trackNumber": 2, - "timecode": 1045, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 38241, - "trackNumber": 1, - "timecode": 1063, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 1068, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 999, - "trackNumber": 2, - "timecode": 1091, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 33876, - "trackNumber": 1, - "timecode": 1103, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 992, - "trackNumber": 2, - "timecode": 1114, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 1138, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 91628, - "trackNumber": 1, - "timecode": 1143, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 980, - "trackNumber": 2, - "timecode": 1161, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 29192, - "trackNumber": 1, - "timecode": 1183, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1103, - "trackNumber": 2, - "timecode": 1184, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 158, - "trackNumber": 2, - "timecode": 1207, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 156, - "trackNumber": 2, - "timecode": 1220, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 32274, - "trackNumber": 1, - "timecode": 1223, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 157, - "trackNumber": 2, - "timecode": 1223, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 156, - "trackNumber": 2, - "timecode": 1226, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 159, - "trackNumber": 2, - "timecode": 1229, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 156, - "trackNumber": 2, - "timecode": 1232, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 180, - "trackNumber": 2, - "timecode": 1235, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 182, - "trackNumber": 2, - "timecode": 1238, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 180, - "trackNumber": 2, - "timecode": 1241, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1091, - "trackNumber": 2, - "timecode": 1243, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 1257, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 34248, - "trackNumber": 1, - "timecode": 1263, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 1280, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 42719, - "trackNumber": 1, - "timecode": 1303, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 1303, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1009, - "trackNumber": 2, - "timecode": 1326, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 6129, - "trackNumber": 1, - "timecode": 1343, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 1349, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1002, - "trackNumber": 2, - "timecode": 1373, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 43298, - "trackNumber": 1, - "timecode": 1383, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1002, - "trackNumber": 2, - "timecode": 1396, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1027, - "trackNumber": 2, - "timecode": 1419, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 94538, - "trackNumber": 1, - "timecode": 1423, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 1442, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 47194, - "trackNumber": 1, - "timecode": 1463, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1007, - "trackNumber": 2, - "timecode": 1466, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1012, - "trackNumber": 2, - "timecode": 1489, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 37931, - "trackNumber": 1, - "timecode": 1503, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1002, - "trackNumber": 2, - "timecode": 1512, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1008, - "trackNumber": 2, - "timecode": 1535, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 5820, - "trackNumber": 1, - "timecode": 1543, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 992, - "trackNumber": 2, - "timecode": 1558, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1024, - "trackNumber": 2, - "timecode": 1582, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 49662, - "trackNumber": 1, - "timecode": 1583, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 1605, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 34069, - "trackNumber": 1, - "timecode": 1623, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1008, - "trackNumber": 2, - "timecode": 1628, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1002, - "trackNumber": 2, - "timecode": 1651, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 40375, - "trackNumber": 1, - "timecode": 1663, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1004, - "trackNumber": 2, - "timecode": 1675, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 1698, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 93936, - "trackNumber": 1, - "timecode": 1703, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1009, - "trackNumber": 2, - "timecode": 1721, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 196, - "trackNumber": 1, - "timecode": 1743, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1005, - "trackNumber": 2, - "timecode": 1744, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1004, - "trackNumber": 2, - "timecode": 1767, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 42681, - "trackNumber": 1, - "timecode": 1783, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1133, - "trackNumber": 2, - "timecode": 1791, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 162, - "trackNumber": 2, - "timecode": 1814, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 39351, - "trackNumber": 1, - "timecode": 1823, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 162, - "trackNumber": 2, - "timecode": 1827, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 159, - "trackNumber": 2, - "timecode": 1830, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 158, - "trackNumber": 2, - "timecode": 1833, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 159, - "trackNumber": 2, - "timecode": 1836, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 183, - "trackNumber": 2, - "timecode": 1839, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 184, - "trackNumber": 2, - "timecode": 1841, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 187, - "trackNumber": 2, - "timecode": 1844, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 153, - "trackNumber": 2, - "timecode": 1847, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 152, - "trackNumber": 2, - "timecode": 1850, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 159, - "trackNumber": 2, - "timecode": 1853, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 164, - "trackNumber": 2, - "timecode": 1856, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 159, - "trackNumber": 2, - "timecode": 1859, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 158, - "trackNumber": 2, - "timecode": 1862, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35079, - "trackNumber": 1, - "timecode": 1863, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 158, - "trackNumber": 2, - "timecode": 1865, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 184, - "trackNumber": 2, - "timecode": 1868, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 179, - "trackNumber": 2, - "timecode": 1870, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 175, - "trackNumber": 2, - "timecode": 1873, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 160, - "trackNumber": 2, - "timecode": 1876, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 183, - "trackNumber": 2, - "timecode": 1879, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 186, - "trackNumber": 2, - "timecode": 1882, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 178, - "trackNumber": 2, - "timecode": 1885, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 185, - "trackNumber": 2, - "timecode": 1888, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 181, - "trackNumber": 2, - "timecode": 1891, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 184, - "trackNumber": 2, - "timecode": 1894, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 185, - "trackNumber": 2, - "timecode": 1897, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 180, - "trackNumber": 2, - "timecode": 1899, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 185, - "trackNumber": 2, - "timecode": 1902, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 46892, - "trackNumber": 1, - "timecode": 1903, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 180, - "trackNumber": 2, - "timecode": 1905, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 178, - "trackNumber": 2, - "timecode": 1908, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 155, - "trackNumber": 2, - "timecode": 1911, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 156, - "trackNumber": 2, - "timecode": 1914, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 151, - "trackNumber": 2, - "timecode": 1917, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 157, - "trackNumber": 2, - "timecode": 1920, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 158, - "trackNumber": 2, - "timecode": 1923, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 182, - "trackNumber": 2, - "timecode": 1926, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 183, - "trackNumber": 2, - "timecode": 1928, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 179, - "trackNumber": 2, - "timecode": 1931, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 177, - "trackNumber": 2, - "timecode": 1934, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 176, - "trackNumber": 2, - "timecode": 1937, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1095, - "trackNumber": 2, - "timecode": 1940, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 7031, - "trackNumber": 1, - "timecode": 1943, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 994, - "trackNumber": 2, - "timecode": 1953, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1000, - "trackNumber": 2, - "timecode": 1976, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 117744, - "trackNumber": 1, - "timecode": 1983, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 991, - "trackNumber": 2, - "timecode": 2000, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 35923, - "trackNumber": 1, - "timecode": 2023, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 2023, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1001, - "trackNumber": 2, - "timecode": 2046, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 38889, - "trackNumber": 1, - "timecode": 2063, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 995, - "trackNumber": 2, - "timecode": 2069, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 993, - "trackNumber": 2, - "timecode": 2092, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 36668, - "trackNumber": 1, - "timecode": 2103, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 2116, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1003, - "trackNumber": 2, - "timecode": 2139, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 5719, - "trackNumber": 1, - "timecode": 2143, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 998, - "trackNumber": 2, - "timecode": 2162, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 55457, - "trackNumber": 1, - "timecode": 2183, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1000, - "trackNumber": 2, - "timecode": 2185, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 997, - "trackNumber": 2, - "timecode": 2209, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 34087, - "trackNumber": 1, - "timecode": 2223, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 995, - "trackNumber": 2, - "timecode": 2232, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1004, - "trackNumber": 2, - "timecode": 2255, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 57606, - "trackNumber": 1, - "timecode": 2263, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1006, - "trackNumber": 2, - "timecode": 2278, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 985, - "trackNumber": 2, - "timecode": 2301, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 59379, - "trackNumber": 1, - "timecode": 2303, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 994, - "trackNumber": 2, - "timecode": 2325, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1857, - "trackNumber": 1, - "timecode": 2343, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1005, - "trackNumber": 2, - "timecode": 2348, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1018, - "trackNumber": 2, - "timecode": 2371, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 63188, - "trackNumber": 1, - "timecode": 2383, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1029, - "trackNumber": 2, - "timecode": 2394, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 1112, - "trackNumber": 2, - "timecode": 2418, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 52607, - "trackNumber": 1, - "timecode": 2423, - "headerFlags": 0, - "keyframe": false, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 163, - "trackNumber": 2, - "timecode": 2441, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 161, - "trackNumber": 2, - "timecode": 2454, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 181, - "trackNumber": 2, - "timecode": 2457, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 221, - "trackNumber": 2, - "timecode": 2460, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - }, - { - "type": "simple-block-segment", - "length": 179, - "trackNumber": 2, - "timecode": 2463, - "headerFlags": 128, - "keyframe": true, - "lacing": [ - 0, - 0 - ], - "invisible": false, - "children": [] - } - ] - }, - { - "id": "0x1c53bb6b", - "type": "unknown-segment" - } - ] - } -] \ No newline at end of file diff --git a/packages/media-parser/src/add-new-matroska-tracks.ts b/packages/media-parser/src/add-new-matroska-tracks.ts new file mode 100644 index 00000000000..057004625fb --- /dev/null +++ b/packages/media-parser/src/add-new-matroska-tracks.ts @@ -0,0 +1,23 @@ +import type {Track} from './get-tracks'; +import type {ParserContext} from './parser-context'; +import type {ParserState} from './parser-state'; + +export const registerTrack = async ({ + state, + options, + track, +}: { + state: ParserState; + options: ParserContext; + track: Track; +}) => { + if (track.type === 'video' && options.onVideoTrack) { + const callback = await options.onVideoTrack(track); + await state.registerVideoSampleCallback(track.trackId, callback ?? null); + } + + if (track.type === 'audio' && options.onAudioTrack) { + const callback = await options.onAudioTrack(track); + await state.registerAudioSampleCallback(track.trackId, callback ?? null); + } +}; diff --git a/packages/media-parser/src/av1-codec-string.ts b/packages/media-parser/src/av1-codec-string.ts deleted file mode 100644 index 2bff81a80b1..00000000000 --- a/packages/media-parser/src/av1-codec-string.ts +++ /dev/null @@ -1,136 +0,0 @@ -// https://aomediacodec.github.io/av1-isobmff/#codecsparam - -import type {ColorParameterBox} from './boxes/iso-base-media/stsd/colr'; -import type {Av1BitstreamHeaderSegment} from './boxes/webm/bitstream/av1/header-segment'; -import type { - ClusterSegment, - TrackEntrySegment, -} from './boxes/webm/segments/track-entry'; -import {getAv1BitstreamHeader} from './boxes/webm/traversal'; -import {getCodecSegment} from './traversal'; - -export const constructAv1CodecString = ( - av1BitstreamHeader: Av1BitstreamHeaderSegment, - colrAtom: ColorParameterBox | null, -) => { - let str = 'av01.'; - - // Profile - str += av1BitstreamHeader.seq_profile; - str += '.'; - - // Level - // The level parameter value SHALL equal the first level value indicated by seq_level_idx in the Sequence Header OBU - str += av1BitstreamHeader.seq_level[0].seq_level_idx - .toString() - .padStart(2, '0'); - - // Tier - // The tier parameter value SHALL be equal to M when the first seq_tier value in the Sequence Header OBU is equal to 0, and H when it is equal to 1 - str += av1BitstreamHeader.seq_level[0].seq_tier ? 'H' : 'M'; - str += '.'; - - // bitDepth - // The bitDepth parameter value SHALL equal the value of BitDepth variable as defined in [AV1] derived from the Sequence Header OBU - str += av1BitstreamHeader.color_config.bitDepth.toString().padStart(2, '0'); - str += '.'; - - // monochrome - // The monochrome parameter value, represented by a single digit decimal, SHALL equal the value of mono_chrome in the Sequence Header OBU - str += av1BitstreamHeader.color_config.mono_chrome ? '1' : '0'; - str += '.'; - - // The chromaSubsampling parameter value, represented by a three-digit decimal, - // SHALL have its first digit equal to subsampling_x - str += av1BitstreamHeader.color_config.subsampling_x ? '1' : '0'; - // and its second digit equal to subsampling_y. - str += av1BitstreamHeader.color_config.subsampling_y ? '1' : '0'; - // If both subsampling_x and subsampling_y are set to 1, then the third digit SHALL be equal to chroma_sample_position, otherwise it SHALL be set to 0 - str += - av1BitstreamHeader.color_config.subsampling_x && - av1BitstreamHeader.color_config.subsampling_y - ? av1BitstreamHeader.color_config.chroma_sample_position === 1 - ? '1' - : '0' - : '0'; - str += '.'; - - // The colorPrimaries, transferCharacteristics, matrixCoefficients, and videoFullRangeFlag parameter values are set as follows: - // If a colr box with colour_type set to nclx is present, the colorPrimaries, transferCharacteristics, matrixCoefficients, and videoFullRangeFlag parameter values SHALL equal the values of matching fields in the colr box. - if (colrAtom) { - str += colrAtom.primaries.toString().padStart(2, '0'); - str += '.'; - str += colrAtom.transfer.toString().padStart(2, '0'); - str += '.'; - str += colrAtom.matrixIndex.toString().padStart(2, '0'); - str += '.'; - str += colrAtom.fullRangeFlag ? '1' : '0'; - } - // Otherwise, a colr box with colour_type set to nclx is absent. - // If the color_description_present_flag is set to 1 in the Sequence Header OBU, the colorPrimaries, transferCharacteristics, and matrixCoefficients parameter values SHALL equal the values of matching fields in the Sequence Header OBU. - else if (av1BitstreamHeader.color_config.color_description_present_flag) { - str += av1BitstreamHeader.color_config.color_primaries - .toString() - .padStart(2, '0'); - str += '.'; - str += av1BitstreamHeader.color_config.transfer_characteristics - .toString() - .padStart(2, '0'); - str += '.'; - str += av1BitstreamHeader.color_config.matrix_coefficients - .toString() - .padStart(2, '0'); - str += '.'; - // The videoFullRangeFlag parameter value SHALL equal the color_range flag in the Sequence Header OBU. - str += av1BitstreamHeader.color_config.color_range ? '1' : '0'; - } else { - // Otherwise, the color_description_present_flag is set to 0 in the Sequence Header OBU. The colorPrimaries, transferCharacteristics, and matrixCoefficients parameter values SHOULD be set to the default values below. - // colorPrimaries 01 (ITU-R BT.709) - str += '01'; - str += '.'; - // transferCharacteristics 01 (ITU-R BT.709) - str += '01'; - str += '.'; - // matrixCoefficients 00 (ITU-R BT.709) - str += '01'; - str += '.'; - // videoFullRangeFlag 0 (studio swing representation) - str += '0'; - } - - // If the codecs parameter string ends with ".0.110.01.01.01.0" (containing all the default values below), that trailing part of the string SHOULD be omitted. - const suffix = '.0.110.01.01.01.0'; - - if (str.endsWith(suffix)) { - str = str.slice(0, -suffix.length); - } - - return str; -}; - -export const av1CodecStringToString = ({ - track, - clusterSegment, -}: { - track: TrackEntrySegment; - clusterSegment: ClusterSegment; -}): string | null => { - const codecSegment = getCodecSegment(track); - - if (!codecSegment) { - throw new Error('Expected codec segment'); - } - - if (codecSegment.codec !== 'V_AV1') { - throw new Error( - `Should not call this function if it is not AV1: ${codecSegment.codec}`, - ); - } - - const av1BitstreamHeader = getAv1BitstreamHeader(clusterSegment); - if (!av1BitstreamHeader) { - return null; - } - - return constructAv1CodecString(av1BitstreamHeader, null); -}; diff --git a/packages/media-parser/src/boxes/iso-base-media/make-track.ts b/packages/media-parser/src/boxes/iso-base-media/make-track.ts index f412943eb36..716cb619693 100644 --- a/packages/media-parser/src/boxes/iso-base-media/make-track.ts +++ b/packages/media-parser/src/boxes/iso-base-media/make-track.ts @@ -10,6 +10,7 @@ import { } from '../../get-fps'; import { applyAspectRatios, + applyTkhdBox, getDisplayAspectRatio, getSampleAspectRatio, getVideoSample, @@ -39,6 +40,7 @@ export const makeBaseMediaTrack = ( const sttsBox = getSttsBox(trakBox); const tkhdBox = getTkhdBox(trakBox); const cttsBox = getCttsBox(trakBox); + const videoDescriptors = getVideoDescriptors(trakBox); const timescaleAndDuration = getTimescaleAndDuration(trakBox); @@ -116,7 +118,7 @@ export const makeBaseMediaTrack = ( const sampleAspectRatio = getSampleAspectRatio(trakBox); - const applied = applyAspectRatios({ + const aspectRatioApplied = applyAspectRatios({ dimensions: videoSample, sampleAspectRatio, displayAspectRatio: getDisplayAspectRatio({ @@ -125,17 +127,31 @@ export const makeBaseMediaTrack = ( }), }); - return { + const {displayAspectHeight, displayAspectWidth, height, rotation, width} = + applyTkhdBox(aspectRatioApplied, tkhdBox); + + const codec = getVideoCodecString(trakBox); + + if (!codec) { + throw new Error('Could not find video codec'); + } + + const track: VideoTrack = { type: 'video', samplePositions, trackId: tkhdBox.trackId, description: videoDescriptors ?? undefined, timescale: timescaleAndDuration.timescale, - codec: getVideoCodecString(trakBox), + codec, sampleAspectRatio: getSampleAspectRatio(trakBox), - width: applied.width, - height: applied.height, + width, + height, codedWidth: videoSample.width, codedHeight: videoSample.height, - } as VideoTrack; + // Repeating those keys because they get picked up by VideoDecoder + displayAspectWidth, + displayAspectHeight, + rotation, + }; + return track; }; diff --git a/packages/media-parser/src/boxes/iso-base-media/mdat/mdat.ts b/packages/media-parser/src/boxes/iso-base-media/mdat/mdat.ts index 6a90a3baad9..584127db82f 100644 --- a/packages/media-parser/src/boxes/iso-base-media/mdat/mdat.ts +++ b/packages/media-parser/src/boxes/iso-base-media/mdat/mdat.ts @@ -11,8 +11,7 @@ export interface MdatBox { fileOffset: number; } -// TODO: Parse mdat only gets called when all of the atom is downloaded -export const parseMdat = ({ +export const parseMdat = async ({ data, size, fileOffset, @@ -24,19 +23,19 @@ export const parseMdat = ({ fileOffset: number; existingBoxes: AnySegment[]; options: ParserContext; -}): MdatBox => { +}): Promise => { const alreadyHas = hasTracks(existingBoxes); if (!alreadyHas) { data.discard(size - 8); - return { + return Promise.resolve({ type: 'mdat-box', boxSize: size, samplesProcessed: false, fileOffset, - }; + }); } - const tracks = getTracks(existingBoxes); + const tracks = getTracks(existingBoxes, options.parserState); const allTracks = [ ...tracks.videoTracks, ...tracks.audioTracks, @@ -64,41 +63,32 @@ export const parseMdat = ({ return sample.samplePosition.offset === data.counter.getOffset(); }); if (!sampleWithIndex) { - if (data.bytesRemaining() >= 8) { - const possibleAtomLength = data.getFourByteNumber(); - const possibleAtom = data.getByteString(4); - data.counter.decrement(8); - // if a weird hoov atom appears, like in iphonevideo.hevc - // then we skip to the next sample - if (possibleAtom === 'hoov' || possibleAtom === 'moof') { - const nextSample = flatSamples - .filter((s) => s.samplePosition.offset > data.counter.getOffset()) - .sort( - (a, b) => a.samplePosition.offset - b.samplePosition.offset, - )[0]; - if (nextSample) { - data.discard( - nextSample.samplePosition.offset - data.counter.getOffset(), - ); - continue; - } else { - data.discard(possibleAtomLength); - break; - } - } - - data.peekB(8); + // There are various reasons why in mdat we find weird stuff: + // - iphonevideo.hevc has a fake hoov atom which is not mapped + // - corrupted.mp4 has a corrupt table + const nextSample_ = flatSamples + .filter((s) => s.samplePosition.offset > data.counter.getOffset()) + .sort((a, b) => a.samplePosition.offset - b.samplePosition.offset)[0]; + if (nextSample_) { + data.discard( + nextSample_.samplePosition.offset - data.counter.getOffset(), + ); + continue; + } else { + const bytesRemaining = size + fileOffset - data.counter.getOffset(); + data.discard(bytesRemaining); + break; } + } - throw new Error( - 'Could not find sample with offset ' + data.counter.getOffset(), - ); + if (data.bytesRemaining() < sampleWithIndex.samplePosition.size) { + break; } const bytes = data.getSlice(sampleWithIndex.samplePosition.size); if (sampleWithIndex.track.type === 'audio') { - options.parserState.onAudioSample(sampleWithIndex.track.trackId, { + await options.parserState.onAudioSample(sampleWithIndex.track.trackId, { data: bytes, timestamp: sampleWithIndex.samplePosition.offset, offset: data.counter.getOffset(), @@ -115,7 +105,7 @@ export const parseMdat = ({ (sampleWithIndex.samplePosition.duration * 1_000_000) / sampleWithIndex.track.timescale; - options.parserState.onVideoSample(sampleWithIndex.track.trackId, { + await options.parserState.onVideoSample(sampleWithIndex.track.trackId, { data: bytes, timestamp, duration, @@ -132,10 +122,10 @@ export const parseMdat = ({ } } - return { + return Promise.resolve({ type: 'mdat-box', boxSize: size, samplesProcessed: true, fileOffset, - }; + }); }; diff --git a/packages/media-parser/src/boxes/iso-base-media/moov/moov.ts b/packages/media-parser/src/boxes/iso-base-media/moov/moov.ts index 137d095a157..d95bf10a686 100644 --- a/packages/media-parser/src/boxes/iso-base-media/moov/moov.ts +++ b/packages/media-parser/src/boxes/iso-base-media/moov/moov.ts @@ -9,7 +9,7 @@ export interface MoovBox extends BaseBox { children: AnySegment[]; } -export const parseMoov = ({ +export const parseMoov = async ({ iterator, offset, size, @@ -19,13 +19,14 @@ export const parseMoov = ({ offset: number; size: number; options: ParserContext; -}): MoovBox => { - const children = parseBoxes({ +}): Promise => { + const children = await parseBoxes({ iterator, maxBytes: size - (iterator.counter.getOffset() - offset), allowIncompleteBoxes: false, initialBoxes: [], options, + continueMdat: false, }); if (children.status === 'incomplete') { diff --git a/packages/media-parser/src/boxes/iso-base-media/mvhd.ts b/packages/media-parser/src/boxes/iso-base-media/mvhd.ts index 8a0a5ce7496..b1e5b4b7531 100644 --- a/packages/media-parser/src/boxes/iso-base-media/mvhd.ts +++ b/packages/media-parser/src/boxes/iso-base-media/mvhd.ts @@ -94,6 +94,8 @@ export const parseMvhd = ({ // next track id const nextTrackId = iterator.getUint32(); + volumeView.destroy(); + return { creationTime: toUnixTimestamp(creationTime), modificationTime: toUnixTimestamp(modificationTime), diff --git a/packages/media-parser/src/boxes/iso-base-media/process-box.ts b/packages/media-parser/src/boxes/iso-base-media/process-box.ts index 2eee19d9662..9cca12f0ef1 100644 --- a/packages/media-parser/src/boxes/iso-base-media/process-box.ts +++ b/packages/media-parser/src/boxes/iso-base-media/process-box.ts @@ -6,7 +6,7 @@ import type { IsoBaseMediaBox, ParseResult, } from '../../parse-result'; -import type {BoxAndNext} from '../../parse-video'; +import type {BoxAndNext, PartialMdatBox} from '../../parse-video'; import type {ParserContext} from '../../parser-context'; import {hasSkippedMdatProcessing} from '../../traversal'; import {parseEsds} from './esds/esds'; @@ -32,7 +32,7 @@ import {parseStts} from './stsd/stts'; import {parseTkhd} from './tkhd'; import {parseTrak} from './trak/trak'; -const getChildren = ({ +const getChildren = async ({ boxType, iterator, bytesRemainingInBox, @@ -52,12 +52,13 @@ const getChildren = ({ boxType === 'stsb'; if (parseChildren) { - const parsed = parseBoxes({ + const parsed = await parseBoxes({ iterator, maxBytes: bytesRemainingInBox, allowIncompleteBoxes: false, initialBoxes: [], options, + continueMdat: false, }); if (parsed.status === 'incomplete') { @@ -75,7 +76,47 @@ const getChildren = ({ return []; }; -export const processBox = ({ +export const parseMdatPartially = async ({ + iterator, + boxSize, + fileOffset, + parsedBoxes, + options, +}: { + iterator: BufferIterator; + boxSize: number; + fileOffset: number; + parsedBoxes: AnySegment[]; + options: ParserContext; +}): Promise => { + const box = await parseMdat({ + data: iterator, + size: boxSize, + fileOffset, + existingBoxes: parsedBoxes, + options, + }); + + if ( + box.samplesProcessed && + box.fileOffset + boxSize === iterator.counter.getOffset() + ) { + return { + type: 'complete', + box, + size: boxSize, + skipTo: null, + }; + } + + return { + type: 'partial-mdat-box', + boxSize, + fileOffset, + }; +}; + +export const processBox = async ({ iterator, allowIncompleteBoxes, parsedBoxes, @@ -85,7 +126,7 @@ export const processBox = ({ allowIncompleteBoxes: boolean; parsedBoxes: AnySegment[]; options: ParserContext; -}): BoxAndNext => { +}): Promise => { const fileOffset = iterator.counter.getOffset(); const bytesRemaining = iterator.bytesRemaining(); @@ -109,6 +150,7 @@ export const processBox = ({ if (type === 'mdat') { const shouldSkip = options.canSkipVideoData || !hasTracks(parsedBoxes); + if (shouldSkip) { const skipTo = fileOffset + boxSize; const bytesToSkip = skipTo - iterator.counter.getOffset(); @@ -127,6 +169,15 @@ export const processBox = ({ skipTo: fileOffset + boxSize, }; } + } else { + iterator.discard(4); + return parseMdatPartially({ + iterator, + boxSize, + fileOffset, + parsedBoxes, + options, + }); } } } @@ -190,7 +241,7 @@ export const processBox = ({ } if (boxType === 'stsd') { - const box = parseStsd({ + const box = await parseStsd({ iterator, offset: fileOffset, size: boxSize, @@ -296,7 +347,7 @@ export const processBox = ({ } if (boxType === 'mebx') { - const box = parseMebx({ + const box = await parseMebx({ iterator, offset: fileOffset, size: boxSize, @@ -312,7 +363,7 @@ export const processBox = ({ } if (boxType === 'moov') { - const box = parseMoov({ + const box = await parseMoov({ iterator, offset: fileOffset, size: boxSize, @@ -328,7 +379,7 @@ export const processBox = ({ } if (boxType === 'trak') { - const box = parseTrak({ + const box = await parseTrak({ data: iterator, size: boxSize, offsetAtStart: fileOffset, @@ -337,16 +388,16 @@ export const processBox = ({ const transformedTrack = makeBaseMediaTrack(box); if (transformedTrack) { if (transformedTrack.type === 'audio') { - const callback = options.onAudioTrack?.(transformedTrack); - options.parserState.registerAudioSampleCallback( + const callback = await options.onAudioTrack?.(transformedTrack); + await options.parserState.registerAudioSampleCallback( transformedTrack.trackId, callback ?? null, ); } if (transformedTrack.type === 'video') { - const callback = options.onVideoTrack?.(transformedTrack); - options.parserState.registerVideoSampleCallback( + const callback = await options.onVideoTrack?.(transformedTrack); + await options.parserState.registerVideoSampleCallback( transformedTrack.trackId, callback ?? null, ); @@ -393,6 +444,7 @@ export const processBox = ({ if (boxType === 'av1C') { const box = parseAv1C({ data: iterator, + size: boxSize, }); return { @@ -449,7 +501,7 @@ export const processBox = ({ } if (boxType === 'mdat') { - const box = parseMdat({ + const box = await parseMdat({ data: iterator, size: boxSize, fileOffset, @@ -468,7 +520,7 @@ export const processBox = ({ const bytesRemainingInBox = boxSize - (iterator.counter.getOffset() - fileOffset); - const children = getChildren({ + const children = await getChildren({ boxType, iterator, bytesRemainingInBox, @@ -489,19 +541,21 @@ export const processBox = ({ }; }; -export const parseBoxes = ({ +export const parseBoxes = async ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, options, + continueMdat, }: { iterator: BufferIterator; maxBytes: number; allowIncompleteBoxes: boolean; initialBoxes: IsoBaseMediaBox[]; options: ParserContext; -}): ParseResult => { + continueMdat: false | PartialMdatBox; +}): Promise => { let boxes: IsoBaseMediaBox[] = initialBoxes; const initialOffset = iterator.counter.getOffset(); const alreadyHasMdat = boxes.find((b) => b.type === 'mdat-box'); @@ -510,12 +564,21 @@ export const parseBoxes = ({ iterator.bytesRemaining() > 0 && iterator.counter.getOffset() - initialOffset < maxBytes ) { - const result = processBox({ - iterator, - allowIncompleteBoxes, - parsedBoxes: initialBoxes, - options, - }); + const result = continueMdat + ? await parseMdatPartially({ + iterator, + boxSize: continueMdat.boxSize, + fileOffset: continueMdat.fileOffset, + parsedBoxes: initialBoxes, + options, + }) + : await processBox({ + iterator, + allowIncompleteBoxes, + parsedBoxes: initialBoxes, + options, + }); + if (result.type === 'incomplete') { if (Number.isFinite(maxBytes)) { throw new Error('maxBytes must be Infinity for top-level boxes'); @@ -531,12 +594,33 @@ export const parseBoxes = ({ allowIncompleteBoxes, initialBoxes: boxes, options, + continueMdat: false, }); }, skipTo: null, }; } + if (result.type === 'partial-mdat-box') { + return { + status: 'incomplete', + segments: boxes, + continueParsing: () => { + return Promise.resolve( + parseBoxes({ + iterator, + maxBytes, + allowIncompleteBoxes, + initialBoxes: boxes, + options, + continueMdat: result, + }), + ); + }, + skipTo: null, + }; + } + if (result.box.type === 'mdat-box' && alreadyHasMdat) { boxes = boxes.filter((b) => b.type !== 'mdat-box'); boxes.push(result.box); @@ -556,6 +640,7 @@ export const parseBoxes = ({ allowIncompleteBoxes, initialBoxes: boxes, options, + continueMdat: false, }); }, skipTo: result.skipTo, @@ -577,6 +662,7 @@ export const parseBoxes = ({ allowIncompleteBoxes, initialBoxes: boxes, options, + continueMdat: false, }); }, skipTo: mdatState.fileOffset, diff --git a/packages/media-parser/src/boxes/iso-base-media/stsd/av1c.ts b/packages/media-parser/src/boxes/iso-base-media/stsd/av1c.ts index 7b31add9d8b..794d88be2d2 100644 --- a/packages/media-parser/src/boxes/iso-base-media/stsd/av1c.ts +++ b/packages/media-parser/src/boxes/iso-base-media/stsd/av1c.ts @@ -1,96 +1,19 @@ import type {BufferIterator} from '../../../buffer-iterator'; -import type {Av1BitstreamHeaderSegment} from '../../webm/bitstream/av1/header-segment'; -import {parseAv1BitstreamHeaderSegment} from '../../webm/bitstream/av1/header-segment'; export interface Av1CBox { type: 'av1C-box'; - marker: number; - version: number; - seq_profile: number; - seq_level_idx: number; - seq_tier_0: number; - high_bitdepth: boolean; - twelve_bit: boolean; - mono_chrome: boolean; - chroma_subsampling_x: boolean; - chroma_subsampling_y: boolean; - chroma_sample_position: number; - reserved: number; - initial_presentation_delay_minus_one: null | number; - av1HeaderSegment: Av1BitstreamHeaderSegment; + privateData: Uint8Array; } -export const parseAv1C = ({data}: {data: BufferIterator}): Av1CBox => { - data.startReadingBits(); - - const marker = data.getBits(1); - const version = data.getBits(7); - if (version !== 1) { - throw new Error(`Unsupported AV1C version ${version}`); - } - - const seq_profile = data.getBits(3); - const seq_level_idx = data.getBits(5); - const seq_tier_0 = data.getBits(1); - const high_bitdepth = Boolean(data.getBits(1)); - const twelve_bit = Boolean(data.getBits(1)); - const mono_chrome = Boolean(data.getBits(1)); - const chroma_subsampling_x = Boolean(data.getBits(1)); - const chroma_subsampling_y = Boolean(data.getBits(1)); - const chroma_sample_position = data.getBits(2); - const reserved = data.getBits(3); - - const initial_presentation_delay_present = Boolean(data.getBits(1)); - const initial_presentation_delay_minus_one_or_reserved = data.getBits(4); - const initial_presentation_delay_minus_one = - initial_presentation_delay_present - ? initial_presentation_delay_minus_one_or_reserved - : null; - - // get bit 0 - const obuForbiddenBit = data.getBits(1); - if (obuForbiddenBit) { - throw new Error('obuForbiddenBit is not 0'); - } - - // get bits 1-3 - data.getBits(4); - - // get bit 4 - const obuExtensionFlag = data.getBits(1); - // get bit 5 - const obuHasSizeField = data.getBits(1); - // reserved bit - data.getBits(1); - - if (obuExtensionFlag) { - // extension - data.getBits(6); - } - - if (obuHasSizeField) { - // size - data.leb128(); - } - - const header = parseAv1BitstreamHeaderSegment(data); - data.stopReadingBits(); - +export const parseAv1C = ({ + data, + size, +}: { + data: BufferIterator; + size: number; +}): Av1CBox => { return { type: 'av1C-box', - marker, - version, - seq_profile, - seq_level_idx, - seq_tier_0, - chroma_sample_position, - high_bitdepth, - twelve_bit, - mono_chrome, - chroma_subsampling_x, - chroma_subsampling_y, - reserved, - initial_presentation_delay_minus_one, - av1HeaderSegment: header, + privateData: data.getSlice(size - 8), }; }; diff --git a/packages/media-parser/src/boxes/iso-base-media/stsd/avcc.ts b/packages/media-parser/src/boxes/iso-base-media/stsd/avcc.ts index a1a63bb4730..17a8ae5a49a 100644 --- a/packages/media-parser/src/boxes/iso-base-media/stsd/avcc.ts +++ b/packages/media-parser/src/boxes/iso-base-media/stsd/avcc.ts @@ -2,7 +2,7 @@ import type {BufferIterator} from '../../../buffer-iterator'; export interface AvccBox { type: 'avcc-box'; - data: Uint8Array; + description: Uint8Array; configurationString: string; } @@ -26,9 +26,11 @@ export const parseAvcc = ({ data.counter.decrement(4); + const description = data.getSlice(size - 8); + return { type: 'avcc-box', - data: data.getSlice(size - 8), + description, configurationString: str, }; }; diff --git a/packages/media-parser/src/boxes/iso-base-media/stsd/hvcc.ts b/packages/media-parser/src/boxes/iso-base-media/stsd/hvcc.ts index 835fef03e9b..3a55a0971d0 100644 --- a/packages/media-parser/src/boxes/iso-base-media/stsd/hvcc.ts +++ b/packages/media-parser/src/boxes/iso-base-media/stsd/hvcc.ts @@ -1,4 +1,5 @@ import type {BufferIterator} from '../../../buffer-iterator'; +import {getHvc1CodecString} from '../../../make-hvc1-codec-strings'; export interface HvccBox { type: 'hvcc-box'; @@ -18,57 +19,7 @@ export const parseHvcc = ({ const raw = data.getSlice(size - 8); data.counter.decrement(size - 8); - const configurationVersion = data.getUint8(); - if (configurationVersion !== 1) { - throw new Error(`Unsupported HVCC version ${configurationVersion}`); - } - - const generalProfileSpaceTierFlagAndIdc = data.getUint8(); - let generalProfileCompatibility = data.getUint32(); - // unsigned int(2) general_profile_space; - // unsigned int(1) general_tier_flag; - // unsigned int(5) general_profile_idc; - - const generalProfileSpace = generalProfileSpaceTierFlagAndIdc >> 6; - const generalTierFlag = generalProfileSpaceTierFlagAndIdc >> 5; - const generalProfileIdc = generalProfileSpaceTierFlagAndIdc >> 0; - - // general_constraint_indicator_flags(48) - const generalConstraintIndicator = data.getSlice(6); - const generalLevelIdc = data.getUint8(); - - let reversedGeneralProfileSpace = 0; - for (let i = 0; i < 32; i++) { - reversedGeneralProfileSpace |= generalProfileCompatibility & 1; - if (i === 31) break; - - reversedGeneralProfileSpace <<= 1; - generalProfileCompatibility >>= 1; - } - - const profileSpaceChar = - generalProfileSpace === 0 - ? '' - : generalProfileSpace === 1 - ? 'A' - : generalProfileSpace === 2 - ? 'B' - : 'C'; - - const generalTierChar = generalTierFlag === 0 ? 'L' : 'H'; - - let hasByte = false; - - let generalConstraintString = ''; - for (let i = 5; i >= 0; i--) { - if (generalConstraintIndicator[i] || hasByte) { - generalConstraintString = - generalConstraintIndicator[i].toString(16) + generalConstraintString; - hasByte = true; - } - } - - const constraintString = `${profileSpaceChar}${generalProfileIdc.toString(16)}.${reversedGeneralProfileSpace.toString(16)}.${generalTierChar}${generalLevelIdc}.${generalConstraintString}`; + const constraintString = getHvc1CodecString(data); const remaining = size - (data.counter.getOffset() - offset); data.discard(remaining); diff --git a/packages/media-parser/src/boxes/iso-base-media/stsd/keys.ts b/packages/media-parser/src/boxes/iso-base-media/stsd/keys.ts index 607641de6d3..2db515a8916 100644 --- a/packages/media-parser/src/boxes/iso-base-media/stsd/keys.ts +++ b/packages/media-parser/src/boxes/iso-base-media/stsd/keys.ts @@ -17,6 +17,8 @@ export const parseKeys = (data: Uint8Array, offset: number): KeysBox => { throw new Error(`Expected keys type of keys, got ${atom}`); } + iterator.destroy(); + return { type: 'keys-box', boxSize: data.byteLength, diff --git a/packages/media-parser/src/boxes/iso-base-media/stsd/mebx.ts b/packages/media-parser/src/boxes/iso-base-media/stsd/mebx.ts index bdd65e2d8bb..fb341807280 100644 --- a/packages/media-parser/src/boxes/iso-base-media/stsd/mebx.ts +++ b/packages/media-parser/src/boxes/iso-base-media/stsd/mebx.ts @@ -11,7 +11,7 @@ export interface MebxBox extends BaseBox { children: AnySegment[]; } -export const parseMebx = ({ +export const parseMebx = async ({ iterator, offset, size, @@ -21,18 +21,19 @@ export const parseMebx = ({ offset: number; size: number; options: ParserContext; -}): MebxBox => { +}): Promise => { // reserved, 6 bit iterator.discard(6); const dataReferenceIndex = iterator.getUint16(); - const children = parseBoxes({ + const children = await parseBoxes({ iterator, maxBytes: iterator.counter.getOffset() - offset, allowIncompleteBoxes: false, initialBoxes: [], options, + continueMdat: false, }); if (children.status === 'incomplete') { diff --git a/packages/media-parser/src/boxes/iso-base-media/stsd/samples.ts b/packages/media-parser/src/boxes/iso-base-media/stsd/samples.ts index 4c781657531..a5fa86e1672 100644 --- a/packages/media-parser/src/boxes/iso-base-media/stsd/samples.ts +++ b/packages/media-parser/src/boxes/iso-base-media/stsd/samples.ts @@ -114,13 +114,13 @@ const audioTags = [ 'ac-3', ]; -export const processSample = ({ +export const processSample = async ({ iterator, options, }: { iterator: BufferIterator; options: ParserContext; -}): SampleAndNext => { +}): Promise => { const fileOffset = iterator.counter.getOffset(); const bytesRemaining = iterator.bytesRemaining(); const boxSize = iterator.getUint32(); @@ -172,12 +172,13 @@ export const processSample = ({ const bytesRemainingInBox = boxSize - (iterator.counter.getOffset() - fileOffset); - const children = parseBoxes({ + const children = await parseBoxes({ iterator, allowIncompleteBoxes: false, maxBytes: bytesRemainingInBox, initialBoxes: [], options, + continueMdat: false, }); if (children.status === 'incomplete') { @@ -224,12 +225,13 @@ export const processSample = ({ const bytesRemainingInBox = boxSize - (iterator.counter.getOffset() - fileOffset); - const children = parseBoxes({ + const children = await parseBoxes({ iterator, allowIncompleteBoxes: false, maxBytes: bytesRemainingInBox, initialBoxes: [], options, + continueMdat: false, }); if (children.status === 'incomplete') { @@ -279,12 +281,13 @@ export const processSample = ({ const bytesRemainingInBox = boxSize - (iterator.counter.getOffset() - fileOffset); - const children = parseBoxes({ + const children = await parseBoxes({ iterator, allowIncompleteBoxes: false, maxBytes: bytesRemainingInBox, initialBoxes: [], options, + continueMdat: false, }); if (children.status === 'incomplete') { @@ -320,7 +323,7 @@ export const processSample = ({ throw new Error(`Unknown sample format ${boxFormat}`); }; -export const parseSamples = ({ +export const parseSamples = async ({ iterator, maxBytes, options, @@ -328,7 +331,7 @@ export const parseSamples = ({ iterator: BufferIterator; maxBytes: number; options: ParserContext; -}): Sample[] => { +}): Promise => { const samples: Sample[] = []; const initialOffset = iterator.counter.getOffset(); @@ -336,7 +339,7 @@ export const parseSamples = ({ iterator.bytesRemaining() > 0 && iterator.counter.getOffset() - initialOffset < maxBytes ) { - const {sample} = processSample({ + const {sample} = await processSample({ iterator, options, }); diff --git a/packages/media-parser/src/boxes/iso-base-media/stsd/stsd.ts b/packages/media-parser/src/boxes/iso-base-media/stsd/stsd.ts index cf522beb806..92ce5a4c8ee 100644 --- a/packages/media-parser/src/boxes/iso-base-media/stsd/stsd.ts +++ b/packages/media-parser/src/boxes/iso-base-media/stsd/stsd.ts @@ -10,7 +10,7 @@ export interface StsdBox extends BaseBox { samples: Sample[]; } -export const parseStsd = ({ +export const parseStsd = async ({ iterator, offset, size, @@ -20,7 +20,7 @@ export const parseStsd = ({ offset: number; size: number; options: ParserContext; -}): StsdBox => { +}): Promise => { const version = iterator.getUint8(); if (version !== 0) { throw new Error(`Unsupported STSD version ${version}`); @@ -33,7 +33,7 @@ export const parseStsd = ({ const bytesRemainingInBox = size - (iterator.counter.getOffset() - offset); - const boxes = parseSamples({ + const boxes = await parseSamples({ iterator, maxBytes: bytesRemainingInBox, options, diff --git a/packages/media-parser/src/boxes/iso-base-media/trak/trak.ts b/packages/media-parser/src/boxes/iso-base-media/trak/trak.ts index b2f16cf9287..dd74ddf6510 100644 --- a/packages/media-parser/src/boxes/iso-base-media/trak/trak.ts +++ b/packages/media-parser/src/boxes/iso-base-media/trak/trak.ts @@ -9,7 +9,7 @@ export interface TrakBox extends BaseBox { children: AnySegment[]; } -export const parseTrak = ({ +export const parseTrak = async ({ data, size, offsetAtStart, @@ -19,13 +19,14 @@ export const parseTrak = ({ size: number; offsetAtStart: number; options: ParserContext; -}): TrakBox => { - const children = parseBoxes({ +}): Promise => { + const children = await parseBoxes({ iterator: data, maxBytes: size - (data.counter.getOffset() - offsetAtStart), allowIncompleteBoxes: false, initialBoxes: [], options, + continueMdat: false, }); if (children.status === 'incomplete') { diff --git a/packages/media-parser/src/boxes/webm/av1-codec-private.ts b/packages/media-parser/src/boxes/webm/av1-codec-private.ts new file mode 100644 index 00000000000..e58db3fe29a --- /dev/null +++ b/packages/media-parser/src/boxes/webm/av1-codec-private.ts @@ -0,0 +1,113 @@ +import {getArrayBufferIterator} from '../../buffer-iterator'; +import type {ColorParameterBox} from '../iso-base-media/stsd/colr'; + +export const parseAv1PrivateData = ( + data: Uint8Array, + colrAtom: ColorParameterBox | null, +) => { + const iterator = getArrayBufferIterator(data); + iterator.startReadingBits(); + if (iterator.getBits(1) !== 1) { + iterator.destroy(); + throw new Error('Expected av1 private data to be version 1'); + } + + const version = iterator.getBits(7); + if (version !== 1) { + iterator.destroy(); + throw new Error( + `Expected av1 private data to be version 1, got ${version}`, + ); + } + + let str = 'av01.'; + + // https://aomediacodec.github.io/av1-isobmff/#codecsparam + + const seqProfile = iterator.getBits(3); + // Profile + str += seqProfile; + str += '.'; + + const seq_level_idx = iterator.getBits(5); + const seq_tier_0 = iterator.getBits(1); + // Level + // The level parameter value SHALL equal the first level value indicated by seq_level_idx in the Sequence Header OBU + str += seq_level_idx.toString(16).padStart(2, '0'); + str += seq_tier_0 ? 'H' : 'M'; + str += '.'; + + // bitDepth + // The bitDepth parameter value SHALL equal the value of BitDepth variable as defined in [AV1] derived from the Sequence Header OBU + const high_bitdepth = iterator.getBits(1); + const twelve_bit = iterator.getBits(1); + const bitDepth = + high_bitdepth && seqProfile === 2 + ? twelve_bit + ? 12 + : 10 + : high_bitdepth + ? 10 + : 8; + str += bitDepth.toString().padStart(2, '0'); + str += '.'; + + // monochrome + // The monochrome parameter value, represented by a single digit decimal, SHALL equal the value of mono_chrome in the Sequence Header OBU + const mono_chrome = iterator.getBits(1); + str += mono_chrome ? '1' : '0'; + str += '.'; + + // The chromaSubsampling parameter value, represented by a three-digit decimal, + // SHALL have its first digit equal to subsampling_x + const subsampling_x = iterator.getBits(1); + str += subsampling_x ? '1' : '0'; + + // and its second digit equal to subsampling_y. + const subsampling_y = iterator.getBits(1); + str += subsampling_y ? '1' : '0'; + + // If both subsampling_x and subsampling_y are set to 1, then the third digit SHALL be equal to chroma_sample_position, otherwise it SHALL be set to 0 + const chroma_sample_position = iterator.getBits(2); + str += + subsampling_x && subsampling_y + ? chroma_sample_position === 1 + ? '1' + : '0' + : '0'; + str += '.'; + + if (colrAtom) { + str += colrAtom.primaries.toString().padStart(2, '0'); + str += '.'; + str += colrAtom.transfer.toString().padStart(2, '0'); + str += '.'; + str += colrAtom.matrixIndex.toString().padStart(2, '0'); + str += '.'; + str += colrAtom.fullRangeFlag ? '1' : '0'; + } else { + // Otherwise, the color_description_present_flag is set to 0 in the Sequence Header OBU. The colorPrimaries, transferCharacteristics, and matrixCoefficients parameter values SHOULD be set to the default values below. + // colorPrimaries 01 (ITU-R BT.709) + str += '01'; + str += '.'; + // transferCharacteristics 01 (ITU-R BT.709) + str += '01'; + str += '.'; + // matrixCoefficients 00 (ITU-R BT.709) + str += '01'; + str += '.'; + // videoFullRangeFlag 0 (studio swing representation) + str += '0'; + } + + // If the codecs parameter string ends with ".0.110.01.01.01.0" (containing all the default values below), that trailing part of the string SHOULD be omitted. + const suffix = '.0.110.01.01.01.0'; + + if (str.endsWith(suffix)) { + str = str.slice(0, -suffix.length); + } + + iterator.destroy(); + + return str; +}; diff --git a/packages/media-parser/src/boxes/webm/bitstream/av1.ts b/packages/media-parser/src/boxes/webm/bitstream/av1.ts deleted file mode 100644 index fb3c3e0fcaf..00000000000 --- a/packages/media-parser/src/boxes/webm/bitstream/av1.ts +++ /dev/null @@ -1,181 +0,0 @@ -import type {BufferIterator} from '../../../buffer-iterator'; -import {combineUint8Arrays} from '../../../combine-uint8array'; -import type {ParserContext} from '../../../parser-context'; -import type {VideoSample} from '../../../webcodec-sample-types'; -import {parseAv1Frame} from './av1/bitstream-frame'; -import { - parseAv1BitstreamHeaderSegment, - type Av1BitstreamHeaderSegment, -} from './av1/header-segment'; - -type Av1BitstreamUimplementedSegment = { - type: 'av1-bitstream-unimplemented'; -}; - -export type Av1BitstreamSegment = - | Av1BitstreamHeaderSegment - | Av1BitstreamUimplementedSegment; - -export const av1Bitstream = ({ - stream, - length, - onVideoSample, - trackNumber, - context, - timecode, -}: { - stream: BufferIterator; - length: number; - onVideoSample: (trackId: number, sample: VideoSample) => void; - trackNumber: number; - context: ParserContext; - timecode: number; -}): { - discarded: boolean; - segment: Av1BitstreamSegment; -} => { - const address = stream.counter.getOffset(); - - stream.startReadingBits(); - - // log this to understand: - // (firstByte.toString(2).padStart(8, '0')); - - // get bit 0 - const obuForbiddenBit = stream.getBits(1); - if (obuForbiddenBit) { - throw new Error('obuForbiddenBit is not 0'); - } - - // get bits 1-3 - const obuType = stream.getBits(4); - - // get bit 4 - const obuExtensionFlag = stream.getBits(1); - // get bit 5 - const obuHasSizeField = stream.getBits(1); - // reserved bit - stream.getBits(1); - - let size: number | null = null; - - if (obuExtensionFlag) { - // extension - stream.getBits(6); - } - - if (obuHasSizeField) { - // size - size = stream.leb128(); - } - - /* - console.log( - address.toString(16), - firstByte.toString(2).padStart(8, '0'), - obuForbiddenBit, - obuType, - obuExtensionFlag, - obuHasSizeField, - reservedBit, - size, - ); - */ - - const bytesReadSoFar = stream.counter.getOffset() - address; - - const segment: Av1BitstreamSegment = - obuType === 1 - ? parseAv1BitstreamHeaderSegment(stream) - : { - type: 'av1-bitstream-unimplemented', - }; - if (segment.type === 'av1-bitstream-header') { - if (!size) { - throw new Error('Expected size'); - } - - const toSample = bytesReadSoFar + size; - stream.counter.decrement(stream.counter.getOffset() - address); - const header = stream.getSlice(toSample); - context.parserState.setAv1BitstreamHeaderSegment(segment, header); - } - - if (obuType === 6) { - const head = context.parserState.getAv1BitstreamHeaderSegment(); - if (!head) { - throw new Error('Expected header segment'); - } - - const header = parseAv1Frame({ - stream, - headerSegment: head.segment, - }); - - const bytesAdvanced = stream.counter.getOffset() - address; - stream.counter.decrement(bytesAdvanced); - if (size === null) { - throw new Error('Expected size in OBU'); - } - - const clusterTimestamp = context.parserState.getClusterTimestamp(); - if (clusterTimestamp === null) { - throw new Error('Expected cluster timestamp'); - } - - const toSlice = size + bytesReadSoFar; - - const frame = stream.getSlice(toSlice); - let extraBytes: Uint8Array | null = null; - if (!context.parserState.getIsFirstAv1FrameRead()) { - context.parserState.setIsFirstAv1FrameRead(); - extraBytes = - context.parserState.getAv1BitstreamHeaderSegment()?.header ?? null; - if (!extraBytes) { - throw new Error('Expected extra bytes'); - } - } - - onVideoSample(trackNumber, { - data: combineUint8Arrays(extraBytes, frame), - timestamp: timecode + clusterTimestamp, - duration: undefined, - trackId: trackNumber, - cts: null, - dts: null, - type: header.header.frameType === 'key' ? 'key' : 'delta', - }); - stream.stopReadingBits(); - return { - discarded: true, - segment, - }; - } - - stream.stopReadingBits(); - - if (size === null) { - return { - discarded: false, - segment, - }; - } - - const end = stream.counter.getOffset(); - const remaining = - (size === null ? length : size + bytesReadSoFar) - (end - address); - - if (remaining > 0) { - stream.discard(remaining); - } - - const remainingNow = length - (stream.counter.getOffset() - address); - if (remainingNow > 0 && remainingNow <= 2) { - throw new Error('remainingNow > 0 && remainingNow <= 2'); - } - - return { - discarded: Boolean(size), - segment, - }; -}; diff --git a/packages/media-parser/src/boxes/webm/bitstream/av1/bitstream-frame-header.ts b/packages/media-parser/src/boxes/webm/bitstream/av1/bitstream-frame-header.ts deleted file mode 100644 index ba2cf464fec..00000000000 --- a/packages/media-parser/src/boxes/webm/bitstream/av1/bitstream-frame-header.ts +++ /dev/null @@ -1,91 +0,0 @@ -import type {BufferIterator} from '../../../../buffer-iterator'; -import type {Av1BitstreamHeaderSegment} from './header-segment'; -import {getTemporalPointInfo} from './temporal-point-info'; - -type FrameType = 'key' | 'delta' | 'intra' | 'switch'; - -export type Av1FrameHeader = { - type: 'av1-frame-header'; - frameType: FrameType; - temporalPointInfo: number | null; -}; - -export const getFrameType = (frameType: number): FrameType => { - switch (frameType) { - case 0: - return 'key'; - case 1: - return 'delta'; - case 2: - return 'intra'; - case 3: - return 'switch'; - default: - throw new Error('Unknown frame type'); - } -}; - -// https://aomediacodec.github.io/av1-spec/#uncompressed-header-syntax -// Only implmementing to get the basic stuff -export const parseAv1FrameHeader = ({ - stream, - headerSegment, -}: { - stream: BufferIterator; - headerSegment: Av1BitstreamHeaderSegment; -}): Av1FrameHeader => { - if (headerSegment.reduced_still_picture_header) { - return { - type: 'av1-frame-header', - frameType: 'key', - temporalPointInfo: null, - }; - } - - let temporalPointInfo: number | null = null; - - const show_existing_frame = Boolean(stream.getBits(1)); - if (show_existing_frame) { - const frame_to_show_map_idx = stream.getBits(3); - if ( - headerSegment.decoder_model_info && - !headerSegment.timing_info?.equal_picture_interval - ) { - temporalPointInfo = getTemporalPointInfo({ - stream, - frame_presentation_time_length_minus_1: - headerSegment.decoder_model_info - .frame_presentation_time_length_minus_1, - }); - } - - // TODO: this is wrong, there should be a store - const frame_type = getFrameType(frame_to_show_map_idx); - return { - type: 'av1-frame-header', - frameType: frame_type, - temporalPointInfo, - }; - } - - const frameType = getFrameType(stream.getBits(2)); - const showFrame = Boolean(stream.getBits(1)); - - if ( - showFrame && - headerSegment.decoder_model_info && - !headerSegment.timing_info?.equal_picture_interval - ) { - temporalPointInfo = getTemporalPointInfo({ - stream, - frame_presentation_time_length_minus_1: - headerSegment.decoder_model_info.frame_presentation_time_length_minus_1, - }); - } - - return { - type: 'av1-frame-header', - frameType, - temporalPointInfo, - }; -}; diff --git a/packages/media-parser/src/boxes/webm/bitstream/av1/bitstream-frame.ts b/packages/media-parser/src/boxes/webm/bitstream/av1/bitstream-frame.ts deleted file mode 100644 index 7cc25129c82..00000000000 --- a/packages/media-parser/src/boxes/webm/bitstream/av1/bitstream-frame.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type {BufferIterator} from '../../../../buffer-iterator'; -import { - parseAv1FrameHeader, - type Av1FrameHeader, -} from './bitstream-frame-header'; -import type {Av1BitstreamHeaderSegment} from './header-segment'; - -export type Av1Frame = { - type: 'av1-frame'; - header: Av1FrameHeader; -}; - -export const parseAv1Frame = ({ - stream, - headerSegment, -}: { - stream: BufferIterator; - headerSegment: Av1BitstreamHeaderSegment; -}): Av1Frame => { - return { - type: 'av1-frame', - header: parseAv1FrameHeader({ - stream, - headerSegment, - }), - }; -}; diff --git a/packages/media-parser/src/boxes/webm/bitstream/av1/chroma-sample-position.ts b/packages/media-parser/src/boxes/webm/bitstream/av1/chroma-sample-position.ts deleted file mode 100644 index f9743eeb06c..00000000000 --- a/packages/media-parser/src/boxes/webm/bitstream/av1/chroma-sample-position.ts +++ /dev/null @@ -1,6 +0,0 @@ -export const chromaSamplePositions = { - CSP_UNKNOWN: 0, - CSP_VERTICAL: 1, - CSP_COLOCATED: 2, - CSP_RESERVED: 3, -}; diff --git a/packages/media-parser/src/boxes/webm/bitstream/av1/color-config.ts b/packages/media-parser/src/boxes/webm/bitstream/av1/color-config.ts deleted file mode 100644 index 8b433fdd7c4..00000000000 --- a/packages/media-parser/src/boxes/webm/bitstream/av1/color-config.ts +++ /dev/null @@ -1,123 +0,0 @@ -import type {BufferIterator} from '../../../../buffer-iterator'; -import {chromaSamplePositions} from './chroma-sample-position'; -import {colorPrimaries} from './color-primaries'; -import {matrixCoefficients} from './matrix-coefficients'; -import {transferCharacteristics} from './transfer-characteristics'; - -export type ColorConfig = { - bitDepth: number; - numPlanes: number; - color_primaries: number; - transfer_characteristics: number; - matrix_coefficients: number; - separate_uv_delta_q: number; - color_range: boolean; - subsampling_x: boolean; - subsampling_y: boolean; - chroma_sample_position: number; - mono_chrome: boolean; - color_description_present_flag: boolean; -}; - -export const getColorConfig = ( - stream: BufferIterator, - seq_profile: number, -): ColorConfig => { - const high_bitdepth = Boolean(stream.getBits(1)); - let bitDepth = 0; - if (seq_profile === 2 && high_bitdepth) { - const twelve_bit = Boolean(stream.getBits(1)); - bitDepth = twelve_bit ? 12 : 10; - } else if (seq_profile <= 2) { - bitDepth = high_bitdepth ? 10 : 8; - } - - const mono_chrome = seq_profile === 1 ? true : Boolean(stream.getBits(1)); - - const numPlanes = mono_chrome ? 1 : 3; - const color_description_present_flag = Boolean(stream.getBits(1)); - const color_primaries = color_description_present_flag - ? stream.getBits(8) - : colorPrimaries.CP_UNSPECIFIED; - const transfer_characteristics = color_description_present_flag - ? stream.getBits(8) - : transferCharacteristics.TC_UNSPECIFIED; - const matrix_coefficients = color_description_present_flag - ? stream.getBits(8) - : matrixCoefficients.MC_UNSPECIFIED; - let chroma_sample_position = chromaSamplePositions.CSP_UNKNOWN; - let color_range = false; - - let subsampling_x = false; - let subsampling_y = false; - - if (mono_chrome) { - color_range = Boolean(stream.getBits(1)); - subsampling_x = true; - subsampling_y = true; - return { - bitDepth, - numPlanes, - color_primaries, - transfer_characteristics, - matrix_coefficients, - separate_uv_delta_q: 0, - color_range, - subsampling_x, - subsampling_y, - chroma_sample_position, - mono_chrome, - color_description_present_flag, - }; - } - - if ( - color_primaries === colorPrimaries.CP_BT_709 && - transfer_characteristics === transferCharacteristics.TC_SRGB && - matrix_coefficients === matrixCoefficients.MC_IDENTITY - ) { - color_range = true; - subsampling_x = false; - subsampling_y = false; - } else { - color_range = Boolean(stream.getBits(1)); - if (seq_profile === 0) { - subsampling_x = true; - subsampling_y = true; - } else if (seq_profile === 1) { - subsampling_x = false; - subsampling_y = false; - } else if (bitDepth === 12) { - subsampling_x = Boolean(stream.getBits(1)); - if (subsampling_x) { - subsampling_y = Boolean(stream.getBits(1)); - } else { - subsampling_y = false; - } - } else { - subsampling_x = true; - subsampling_y = false; - } - - if (subsampling_x && subsampling_y) { - chroma_sample_position = stream.getBits(2); - } - } - - const separate_uv_delta_q = stream.getBits(1); - - return { - bitDepth, - numPlanes, - color_primaries, - transfer_characteristics, - matrix_coefficients, - separate_uv_delta_q, - chroma_sample_position, - color_range, - subsampling_x, - subsampling_y, - mono_chrome, - color_description_present_flag, - }; -}; diff --git a/packages/media-parser/src/boxes/webm/bitstream/av1/color-primaries.ts b/packages/media-parser/src/boxes/webm/bitstream/av1/color-primaries.ts deleted file mode 100644 index 23551f045a6..00000000000 --- a/packages/media-parser/src/boxes/webm/bitstream/av1/color-primaries.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const colorPrimaries = { - CP_BT_709: 1, - CP_UNSPECIFIED: 2, - CP_BT_470_M: 4, - CP_BT_470_B_G: 5, - CP_BT_601: 6, - CP_SMPTE_240: 7, - CP_GENERIC_FILM: 8, - CP_BT_2020: 9, - CP_XYZ: 10, - CP_SMPTE_431: 11, - CP_SMPTE_432: 12, - CP_EBU_3213: 22, -}; diff --git a/packages/media-parser/src/boxes/webm/bitstream/av1/decoder-model-info.ts b/packages/media-parser/src/boxes/webm/bitstream/av1/decoder-model-info.ts deleted file mode 100644 index 8e37ef06d03..00000000000 --- a/packages/media-parser/src/boxes/webm/bitstream/av1/decoder-model-info.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type {BufferIterator} from '../../../../buffer-iterator'; - -export type DecoderModelInfo = { - type: 'decoder-model-info'; - buffer_delay_length_minus_1: number; - num_units_in_decoding_tick: number; - buffer_removal_time_length_minus_1: number; - frame_presentation_time_length_minus_1: number; -}; - -export const parseDecoderModelInfo = ( - stream: BufferIterator, -): DecoderModelInfo => { - const buffer_delay_length_minus_1 = stream.getBits(5); - const num_units_in_decoding_tick = stream.getBits(32); - const buffer_removal_time_length_minus_1 = stream.getBits(5); - const frame_presentation_time_length_minus_1 = stream.getBits(5); - - return { - type: 'decoder-model-info', - buffer_delay_length_minus_1, - num_units_in_decoding_tick, - buffer_removal_time_length_minus_1, - frame_presentation_time_length_minus_1, - }; -}; diff --git a/packages/media-parser/src/boxes/webm/bitstream/av1/header-segment.ts b/packages/media-parser/src/boxes/webm/bitstream/av1/header-segment.ts deleted file mode 100644 index 70784ada009..00000000000 --- a/packages/media-parser/src/boxes/webm/bitstream/av1/header-segment.ts +++ /dev/null @@ -1,258 +0,0 @@ -/* eslint-disable max-depth */ -import type {BufferIterator} from '../../../../buffer-iterator'; -import type {ColorConfig} from './color-config'; -import {getColorConfig} from './color-config'; -import { - parseDecoderModelInfo, - type DecoderModelInfo, -} from './decoder-model-info'; -import { - parseOperatingParametersInfo, - type OperatingParametersInfo, -} from './operating-parameters-info'; -import {getTimingInfo, type TimingInfo} from './timing-info'; - -const makeSeqLevelIdx = () => { - return { - operating_point_idc: 0, - seq_level_idx: 0, - seq_tier: 0, - }; -}; - -type SeqLevelIndex = { - operating_point_idc: number; - seq_level_idx: number; - seq_tier: number; -}; - -export type Av1BitstreamHeaderSegment = { - type: 'av1-bitstream-header'; - seq_profile: number; - still_picture: boolean; - reduced_still_picture_header: boolean; - timing_info_present_flag: boolean; - decoder_model_info_present_flag: boolean; - initial_display_delay_present_flag: boolean; - operating_points_cnt_minus_1: number; - seq_level: SeqLevelIndex[]; - timing_info: TimingInfo | null; - decoder_model_info: DecoderModelInfo | null; - operating_parameters_info: OperatingParametersInfo[]; - initial_display_delay_minus_1: number[]; - frame_width_bits_minus_1: number; - frame_height_bits_minus_1: number; - max_frame_width_minus_1: number; - max_frame_height_minus_1: number; - delta_frame_id_length_minus_2: number | null; - additional_frame_id_length_minus_1: number | null; - use_128x128_superblock: boolean; - enable_filter_intra: boolean; - enable_intra_edge_filter: boolean; - color_config: ColorConfig; - film_grain_params_present: boolean; - enable_interintra_compound: number; - enable_masked_compound: number; - enable_warped_motion: number; - enable_order_hint: number; - enable_dual_filter: number; - enable_jnt_comp: boolean; - enable_ref_frame_mvs: boolean; - seq_force_screen_content_tools: number; - seq_force_integer_mv: number; - enable_superres: boolean; - enable_cdef: boolean; - enable_restoration: boolean; - orderHintBits: number; -}; - -const SELECT_SCREEN_CONTENT_TOOLS = 2; -const SELECT_INTEGER_MV = 2; - -export const parseAv1BitstreamHeaderSegment = ( - stream: BufferIterator, -): Av1BitstreamHeaderSegment => { - // https://aomediacodec.github.io/av1-spec/av1-spec.pdf - // Page 41 - - const seq_profile = stream.getBits(3); - const still_picture = Boolean(stream.getBits(1)); - const reduced_still_picture_header = Boolean(stream.getBits(1)); - - let timing_info_present_flag = false; - let decoder_model_info_present_flag = false; - let initial_display_delay_present_flag = false; - let operating_points_cnt_minus_1 = 1; - const seq_level: SeqLevelIndex[] = []; - let timing_info: TimingInfo | null = null; - let decoder_model_info: DecoderModelInfo | null = null; - const operating_parameters_info: OperatingParametersInfo[] = []; - const initial_display_delay_minus_1: number[] = []; - - if (reduced_still_picture_header) { - timing_info_present_flag = false; - decoder_model_info_present_flag = false; - initial_display_delay_present_flag = false; - operating_points_cnt_minus_1 = 0; - seq_level[0] = makeSeqLevelIdx(); - seq_level[0].seq_level_idx = stream.getBits(5); - } else { - timing_info_present_flag = Boolean(stream.getBits(1)); - if (timing_info_present_flag) { - timing_info = getTimingInfo(stream); - decoder_model_info_present_flag = Boolean(stream.getBits(1)); - if (decoder_model_info_present_flag) { - decoder_model_info = parseDecoderModelInfo(stream); - } - } - - initial_display_delay_present_flag = Boolean(stream.getBits(1)); - operating_points_cnt_minus_1 = stream.getBits(5); - - for (let i = 0; i <= operating_points_cnt_minus_1; i++) { - seq_level[i] = makeSeqLevelIdx(); - seq_level[i].operating_point_idc = stream.getBits(12); - seq_level[i].seq_level_idx = stream.getBits(5); - if (seq_level[i].seq_level_idx > 7) { - seq_level[i].seq_tier = stream.getBits(1); - } else { - seq_level[i].seq_tier = 0; - } - - if (decoder_model_info) { - const decoder_model_present_for_this_op = Boolean(stream.getBits(1)); - if (decoder_model_present_for_this_op) { - operating_parameters_info.push( - parseOperatingParametersInfo({ - stream, - buffer_delay_length_minus_1: - decoder_model_info.buffer_delay_length_minus_1, - }), - ); - } - } - - if (initial_display_delay_present_flag) { - const initial_display_delay_present_for_this_op = Boolean( - stream.getBits(1), - ); - if (initial_display_delay_present_for_this_op) { - initial_display_delay_minus_1.push(stream.getBits(4)); - } - } - } - } - - const frame_width_bits_minus_1 = stream.getBits(4); - const frame_height_bits_minus_1 = stream.getBits(4); - - const n = frame_width_bits_minus_1 + 1; - const max_frame_width_minus_1 = stream.getBits(n); - const m = frame_height_bits_minus_1 + 1; - const max_frame_height_minus_1 = stream.getBits(m); - - let frame_id_numbers_present_flag = false; - if (!reduced_still_picture_header) { - frame_id_numbers_present_flag = Boolean(stream.getBits(1)); - } - - let delta_frame_id_length_minus_2: number | null = null; - let additional_frame_id_length_minus_1: number | null = null; - - if (frame_id_numbers_present_flag) { - delta_frame_id_length_minus_2 = stream.getBits(4); - additional_frame_id_length_minus_1 = stream.getBits(3); - } - - const use_128x128_superblock = Boolean(stream.getBits(1)); - const enable_filter_intra = Boolean(stream.getBits(1)); - const enable_intra_edge_filter = Boolean(stream.getBits(1)); - - let enable_interintra_compound = 0; - let enable_masked_compound = 0; - let enable_warped_motion = 0; - let enable_dual_filter = 0; - let enable_order_hint = 0; - let enable_jnt_comp = false; - let enable_ref_frame_mvs = false; - let seq_force_screen_content_tools = SELECT_SCREEN_CONTENT_TOOLS; - let seq_force_integer_mv = SELECT_INTEGER_MV; - let orderHintBits = 0; - - if (!reduced_still_picture_header) { - enable_interintra_compound = stream.getBits(1); - enable_masked_compound = stream.getBits(1); - enable_warped_motion = stream.getBits(1); - enable_dual_filter = stream.getBits(1); - enable_order_hint = stream.getBits(1); - enable_jnt_comp = enable_order_hint ? Boolean(stream.getBits(1)) : false; - enable_ref_frame_mvs = enable_order_hint - ? Boolean(stream.getBits(1)) - : false; - const seq_choose_screen_content_tools = stream.getBits(1); - seq_force_screen_content_tools = seq_choose_screen_content_tools - ? SELECT_SCREEN_CONTENT_TOOLS - : stream.getBits(1); - if (seq_choose_screen_content_tools > 0) { - const seq_choose_integer_mv = stream.getBits(1); - seq_force_integer_mv = seq_choose_integer_mv - ? SELECT_INTEGER_MV - : stream.getBits(1); - } else { - seq_force_integer_mv = SELECT_INTEGER_MV; - } - - if (enable_order_hint) { - const order_hint_bits_minus_1 = stream.getBits(3); - orderHintBits = order_hint_bits_minus_1 + 1; - } else { - orderHintBits = 0; - } - } - - const enable_superres = Boolean(stream.getBits(1)); - const enable_cdef = Boolean(stream.getBits(1)); - const enable_restoration = Boolean(stream.getBits(1)); - const color_config = getColorConfig(stream, seq_profile); - const film_grain_params_present = Boolean(stream.getBits(1)); - - return { - type: 'av1-bitstream-header', - seq_profile, - still_picture, - reduced_still_picture_header, - timing_info_present_flag, - decoder_model_info_present_flag, - initial_display_delay_present_flag, - operating_points_cnt_minus_1, - seq_level, - timing_info, - decoder_model_info, - operating_parameters_info, - initial_display_delay_minus_1, - frame_width_bits_minus_1, - frame_height_bits_minus_1, - max_frame_width_minus_1, - max_frame_height_minus_1, - delta_frame_id_length_minus_2, - additional_frame_id_length_minus_1, - use_128x128_superblock, - enable_filter_intra, - enable_intra_edge_filter, - color_config, - film_grain_params_present, - enable_interintra_compound, - enable_masked_compound, - enable_warped_motion, - enable_order_hint, - enable_dual_filter, - enable_jnt_comp, - enable_ref_frame_mvs, - seq_force_screen_content_tools, - seq_force_integer_mv, - enable_superres, - enable_cdef, - enable_restoration, - orderHintBits, - }; -}; diff --git a/packages/media-parser/src/boxes/webm/bitstream/av1/matrix-coefficients.ts b/packages/media-parser/src/boxes/webm/bitstream/av1/matrix-coefficients.ts deleted file mode 100644 index a3c5f4f5897..00000000000 --- a/packages/media-parser/src/boxes/webm/bitstream/av1/matrix-coefficients.ts +++ /dev/null @@ -1,17 +0,0 @@ -export const matrixCoefficients = { - MC_IDENTITY: 0, - MC_BT_709: 1, - MC_UNSPECIFIED: 2, - MC_RESERVED_3: 3, - MC_FCC: 4, - MC_BT_470_B_G: 5, - MC_BT_601: 6, - MC_SMPTE_240: 7, - MC_SMPTE_YCGCO: 8, - MC_BT_2020_NCL: 9, - MC_BT_2020_CL: 10, - MC_SMPTE_2085: 11, - MC_CHROMAT_NCL: 12, - MC_CHROMAT_CL: 13, - MC_ICTCP: 14, -}; diff --git a/packages/media-parser/src/boxes/webm/bitstream/av1/operating-parameters-info.ts b/packages/media-parser/src/boxes/webm/bitstream/av1/operating-parameters-info.ts deleted file mode 100644 index e58cb5889e5..00000000000 --- a/packages/media-parser/src/boxes/webm/bitstream/av1/operating-parameters-info.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type {BufferIterator} from '../../../../buffer-iterator'; - -export type OperatingParametersInfo = { - decoder_buffer_delay: number; - encoder_buffer_delay: number; - low_delay_mode_flag: boolean; -}; - -export const parseOperatingParametersInfo = ({ - stream, - buffer_delay_length_minus_1, -}: { - stream: BufferIterator; - buffer_delay_length_minus_1: number; -}): OperatingParametersInfo => { - const n = buffer_delay_length_minus_1 + 1; - const decoder_buffer_delay = stream.getBits(n); - const encoder_buffer_delay = stream.getBits(n); - const low_delay_mode_flag = Boolean(stream.getBits(1)); - return { - decoder_buffer_delay, - encoder_buffer_delay, - low_delay_mode_flag, - }; -}; diff --git a/packages/media-parser/src/boxes/webm/bitstream/av1/temporal-point-info.ts b/packages/media-parser/src/boxes/webm/bitstream/av1/temporal-point-info.ts deleted file mode 100644 index 2438bdaa1e2..00000000000 --- a/packages/media-parser/src/boxes/webm/bitstream/av1/temporal-point-info.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type {BufferIterator} from '../../../../buffer-iterator'; - -export const getTemporalPointInfo = ({ - stream, - frame_presentation_time_length_minus_1, -}: { - stream: BufferIterator; - frame_presentation_time_length_minus_1: number; -}): number => { - const n = frame_presentation_time_length_minus_1 + 1; - return stream.getBits(n); -}; diff --git a/packages/media-parser/src/boxes/webm/bitstream/av1/timing-info.ts b/packages/media-parser/src/boxes/webm/bitstream/av1/timing-info.ts deleted file mode 100644 index 76ef0b7534e..00000000000 --- a/packages/media-parser/src/boxes/webm/bitstream/av1/timing-info.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type {BufferIterator} from '../../../../buffer-iterator'; -import {uvlc} from './uvlc'; - -export type TimingInfo = { - num_units_in_display_tick: number; - time_scale: number; - equal_picture_interval: boolean; - num_ticks_per_picture_minus_1: number; -}; - -export const getTimingInfo = (stream: BufferIterator): TimingInfo => { - const num_units_in_display_tick = stream.getBits(32); - const time_scale = stream.getBits(32); - const equal_picture_interval = Boolean(stream.getBits(1)); - - let num_ticks_per_picture_minus_1 = 0; - - if (equal_picture_interval) { - num_ticks_per_picture_minus_1 = uvlc(stream); - } - - return { - num_units_in_display_tick, - time_scale, - equal_picture_interval, - num_ticks_per_picture_minus_1, - }; -}; diff --git a/packages/media-parser/src/boxes/webm/bitstream/av1/transfer-characteristics.ts b/packages/media-parser/src/boxes/webm/bitstream/av1/transfer-characteristics.ts deleted file mode 100644 index 2f75f800da7..00000000000 --- a/packages/media-parser/src/boxes/webm/bitstream/av1/transfer-characteristics.ts +++ /dev/null @@ -1,21 +0,0 @@ -export const transferCharacteristics = { - TC_RESERVED_0: 0, - TC_BT_709: 1, - TC_UNSPECIFIED: 2, - TC_RESERVED_3: 3, - TC_BT_470_M: 4, - TC_BT_470_B_G: 5, - TC_BT_601: 6, - TC_SMPTE_240: 7, - TC_LINEAR: 8, - TC_LOG_100: 9, - TC_LOG_100_SQRT10: 10, - TC_IEC_61966: 11, - TC_BT_1361: 12, - TC_SRGB: 13, - TC_BT_2020_10_BIT: 14, - TC_BT_2020_12_BIT: 15, - TC_SMPTE_2084: 16, - TC_SMPTE_428: 17, - TC_HLG: 18, -}; diff --git a/packages/media-parser/src/boxes/webm/bitstream/av1/uvlc.ts b/packages/media-parser/src/boxes/webm/bitstream/av1/uvlc.ts deleted file mode 100644 index fc20548074e..00000000000 --- a/packages/media-parser/src/boxes/webm/bitstream/av1/uvlc.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type {BufferIterator} from '../../../../buffer-iterator'; - -export const uvlc = (stream: BufferIterator) => { - let leadingZeroBits = 0; - - // eslint-disable-next-line no-constant-condition - while (true) { - const done = stream.getBits(1); - if (done) { - break; - } - - leadingZeroBits++; - } - - if (leadingZeroBits >= 32) { - return (1 << 32) - 1; - } - - const value = stream.getBits(leadingZeroBits); - - return value + (1 << leadingZeroBits) - 1; -}; diff --git a/packages/media-parser/src/boxes/webm/get-ready-tracks.ts b/packages/media-parser/src/boxes/webm/get-ready-tracks.ts index 0a807e5143e..ebc497e8070 100644 --- a/packages/media-parser/src/boxes/webm/get-ready-tracks.ts +++ b/packages/media-parser/src/boxes/webm/get-ready-tracks.ts @@ -1,35 +1,18 @@ -import type {AudioTrack, OtherTrack, VideoTrack} from '../../get-tracks'; -import { - getClusterSegment, - getTimescaleSegment, - getTracksSegment, -} from '../../traversal'; +import type {Track} from '../../get-tracks'; +import {getTracksSegment} from '../../traversal'; import {getTrack} from './get-track'; import type {MainSegment} from './segments/main'; export const getTracksFromMatroska = ( segment: MainSegment, -): { - videoTracks: VideoTrack[]; - audioTracks: AudioTrack[]; - otherTracks: OtherTrack[]; -} => { + timescale: number, +): Track[] => { const tracksSegment = getTracksSegment(segment); if (!tracksSegment) { throw new Error('No tracks segment'); } - const timescale = getTimescaleSegment(segment); - - if (!timescale) { - throw new Error('No timescale segment'); - } - - const clusterSegment = getClusterSegment(segment); - - const videoTracks: VideoTrack[] = []; - const audioTracks: AudioTrack[] = []; - const otherTracks: OtherTrack[] = []; + const tracks: Track[] = []; for (const trackEntrySegment of tracksSegment.children) { if (trackEntrySegment.type === 'crc32-segment') { @@ -41,23 +24,13 @@ export const getTracksFromMatroska = ( } const track = getTrack({ - mainSegment: segment, - clusterSegment, track: trackEntrySegment, + timescale, }); - - if (track && track.type === 'video') { - videoTracks.push(track); - } - - if (track && track.type === 'audio') { - audioTracks.push(track); + if (track) { + tracks.push(track); } } - return { - videoTracks, - audioTracks, - otherTracks, - }; + return tracks; }; diff --git a/packages/media-parser/src/boxes/webm/get-track.ts b/packages/media-parser/src/boxes/webm/get-track.ts index 65660785064..3392b3d1bd1 100644 --- a/packages/media-parser/src/boxes/webm/get-track.ts +++ b/packages/media-parser/src/boxes/webm/get-track.ts @@ -1,6 +1,8 @@ -import {av1CodecStringToString} from '../../av1-codec-string'; +import {getArrayBufferIterator} from '../../buffer-iterator'; import type {AudioTrack, VideoTrack} from '../../get-tracks'; +import {getHvc1CodecString} from '../../make-hvc1-codec-strings'; import { + getBitDepth, getCodecSegment, getDisplayHeightSegment, getDisplayWidthSegment, @@ -8,26 +10,35 @@ import { getNumberOfChannels, getPrivateData, getSampleRate, - getTimescaleSegment, getTrackId, getTrackTypeSegment, getWidthSegment, } from '../../traversal'; +import {parseAv1PrivateData} from './av1-codec-private'; import {getAudioDescription} from './description'; -import type {MainSegment} from './segments/main'; -import type { - ClusterSegment, - CodecSegment, - TrackEntrySegment, -} from './segments/track-entry'; +import type {CodecSegment, TrackEntrySegment} from './segments/track-entry'; + +const getDescription = (track: TrackEntrySegment): undefined | Uint8Array => { + const codec = getCodecSegment(track); + if (!codec) { + return undefined; + } + + if (codec.codec === 'V_MPEG4/ISO/AVC' || codec.codec === 'V_MPEGH/ISO/HEVC') { + const priv = getPrivateData(track); + if (priv) { + return priv; + } + } + + return undefined; +}; const getMatroskaVideoCodecString = ({ track, - cluster, codecSegment: codec, }: { track: TrackEntrySegment; - cluster: ClusterSegment | null; codecSegment: CodecSegment; }): string | null => { if (codec.codec === 'V_VP8') { @@ -38,7 +49,7 @@ const getMatroskaVideoCodecString = ({ const priv = getPrivateData(track); if (priv) { throw new Error( - 'Private data is not implemented for VP9. Do you have an example file?', + '@remotion/media-parser cannot handle the private data for VP9. Do you have an example file you could send so we can implement it?', ); } @@ -55,11 +66,20 @@ const getMatroskaVideoCodecString = ({ } if (codec.codec === 'V_AV1') { - if (!cluster) { - return null; + const priv = getPrivateData(track); + + if (!priv) { + throw new Error('Expected private data in AV1 track'); } - return av1CodecStringToString({track, clusterSegment: cluster}); + return parseAv1PrivateData(priv, null); + } + + if (codec.codec === 'V_MPEGH/ISO/HEVC') { + const priv = getPrivateData(track); + const iterator = getArrayBufferIterator(priv as Uint8Array); + + return 'hvc1.' + getHvc1CodecString(iterator); } throw new Error(`Unknown codec: ${codec.codec}`); @@ -79,22 +99,70 @@ const getMatroskaAudioCodecString = (track: TrackEntrySegment): string => { return 'vorbis'; } - // TODO: Wrong, see here how to parse it correctly if (codec.codec === 'A_PCM/INT/LIT') { - return 'pcm-s16'; + // https://github.com/ietf-wg-cellar/matroska-specification/issues/142#issuecomment-330004950 + // Audio samples MUST be considered as signed values, except if the audio bit depth is 8 which MUST be interpreted as unsigned values. + + const bitDepth = getBitDepth(track); + if (bitDepth === null) { + throw new Error('Expected bit depth'); + } + + if (bitDepth === 8) { + return 'pcm-u8'; + } + + return 'pcm-s' + bitDepth; + } + + if (codec.codec === 'A_AAC') { + const priv = getPrivateData(track); + + const iterator = getArrayBufferIterator(priv as Uint8Array); + + iterator.startReadingBits(); + /** + * ChatGPT + * ▪ The first 5 bits represent the AOT. + ▪ Common values: + ◦ 1 for AAC Main + ◦ 2 for AAC LC (Low Complexity) + ◦ 3 for AAC SSR (Scalable Sample Rate) + ◦ 4 for AAC LTP (Long Term Prediction) + ◦ 5 for SBR (Spectral Band Replication) + ◦ 29 for HE-AAC (which uses SBR with AAC LC) + */ + /** + * Fully qualified codec: + * This codec has multiple possible codec strings: + "mp4a.40.2" — MPEG-4 AAC LC + "mp4a.40.02" — MPEG-4 AAC LC, leading 0 for Aud-OTI compatibility + "mp4a.40.5" — MPEG-4 HE-AAC v1 (AAC LC + SBR) + "mp4a.40.05" — MPEG-4 HE-AAC v1 (AAC LC + SBR), leading 0 for Aud-OTI compatibility + "mp4a.40.29" — MPEG-4 HE-AAC v2 (AAC LC + SBR + PS) + "mp4a.67" — MPEG-2 AAC LC + */ + + const profile = iterator.getBits(5); + iterator.stopReadingBits(); + iterator.destroy(); + + return `mp4a.40.${profile.toString().padStart(2, '0')}`; + } + + if (codec.codec === 'A_MPEG/L3') { + return 'mp3'; } throw new Error(`Unknown codec: ${codec.codec}`); }; export const getTrack = ({ - mainSegment, + timescale, track, - clusterSegment, }: { - mainSegment: MainSegment; + timescale: number; track: TrackEntrySegment; - clusterSegment: ClusterSegment | null; }): VideoTrack | AudioTrack | null => { const trackType = getTrackTypeSegment(track); @@ -104,12 +172,6 @@ export const getTrack = ({ const trackId = getTrackId(track); - const timescale = getTimescaleSegment(mainSegment); - - if (!timescale) { - throw new Error('No timescale segment'); - } - if (trackType.trackType === 'video') { const width = getWidthSegment(track); @@ -133,7 +195,6 @@ export const getTrack = ({ const codecString = getMatroskaVideoCodecString({ track, - cluster: clusterSegment ?? null, codecSegment: codec, }); @@ -145,17 +206,24 @@ export const getTrack = ({ type: 'video', trackId, codec: codecString, - description: undefined, + description: getDescription(track), height: displayHeight ? displayHeight.displayHeight : height.height, width: displayWidth ? displayWidth.displayWidth : width.width, sampleAspectRatio: { numerator: 1, denominator: 1, }, - timescale: timescale.timestampScale, + timescale, samplePositions: [], codedHeight: height.height, codedWidth: width.width, + displayAspectHeight: displayHeight + ? displayHeight.displayHeight + : height.height, + displayAspectWidth: displayWidth + ? displayWidth.displayWidth + : width.width, + rotation: 0, }; } @@ -171,7 +239,7 @@ export const getTrack = ({ trackId, codec: getMatroskaAudioCodecString(track), samplePositions: null, - timescale: timescale.timestampScale, + timescale, numberOfChannels, sampleRate, description: getAudioDescription(track), diff --git a/packages/media-parser/src/boxes/webm/parse-webm-header.ts b/packages/media-parser/src/boxes/webm/parse-webm-header.ts index 866e86785dc..899ae5bbb87 100644 --- a/packages/media-parser/src/boxes/webm/parse-webm-header.ts +++ b/packages/media-parser/src/boxes/webm/parse-webm-header.ts @@ -7,7 +7,7 @@ import {expectSegment} from './segments'; export const parseWebm = ( counter: BufferIterator, parserContext: ParserContext, -): ParseResult => { +): Promise => { counter.discard(4); const length = counter.getVint(); diff --git a/packages/media-parser/src/boxes/webm/segments.ts b/packages/media-parser/src/boxes/webm/segments.ts index e68e2e6bbdf..b33a0abab4e 100644 --- a/packages/media-parser/src/boxes/webm/segments.ts +++ b/packages/media-parser/src/boxes/webm/segments.ts @@ -1,7 +1,8 @@ +import {registerTrack} from '../../add-new-matroska-tracks'; import type {BufferIterator} from '../../buffer-iterator'; import type {ParseResult} from '../../parse-result'; import type {ParserContext} from '../../parser-context'; -import type {Av1BitstreamSegment} from './bitstream/av1'; +import {getTrack} from './get-track'; import {matroskaElements} from './segments/all-segments'; import type {DurationSegment} from './segments/duration'; import {parseDurationSegment} from './segments/duration'; @@ -145,7 +146,6 @@ export type MatroskaSegment = | BlockGroupSegment | BlockElement | SeekIdSegment - | Av1BitstreamSegment | AudioSegment | SamplingFrequencySegment | ChannelsSegment @@ -153,7 +153,7 @@ export type MatroskaSegment = export type OnTrackEntrySegment = (trackEntry: TrackEntrySegment) => void; -const parseSegment = ({ +const parseSegment = async ({ segmentId, iterator, length, @@ -163,7 +163,7 @@ const parseSegment = ({ iterator: BufferIterator; length: number; parserContext: ParserContext; -}): MatroskaSegment => { +}): Promise | MatroskaSegment> => { if (length === 0) { throw new Error(`Expected length of ${segmentId} to be greater than 0`); } @@ -209,8 +209,10 @@ const parseSegment = ({ return parseInfoSegment(iterator, length, parserContext); } - if (segmentId === '0x2ad7b1') { - return parseTimestampScaleSegment(iterator); + if (segmentId === matroskaElements.TimestampScale) { + const timestampScale = parseTimestampScaleSegment(iterator); + parserContext.parserState.setTimescale(timestampScale.timestampScale); + return timestampScale; } if (segmentId === '0x4d80') { @@ -229,9 +231,24 @@ const parseSegment = ({ return parseTracksSegment(iterator, length, parserContext); } - if (segmentId === '0xae') { - const trackEntry = parseTrackEntry(iterator, length, parserContext); + if (segmentId === matroskaElements.TrackEntry) { + const trackEntry = await parseTrackEntry(iterator, length, parserContext); + parserContext.parserState.onTrackEntrySegment(trackEntry); + + const track = getTrack({ + track: trackEntry, + timescale: parserContext.parserState.getTimescale(), + }); + + if (track) { + await registerTrack({ + state: parserContext.parserState, + options: parserContext, + track, + }); + } + return trackEntry; } @@ -344,9 +361,7 @@ const parseSegment = ({ } if (segmentId === '0xe7') { - const timestamp = parseTimestampSegment(iterator, length); - parserContext.parserState.registerClusterTimestamp(timestamp.timestamp); - return timestamp; + return parseTimestampSegment(iterator, length); } if (segmentId === '0xa3') { @@ -354,7 +369,6 @@ const parseSegment = ({ iterator, length, parserContext, - onVideoSample: parserContext.parserState.onVideoSample, }); } @@ -376,17 +390,17 @@ const parseSegment = ({ return child; }; -export const expectSegment = ( +export const expectSegment = async ( iterator: BufferIterator, parserContext: ParserContext, -): ParseResult => { +): Promise => { const bytesRemaining_ = iterator.bytesRemaining(); if (bytesRemaining_ === 0) { return { status: 'incomplete', segments: [], continueParsing: () => { - return expectSegment(iterator, parserContext); + return Promise.resolve(expectSegment(iterator, parserContext)); }, skipTo: null, }; @@ -399,7 +413,7 @@ export const expectSegment = ( iterator.byteLength() - iterator.counter.getOffset(); if (segmentId === '0x18538067' || segmentId === '0x1f43b675') { - const main = expectChildren({ + const main = await expectChildren({ iterator, length, initialChildren: [], @@ -438,13 +452,13 @@ export const expectSegment = ( status: 'incomplete', segments: [], continueParsing: () => { - return expectSegment(iterator, parserContext); + return Promise.resolve(expectSegment(iterator, parserContext)); }, skipTo: null, }; } - const segment = parseSegment({ + const segment = await parseSegment({ segmentId, iterator, length, diff --git a/packages/media-parser/src/boxes/webm/segments/info.ts b/packages/media-parser/src/boxes/webm/segments/info.ts index 18e6688b41c..43fa1e49366 100644 --- a/packages/media-parser/src/boxes/webm/segments/info.ts +++ b/packages/media-parser/src/boxes/webm/segments/info.ts @@ -9,12 +9,12 @@ export type InfoSegment = { children: MatroskaSegment[]; }; -export const parseInfoSegment = ( +export const parseInfoSegment = async ( iterator: BufferIterator, length: number, parserContext: ParserContext, -): InfoSegment => { - const children = expectChildren({ +): Promise => { + const children = await expectChildren({ iterator, length, initialChildren: [], diff --git a/packages/media-parser/src/boxes/webm/segments/parse-children.ts b/packages/media-parser/src/boxes/webm/segments/parse-children.ts index 5d6ca054c86..4c7bdfaaf5a 100644 --- a/packages/media-parser/src/boxes/webm/segments/parse-children.ts +++ b/packages/media-parser/src/boxes/webm/segments/parse-children.ts @@ -20,8 +20,8 @@ const processParseResult = ({ return { status: 'incomplete', segments: [], - continueParsing: () => { - const newParseResult = parseResult.continueParsing(); + continueParsing: async () => { + const newParseResult = await parseResult.continueParsing(); return processParseResult({ children, parseResult: newParseResult, @@ -58,14 +58,14 @@ const continueParsingfunction = parserContext: ParserContext; length: number; }) => - (): ParseResult => { + async (): Promise => { if (result.status !== 'incomplete') { throw new Error('expected incomplete'); } const offset = iterator.counter.getOffset(); - const continued = result.continueParsing(); + const continued = await result.continueParsing(); if (continued.status === 'incomplete') { return { status: 'incomplete', @@ -91,7 +91,7 @@ const continueParsingfunction = }); }; -export const expectChildren = ({ +export const expectChildren = async ({ iterator, length, initialChildren, @@ -103,7 +103,7 @@ export const expectChildren = ({ initialChildren: MatroskaSegment[]; wrap: WrapChildren | null; parserContext: ParserContext; -}): ParseResult => { +}): Promise => { const children: MatroskaSegment[] = [...initialChildren]; const startOffset = iterator.counter.getOffset(); @@ -112,7 +112,7 @@ export const expectChildren = ({ break; } - const parseResult = expectSegment(iterator, parserContext); + const parseResult = await expectSegment(iterator, parserContext); const child = processParseResult({ children, diff --git a/packages/media-parser/src/boxes/webm/segments/seek-head.ts b/packages/media-parser/src/boxes/webm/segments/seek-head.ts index bb3095faa81..8643eb856b8 100644 --- a/packages/media-parser/src/boxes/webm/segments/seek-head.ts +++ b/packages/media-parser/src/boxes/webm/segments/seek-head.ts @@ -9,12 +9,12 @@ export type SeekHeadSegment = { length: number; }; -export const parseSeekHeadSegment = ( +export const parseSeekHeadSegment = async ( iterator: BufferIterator, length: number, parserContext: ParserContext, -): SeekHeadSegment => { - const children = expectChildren({ +): Promise => { + const children = await expectChildren({ iterator, length, initialChildren: [], diff --git a/packages/media-parser/src/boxes/webm/segments/seek.ts b/packages/media-parser/src/boxes/webm/segments/seek.ts index 28794945e36..9ed647c7650 100644 --- a/packages/media-parser/src/boxes/webm/segments/seek.ts +++ b/packages/media-parser/src/boxes/webm/segments/seek.ts @@ -8,12 +8,12 @@ export type SeekSegment = { children: MatroskaSegment[]; }; -export const parseSeekSegment = ( +export const parseSeekSegment = async ( iterator: BufferIterator, length: number, parserContext: ParserContext, -): SeekSegment => { - const children = expectChildren({ +): Promise => { + const children = await expectChildren({ iterator, length, initialChildren: [], diff --git a/packages/media-parser/src/boxes/webm/segments/track-entry.ts b/packages/media-parser/src/boxes/webm/segments/track-entry.ts index a9e611d4e61..2e8fbf4d722 100644 --- a/packages/media-parser/src/boxes/webm/segments/track-entry.ts +++ b/packages/media-parser/src/boxes/webm/segments/track-entry.ts @@ -1,7 +1,5 @@ import type {BufferIterator} from '../../../buffer-iterator'; import type {ParserContext} from '../../../parser-context'; -import type {VideoSample} from '../../../webcodec-sample-types'; -import {av1Bitstream} from '../bitstream/av1'; import type {MatroskaSegment} from '../segments'; import {expectChildren} from './parse-children'; @@ -10,12 +8,12 @@ export type TrackEntrySegment = { children: MatroskaSegment[]; }; -export const parseTrackEntry = ( +export const parseTrackEntry = async ( iterator: BufferIterator, length: number, parserContext: ParserContext, -): TrackEntrySegment => { - const children = expectChildren({ +): Promise => { + const children = await expectChildren({ iterator, length, initialChildren: [], @@ -207,12 +205,12 @@ export type VideoSegment = { children: MatroskaSegment[]; }; -export const parseVideoSegment = ( +export const parseVideoSegment = async ( iterator: BufferIterator, length: number, parserContext: ParserContext, -): VideoSegment => { - const children = expectChildren({ +): Promise => { + const children = await expectChildren({ iterator, length, initialChildren: [], @@ -235,12 +233,12 @@ export type AudioSegment = { children: MatroskaSegment[]; }; -export const parseAudioSegment = ( +export const parseAudioSegment = async ( iterator: BufferIterator, length: number, parserContext: ParserContext, -): AudioSegment => { - const children = expectChildren({ +): Promise => { + const children = await expectChildren({ iterator, length, initialChildren: [], @@ -514,12 +512,12 @@ export type TagsSegment = { children: MatroskaSegment[]; }; -export const parseTagsSegment = ( +export const parseTagsSegment = async ( iterator: BufferIterator, length: number, parserContext: ParserContext, -): TagsSegment => { - const children = expectChildren({ +): Promise => { + const children = await expectChildren({ iterator, length, initialChildren: [], @@ -594,17 +592,15 @@ export type SimpleBlockSegment = { export type GetTracks = () => TrackEntrySegment[]; -export const parseSimpleBlockSegment = ({ +export const parseSimpleBlockSegment = async ({ iterator, length, parserContext, - onVideoSample, }: { iterator: BufferIterator; length: number; parserContext: ParserContext; - onVideoSample: (trackId: number, sample: VideoSample) => void; -}): SimpleBlockSegment => { +}): Promise => { const start = iterator.counter.getOffset(); const trackNumber = iterator.getVint(); const timecode = iterator.getUint16(); @@ -623,51 +619,10 @@ export const parseSimpleBlockSegment = ({ const children: MatroskaSegment[] = []; - if (codec.codec === 'V_AV1') { - let remainingNow = length - (iterator.counter.getOffset() - start); - - // eslint-disable-next-line no-constant-condition - while (true) { - const bitStream = av1Bitstream({ - stream: iterator, - length: remainingNow, - onVideoSample, - trackNumber, - context: parserContext, - timecode, - }); - remainingNow = length - (iterator.counter.getOffset() - start); - - children.push(bitStream.segment); - if (!bitStream.discarded) { - iterator.discard(remainingNow); - break; - } - - if (remainingNow === 0) { - break; - } - } - } - - if (codec.codec === 'V_VP8') { - const remainingNow = length - (iterator.counter.getOffset() - start); - - parserContext.parserState.onVideoSample(trackNumber, { - data: iterator.getSlice(remainingNow), - cts: null, - dts: null, - duration: undefined, - type: keyframe ? 'key' : 'delta', - trackId: trackNumber, - timestamp: timecode, - }); - } - - if (codec.codec === 'V_VP9') { + if (codec.codec.startsWith('V_')) { const remainingNow = length - (iterator.counter.getOffset() - start); - parserContext.parserState.onVideoSample(trackNumber, { + await parserContext.parserState.onVideoSample(trackNumber, { data: iterator.getSlice(remainingNow), cts: null, dts: null, @@ -678,9 +633,9 @@ export const parseSimpleBlockSegment = ({ }); } - if (codec.codec === 'A_VORBIS') { + if (codec.codec.startsWith('A_')) { const vorbisRemaining = length - (iterator.counter.getOffset() - start); - parserContext.parserState.onAudioSample(trackNumber, { + await parserContext.parserState.onAudioSample(trackNumber, { data: iterator.getSlice(vorbisRemaining), offset: timecode, trackId: trackNumber, @@ -728,12 +683,12 @@ export type BlockGroupSegment = { children: MatroskaSegment[]; }; -export const parseBlockGroupSegment = ( +export const parseBlockGroupSegment = async ( iterator: BufferIterator, length: number, parserContext: ParserContext, -): BlockGroupSegment => { - const children = expectChildren({ +): Promise => { + const children = await expectChildren({ iterator, length, initialChildren: [], diff --git a/packages/media-parser/src/boxes/webm/segments/tracks.ts b/packages/media-parser/src/boxes/webm/segments/tracks.ts index ef127052b98..265efcc518e 100644 --- a/packages/media-parser/src/boxes/webm/segments/tracks.ts +++ b/packages/media-parser/src/boxes/webm/segments/tracks.ts @@ -8,12 +8,12 @@ export type TracksSegment = { children: MatroskaSegment[]; }; -export const parseTracksSegment = ( +export const parseTracksSegment = async ( iterator: BufferIterator, length: number, parserContext: ParserContext, -): TracksSegment => { - const children = expectChildren({ +): Promise => { + const children = await expectChildren({ iterator, length, initialChildren: [], diff --git a/packages/media-parser/src/boxes/webm/traversal.ts b/packages/media-parser/src/boxes/webm/traversal.ts index 7e1a7039457..ae2e9ce194a 100644 --- a/packages/media-parser/src/boxes/webm/traversal.ts +++ b/packages/media-parser/src/boxes/webm/traversal.ts @@ -1,8 +1,6 @@ import type {AnySegment} from '../../parse-result'; -import type {Av1BitstreamHeaderSegment} from './bitstream/av1/header-segment'; import type {MainSegment} from './segments/main'; import type { - ClusterSegment, CodecSegment, TrackEntrySegment, TrackNumberSegment, @@ -32,36 +30,3 @@ export const getTrackByNumber = (tracks: TrackEntrySegment[], id: number) => { return trackNumber === id; }); }; - -export const getAv1BitstreamHeader = ( - clusterSegment: ClusterSegment, -): Av1BitstreamHeaderSegment | null => { - const simpleBlockSegment = clusterSegment.children.find((b) => { - if (b.type !== 'simple-block-segment') { - return false; - } - - const child = b.children.find((c) => c.type === 'av1-bitstream-header'); - return child; - }); - - if ( - !simpleBlockSegment || - simpleBlockSegment.type !== 'simple-block-segment' - ) { - return null; - } - - const av1BitstreamHeader = simpleBlockSegment.children.find( - (c) => c.type === 'av1-bitstream-header', - ); - - if ( - !av1BitstreamHeader || - av1BitstreamHeader.type !== 'av1-bitstream-header' - ) { - return null; - } - - return av1BitstreamHeader; -}; diff --git a/packages/media-parser/src/buffer-iterator.ts b/packages/media-parser/src/buffer-iterator.ts index 87c15c83686..f5ebc299bf7 100644 --- a/packages/media-parser/src/buffer-iterator.ts +++ b/packages/media-parser/src/buffer-iterator.ts @@ -47,6 +47,7 @@ export class OffsetCounter { const isoBaseMediaMp4Pattern = new TextEncoder().encode('ftyp'); const webmPattern = new Uint8Array([0x1a, 0x45, 0xdf, 0xa3]); +const mpegPattern = new Uint8Array([0xff, 0xf3, 0xe4, 0x64]); const matchesPattern = (pattern: Uint8Array) => { return (data: Uint8Array) => { @@ -67,7 +68,7 @@ export const getArrayBufferIterator = ( }); if (!buf.resize) { throw new Error( - '`ArrayBuffer.resize` is not supported in this Runtime. Use at least Node.js 20 or Bun.', + '`ArrayBuffer.resize` is not supported in this Runtime. On the server: Use at least Node.js 20 or Bun. In the browser: Chrome 111, Edge 111, Safari 16.4, Firefox 128, Opera 111', ); } @@ -159,6 +160,10 @@ export const getArrayBufferIterator = ( return matchesPattern(webmPattern)(data.subarray(0, 4)); }; + const isMp3 = () => { + return matchesPattern(mpegPattern)(data.subarray(0, 4)); + }; + const removeBytesRead = () => { const bytesToRemove = counter.getDiscardedOffset(); @@ -253,6 +258,11 @@ export const getArrayBufferIterator = ( return result; }; + const destroy = () => { + data = new Uint8Array(0); + buf.resize(0); + }; + return { startReadingBits, stopReadingBits, @@ -428,6 +438,8 @@ export const getArrayBufferIterator = ( }, getUint32Le, getInt32Le, + destroy, + isMp3, }; }; diff --git a/packages/media-parser/src/get-audio-codec.ts b/packages/media-parser/src/get-audio-codec.ts index 95bdc25982c..0a94a719d96 100644 --- a/packages/media-parser/src/get-audio-codec.ts +++ b/packages/media-parser/src/get-audio-codec.ts @@ -178,9 +178,21 @@ export const getAudioCodecFromMatroska = (mainSegment: MainSegment) => { return 'opus'; } + if (trackType.codec === 'A_VORBIS') { + return 'vorbis'; + } + if (trackType.codec === 'A_PCM/INT/LIT') { return 'pcm'; } + + if (trackType.codec === 'A_AAC') { + return 'aac'; + } + + if (trackType.codec === 'A_MPEG/L3') { + return 'mp3'; + } } } } @@ -196,18 +208,24 @@ export const getAudioCodecStringFromTrak = ( throw new Error('Expected codec'); } + const codecStringWithoutMp3Exception = ( + [ + codec.format, + codec.primarySpecificator ? codec.primarySpecificator.toString(16) : null, + codec.secondarySpecificator + ? codec.secondarySpecificator.toString().padStart(2, '0') + : null, + ].filter(Boolean) as string[] + ).join('.'); + + // Really, MP3? 😔 + const codecString = + codecStringWithoutMp3Exception === 'mp4a.6b' + ? 'mp3' // or "mp4a.6B" would also work, with the uppercasing, but mp3 is probably more obvious + : codecStringWithoutMp3Exception; + return { - codecString: ( - [ - codec.format, - codec.primarySpecificator - ? codec.primarySpecificator.toString(16) - : null, - codec.secondarySpecificator - ? codec.secondarySpecificator.toString().padStart(2, '0') - : null, - ].filter(Boolean) as string[] - ).join('.'), + codecString, description: codec.description, }; }; diff --git a/packages/media-parser/src/get-dimensions.ts b/packages/media-parser/src/get-dimensions.ts index c735ca49eaf..cc563d501a4 100644 --- a/packages/media-parser/src/get-dimensions.ts +++ b/packages/media-parser/src/get-dimensions.ts @@ -1,8 +1,6 @@ -import type {MainSegment} from './boxes/webm/segments/main'; -import {trakBoxContainsVideo} from './get-fps'; -import {getVideoSample} from './get-sample-aspect-ratio'; +import {getTracks} from './get-tracks'; import type {AnySegment} from './parse-result'; -import {getMoovBox, getStsdBox, getTkhdBox, getTraks} from './traversal'; +import type {ParserState} from './parser-state'; export type Dimensions = { width: number; @@ -15,114 +13,34 @@ export type ExpandedDimensions = Dimensions & { unrotatedHeight: number; }; -const getDimensionsFromMatroska = ( - segments: MainSegment, +export const getDimensions = ( + boxes: AnySegment[], + state: ParserState, ): ExpandedDimensions => { - const tracksSegment = segments.children.find( - (b) => b.type === 'tracks-segment', - ); - if (!tracksSegment || tracksSegment.type !== 'tracks-segment') { - throw new Error('No tracks segment'); + const {videoTracks} = getTracks(boxes, state); + if (!videoTracks.length) { + throw new Error('Expected video track'); } - const trackEntrySegment = tracksSegment.children.find((b) => { - if (b.type !== 'track-entry-segment') { - return false; - } - - return ( - b.children.find( - (c) => c.type === 'codec-segment' && c.codec.startsWith('V_'), - ) !== undefined - ); - }); - if (!trackEntrySegment || trackEntrySegment.type !== 'track-entry-segment') { - throw new Error('No track entry segment'); - } - - const videoSegment = trackEntrySegment.children.find( - (b) => b.type === 'video-segment', - ); - if (!videoSegment || videoSegment.type !== 'video-segment') { - throw new Error('No video segment'); - } - - const widthSegment = videoSegment.children.find( - (b) => b.type === 'width-segment', - ); - if (!widthSegment || widthSegment.type !== 'width-segment') { - throw new Error('No width segment'); - } - - const heightSegment = videoSegment.children.find( - (b) => b.type === 'height-segment', - ); - if (!heightSegment || heightSegment.type !== 'height-segment') { - throw new Error('No height segment'); - } - - return { - width: widthSegment.width, - height: heightSegment.height, - rotation: 0, - unrotatedHeight: heightSegment.height, - unrotatedWidth: widthSegment.width, - }; -}; - -export const getDimensions = (boxes: AnySegment[]): ExpandedDimensions => { - const matroskaBox = boxes.find((b) => b.type === 'main-segment'); - if (matroskaBox && matroskaBox.type === 'main-segment') { - return getDimensionsFromMatroska(matroskaBox); - } - - const moovBox = getMoovBox(boxes); - if (!moovBox) { - throw new Error('Expected moov box'); - } - - const trakBox = getTraks(moovBox).filter((t) => trakBoxContainsVideo(t))[0]; - - if (!trakBox) { - throw new Error('Expected trak box'); - } - - const tkhdBox = getTkhdBox(trakBox); - if (tkhdBox) { - return { - width: tkhdBox.width, - height: tkhdBox.height, - rotation: tkhdBox.rotation, - unrotatedHeight: tkhdBox.unrotatedHeight, - unrotatedWidth: tkhdBox.unrotatedWidth, - }; - } - - const stsdBox = getStsdBox(trakBox); - - if (!stsdBox) { - throw new Error('Expected stsd box'); - } - - const videoSample = getVideoSample(trakBox); - if (!videoSample) { - throw new Error('Expected video sample'); - } + const firstVideoTrack = videoTracks[0]; return { - width: videoSample.width, - height: videoSample.height, - rotation: 0, - unrotatedHeight: videoSample.height, - unrotatedWidth: videoSample.width, + width: firstVideoTrack.width, + height: firstVideoTrack.height, + rotation: firstVideoTrack.rotation, + unrotatedHeight: firstVideoTrack.displayAspectHeight, + unrotatedWidth: firstVideoTrack.displayAspectWidth, }; }; // TODO: An audio track should return 'hasDimensions' = true on an audio file // and stop parsing -export const hasDimensions = (boxes: AnySegment[]): boolean => { +export const hasDimensions = ( + boxes: AnySegment[], + state: ParserState, +): boolean => { try { - return getDimensions(boxes) !== null; + return getDimensions(boxes, state) !== null; } catch (err) { return false; } diff --git a/packages/media-parser/src/get-sample-aspect-ratio.ts b/packages/media-parser/src/get-sample-aspect-ratio.ts index e9326008a3c..c1ed4cb6f59 100644 --- a/packages/media-parser/src/get-sample-aspect-ratio.ts +++ b/packages/media-parser/src/get-sample-aspect-ratio.ts @@ -4,6 +4,7 @@ import type {ColorParameterBox} from './boxes/iso-base-media/stsd/colr'; import type {HvccBox} from './boxes/iso-base-media/stsd/hvcc'; import type {PaspBox} from './boxes/iso-base-media/stsd/pasp'; import type {VideoSample} from './boxes/iso-base-media/stsd/samples'; +import type {TkhdBox} from './boxes/iso-base-media/tkhd'; import type {TrakBox} from './boxes/iso-base-media/trak/trak'; import type {Dimensions} from './get-dimensions'; import {getStsdBox} from './traversal'; @@ -115,6 +116,35 @@ export const getColrBox = ( return colrBox; }; +export const applyTkhdBox = ( + aspectRatioApplied: Dimensions, + tkhdBox: TkhdBox, +): { + displayAspectWidth: number; + displayAspectHeight: number; + width: number; + height: number; + rotation: number; +} => { + if (tkhdBox === null || tkhdBox.rotation === 0) { + return { + displayAspectWidth: aspectRatioApplied.width, + displayAspectHeight: aspectRatioApplied.height, + width: aspectRatioApplied.width, + height: aspectRatioApplied.height, + rotation: 0, + }; + } + + return { + width: tkhdBox.width, + height: tkhdBox.height, + rotation: tkhdBox.rotation, + displayAspectWidth: aspectRatioApplied.width, + displayAspectHeight: aspectRatioApplied.height, + }; +}; + export const applyAspectRatios = ({ dimensions, sampleAspectRatio, diff --git a/packages/media-parser/src/get-tracks.ts b/packages/media-parser/src/get-tracks.ts index 48dc2fab9d6..0c8e6b60b55 100644 --- a/packages/media-parser/src/get-tracks.ts +++ b/packages/media-parser/src/get-tracks.ts @@ -4,7 +4,8 @@ import {getTracksFromMatroska} from './boxes/webm/get-ready-tracks'; import {getMainSegment} from './boxes/webm/traversal'; import type {SamplePosition} from './get-sample-positions'; import type {AnySegment} from './parse-result'; -import {getFtypBox, getMoovBox, getMvhdBox, getTraks} from './traversal'; +import type {ParserState} from './parser-state'; +import {getMoovBox, getMvhdBox, getTracksSegment, getTraks} from './traversal'; type SampleAspectRatio = { numerator: number; @@ -21,8 +22,11 @@ export type VideoTrack = { sampleAspectRatio: SampleAspectRatio; width: number; height: number; + displayAspectWidth: number; + displayAspectHeight: number; codedWidth: number; codedHeight: number; + rotation: number; }; export type AudioTrack = { @@ -43,9 +47,8 @@ export type OtherTrack = { timescale: number; }; -export type Track = VideoTrack | AudioTrack; +export type Track = VideoTrack | AudioTrack | OtherTrack; -// TODO: Use this to determine if all tracks are present export const getNumberOfTracks = (moovBox: MoovBox): number => { const mvHdBox = getMvhdBox(moovBox); if (!mvHdBox) { @@ -56,17 +59,16 @@ export const getNumberOfTracks = (moovBox: MoovBox): number => { }; export const hasTracks = (segments: AnySegment[]): boolean => { - const moovBox = getMoovBox(segments); const mainSegment = getMainSegment(segments); - const ftypBox = getFtypBox(segments); - if (!moovBox) { - if (ftypBox) { - return false; - } + if (mainSegment) { + return getTracksSegment(mainSegment) !== null; + } - // TODO: Support Matroska - return Boolean(mainSegment); + const moovBox = getMoovBox(segments); + + if (!moovBox) { + return false; } const numberOfTracks = getNumberOfTracks(moovBox); @@ -77,28 +79,49 @@ export const hasTracks = (segments: AnySegment[]): boolean => { export const getTracks = ( segments: AnySegment[], + state: ParserState, ): { videoTracks: VideoTrack[]; audioTracks: AudioTrack[]; otherTracks: OtherTrack[]; } => { + const videoTracks: VideoTrack[] = []; + const audioTracks: AudioTrack[] = []; + const otherTracks: OtherTrack[] = []; + const mainSegment = segments.find((s) => s.type === 'main-segment'); if (mainSegment && mainSegment.type === 'main-segment') { - return getTracksFromMatroska(mainSegment); + const matroskaTracks = getTracksFromMatroska( + mainSegment, + state.getTimescale(), + ); + + for (const track of matroskaTracks) { + if (track.type === 'video') { + videoTracks.push(track); + } else if (track.type === 'audio') { + audioTracks.push(track); + } else if (track.type === 'other') { + otherTracks.push(track); + } + } + + return { + videoTracks, + audioTracks, + otherTracks, + }; } const moovBox = getMoovBox(segments); if (!moovBox) { return { - videoTracks: [], - audioTracks: [], - otherTracks: [], + videoTracks, + audioTracks, + otherTracks, }; } - const videoTracks: VideoTrack[] = []; - const audioTracks: AudioTrack[] = []; - const otherTracks: OtherTrack[] = []; const tracks = getTraks(moovBox); for (const trakBox of tracks) { diff --git a/packages/media-parser/src/get-video-codec.ts b/packages/media-parser/src/get-video-codec.ts index 98703dca708..5d4b2ee7850 100644 --- a/packages/media-parser/src/get-video-codec.ts +++ b/packages/media-parser/src/get-video-codec.ts @@ -1,8 +1,6 @@ /* eslint-disable max-depth */ -import {constructAv1CodecString} from './av1-codec-string'; -import type {Av1CBox} from './boxes/iso-base-media/stsd/av1c'; -import type {ColorParameterBox} from './boxes/iso-base-media/stsd/colr'; import type {TrakBox} from './boxes/iso-base-media/trak/trak'; +import {parseAv1PrivateData} from './boxes/webm/av1-codec-private'; import {trakBoxContainsVideo} from './get-fps'; import { getAv1CBox, @@ -23,13 +21,6 @@ export const hasVideoCodec = (boxes: AnySegment[]): boolean => { } }; -const getAv01CodecString = ( - av1cBox: Av1CBox, - colrAtom: ColorParameterBox | null, -) => { - return constructAv1CodecString(av1cBox.av1HeaderSegment, colrAtom); -}; - export const getVideoCodecString = (trakBox: TrakBox): string | null => { const videoSample = getVideoSample(trakBox); const avccBox = getAvccBox(trakBox); @@ -50,7 +41,7 @@ export const getVideoCodecString = (trakBox: TrakBox): string | null => { if (av1cBox) { const colrAtom = getColrBox(videoSample); - return getAv01CodecString(av1cBox, colrAtom); + return parseAv1PrivateData(av1cBox.privateData, colrAtom); } return videoSample.format; @@ -116,6 +107,10 @@ export const getVideoCodec = (boxes: AnySegment[]): KnownVideoCodecs | null => { if (trackType.codec === 'V_MPEG4/ISO/AVC') { return 'h264'; } + + if (trackType.codec === 'V_MPEGH/ISO/HEVC') { + return 'h265'; + } } } } diff --git a/packages/media-parser/src/has-all-info.ts b/packages/media-parser/src/has-all-info.ts index d41345ae9ef..299fb04493c 100644 --- a/packages/media-parser/src/has-all-info.ts +++ b/packages/media-parser/src/has-all-info.ts @@ -6,6 +6,7 @@ import {hasTracks} from './get-tracks'; import {hasVideoCodec} from './get-video-codec'; import type {Options} from './options'; import type {ParseResult} from './parse-result'; +import type {ParserState} from './parser-state'; export const hasAllInfo = ( options: Options< @@ -17,9 +18,11 @@ export const hasAllInfo = ( boolean, boolean, boolean, + boolean, boolean >, parseResult: ParseResult, + state: ParserState, ) => { const keys = Object.entries(options) .filter(([, value]) => value) @@ -32,6 +35,7 @@ export const hasAllInfo = ( true, true, true, + true, true >)[]; @@ -49,7 +53,7 @@ export const hasAllInfo = ( key === 'rotation' || key === 'unrotatedDimension' ) { - return hasDimensions(parseResult.segments); + return hasDimensions(parseResult.segments, state); } if (key === 'fps') { @@ -68,6 +72,10 @@ export const hasAllInfo = ( return hasTracks(parseResult.segments); } + if (key === 'internalStats') { + return false; + } + throw new Error(`Unknown key: ${key satisfies never}`); }); }; diff --git a/packages/media-parser/src/make-hvc1-codec-strings.ts b/packages/media-parser/src/make-hvc1-codec-strings.ts new file mode 100644 index 00000000000..24e35a241fc --- /dev/null +++ b/packages/media-parser/src/make-hvc1-codec-strings.ts @@ -0,0 +1,55 @@ +import type {BufferIterator} from './buffer-iterator'; + +export const getHvc1CodecString = (data: BufferIterator) => { + const configurationVersion = data.getUint8(); + if (configurationVersion !== 1) { + throw new Error(`Unsupported HVCC version ${configurationVersion}`); + } + + const generalProfileSpaceTierFlagAndIdc = data.getUint8(); + let generalProfileCompatibility = data.getUint32(); + // unsigned int(2) general_profile_space; + // unsigned int(1) general_tier_flag; + // unsigned int(5) general_profile_idc; + + const generalProfileSpace = generalProfileSpaceTierFlagAndIdc >> 6; + const generalTierFlag = generalProfileSpaceTierFlagAndIdc >> 5; + const generalProfileIdc = generalProfileSpaceTierFlagAndIdc >> 0; + + // general_constraint_indicator_flags(48) + const generalConstraintIndicator = data.getSlice(6); + const generalLevelIdc = data.getUint8(); + + let reversedGeneralProfileSpace = 0; + for (let i = 0; i < 32; i++) { + reversedGeneralProfileSpace |= generalProfileCompatibility & 1; + if (i === 31) break; + + reversedGeneralProfileSpace <<= 1; + generalProfileCompatibility >>= 1; + } + + const profileSpaceChar = + generalProfileSpace === 0 + ? '' + : generalProfileSpace === 1 + ? 'A' + : generalProfileSpace === 2 + ? 'B' + : 'C'; + + const generalTierChar = generalTierFlag === 0 ? 'L' : 'H'; + + let hasByte = false; + + let generalConstraintString = ''; + for (let i = 5; i >= 0; i--) { + if (generalConstraintIndicator[i] || hasByte) { + generalConstraintString = + generalConstraintIndicator[i].toString(16) + generalConstraintString; + hasByte = true; + } + } + + return `${profileSpaceChar}${generalProfileIdc.toString(16)}.${reversedGeneralProfileSpace.toString(16)}.${generalTierChar}${generalLevelIdc}.${generalConstraintString}`; +}; diff --git a/packages/media-parser/src/options.ts b/packages/media-parser/src/options.ts index 158da602d54..584c5e43e60 100644 --- a/packages/media-parser/src/options.ts +++ b/packages/media-parser/src/options.ts @@ -2,6 +2,7 @@ import type {} from './boxes/iso-base-media/mdat/mdat'; import type {Dimensions} from './get-dimensions'; import type {AudioTrack, VideoTrack} from './get-tracks'; import type {AnySegment} from './parse-result'; +import type {InternalStats} from './parser-state'; import type {ReaderInterface} from './reader'; import type {OnAudioTrack, OnVideoTrack} from './webcodec-sample-types'; @@ -19,6 +20,7 @@ export type KnownAudioCodecs = | 'aiff' | 'opus' | 'pcm' + | 'vorbis' | 'unknown'; export type Options< @@ -31,6 +33,7 @@ export type Options< EnableTracks extends boolean, EnableRotation extends boolean, EnableUnrotatedDimensions extends boolean, + EnableInternalStats extends boolean, > = { dimensions?: EnableDimensions; durationInSeconds?: EnableDuration; @@ -41,6 +44,7 @@ export type Options< tracks?: EnableTracks; rotation?: EnableRotation; unrotatedDimension?: EnableUnrotatedDimensions; + internalStats?: EnableInternalStats; }; export type Metadata< @@ -53,6 +57,7 @@ export type Metadata< EnableTracks extends boolean, EnableRotation extends boolean, EnableUnrotatedDimensions extends boolean, + EnableInternalStats extends boolean, > = (EnableDimensions extends true ? {dimensions: Dimensions} : {}) & (EnableDuration extends true ? {durationInSeconds: number | null} : {}) & (EnableBoxes extends true ? {boxes: AnySegment[]} : {}) & @@ -65,7 +70,8 @@ export type Metadata< (EnableRotation extends true ? {rotation: number | null} : {}) & (EnableUnrotatedDimensions extends true ? {unrotatedDimension: Dimensions} - : {}); + : {}) & + (EnableInternalStats extends true ? {internalStats: InternalStats} : {}); export type ParseMedia = < EnableDimensions extends boolean, @@ -77,6 +83,7 @@ export type ParseMedia = < EnableTracks extends boolean, EnableRotation extends boolean, EnableUnrotatedDimensions extends boolean, + EnableInternalStats extends boolean, >(options: { src: string | File; fields?: Options< @@ -88,7 +95,8 @@ export type ParseMedia = < EnableAudioCodec, EnableTracks, EnableRotation, - EnableUnrotatedDimensions + EnableUnrotatedDimensions, + EnableInternalStats >; reader?: ReaderInterface; onAudioTrack?: OnAudioTrack; @@ -103,6 +111,7 @@ export type ParseMedia = < EnableAudioCodec, EnableTracks, EnableRotation, - EnableUnrotatedDimensions + EnableUnrotatedDimensions, + EnableInternalStats > >; diff --git a/packages/media-parser/src/parse-media.ts b/packages/media-parser/src/parse-media.ts index ba3d5dcde12..f3d040577f7 100644 --- a/packages/media-parser/src/parse-media.ts +++ b/packages/media-parser/src/parse-media.ts @@ -1,6 +1,4 @@ /* eslint-disable max-depth */ -import {getTracksFromMatroska} from './boxes/webm/get-ready-tracks'; -import {getMainSegment} from './boxes/webm/traversal'; import type {BufferIterator} from './buffer-iterator'; import {getArrayBufferIterator} from './buffer-iterator'; import {fetchReader} from './from-fetch'; @@ -14,6 +12,7 @@ import {hasAllInfo} from './has-all-info'; import type {Metadata, ParseMedia} from './options'; import type {ParseResult} from './parse-result'; import {parseVideo} from './parse-video'; +import type {ParserContext} from './parser-context'; import {makeParserState} from './parser-state'; export const parseMedia: ParseMedia = async ({ @@ -35,6 +34,7 @@ export const parseMedia: ParseMedia = async ({ true, true, true, + true, true >; @@ -46,6 +46,13 @@ export const parseMedia: ParseMedia = async ({ hasVideoCallbacks: onVideoTrack !== null, }); + const options: ParserContext = { + canSkipVideoData: !(onAudioTrack || onVideoTrack), + onAudioTrack: onAudioTrack ?? null, + onVideoTrack: onVideoTrack ?? null, + parserState: state, + }; + while (parseResult === null || parseResult.status === 'incomplete') { const result = await currentReader.read(); @@ -65,51 +72,18 @@ export const parseMedia: ParseMedia = async ({ } if (parseResult && parseResult.status === 'incomplete') { - parseResult = parseResult.continueParsing(); + parseResult = await parseResult.continueParsing(); } else { - parseResult = parseVideo({ + parseResult = await parseVideo({ iterator, - options: { - canSkipVideoData: !(onAudioTrack || onVideoTrack), - onAudioTrack: onAudioTrack ?? null, - onVideoTrack: onVideoTrack ?? null, - parserState: state, - }, + options, }); } - const matroskaSegment = getMainSegment(parseResult.segments); - if (matroskaSegment) { - const tracks = getTracksFromMatroska(matroskaSegment); - for (const track of tracks.videoTracks) { - if (state.isEmitted(track.trackId)) { - continue; - } - - state.addEmittedCodecId(track.trackId); - if (onVideoTrack) { - const callback = onVideoTrack(track); - state.registerVideoSampleCallback(track.trackId, callback ?? null); - } - } - - for (const track of tracks.audioTracks) { - if (state.isEmitted(track.trackId)) { - continue; - } - - state.addEmittedCodecId(track.trackId); - if (onAudioTrack) { - const callback = onAudioTrack(track); - state.registerAudioSampleCallback(track.trackId, callback ?? null); - } - } - } - // TODO Better: Check if no active listeners are registered // Also maybe check for canSkipVideoData if ( - hasAllInfo(fields ?? {}, parseResult) && + hasAllInfo(fields ?? {}, parseResult, state) && !onVideoTrack && !onAudioTrack ) { @@ -143,7 +117,7 @@ export const parseMedia: ParseMedia = async ({ } if (fields?.dimensions) { - const dimensions = getDimensions(parseResult.segments); + const dimensions = getDimensions(parseResult.segments, state); returnValue.dimensions = { width: dimensions.width, height: dimensions.height, @@ -151,7 +125,7 @@ export const parseMedia: ParseMedia = async ({ } if (fields?.unrotatedDimension) { - const dimensions = getDimensions(parseResult.segments); + const dimensions = getDimensions(parseResult.segments, state); returnValue.unrotatedDimension = { width: dimensions.unrotatedWidth, height: dimensions.unrotatedHeight, @@ -159,7 +133,7 @@ export const parseMedia: ParseMedia = async ({ } if (fields?.rotation) { - const dimensions = getDimensions(parseResult.segments); + const dimensions = getDimensions(parseResult.segments, state); returnValue.rotation = dimensions.rotation; } @@ -180,7 +154,7 @@ export const parseMedia: ParseMedia = async ({ } if (fields?.tracks) { - const {audioTracks, videoTracks} = getTracks(parseResult.segments); + const {audioTracks, videoTracks} = getTracks(parseResult.segments, state); returnValue.audioTracks = audioTracks; returnValue.videoTracks = videoTracks; } @@ -189,5 +163,10 @@ export const parseMedia: ParseMedia = async ({ returnValue.boxes = parseResult.segments; } + if (fields?.internalStats) { + returnValue.internalStats = state.getInternalStats(); + } + + iterator?.destroy(); return returnValue; }; diff --git a/packages/media-parser/src/parse-result.ts b/packages/media-parser/src/parse-result.ts index 8e4003295da..466e7cc10bb 100644 --- a/packages/media-parser/src/parse-result.ts +++ b/packages/media-parser/src/parse-result.ts @@ -69,5 +69,5 @@ export type ParseResult = status: 'incomplete'; segments: AnySegment[]; skipTo: number | null; - continueParsing: () => ParseResult; + continueParsing: () => Promise; }; diff --git a/packages/media-parser/src/parse-video.ts b/packages/media-parser/src/parse-video.ts index 942dec26bc3..72cb4ef381e 100644 --- a/packages/media-parser/src/parse-video.ts +++ b/packages/media-parser/src/parse-video.ts @@ -4,6 +4,12 @@ import type {BufferIterator} from './buffer-iterator'; import type {IsoBaseMediaBox, ParseResult} from './parse-result'; import type {ParserContext} from './parser-context'; +export type PartialMdatBox = { + type: 'partial-mdat-box'; + boxSize: number; + fileOffset: number; +}; + export type BoxAndNext = | { type: 'complete'; @@ -13,7 +19,8 @@ export type BoxAndNext = } | { type: 'incomplete'; - }; + } + | PartialMdatBox; export const parseVideo = ({ iterator, @@ -21,9 +28,9 @@ export const parseVideo = ({ }: { iterator: BufferIterator; options: ParserContext; -}): ParseResult => { +}): Promise => { if (iterator.bytesRemaining() === 0) { - return { + return Promise.resolve({ status: 'incomplete', segments: [], continueParsing: () => { @@ -33,7 +40,7 @@ export const parseVideo = ({ }); }, skipTo: null, - }; + }); } if (iterator.isIsoBaseMedia()) { @@ -43,12 +50,17 @@ export const parseVideo = ({ allowIncompleteBoxes: true, initialBoxes: [], options, + continueMdat: false, }); } if (iterator.isWebm()) { - return parseWebm(iterator, options); + return Promise.resolve(parseWebm(iterator, options)); + } + + if (iterator.isMp3()) { + return Promise.reject(new Error('MP3 files are not yet supported')); } - throw new Error('Unknown video format'); + return Promise.reject(new Error('Unknown video format')); }; diff --git a/packages/media-parser/src/parser-state.ts b/packages/media-parser/src/parser-state.ts index 53c2ead5ffc..16f346e633f 100644 --- a/packages/media-parser/src/parser-state.ts +++ b/packages/media-parser/src/parser-state.ts @@ -1,5 +1,3 @@ -import type {} from './boxes/iso-base-media/stsd/samples'; -import type {Av1BitstreamHeaderSegment} from './boxes/webm/bitstream/av1/header-segment'; import type {OnTrackEntrySegment} from './boxes/webm/segments'; import type {CodecSegment} from './boxes/webm/segments/track-entry'; import {getTrackCodec} from './boxes/webm/traversal'; @@ -11,6 +9,10 @@ import type { VideoSample, } from './webcodec-sample-types'; +export type InternalStats = { + samplesThatHadToBeQueued: number; +}; + export const makeParserState = ({ hasAudioCallbacks, hasVideoCallbacks, @@ -19,47 +21,53 @@ export const makeParserState = ({ hasVideoCallbacks: boolean; }) => { const trackEntries: Record = {}; - const onTrackEntrySegment: OnTrackEntrySegment = (trackEntry) => { - const codec = getTrackCodec(trackEntry); - if (!codec) { - throw new Error('Expected codec'); - } + const onTrackEntrySegment: OnTrackEntrySegment = (trackEntry) => { const trackId = getTrackId(trackEntry); if (!trackId) { throw new Error('Expected track id'); } - trackEntries[trackId] = codec; - }; + if (trackEntries[trackId]) { + return; + } - let clusterTimestamp: number | null = null; + const codec = getTrackCodec(trackEntry); + if (!codec) { + throw new Error('Expected codec'); + } - const emittedCodecIds: number[] = []; + trackEntries[trackId] = codec; + }; const videoSampleCallbacks: Record = {}; const audioSampleCallbacks: Record = {}; + let samplesThatHadToBeQueued = 0; + const queuedAudioSamples: Record = {}; const queuedVideoSamples: Record = {}; const declinedTrackNumbers: number[] = []; - let isFirstAv1FrameRead = false; + let timescale: number | null = null; + + const getTimescale = () => { + if (timescale === null) { + throw new Error('Timescale not set'); + } + + return timescale; + }; - let av1BitstreamHeaderSegment: { - segment: Av1BitstreamHeaderSegment; - header: Uint8Array; - } | null = null; + const setTimescale = (newTimescale: number) => { + timescale = newTimescale; + }; return { onTrackEntrySegment, - isEmitted: (id: number) => emittedCodecIds.includes(id), - addEmittedCodecId: (id: number) => { - emittedCodecIds.push(id); - }, getTrackInfoByNumber: (id: number) => trackEntries[id], - registerVideoSampleCallback: ( + registerVideoSampleCallback: async ( id: number, callback: OnVideoSample | null, ) => { @@ -70,13 +78,14 @@ export const makeParserState = ({ } videoSampleCallbacks[id] = callback; + for (const queued of queuedVideoSamples[id] ?? []) { - callback(queued); + await callback(queued); } queuedVideoSamples[id] = []; }, - registerAudioSampleCallback: ( + registerAudioSampleCallback: async ( id: number, callback: OnAudioSample | null, ) => { @@ -88,15 +97,15 @@ export const makeParserState = ({ audioSampleCallbacks[id] = callback; for (const queued of queuedAudioSamples[id] ?? []) { - callback(queued); + await callback(queued); } queuedAudioSamples[id] = []; }, - onAudioSample: (trackId: number, audioSample: AudioSample) => { + onAudioSample: async (trackId: number, audioSample: AudioSample) => { const callback = audioSampleCallbacks[trackId]; if (callback) { - callback(audioSample); + await callback(audioSample); } else { if (declinedTrackNumbers.includes(trackId)) { return; @@ -108,12 +117,13 @@ export const makeParserState = ({ queuedAudioSamples[trackId] ??= []; queuedAudioSamples[trackId].push(audioSample); + samplesThatHadToBeQueued++; } }, - onVideoSample: (trackId: number, videoSample: VideoSample) => { + onVideoSample: async (trackId: number, videoSample: VideoSample) => { const callback = videoSampleCallbacks[trackId]; if (callback) { - callback(videoSample); + await callback(videoSample); } else { if (declinedTrackNumbers.includes(trackId)) { return; @@ -125,28 +135,16 @@ export const makeParserState = ({ queuedVideoSamples[trackId] ??= []; queuedVideoSamples[trackId].push(videoSample); + samplesThatHadToBeQueued++; } }, - registerClusterTimestamp: (timestamp: number) => { - clusterTimestamp = timestamp; - }, - getClusterTimestamp: () => { - return clusterTimestamp; - }, - setAv1BitstreamHeaderSegment: ( - segment: Av1BitstreamHeaderSegment, - header: Uint8Array, - ) => { - av1BitstreamHeaderSegment = { - segment, - header, + getInternalStats: () => { + return { + samplesThatHadToBeQueued, }; }, - getAv1BitstreamHeaderSegment: () => av1BitstreamHeaderSegment, - setIsFirstAv1FrameRead: () => { - isFirstAv1FrameRead = true; - }, - getIsFirstAv1FrameRead: () => isFirstAv1FrameRead, + getTimescale, + setTimescale, }; }; diff --git a/packages/media-parser/src/test/av1.test.ts b/packages/media-parser/src/test/av1.test.ts index efa966111b4..7d03475720e 100644 --- a/packages/media-parser/src/test/av1.test.ts +++ b/packages/media-parser/src/test/av1.test.ts @@ -31,77 +31,9 @@ test('AV1 in MP4', async () => { const avc1Box = getAv1CBox(traks); expect(avc1Box).toEqual({ type: 'av1C-box', - marker: 1, - version: 1, - seq_profile: 0, - seq_level_idx: 8, - seq_tier_0: 0, - chroma_sample_position: 0, - high_bitdepth: false, - twelve_bit: false, - mono_chrome: false, - chroma_subsampling_x: true, - chroma_subsampling_y: true, - reserved: 0, - initial_presentation_delay_minus_one: null, - av1HeaderSegment: { - additional_frame_id_length_minus_1: null, - color_config: { - bitDepth: 8, - chroma_sample_position: 0, - color_description_present_flag: false, - color_primaries: 2, - color_range: false, - matrix_coefficients: 2, - mono_chrome: false, - numPlanes: 3, - separate_uv_delta_q: 0, - subsampling_x: true, - subsampling_y: true, - transfer_characteristics: 2, - }, - decoder_model_info: null, - decoder_model_info_present_flag: false, - delta_frame_id_length_minus_2: null, - enable_cdef: true, - enable_dual_filter: 0, - enable_filter_intra: true, - enable_interintra_compound: 0, - enable_intra_edge_filter: true, - enable_jnt_comp: true, - enable_masked_compound: 1, - enable_order_hint: 1, - enable_ref_frame_mvs: true, - enable_restoration: false, - enable_superres: false, - enable_warped_motion: 1, - frame_height_bits_minus_1: 10, - frame_width_bits_minus_1: 10, - initial_display_delay_minus_1: [], - initial_display_delay_present_flag: false, - max_frame_height_minus_1: 1079, - max_frame_width_minus_1: 1919, - operating_parameters_info: [], - operating_points_cnt_minus_1: 0, - orderHintBits: 7, - reduced_still_picture_header: false, - seq_force_integer_mv: 2, - seq_force_screen_content_tools: 2, - seq_level: [ - { - operating_point_idc: 0, - seq_level_idx: 8, - seq_tier: 0, - }, - ], - seq_profile: 0, - still_picture: false, - timing_info: null, - timing_info_present_flag: false, - type: 'av1-bitstream-header', - use_128x128_superblock: true, - film_grain_params_present: false, - }, + privateData: new Uint8Array([ + 129, 8, 12, 0, 10, 11, 0, 0, 0, 66, 171, 191, 195, 119, 111, 228, 1, + ]), }); expect(avc1Box).toBeTruthy(); @@ -153,77 +85,9 @@ test('AV1 in MP4 with colr atom', async () => { const avc1Box = getAv1CBox(traks); expect(avc1Box).toEqual({ type: 'av1C-box', - marker: 1, - version: 1, - seq_profile: 0, - seq_level_idx: 8, - seq_tier_0: 0, - chroma_sample_position: 0, - high_bitdepth: false, - twelve_bit: false, - mono_chrome: false, - chroma_subsampling_x: true, - chroma_subsampling_y: true, - reserved: 0, - initial_presentation_delay_minus_one: null, - av1HeaderSegment: { - additional_frame_id_length_minus_1: null, - color_config: { - bitDepth: 8, - chroma_sample_position: 0, - color_description_present_flag: true, - color_primaries: 1, - color_range: false, - matrix_coefficients: 1, - mono_chrome: false, - numPlanes: 3, - separate_uv_delta_q: 0, - subsampling_x: true, - subsampling_y: true, - transfer_characteristics: 1, - }, - decoder_model_info: null, - decoder_model_info_present_flag: false, - delta_frame_id_length_minus_2: null, - enable_cdef: false, - enable_dual_filter: 0, - enable_filter_intra: true, - enable_interintra_compound: 0, - enable_intra_edge_filter: false, - enable_jnt_comp: false, - enable_masked_compound: 0, - enable_order_hint: 0, - enable_ref_frame_mvs: false, - enable_restoration: false, - enable_superres: false, - enable_warped_motion: 0, - frame_height_bits_minus_1: 10, - frame_width_bits_minus_1: 10, - initial_display_delay_minus_1: [], - initial_display_delay_present_flag: false, - max_frame_height_minus_1: 1079, - max_frame_width_minus_1: 1919, - operating_parameters_info: [], - operating_points_cnt_minus_1: 0, - orderHintBits: 0, - reduced_still_picture_header: false, - seq_force_integer_mv: 2, - seq_force_screen_content_tools: 0, - seq_level: [ - { - operating_point_idc: 0, - seq_level_idx: 8, - seq_tier: 0, - }, - ], - seq_profile: 0, - still_picture: false, - timing_info: null, - timing_info_present_flag: false, - type: 'av1-bitstream-header', - use_128x128_superblock: true, - film_grain_params_present: false, - }, + privateData: new Uint8Array([ + 129, 8, 12, 0, 10, 14, 0, 0, 0, 66, 171, 191, 195, 118, 0, 8, 8, 8, 8, 32, + ]), }); expect(avc1Box).toBeTruthy(); diff --git a/packages/media-parser/src/test/matroska.test.ts b/packages/media-parser/src/test/matroska.test.ts index c63b3edc718..79c7b464182 100644 --- a/packages/media-parser/src/test/matroska.test.ts +++ b/packages/media-parser/src/test/matroska.test.ts @@ -201,69 +201,7 @@ test('Should get duration of AV1 video', async () => { keyframe: true, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-header', - seq_profile: 0, - still_picture: false, - reduced_still_picture_header: false, - timing_info_present_flag: false, - decoder_model_info_present_flag: false, - initial_display_delay_present_flag: false, - operating_points_cnt_minus_1: 0, - seq_level: [ - { - operating_point_idc: 0, - seq_level_idx: 8, - seq_tier: 0, - }, - ], - timing_info: null, - decoder_model_info: null, - operating_parameters_info: [], - initial_display_delay_minus_1: [], - frame_width_bits_minus_1: 10, - frame_height_bits_minus_1: 10, - max_frame_width_minus_1: 1919, - max_frame_height_minus_1: 1079, - delta_frame_id_length_minus_2: null, - additional_frame_id_length_minus_1: null, - use_128x128_superblock: true, - enable_filter_intra: true, - enable_intra_edge_filter: false, - color_config: { - bitDepth: 8, - numPlanes: 3, - color_primaries: 1, - transfer_characteristics: 1, - matrix_coefficients: 1, - separate_uv_delta_q: 0, - chroma_sample_position: 0, - color_range: false, - subsampling_x: true, - subsampling_y: true, - mono_chrome: false, - color_description_present_flag: true, - }, - film_grain_params_present: false, - enable_interintra_compound: 0, - enable_masked_compound: 0, - enable_warped_motion: 0, - enable_order_hint: 0, - enable_dual_filter: 0, - enable_jnt_comp: false, - enable_ref_frame_mvs: false, - seq_force_screen_content_tools: 0, - seq_force_integer_mv: 2, - enable_superres: false, - enable_cdef: false, - enable_restoration: false, - orderHintBits: 0, - }, - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -274,11 +212,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -289,11 +223,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -304,11 +234,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -319,11 +245,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -334,11 +256,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -349,11 +267,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -364,11 +278,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -379,11 +289,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -394,11 +300,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -409,11 +311,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -424,11 +322,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -439,11 +333,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -454,11 +344,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -469,11 +355,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -484,11 +366,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -499,11 +377,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -514,11 +388,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -529,11 +399,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -544,11 +410,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -559,11 +421,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -574,11 +432,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -589,11 +443,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -604,11 +454,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, { type: 'simple-block-segment', @@ -619,11 +465,7 @@ test('Should get duration of AV1 video', async () => { keyframe: false, lacing: [0, 0], invisible: false, - children: [ - { - type: 'av1-bitstream-unimplemented', - }, - ], + children: [], }, ], }, diff --git a/packages/media-parser/src/test/stream-local.test.ts b/packages/media-parser/src/test/stream-local.test.ts index 78222fc7e95..62cfc51f227 100644 --- a/packages/media-parser/src/test/stream-local.test.ts +++ b/packages/media-parser/src/test/stream-local.test.ts @@ -21,7 +21,8 @@ test('Should stream ISO base media', async () => { unrotatedDimension: true, }, reader: nodeReader, - onVideoTrack: () => { + onVideoTrack: (track) => { + expect(track.timescale).toBe(600); videoTracks++; return () => { videoSamples++; @@ -70,6 +71,7 @@ test('Should stream WebM with no duration', async () => { }, reader: nodeReader, onVideoTrack: (track) => { + expect(track.timescale).toBe(1000000); expect(track.codec).toBe('vp8'); expect(track.trackId).toBe(1); return () => { @@ -108,7 +110,9 @@ test('Should stream AV1', async () => { boxes: true, }, reader: nodeReader, - onVideoTrack: () => { + onVideoTrack: (track) => { + expect(track.timescale).toBe(1000000); + videoTracks++; return () => { videoSamples++; @@ -141,6 +145,9 @@ test('Should stream AV1', async () => { codedWidth: 1920, height: 1080, width: 1920, + displayAspectHeight: 1080, + displayAspectWidth: 1920, + rotation: 0, }); expect(parsed.audioTracks.length).toBe(0); expect(videoTracks).toBe(1); @@ -148,6 +155,7 @@ test('Should stream AV1', async () => { }); test('Should stream corrupted video', async () => { + let videoSamples = 0; const parsed = await parseMedia({ src: RenderInternals.exampleVideos.corrupted, fields: { @@ -159,6 +167,12 @@ test('Should stream corrupted video', async () => { tracks: true, rotation: true, }, + onVideoTrack: (track) => { + expect(track.timescale).toBe(24000); + return () => { + videoSamples++; + }; + }, reader: nodeReader, }); @@ -173,6 +187,7 @@ test('Should stream corrupted video', async () => { expect(parsed.videoTracks.length).toEqual(1); expect(parsed.videoTracks[0].codec).toBe('avc1.640028'); expect(parsed.rotation).toBe(0); + expect(videoSamples).toBe(720); }); test('Should stream screen recording video', async () => { @@ -187,6 +202,7 @@ test('Should stream screen recording video', async () => { tracks: true, rotation: true, }, + reader: nodeReader, }); @@ -282,6 +298,9 @@ test('Should stream variable fps video', async () => { codedWidth: 1280, height: 720, width: 1280, + displayAspectHeight: 720, + displayAspectWidth: 1280, + rotation: 0, }); expect(parsed.audioTracks.length).toBe(1); expect(parsed.audioTracks[0]).toEqual({ @@ -298,6 +317,8 @@ test('Should stream variable fps video', async () => { }); test('Should stream MKV video', async () => { + let videoSamples = 0; + let audioSamples = 0; const parsed = await parseMedia({ src: RenderInternals.exampleVideos.matroskaPcm16, fields: { @@ -307,6 +328,21 @@ test('Should stream MKV video', async () => { videoCodec: true, audioCodec: true, rotation: true, + boxes: true, + internalStats: true, + }, + onVideoTrack: (track) => { + expect(track.codec).toBe('avc1.640020'); + + return () => { + videoSamples++; + }; + }, + onAudioTrack: (track) => { + expect(track.codec).toBe('pcm-s16'); + return () => { + audioSamples++; + }; }, reader: nodeReader, }); @@ -318,9 +354,14 @@ test('Should stream MKV video', async () => { expect(parsed.audioCodec).toBe('pcm'); expect(parsed.rotation).toBe(0); expect(parsed.fps).toBe(null); + + expect(videoSamples).toBe(10); + expect(audioSamples).toBe(16); + expect(parsed.internalStats.samplesThatHadToBeQueued).toBe(0); }); test('Should stream MP3 in MP4 video', async () => { + let audioFrames = 0; const parsed = await parseMedia({ src: RenderInternals.exampleVideos.mp4withmp3, fields: { @@ -333,6 +374,15 @@ test('Should stream MP3 in MP4 video', async () => { rotation: true, boxes: true, }, + onAudioTrack: (track) => { + expect(track.type).toBe('audio'); + expect(track.codec).toBe('mp3'); + expect(track.sampleRate).toBe(48000); + expect(typeof track.description).toBe('undefined'); + return () => { + audioFrames++; + }; + }, reader: nodeReader, }); @@ -344,8 +394,9 @@ test('Should stream MP3 in MP4 video', async () => { expect(parsed.videoTracks.length).toEqual(1); expect(parsed.videoTracks[0].codec).toBe('avc1.640020'); expect(parsed.audioTracks.length).toEqual(1); - expect(parsed.audioTracks[0].codec).toBe('mp4a.6b'); + expect(parsed.audioTracks[0].codec).toBe('mp3'); expect(parsed.rotation).toBe(0); + expect(audioFrames).toBe(15); }); test('Should get duration of HEVC video', async () => { @@ -413,7 +464,7 @@ test('Custom DAR', async () => { }); expect(parsed.dimensions).toEqual({ height: 720, - width: 404.9717559814453, + width: 405, }); expect(parsed.durationInSeconds).toBe(5.725); expect(parsed.fps).toBe(30); @@ -428,7 +479,7 @@ test('Custom DAR', async () => { expect(parsed.rotation).toBe(0); expect(parsed.unrotatedDimension).toEqual({ height: 720, - width: 404.9717559814453, + width: 405, }); }); @@ -461,7 +512,7 @@ test('VP8 Vorbis', async () => { let videoSamples = 0; let audioSamples = 0; - await parseMedia({ + const {audioCodec} = await parseMedia({ src: RenderInternals.exampleVideos.vp8Vorbis, onVideoTrack: (track) => { expect(track.codec).toBe('vp8'); @@ -473,6 +524,9 @@ test('VP8 Vorbis', async () => { videoSamples++; }; }, + fields: { + audioCodec: true, + }, onAudioTrack: (track) => { expect(track.codec).toBe('vorbis'); expect(track.timescale).toBe(1000000); @@ -487,6 +541,8 @@ test('VP8 Vorbis', async () => { expect(videoSamples).toBe(812); expect(audioSamples).toBe(1496); + + expect(audioCodec).toBe('vorbis'); }); test('VP9', async () => { @@ -531,6 +587,103 @@ test('Stretched VP8', async () => { trackId: 1, type: 'video', width: 1920, + displayAspectHeight: 1080, + displayAspectWidth: 1920, + rotation: 0, }, ]); }); + +test('HEVC and AAC in Matroska', async () => { + let audioSamples = 0; + let videoSamples = 0; + + const parsed = await parseMedia({ + src: RenderInternals.exampleVideos.matroskaH265Aac, + fields: { + tracks: true, + videoCodec: true, + audioCodec: true, + boxes: true, + }, + reader: nodeReader, + onAudioTrack: (audioTrack) => { + expect(audioTrack.codec).toEqual('mp4a.40.02'); + return () => { + audioSamples++; + }; + }, + onVideoTrack: (videoTrack) => { + expect(videoTrack.codec).toEqual('hvc1.1.6.L93.90'); + return () => { + videoSamples++; + }; + }, + }); + + expect(parsed.videoCodec).toEqual('h265'); + expect(parsed.audioCodec).toEqual('aac'); + expect(parsed.videoTracks.length).toBe(1); + expect(parsed.audioTracks.length).toBe(1); + expect(audioSamples).toBe(159); + expect(videoSamples).toBe(100); +}); + +test('MP3 in matroska', async () => { + let videoSamples = 0; + let audioSamples = 0; + + const parsed = await parseMedia({ + src: RenderInternals.exampleVideos.matroskaMp3, + fields: { + tracks: true, + videoCodec: true, + audioCodec: true, + boxes: true, + }, + reader: nodeReader, + onAudioTrack: (audioTrack) => { + expect(audioTrack.codec).toEqual('mp3'); + return () => { + audioSamples++; + }; + }, + onVideoTrack: (videoTrack) => { + expect(videoTrack.codec).toEqual('avc1.64001f'); + return () => { + videoSamples++; + }; + }, + }); + + expect(parsed.videoCodec).toEqual('h264'); + expect(parsed.audioCodec).toEqual('mp3'); + expect(parsed.videoTracks.length).toBe(1); + expect(parsed.audioTracks.length).toBe(1); + expect(audioSamples).toBe(139); + expect(videoSamples).toBe(100); +}); + +test('Should stream OPUS', async () => { + let audioSamples = 0; + const parsed = await parseMedia({ + src: RenderInternals.exampleVideos.opusWebm, + fields: { + tracks: true, + audioCodec: true, + }, + reader: nodeReader, + onAudioTrack: (track) => { + expect(track.codec).toEqual('opus'); + expect(typeof track.description).toEqual('undefined'); + return (samples) => { + expect(samples.type).toEqual('key'); + audioSamples++; + }; + }, + }); + + expect(parsed.audioCodec).toEqual('opus'); + expect(parsed.audioTracks.length).toBe(1); + expect(audioSamples).toBe(166); +}); diff --git a/packages/media-parser/src/test/stream-samples.test.ts b/packages/media-parser/src/test/stream-samples.test.ts index 88d593b5b48..28f0880b3c1 100644 --- a/packages/media-parser/src/test/stream-samples.test.ts +++ b/packages/media-parser/src/test/stream-samples.test.ts @@ -117,6 +117,9 @@ test('Stream samples', async () => { height: 1080, codedWidth: 1080, codedHeight: 1080, + displayAspectHeight: 1080, + displayAspectWidth: 1080, + rotation: 0, }, ]); @@ -248,7 +251,7 @@ test('Stream samples', async () => { ], timescale: 48000, numberOfChannels: 2, - codec: 'mp4a.6b', + codec: 'mp3', sampleRate: 48000, description: undefined, }, diff --git a/packages/media-parser/src/test/stsd.test.ts b/packages/media-parser/src/test/stsd.test.ts index b6e4555e0d8..fa2c4a5c603 100644 --- a/packages/media-parser/src/test/stsd.test.ts +++ b/packages/media-parser/src/test/stsd.test.ts @@ -4,7 +4,7 @@ import {parseStsd} from '../boxes/iso-base-media/stsd/stsd'; import {getArrayBufferIterator} from '../buffer-iterator'; import {makeParserState} from '../parser-state'; -test('Should be able to parse a STSD audio box correctly', () => { +test('Should be able to parse a STSD audio box correctly', async () => { const buffer = Uint8Array.from([ // box size 0, 0, 0, 159, @@ -38,7 +38,7 @@ test('Should be able to parse a STSD audio box correctly', () => { const iterator = getArrayBufferIterator(buffer); iterator.discard(8); - const parsed = parseStsd({ + const parsed = await parseStsd({ iterator, offset: 0, size: 159, @@ -144,7 +144,7 @@ test('Should be able to parse a STSD audio box correctly', () => { }); }); -test('Should be able to parse a STSD video box correctly', () => { +test('Should be able to parse a STSD video box correctly', async () => { const buffer = Uint8Array.from([ // box size 0, 0, 0, 158, @@ -204,7 +204,7 @@ test('Should be able to parse a STSD video box correctly', () => { 0, 0, 0, 16, 112, 97, 115, 112, 0, 0, 0, 1, 0, 0, 0, 1, ]); - const parsed = processSample({ + const parsed = await processSample({ iterator: getArrayBufferIterator(buffer), options: { canSkipVideoData: true, @@ -241,7 +241,7 @@ test('Should be able to parse a STSD video box correctly', () => { colorTableId: -1, descriptors: [ { - data: new Uint8Array([ + description: new Uint8Array([ 1, 100, 0, 32, 255, 225, 0, 27, 103, 100, 0, 32, 172, 217, 64, 68, 2, 39, 150, 92, 4, 64, 0, 0, 3, 0, 64, 0, 0, 12, 3, 198, 12, 101, 128, 1, 0, 6, 104, 235, 224, 140, 178, 44, 253, 248, 248, 0, diff --git a/packages/media-parser/src/traversal.ts b/packages/media-parser/src/traversal.ts index 4ac6806fb46..649e546aa60 100644 --- a/packages/media-parser/src/traversal.ts +++ b/packages/media-parser/src/traversal.ts @@ -144,7 +144,7 @@ export const getVideoDescriptors = (trakBox: TrakBox): Uint8Array | null => { return s.type === 'video' ? s.descriptors.map((d) => { return d.type === 'avcc-box' - ? d.data + ? d.description : d.type === 'hvcc-box' ? d.data : null; @@ -339,6 +339,23 @@ export const getNumberOfChannels = (track: TrackEntrySegment): number => { return channels.channels; }; +export const getBitDepth = (track: TrackEntrySegment): number | null => { + const audioSegment = getAudioSegment(track); + if (!audioSegment) { + return null; + } + + const bitDepth = audioSegment.children.find( + (b) => b.type === 'bit-depth-segment', + ); + + if (!bitDepth || bitDepth.type !== 'bit-depth-segment') { + return null; + } + + return bitDepth.bitDepth; +}; + export const getPrivateData = (track: TrackEntrySegment): Uint8Array | null => { const privateData = track.children.find( (b) => b.type === 'codec-private-segment', diff --git a/packages/media-parser/src/webcodec-sample-types.ts b/packages/media-parser/src/webcodec-sample-types.ts index 4de9518fe06..84b2e05ba89 100644 --- a/packages/media-parser/src/webcodec-sample-types.ts +++ b/packages/media-parser/src/webcodec-sample-types.ts @@ -18,8 +18,13 @@ export type VideoSample = { dts: number | null; }; -export type OnAudioSample = (sample: AudioSample) => void; -export type OnVideoSample = (sample: VideoSample) => void; +export type OnAudioSample = (sample: AudioSample) => void | Promise; +export type OnVideoSample = (sample: VideoSample) => void | Promise; -export type OnAudioTrack = (track: AudioTrack) => OnAudioSample | null; -export type OnVideoTrack = (track: VideoTrack) => OnVideoSample | null; +export type OnAudioTrack = ( + track: AudioTrack, +) => OnAudioSample | Promise | null; + +export type OnVideoTrack = ( + track: VideoTrack, +) => OnVideoSample | Promise | null; diff --git a/packages/renderer/src/example-videos.ts b/packages/renderer/src/example-videos.ts index dd9073d9425..a0bf3bf5a71 100644 --- a/packages/renderer/src/example-videos.ts +++ b/packages/renderer/src/example-videos.ts @@ -44,4 +44,7 @@ export const exampleVideos = { vp8Vorbis: path.join(examplePackage, 'public', 'vp8-vorbis.webm'), vp9: path.join(examplePackage, 'public', 'vp9.webm'), stretchedVp8: path.join(examplePackage, 'public', 'stretched-vp8.webm'), + matroskaMp3: path.join(examplePackage, 'public', 'matroska-mp3.mkv'), + matroskaH265Aac: path.join(examplePackage, 'public', 'matroska-h265-aac.mkv'), + opusWebm: path.join(examplePackage, 'public', 'opus.webm'), }; diff --git a/packages/studio/src/error-overlay/remotion-overlay/Overlay.tsx b/packages/studio/src/error-overlay/remotion-overlay/Overlay.tsx index 52f31667d06..b49c7a0d3e9 100644 --- a/packages/studio/src/error-overlay/remotion-overlay/Overlay.tsx +++ b/packages/studio/src/error-overlay/remotion-overlay/Overlay.tsx @@ -80,7 +80,8 @@ export const Overlay: React.FC = () => { {errors.errors.map((err, i) => { return (