@aibee/owlly 1.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.external.md +75 -0
- package/README.md +28 -0
- package/lib/src/external/lines/line-geometry.d.ts +9 -0
- package/lib/src/external/lines/line-geometry.js +52 -0
- package/lib/src/external/lines/line-geometry.js.map +1 -0
- package/lib/src/external/lines/line-material.d.ts +10 -0
- package/lib/src/external/lines/line-material.js +377 -0
- package/lib/src/external/lines/line-material.js.map +1 -0
- package/lib/src/external/lines/line-segments-2.d.ts +7 -0
- package/lib/src/external/lines/line-segments-2.js +144 -0
- package/lib/src/external/lines/line-segments-2.js.map +1 -0
- package/lib/src/external/lines/line-segments-geometry.d.ts +15 -0
- package/lib/src/external/lines/line-segments-geometry.js +141 -0
- package/lib/src/external/lines/line-segments-geometry.js.map +1 -0
- package/lib/src/external/loaders/gltf-loader.d.ts +77 -0
- package/lib/src/external/loaders/gltf-loader.js +2319 -0
- package/lib/src/external/loaders/gltf-loader.js.map +1 -0
- package/lib/src/external/orbit-controls.d.ts +44 -0
- package/lib/src/external/orbit-controls.js +746 -0
- package/lib/src/external/orbit-controls.js.map +1 -0
- package/lib/src/external/renderers/css-2d-renderer.d.ts +16 -0
- package/lib/src/external/renderers/css-2d-renderer.js +122 -0
- package/lib/src/external/renderers/css-2d-renderer.js.map +1 -0
- package/lib/src/external/renderers/css-3d-renderer.d.ts +18 -0
- package/lib/src/external/renderers/css-3d-renderer.js +139 -0
- package/lib/src/external/renderers/css-3d-renderer.js.map +1 -0
- package/lib/src/external/transform-controls.d.ts +106 -0
- package/lib/src/external/transform-controls.js +1113 -0
- package/lib/src/external/transform-controls.js.map +1 -0
- package/lib/src/external/util/buffer-geometry-utils.d.ts +45 -0
- package/lib/src/external/util/buffer-geometry-utils.js +569 -0
- package/lib/src/external/util/buffer-geometry-utils.js.map +1 -0
- package/lib/src/owlly/controller/aerial-element-controller.d.ts +65 -0
- package/lib/src/owlly/controller/aerial-element-controller.js +236 -0
- package/lib/src/owlly/controller/aerial-element-controller.js.map +1 -0
- package/lib/src/owlly/controller/basic-controller.d.ts +324 -0
- package/lib/src/owlly/controller/basic-controller.js +1239 -0
- package/lib/src/owlly/controller/basic-controller.js.map +1 -0
- package/lib/src/owlly/controller/camera-controller.d.ts +37 -0
- package/lib/src/owlly/controller/camera-controller.js +138 -0
- package/lib/src/owlly/controller/camera-controller.js.map +1 -0
- package/lib/src/owlly/controller/controller.d.ts +61 -0
- package/lib/src/owlly/controller/controller.js +24 -0
- package/lib/src/owlly/controller/controller.js.map +1 -0
- package/lib/src/owlly/controller/index.d.ts +2 -0
- package/lib/src/owlly/controller/index.js +14 -0
- package/lib/src/owlly/controller/index.js.map +1 -0
- package/lib/src/owlly/controller/mouse-indicator-controller.d.ts +34 -0
- package/lib/src/owlly/controller/mouse-indicator-controller.js +119 -0
- package/lib/src/owlly/controller/mouse-indicator-controller.js.map +1 -0
- package/lib/src/owlly/controller/orbit-control.d.ts +147 -0
- package/lib/src/owlly/controller/orbit-control.js +265 -0
- package/lib/src/owlly/controller/orbit-control.js.map +1 -0
- package/lib/src/owlly/controller/panorama-adjust-controller.d.ts +45 -0
- package/lib/src/owlly/controller/panorama-adjust-controller.js +158 -0
- package/lib/src/owlly/controller/panorama-adjust-controller.js.map +1 -0
- package/lib/src/owlly/controller/panorama-controller.d.ts +441 -0
- package/lib/src/owlly/controller/panorama-controller.js +1944 -0
- package/lib/src/owlly/controller/panorama-controller.js.map +1 -0
- package/lib/src/owlly/controller/panorama-transform-controller.d.ts +66 -0
- package/lib/src/owlly/controller/panorama-transform-controller.js +137 -0
- package/lib/src/owlly/controller/panorama-transform-controller.js.map +1 -0
- package/lib/src/owlly/controller/plane-controller.d.ts +43 -0
- package/lib/src/owlly/controller/plane-controller.js +174 -0
- package/lib/src/owlly/controller/plane-controller.js.map +1 -0
- package/lib/src/owlly/controller/texture-controller.d.ts +181 -0
- package/lib/src/owlly/controller/texture-controller.js +876 -0
- package/lib/src/owlly/controller/texture-controller.js.map +1 -0
- package/lib/src/owlly/controller/tile-panorama-controller.d.ts +308 -0
- package/lib/src/owlly/controller/tile-panorama-controller.js +1354 -0
- package/lib/src/owlly/controller/tile-panorama-controller.js.map +1 -0
- package/lib/src/owlly/controller/transform-controller.d.ts +106 -0
- package/lib/src/owlly/controller/transform-controller.js +546 -0
- package/lib/src/owlly/controller/transform-controller.js.map +1 -0
- package/lib/src/owlly/element/bottom-nav-element.d.ts +65 -0
- package/lib/src/owlly/element/bottom-nav-element.js +258 -0
- package/lib/src/owlly/element/bottom-nav-element.js.map +1 -0
- package/lib/src/owlly/element/camera.d.ts +82 -0
- package/lib/src/owlly/element/camera.js +284 -0
- package/lib/src/owlly/element/camera.js.map +1 -0
- package/lib/src/owlly/element/dom-2d-element.d.ts +35 -0
- package/lib/src/owlly/element/dom-2d-element.js +49 -0
- package/lib/src/owlly/element/dom-2d-element.js.map +1 -0
- package/lib/src/owlly/element/dom-3d-element.d.ts +27 -0
- package/lib/src/owlly/element/dom-3d-element.js +34 -0
- package/lib/src/owlly/element/dom-3d-element.js.map +1 -0
- package/lib/src/owlly/element/dom-label-2d.d.ts +116 -0
- package/lib/src/owlly/element/dom-label-2d.js +383 -0
- package/lib/src/owlly/element/dom-label-2d.js.map +1 -0
- package/lib/src/owlly/element/element.d.ts +53 -0
- package/lib/src/owlly/element/element.js +76 -0
- package/lib/src/owlly/element/element.js.map +1 -0
- package/lib/src/owlly/element/floor-model.d.ts +83 -0
- package/lib/src/owlly/element/floor-model.js +228 -0
- package/lib/src/owlly/element/floor-model.js.map +1 -0
- package/lib/src/owlly/element/gif-kit/Gif.d.ts +96 -0
- package/lib/src/owlly/element/gif-kit/Gif.js +433 -0
- package/lib/src/owlly/element/gif-kit/Gif.js.map +1 -0
- package/lib/src/owlly/element/gif-kit/GifColor.d.ts +21 -0
- package/lib/src/owlly/element/gif-kit/GifColor.js +38 -0
- package/lib/src/owlly/element/gif-kit/GifColor.js.map +1 -0
- package/lib/src/owlly/element/gif-kit/GifCompressedCodesToByteArrayConverter.d.ts +20 -0
- package/lib/src/owlly/element/gif-kit/GifCompressedCodesToByteArrayConverter.js +51 -0
- package/lib/src/owlly/element/gif-kit/GifCompressedCodesToByteArrayConverter.js.map +1 -0
- package/lib/src/owlly/element/gif-kit/GifFrame.d.ts +31 -0
- package/lib/src/owlly/element/gif-kit/GifFrame.js +97 -0
- package/lib/src/owlly/element/gif-kit/GifFrame.js.map +1 -0
- package/lib/src/owlly/element/gif-kit/GifImage.d.ts +23 -0
- package/lib/src/owlly/element/gif-kit/GifImage.js +8 -0
- package/lib/src/owlly/element/gif-kit/GifImage.js.map +1 -0
- package/lib/src/owlly/element/gif-kit/GifParser.d.ts +17 -0
- package/lib/src/owlly/element/gif-kit/GifParser.js +197 -0
- package/lib/src/owlly/element/gif-kit/GifParser.js.map +1 -0
- package/lib/src/owlly/element/gif-kit/GifPresenter.d.ts +20 -0
- package/lib/src/owlly/element/gif-kit/GifPresenter.js +44 -0
- package/lib/src/owlly/element/gif-kit/GifPresenter.js.map +1 -0
- package/lib/src/owlly/element/gif-kit/GifVersion.d.ts +10 -0
- package/lib/src/owlly/element/gif-kit/GifVersion.js +13 -0
- package/lib/src/owlly/element/gif-kit/GifVersion.js.map +1 -0
- package/lib/src/owlly/element/gltf-mesh-element.d.ts +31 -0
- package/lib/src/owlly/element/gltf-mesh-element.js +137 -0
- package/lib/src/owlly/element/gltf-mesh-element.js.map +1 -0
- package/lib/src/owlly/element/index.d.ts +20 -0
- package/lib/src/owlly/element/index.js +25 -0
- package/lib/src/owlly/element/index.js.map +1 -0
- package/lib/src/owlly/element/map-kit/area.d.ts +24 -0
- package/lib/src/owlly/element/map-kit/area.js +218 -0
- package/lib/src/owlly/element/map-kit/area.js.map +1 -0
- package/lib/src/owlly/element/map-kit/block-set.d.ts +39 -0
- package/lib/src/owlly/element/map-kit/block-set.js +91 -0
- package/lib/src/owlly/element/map-kit/block-set.js.map +1 -0
- package/lib/src/owlly/element/map-kit/block.d.ts +77 -0
- package/lib/src/owlly/element/map-kit/block.js +339 -0
- package/lib/src/owlly/element/map-kit/block.js.map +1 -0
- package/lib/src/owlly/element/map-kit/index.d.ts +4 -0
- package/lib/src/owlly/element/map-kit/index.js +7 -0
- package/lib/src/owlly/element/map-kit/index.js.map +1 -0
- package/lib/src/owlly/element/map-kit/shape.d.ts +131 -0
- package/lib/src/owlly/element/map-kit/shape.js +190 -0
- package/lib/src/owlly/element/map-kit/shape.js.map +1 -0
- package/lib/src/owlly/element/mesh-element.d.ts +22 -0
- package/lib/src/owlly/element/mesh-element.js +64 -0
- package/lib/src/owlly/element/mesh-element.js.map +1 -0
- package/lib/src/owlly/element/mesh-line-2d.d.ts +82 -0
- package/lib/src/owlly/element/mesh-line-2d.js +888 -0
- package/lib/src/owlly/element/mesh-line-2d.js.map +1 -0
- package/lib/src/owlly/element/meshline-o.d.ts +64 -0
- package/lib/src/owlly/element/meshline-o.js +679 -0
- package/lib/src/owlly/element/meshline-o.js.map +1 -0
- package/lib/src/owlly/element/panorama-group.d.ts +241 -0
- package/lib/src/owlly/element/panorama-group.js +967 -0
- package/lib/src/owlly/element/panorama-group.js.map +1 -0
- package/lib/src/owlly/element/panorama.d.ts +132 -0
- package/lib/src/owlly/element/panorama.js +813 -0
- package/lib/src/owlly/element/panorama.js.map +1 -0
- package/lib/src/owlly/element/path-group.d.ts +69 -0
- package/lib/src/owlly/element/path-group.js +172 -0
- package/lib/src/owlly/element/path-group.js.map +1 -0
- package/lib/src/owlly/element/path.d.ts +99 -0
- package/lib/src/owlly/element/path.js +532 -0
- package/lib/src/owlly/element/path.js.map +1 -0
- package/lib/src/owlly/element/placeable-2d.d.ts +158 -0
- package/lib/src/owlly/element/placeable-2d.js +471 -0
- package/lib/src/owlly/element/placeable-2d.js.map +1 -0
- package/lib/src/owlly/element/polygon-mesh.d.ts +107 -0
- package/lib/src/owlly/element/polygon-mesh.js +308 -0
- package/lib/src/owlly/element/polygon-mesh.js.map +1 -0
- package/lib/src/owlly/element/ring-element.d.ts +79 -0
- package/lib/src/owlly/element/ring-element.js +384 -0
- package/lib/src/owlly/element/ring-element.js.map +1 -0
- package/lib/src/owlly/element/sphere-mesh.d.ts +28 -0
- package/lib/src/owlly/element/sphere-mesh.js +70 -0
- package/lib/src/owlly/element/sphere-mesh.js.map +1 -0
- package/lib/src/owlly/element/svg-floor-model.d.ts +22 -0
- package/lib/src/owlly/element/svg-floor-model.js +185 -0
- package/lib/src/owlly/element/svg-floor-model.js.map +1 -0
- package/lib/src/owlly/element/svg-floors.d.ts +27 -0
- package/lib/src/owlly/element/svg-floors.js +110 -0
- package/lib/src/owlly/element/svg-floors.js.map +1 -0
- package/lib/src/owlly/element/tile-panorama-group.d.ts +335 -0
- package/lib/src/owlly/element/tile-panorama-group.js +1007 -0
- package/lib/src/owlly/element/tile-panorama-group.js.map +1 -0
- package/lib/src/owlly/element/tile-panorama.d.ts +161 -0
- package/lib/src/owlly/element/tile-panorama.js +511 -0
- package/lib/src/owlly/element/tile-panorama.js.map +1 -0
- package/lib/src/owlly/element/tile-plane.d.ts +105 -0
- package/lib/src/owlly/element/tile-plane.js +361 -0
- package/lib/src/owlly/element/tile-plane.js.map +1 -0
- package/lib/src/owlly/element/video-element.d.ts +33 -0
- package/lib/src/owlly/element/video-element.js +160 -0
- package/lib/src/owlly/element/video-element.js.map +1 -0
- package/lib/src/owlly/geometries/ExtrudeGeometry2.d.ts +15 -0
- package/lib/src/owlly/geometries/ExtrudeGeometry2.js +211 -0
- package/lib/src/owlly/geometries/ExtrudeGeometry2.js.map +1 -0
- package/lib/src/owlly/index.d.ts +13 -0
- package/lib/src/owlly/index.js +17 -0
- package/lib/src/owlly/index.js.map +1 -0
- package/lib/src/owlly/overlay/canvas-overlay.d.ts +96 -0
- package/lib/src/owlly/overlay/canvas-overlay.js +511 -0
- package/lib/src/owlly/overlay/canvas-overlay.js.map +1 -0
- package/lib/src/owlly/overlay/css-2d-overlay.d.ts +14 -0
- package/lib/src/owlly/overlay/css-2d-overlay.js +36 -0
- package/lib/src/owlly/overlay/css-2d-overlay.js.map +1 -0
- package/lib/src/owlly/overlay/css-3d-overlay.d.ts +16 -0
- package/lib/src/owlly/overlay/css-3d-overlay.js +37 -0
- package/lib/src/owlly/overlay/css-3d-overlay.js.map +1 -0
- package/lib/src/owlly/overlay/index.d.ts +6 -0
- package/lib/src/owlly/overlay/index.js +12 -0
- package/lib/src/owlly/overlay/index.js.map +1 -0
- package/lib/src/owlly/overlay/label-overlay.d.ts +62 -0
- package/lib/src/owlly/overlay/label-overlay.js +329 -0
- package/lib/src/owlly/overlay/label-overlay.js.map +1 -0
- package/lib/src/owlly/overlay/overlay.d.ts +14 -0
- package/lib/src/owlly/overlay/overlay.js +5 -0
- package/lib/src/owlly/overlay/overlay.js.map +1 -0
- package/lib/src/owlly/overlay/path-overlay.d.ts +39 -0
- package/lib/src/owlly/overlay/path-overlay.js +125 -0
- package/lib/src/owlly/overlay/path-overlay.js.map +1 -0
- package/lib/src/owlly/overlay/path-overlay2.d.ts +35 -0
- package/lib/src/owlly/overlay/path-overlay2.js +119 -0
- package/lib/src/owlly/overlay/path-overlay2.js.map +1 -0
- package/lib/src/owlly/overlay/poi-overlay-3d.d.ts +278 -0
- package/lib/src/owlly/overlay/poi-overlay-3d.js +1433 -0
- package/lib/src/owlly/overlay/poi-overlay-3d.js.map +1 -0
- package/lib/src/owlly/overlay/poi-overlay.d.ts +277 -0
- package/lib/src/owlly/overlay/poi-overlay.js +1412 -0
- package/lib/src/owlly/overlay/poi-overlay.js.map +1 -0
- package/lib/src/owlly/owlly-2d/index.d.ts +28 -0
- package/lib/src/owlly/owlly-2d/index.js +93 -0
- package/lib/src/owlly/owlly-2d/index.js.map +1 -0
- package/lib/src/owlly/screen/index.d.ts +1 -0
- package/lib/src/owlly/screen/index.js +2 -0
- package/lib/src/owlly/screen/index.js.map +1 -0
- package/lib/src/owlly/screen/screen.d.ts +73 -0
- package/lib/src/owlly/screen/screen.js +237 -0
- package/lib/src/owlly/screen/screen.js.map +1 -0
- package/lib/src/owlly/stage/__test__/stage.spec.d.ts +1 -0
- package/lib/src/owlly/stage/__test__/stage.spec.js +15 -0
- package/lib/src/owlly/stage/__test__/stage.spec.js.map +1 -0
- package/lib/src/owlly/stage/externals.d.ts +19 -0
- package/lib/src/owlly/stage/externals.js +25 -0
- package/lib/src/owlly/stage/externals.js.map +1 -0
- package/lib/src/owlly/stage/index.d.ts +4 -0
- package/lib/src/owlly/stage/index.js +7 -0
- package/lib/src/owlly/stage/index.js.map +1 -0
- package/lib/src/owlly/stage/owlly.d.ts +38 -0
- package/lib/src/owlly/stage/owlly.js +168 -0
- package/lib/src/owlly/stage/owlly.js.map +1 -0
- package/lib/src/owlly/stage/stage.d.ts +108 -0
- package/lib/src/owlly/stage/stage.js +235 -0
- package/lib/src/owlly/stage/stage.js.map +1 -0
- package/lib/src/owlly/utils/alignment-utils.d.ts +20 -0
- package/lib/src/owlly/utils/alignment-utils.js +64 -0
- package/lib/src/owlly/utils/alignment-utils.js.map +1 -0
- package/lib/src/owlly/utils/basic-calc.d.ts +18 -0
- package/lib/src/owlly/utils/basic-calc.js +130 -0
- package/lib/src/owlly/utils/basic-calc.js.map +1 -0
- package/lib/src/owlly/utils/basic-tools.d.ts +71 -0
- package/lib/src/owlly/utils/basic-tools.js +236 -0
- package/lib/src/owlly/utils/basic-tools.js.map +1 -0
- package/lib/src/owlly/utils/bvh-tree.d.ts +105 -0
- package/lib/src/owlly/utils/bvh-tree.js +540 -0
- package/lib/src/owlly/utils/bvh-tree.js.map +1 -0
- package/lib/src/owlly/utils/camera.d.ts +37 -0
- package/lib/src/owlly/utils/camera.js +51 -0
- package/lib/src/owlly/utils/camera.js.map +1 -0
- package/lib/src/owlly/utils/cube-texture-cache.d.ts +25 -0
- package/lib/src/owlly/utils/cube-texture-cache.js +144 -0
- package/lib/src/owlly/utils/cube-texture-cache.js.map +1 -0
- package/lib/src/owlly/utils/device-utils.d.ts +18 -0
- package/lib/src/owlly/utils/device-utils.js +42 -0
- package/lib/src/owlly/utils/device-utils.js.map +1 -0
- package/lib/src/owlly/utils/environment-utils.d.ts +37 -0
- package/lib/src/owlly/utils/environment-utils.js +74 -0
- package/lib/src/owlly/utils/environment-utils.js.map +1 -0
- package/lib/src/owlly/utils/event-hub.d.ts +50 -0
- package/lib/src/owlly/utils/event-hub.js +107 -0
- package/lib/src/owlly/utils/event-hub.js.map +1 -0
- package/lib/src/owlly/utils/events.d.ts +219 -0
- package/lib/src/owlly/utils/events.js +220 -0
- package/lib/src/owlly/utils/events.js.map +1 -0
- package/lib/src/owlly/utils/geometry-utils.d.ts +119 -0
- package/lib/src/owlly/utils/geometry-utils.js +623 -0
- package/lib/src/owlly/utils/geometry-utils.js.map +1 -0
- package/lib/src/owlly/utils/helper.d.ts +6 -0
- package/lib/src/owlly/utils/helper.js +25 -0
- package/lib/src/owlly/utils/helper.js.map +1 -0
- package/lib/src/owlly/utils/index.d.ts +14 -0
- package/lib/src/owlly/utils/index.js +18 -0
- package/lib/src/owlly/utils/index.js.map +1 -0
- package/lib/src/owlly/utils/lru-cache.d.ts +26 -0
- package/lib/src/owlly/utils/lru-cache.js +110 -0
- package/lib/src/owlly/utils/lru-cache.js.map +1 -0
- package/lib/src/owlly/utils/map-utils.d.ts +7 -0
- package/lib/src/owlly/utils/map-utils.js +53 -0
- package/lib/src/owlly/utils/map-utils.js.map +1 -0
- package/lib/src/owlly/utils/number-utils.d.ts +8 -0
- package/lib/src/owlly/utils/number-utils.js +73 -0
- package/lib/src/owlly/utils/number-utils.js.map +1 -0
- package/lib/src/owlly/utils/panorama-model-util.d.ts +46 -0
- package/lib/src/owlly/utils/panorama-model-util.js +246 -0
- package/lib/src/owlly/utils/panorama-model-util.js.map +1 -0
- package/lib/src/owlly/utils/path-utils.d.ts +80 -0
- package/lib/src/owlly/utils/path-utils.js +729 -0
- package/lib/src/owlly/utils/path-utils.js.map +1 -0
- package/lib/src/owlly/utils/svgutils.d.ts +138 -0
- package/lib/src/owlly/utils/svgutils.js +562 -0
- package/lib/src/owlly/utils/svgutils.js.map +1 -0
- package/lib/src/owlly/utils/texture-cache.d.ts +29 -0
- package/lib/src/owlly/utils/texture-cache.js +116 -0
- package/lib/src/owlly/utils/texture-cache.js.map +1 -0
- package/lib/src/owlly/utils/tile-util.d.ts +187 -0
- package/lib/src/owlly/utils/tile-util.js +457 -0
- package/lib/src/owlly/utils/tile-util.js.map +1 -0
- package/lib/src/owlly/utils/time-profiler.d.ts +21 -0
- package/lib/src/owlly/utils/time-profiler.js +49 -0
- package/lib/src/owlly/utils/time-profiler.js.map +1 -0
- package/lib/src/owlly/view/__test__/perspective-view.spec.d.ts +0 -0
- package/lib/src/owlly/view/__test__/perspective-view.spec.js +22 -0
- package/lib/src/owlly/view/__test__/perspective-view.spec.js.map +1 -0
- package/lib/src/owlly/view/camera-view.d.ts +35 -0
- package/lib/src/owlly/view/camera-view.js +102 -0
- package/lib/src/owlly/view/camera-view.js.map +1 -0
- package/lib/src/owlly/view/index.d.ts +3 -0
- package/lib/src/owlly/view/index.js +6 -0
- package/lib/src/owlly/view/index.js.map +1 -0
- package/lib/src/owlly/view/orthographic-view.d.ts +40 -0
- package/lib/src/owlly/view/orthographic-view.js +95 -0
- package/lib/src/owlly/view/orthographic-view.js.map +1 -0
- package/lib/src/owlly/view/perspective-view.d.ts +40 -0
- package/lib/src/owlly/view/perspective-view.js +96 -0
- package/lib/src/owlly/view/perspective-view.js.map +1 -0
- package/lib/src/owlly/view/svg-map-view.d.ts +46 -0
- package/lib/src/owlly/view/svg-map-view.js +145 -0
- package/lib/src/owlly/view/svg-map-view.js.map +1 -0
- package/lib/src/owlly/view/view.d.ts +146 -0
- package/lib/src/owlly/view/view.js +318 -0
- package/lib/src/owlly/view/view.js.map +1 -0
- package/lib/src/web/main.centroid.d.ts +0 -0
- package/lib/src/web/main.centroid.js +74 -0
- package/lib/src/web/main.centroid.js.map +1 -0
- package/lib/src/web/main.hyma.meshline2d.d.ts +1 -0
- package/lib/src/web/main.hyma.meshline2d.js +76 -0
- package/lib/src/web/main.hyma.meshline2d.js.map +1 -0
- package/lib/src/web/main.jyfang.sample.d.ts +0 -0
- package/lib/src/web/main.jyfang.sample.js +122 -0
- package/lib/src/web/main.jyfang.sample.js.map +1 -0
- package/lib/src/web/main.rpeng.extrude.d.ts +1 -0
- package/lib/src/web/main.rpeng.extrude.js +180 -0
- package/lib/src/web/main.rpeng.extrude.js.map +1 -0
- package/lib/src/web/main.rpeng.mes.plane.d.ts +1 -0
- package/lib/src/web/main.rpeng.mes.plane.js +135 -0
- package/lib/src/web/main.rpeng.mes.plane.js.map +1 -0
- package/lib/src/web/main.rpeng.sample.d.ts +0 -0
- package/lib/src/web/main.rpeng.sample.js +318 -0
- package/lib/src/web/main.rpeng.sample.js.map +1 -0
- package/lib/src/web/main.rpeng.vr.d.ts +1 -0
- package/lib/src/web/main.rpeng.vr.js +141 -0
- package/lib/src/web/main.rpeng.vr.js.map +1 -0
- package/lib/src/web/main.sample.d.ts +1 -0
- package/lib/src/web/main.sample.js +52 -0
- package/lib/src/web/main.sample.js.map +1 -0
- package/lib/src/web/quattree.hyma.d.ts +0 -0
- package/lib/src/web/quattree.hyma.js +150 -0
- package/lib/src/web/quattree.hyma.js.map +1 -0
- package/lib/src/web/sensor-vr-plugin.d.ts +0 -0
- package/lib/src/web/sensor-vr-plugin.js +166 -0
- package/lib/src/web/sensor-vr-plugin.js.map +1 -0
- package/package.json +142 -0
- package/src/@types/SceneUtils.d.ts +9 -0
- package/src/@types/chaikin-smooth.d.ts +5 -0
- package/src/@types/global.d.ts +3 -0
- package/src/@types/snapsvg.d.ts +11 -0
- package/src/@types/svgson.d.ts +30 -0
- package/src/assets/favicon.ico +0 -0
- package/src/external/lines/line-geometry.ts +70 -0
- package/src/external/lines/line-material.ts +453 -0
- package/src/external/lines/line-segments-2.ts +194 -0
- package/src/external/lines/line-segments-geometry.ts +197 -0
- package/src/external/loaders/gltf-loader.ts +3004 -0
- package/src/external/orbit-controls.ts +1070 -0
- package/src/external/renderers/css-2d-renderer.ts +185 -0
- package/src/external/renderers/css-3d-renderer.ts +245 -0
- package/src/external/transform-controls.ts +1532 -0
- package/src/external/util/buffer-geometry-utils.ts +783 -0
- package/src/owlly/controller/aerial-element-controller.ts +277 -0
- package/src/owlly/controller/basic-controller.ts +1509 -0
- package/src/owlly/controller/camera-controller.ts +155 -0
- package/src/owlly/controller/controller.ts +76 -0
- package/src/owlly/controller/index.ts +15 -0
- package/src/owlly/controller/mouse-indicator-controller.ts +157 -0
- package/src/owlly/controller/orbit-control.ts +310 -0
- package/src/owlly/controller/panorama-adjust-controller.ts +183 -0
- package/src/owlly/controller/panorama-controller.ts +2234 -0
- package/src/owlly/controller/panorama-transform-controller.ts +151 -0
- package/src/owlly/controller/plane-controller.ts +222 -0
- package/src/owlly/controller/texture-controller.ts +949 -0
- package/src/owlly/controller/tile-panorama-controller.ts +1633 -0
- package/src/owlly/controller/transform-controller.ts +684 -0
- package/src/owlly/element/bottom-nav-element.ts +352 -0
- package/src/owlly/element/camera.ts +389 -0
- package/src/owlly/element/dom-2d-element.ts +88 -0
- package/src/owlly/element/dom-3d-element.ts +87 -0
- package/src/owlly/element/dom-label-2d.ts +497 -0
- package/src/owlly/element/element.ts +117 -0
- package/src/owlly/element/floor-model.ts +290 -0
- package/src/owlly/element/gif-kit/Gif.ts +509 -0
- package/src/owlly/element/gif-kit/GifColor.ts +44 -0
- package/src/owlly/element/gif-kit/GifCompressedCodesToByteArrayConverter.ts +56 -0
- package/src/owlly/element/gif-kit/GifFrame.ts +207 -0
- package/src/owlly/element/gif-kit/GifImage.ts +26 -0
- package/src/owlly/element/gif-kit/GifParser.ts +254 -0
- package/src/owlly/element/gif-kit/GifPresenter.ts +46 -0
- package/src/owlly/element/gif-kit/GifVersion.ts +12 -0
- package/src/owlly/element/gltf-mesh-element.ts +184 -0
- package/src/owlly/element/index.ts +25 -0
- package/src/owlly/element/map-kit/area.ts +232 -0
- package/src/owlly/element/map-kit/block-set.ts +102 -0
- package/src/owlly/element/map-kit/block.ts +417 -0
- package/src/owlly/element/map-kit/index.ts +6 -0
- package/src/owlly/element/map-kit/shape.ts +285 -0
- package/src/owlly/element/mesh-element.ts +94 -0
- package/src/owlly/element/mesh-line-2d.ts +1032 -0
- package/src/owlly/element/meshline-o.ts +802 -0
- package/src/owlly/element/panorama-group.ts +1250 -0
- package/src/owlly/element/panorama.ts +1044 -0
- package/src/owlly/element/path-group.ts +212 -0
- package/src/owlly/element/path.ts +727 -0
- package/src/owlly/element/placeable-2d.ts +627 -0
- package/src/owlly/element/polygon-mesh.ts +344 -0
- package/src/owlly/element/ring-element.ts +517 -0
- package/src/owlly/element/sphere-mesh.ts +96 -0
- package/src/owlly/element/svg-floor-model.ts +200 -0
- package/src/owlly/element/svg-floors.ts +121 -0
- package/src/owlly/element/tile-panorama-group.ts +1314 -0
- package/src/owlly/element/tile-panorama.ts +636 -0
- package/src/owlly/element/tile-plane.ts +430 -0
- package/src/owlly/element/video-element.ts +190 -0
- package/src/owlly/geometries/ExtrudeGeometry2.ts +255 -0
- package/src/owlly/index.ts +19 -0
- package/src/owlly/overlay/canvas-overlay.ts +642 -0
- package/src/owlly/overlay/css-2d-overlay.ts +48 -0
- package/src/owlly/overlay/css-3d-overlay.ts +50 -0
- package/src/owlly/overlay/index.ts +11 -0
- package/src/owlly/overlay/label-overlay.ts +419 -0
- package/src/owlly/overlay/overlay.ts +17 -0
- package/src/owlly/overlay/path-overlay.ts +170 -0
- package/src/owlly/overlay/path-overlay2.ts +149 -0
- package/src/owlly/overlay/poi-overlay-3d.ts +1759 -0
- package/src/owlly/overlay/poi-overlay.ts +1739 -0
- package/src/owlly/owlly-2d/index.ts +108 -0
- package/src/owlly/screen/index.ts +1 -0
- package/src/owlly/screen/screen.ts +323 -0
- package/src/owlly/stage/__test__/stage.spec.ts +15 -0
- package/src/owlly/stage/externals.ts +45 -0
- package/src/owlly/stage/index.ts +12 -0
- package/src/owlly/stage/owlly.ts +223 -0
- package/src/owlly/stage/stage.ts +274 -0
- package/src/owlly/utils/alignment-utils.ts +84 -0
- package/src/owlly/utils/basic-calc.ts +141 -0
- package/src/owlly/utils/basic-tools.ts +286 -0
- package/src/owlly/utils/bvh-tree.ts +695 -0
- package/src/owlly/utils/camera.ts +72 -0
- package/src/owlly/utils/cube-texture-cache.ts +155 -0
- package/src/owlly/utils/device-utils.ts +53 -0
- package/src/owlly/utils/environment-utils.ts +81 -0
- package/src/owlly/utils/event-hub.ts +120 -0
- package/src/owlly/utils/events.ts +266 -0
- package/src/owlly/utils/geometry-utils.ts +749 -0
- package/src/owlly/utils/helper.ts +33 -0
- package/src/owlly/utils/index.ts +17 -0
- package/src/owlly/utils/lru-cache.ts +126 -0
- package/src/owlly/utils/map-utils.ts +55 -0
- package/src/owlly/utils/number-utils.ts +75 -0
- package/src/owlly/utils/panorama-model-util.ts +255 -0
- package/src/owlly/utils/path-utils.ts +837 -0
- package/src/owlly/utils/svgutils.ts +732 -0
- package/src/owlly/utils/texture-cache.ts +132 -0
- package/src/owlly/utils/tile-util.ts +563 -0
- package/src/owlly/utils/time-profiler.ts +57 -0
- package/src/owlly/view/__test__/perspective-view.spec.ts +23 -0
- package/src/owlly/view/camera-view.ts +114 -0
- package/src/owlly/view/index.ts +5 -0
- package/src/owlly/view/orthographic-view.ts +124 -0
- package/src/owlly/view/perspective-view.ts +125 -0
- package/src/owlly/view/svg-map-view.ts +187 -0
- package/src/owlly/view/view.ts +409 -0
- package/src/public/js/jsmpeg.min.js +3129 -0
- package/src/web/index.html +52 -0
- package/src/web/main.centroid.ts +85 -0
- package/src/web/main.hyma.meshline2d.ts +84 -0
- package/src/web/main.jyfang.sample.ts +139 -0
- package/src/web/main.rpeng.extrude.ts +194 -0
- package/src/web/main.rpeng.mes.plane.ts +161 -0
- package/src/web/main.rpeng.sample.ts +345 -0
- package/src/web/main.rpeng.vr.ts +159 -0
- package/src/web/main.sample.ts +59 -0
- package/src/web/quattree.hyma.ts +163 -0
- package/src/web/sensor-vr-plugin.ts +201 -0
- package/src/web/testPixel.png +0 -0
|
@@ -0,0 +1,3129 @@
|
|
|
1
|
+
var JSMpeg = {
|
|
2
|
+
Player: null,
|
|
3
|
+
VideoElement: null,
|
|
4
|
+
BitBuffer: null,
|
|
5
|
+
Source: {},
|
|
6
|
+
Demuxer: {},
|
|
7
|
+
Decoder: {},
|
|
8
|
+
Renderer: {},
|
|
9
|
+
AudioOutput: {},
|
|
10
|
+
Now: function() {
|
|
11
|
+
return window.performance ? window.performance.now() / 1e3 : Date.now() / 1e3
|
|
12
|
+
},
|
|
13
|
+
CreateVideoElements: function() {
|
|
14
|
+
var elements = document.querySelectorAll(".jsmpeg");
|
|
15
|
+
for (var i = 0; i < elements.length; i++) {
|
|
16
|
+
new JSMpeg.VideoElement(elements[i])
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
Fill: function(array, value) {
|
|
20
|
+
if (array.fill) {
|
|
21
|
+
array.fill(value)
|
|
22
|
+
} else {
|
|
23
|
+
for (var i = 0; i < array.length; i++) {
|
|
24
|
+
array[i] = value
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
Base64ToArrayBuffer: function(base64) {
|
|
29
|
+
var binary = window.atob(base64);
|
|
30
|
+
var length = binary.length;
|
|
31
|
+
var bytes = new Uint8Array(length);
|
|
32
|
+
for (var i = 0; i < length; i++) {
|
|
33
|
+
bytes[i] = binary.charCodeAt(i)
|
|
34
|
+
}
|
|
35
|
+
return bytes.buffer
|
|
36
|
+
},
|
|
37
|
+
WASM_BINARY_INLINED: null
|
|
38
|
+
};
|
|
39
|
+
if (document.readyState === "complete") {
|
|
40
|
+
JSMpeg.CreateVideoElements()
|
|
41
|
+
} else {
|
|
42
|
+
document.addEventListener("DOMContentLoaded", JSMpeg.CreateVideoElements)
|
|
43
|
+
}
|
|
44
|
+
JSMpeg.VideoElement = function() {
|
|
45
|
+
"use strict";
|
|
46
|
+
var VideoElement = function(element) {
|
|
47
|
+
var url = element.dataset.url;
|
|
48
|
+
if (!url) {
|
|
49
|
+
throw "VideoElement has no `data-url` attribute"
|
|
50
|
+
}
|
|
51
|
+
var addStyles = function(element, styles) {
|
|
52
|
+
for (var name in styles) {
|
|
53
|
+
element.style[name] = styles[name]
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
this.container = element;
|
|
57
|
+
addStyles(this.container, {
|
|
58
|
+
display: "inline-block",
|
|
59
|
+
position: "relative",
|
|
60
|
+
minWidth: "80px",
|
|
61
|
+
minHeight: "80px"
|
|
62
|
+
});
|
|
63
|
+
this.canvas = document.createElement("canvas");
|
|
64
|
+
this.canvas.width = 960;
|
|
65
|
+
this.canvas.height = 540;
|
|
66
|
+
addStyles(this.canvas, {
|
|
67
|
+
display: "block",
|
|
68
|
+
width: "100%"
|
|
69
|
+
});
|
|
70
|
+
this.container.appendChild(this.canvas);
|
|
71
|
+
this.playButton = document.createElement("div");
|
|
72
|
+
this.playButton.innerHTML = VideoElement.PLAY_BUTTON;
|
|
73
|
+
addStyles(this.playButton, {
|
|
74
|
+
zIndex: 2,
|
|
75
|
+
position: "absolute",
|
|
76
|
+
top: "0",
|
|
77
|
+
bottom: "0",
|
|
78
|
+
left: "0",
|
|
79
|
+
right: "0",
|
|
80
|
+
maxWidth: "75px",
|
|
81
|
+
maxHeight: "75px",
|
|
82
|
+
margin: "auto",
|
|
83
|
+
opacity: "0.7",
|
|
84
|
+
cursor: "pointer"
|
|
85
|
+
});
|
|
86
|
+
this.container.appendChild(this.playButton);
|
|
87
|
+
var options = {
|
|
88
|
+
canvas: this.canvas
|
|
89
|
+
};
|
|
90
|
+
for (var option in element.dataset) {
|
|
91
|
+
try {
|
|
92
|
+
options[option] = JSON.parse(element.dataset[option])
|
|
93
|
+
} catch (err) {
|
|
94
|
+
options[option] = element.dataset[option]
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
this.player = new JSMpeg.Player(url, options);
|
|
98
|
+
element.playerInstance = this.player;
|
|
99
|
+
if (options.poster && !options.autoplay && !this.player.options.streaming) {
|
|
100
|
+
options.decodeFirstFrame = false;
|
|
101
|
+
this.poster = new Image;
|
|
102
|
+
this.poster.src = options.poster;
|
|
103
|
+
this.poster.addEventListener("load", this.posterLoaded);
|
|
104
|
+
addStyles(this.poster, {
|
|
105
|
+
display: "block",
|
|
106
|
+
zIndex: 1,
|
|
107
|
+
position: "absolute",
|
|
108
|
+
top: 0,
|
|
109
|
+
left: 0,
|
|
110
|
+
bottom: 0,
|
|
111
|
+
right: 0
|
|
112
|
+
});
|
|
113
|
+
this.container.appendChild(this.poster)
|
|
114
|
+
}
|
|
115
|
+
if (!this.player.options.streaming) {
|
|
116
|
+
this.container.addEventListener("click", this.onClick.bind(this))
|
|
117
|
+
}
|
|
118
|
+
if (options.autoplay || this.player.options.streaming) {
|
|
119
|
+
this.playButton.style.display = "none"
|
|
120
|
+
}
|
|
121
|
+
if (this.player.audioOut && !this.player.audioOut.unlocked) {
|
|
122
|
+
var unlockAudioElement = this.container;
|
|
123
|
+
if (options.autoplay || this.player.options.streaming) {
|
|
124
|
+
this.unmuteButton = document.createElement("div");
|
|
125
|
+
this.unmuteButton.innerHTML = VideoElement.UNMUTE_BUTTON;
|
|
126
|
+
addStyles(this.unmuteButton, {
|
|
127
|
+
zIndex: 2,
|
|
128
|
+
position: "absolute",
|
|
129
|
+
bottom: "10px",
|
|
130
|
+
right: "20px",
|
|
131
|
+
width: "75px",
|
|
132
|
+
height: "75px",
|
|
133
|
+
margin: "auto",
|
|
134
|
+
opacity: "0.7",
|
|
135
|
+
cursor: "pointer"
|
|
136
|
+
});
|
|
137
|
+
this.container.appendChild(this.unmuteButton);
|
|
138
|
+
unlockAudioElement = this.unmuteButton
|
|
139
|
+
}
|
|
140
|
+
this.unlockAudioBound = this.onUnlockAudio.bind(this, unlockAudioElement);
|
|
141
|
+
unlockAudioElement.addEventListener("touchstart", this.unlockAudioBound, false);
|
|
142
|
+
unlockAudioElement.addEventListener("click", this.unlockAudioBound, true)
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
VideoElement.prototype.onUnlockAudio = function(element, ev) {
|
|
146
|
+
if (this.unmuteButton) {
|
|
147
|
+
ev.preventDefault();
|
|
148
|
+
ev.stopPropagation()
|
|
149
|
+
}
|
|
150
|
+
this.player.audioOut.unlock(function() {
|
|
151
|
+
if (this.unmuteButton) {
|
|
152
|
+
this.unmuteButton.style.display = "none"
|
|
153
|
+
}
|
|
154
|
+
element.removeEventListener("touchstart", this.unlockAudioBound);
|
|
155
|
+
element.removeEventListener("click", this.unlockAudioBound)
|
|
156
|
+
}.bind(this))
|
|
157
|
+
};
|
|
158
|
+
VideoElement.prototype.onClick = function(ev) {
|
|
159
|
+
if (this.player.isPlaying) {
|
|
160
|
+
this.player.pause();
|
|
161
|
+
this.playButton.style.display = "block"
|
|
162
|
+
} else {
|
|
163
|
+
this.player.play();
|
|
164
|
+
this.playButton.style.display = "none";
|
|
165
|
+
if (this.poster) {
|
|
166
|
+
this.poster.style.display = "none"
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
VideoElement.PLAY_BUTTON = '<svg style="max-width: 75px; max-height: 75px;" ' + 'viewBox="0 0 200 200" alt="Play video">' + '<circle cx="100" cy="100" r="90" fill="none" ' + 'stroke-width="15" stroke="#fff"/>' + '<polygon points="70, 55 70, 145 145, 100" fill="#fff"/>' + "</svg>";
|
|
171
|
+
VideoElement.UNMUTE_BUTTON = '<svg style="max-width: 75px; max-height: 75px;" viewBox="0 0 75 75">' + '<polygon class="audio-speaker" stroke="none" fill="#fff" ' + 'points="39,13 22,28 6,28 6,47 21,47 39,62 39,13"/>' + '<g stroke="#fff" stroke-width="5">' + '<path d="M 49,50 69,26"/>' + '<path d="M 69,50 49,26"/>' + "</g>" + "</svg>";
|
|
172
|
+
return VideoElement
|
|
173
|
+
}();
|
|
174
|
+
JSMpeg.Player = function() {
|
|
175
|
+
"use strict";
|
|
176
|
+
var Player = function(url, options) {
|
|
177
|
+
this.options = options || {};
|
|
178
|
+
if (options.source) {
|
|
179
|
+
this.source = new options.source(url, options);
|
|
180
|
+
options.streaming = !!this.source.streaming
|
|
181
|
+
} else if (url.match(/^wss?:\/\//)) {
|
|
182
|
+
this.source = new JSMpeg.Source.WebSocket(url, options);
|
|
183
|
+
options.streaming = true
|
|
184
|
+
} else if (options.progressive !== false) {
|
|
185
|
+
this.source = new JSMpeg.Source.AjaxProgressive(url, options);
|
|
186
|
+
options.streaming = false
|
|
187
|
+
} else {
|
|
188
|
+
this.source = new JSMpeg.Source.Ajax(url, options);
|
|
189
|
+
options.streaming = false
|
|
190
|
+
}
|
|
191
|
+
this.maxAudioLag = options.maxAudioLag || .25;
|
|
192
|
+
this.loop = options.loop !== false;
|
|
193
|
+
this.autoplay = !!options.autoplay || options.streaming;
|
|
194
|
+
this.demuxer = new JSMpeg.Demuxer.TS(options);
|
|
195
|
+
this.source.connect(this.demuxer);
|
|
196
|
+
if (!options.disableWebAssembly && JSMpeg.WASMModule.IsSupported()) {
|
|
197
|
+
this.wasmModule = JSMpeg.WASMModule.GetModule();
|
|
198
|
+
options.wasmModule = this.wasmModule
|
|
199
|
+
}
|
|
200
|
+
if (options.video !== false) {
|
|
201
|
+
this.video = options.wasmModule ? new JSMpeg.Decoder.MPEG1VideoWASM(options) : new JSMpeg.Decoder.MPEG1Video(options);
|
|
202
|
+
this.renderer = !options.disableGl && JSMpeg.Renderer.WebGL.IsSupported() ? new JSMpeg.Renderer.WebGL(options) : new JSMpeg.Renderer.Canvas2D(options);
|
|
203
|
+
this.demuxer.connect(JSMpeg.Demuxer.TS.STREAM.VIDEO_1, this.video);
|
|
204
|
+
this.video.connect(this.renderer)
|
|
205
|
+
}
|
|
206
|
+
if (options.audio !== false && JSMpeg.AudioOutput.WebAudio.IsSupported()) {
|
|
207
|
+
this.audio = options.wasmModule ? new JSMpeg.Decoder.MP2AudioWASM(options) : new JSMpeg.Decoder.MP2Audio(options);
|
|
208
|
+
this.audioOut = new JSMpeg.AudioOutput.WebAudio(options);
|
|
209
|
+
this.demuxer.connect(JSMpeg.Demuxer.TS.STREAM.AUDIO_1, this.audio);
|
|
210
|
+
this.audio.connect(this.audioOut)
|
|
211
|
+
}
|
|
212
|
+
Object.defineProperty(this, "currentTime", {
|
|
213
|
+
get: this.getCurrentTime,
|
|
214
|
+
set: this.setCurrentTime
|
|
215
|
+
});
|
|
216
|
+
Object.defineProperty(this, "volume", {
|
|
217
|
+
get: this.getVolume,
|
|
218
|
+
set: this.setVolume
|
|
219
|
+
});
|
|
220
|
+
this.paused = true;
|
|
221
|
+
this.unpauseOnShow = false;
|
|
222
|
+
if (options.pauseWhenHidden !== false) {
|
|
223
|
+
document.addEventListener("visibilitychange", this.showHide.bind(this))
|
|
224
|
+
}
|
|
225
|
+
if (this.wasmModule) {
|
|
226
|
+
if (this.wasmModule.ready) {
|
|
227
|
+
this.startLoading()
|
|
228
|
+
} else if (JSMpeg.WASM_BINARY_INLINED) {
|
|
229
|
+
var wasm = JSMpeg.Base64ToArrayBuffer(JSMpeg.WASM_BINARY_INLINED);
|
|
230
|
+
this.wasmModule.loadFromBuffer(wasm, this.startLoading.bind(this))
|
|
231
|
+
} else {
|
|
232
|
+
this.wasmModule.loadFromFile("jsmpeg.wasm", this.startLoading.bind(this))
|
|
233
|
+
}
|
|
234
|
+
} else {
|
|
235
|
+
this.startLoading()
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
Player.prototype.startLoading = function() {
|
|
239
|
+
this.source.start();
|
|
240
|
+
if (this.autoplay) {
|
|
241
|
+
this.play()
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
Player.prototype.showHide = function(ev) {
|
|
245
|
+
if (document.visibilityState === "hidden") {
|
|
246
|
+
this.unpauseOnShow = this.wantsToPlay;
|
|
247
|
+
this.pause()
|
|
248
|
+
} else if (this.unpauseOnShow) {
|
|
249
|
+
this.play()
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
Player.prototype.play = function(ev) {
|
|
253
|
+
if (this.animationId) {
|
|
254
|
+
return
|
|
255
|
+
}
|
|
256
|
+
this.animationId = requestAnimationFrame(this.update.bind(this));
|
|
257
|
+
this.wantsToPlay = true;
|
|
258
|
+
this.paused = false
|
|
259
|
+
};
|
|
260
|
+
Player.prototype.pause = function(ev) {
|
|
261
|
+
if (this.paused) {
|
|
262
|
+
return
|
|
263
|
+
}
|
|
264
|
+
cancelAnimationFrame(this.animationId);
|
|
265
|
+
this.animationId = null;
|
|
266
|
+
this.wantsToPlay = false;
|
|
267
|
+
this.isPlaying = false;
|
|
268
|
+
this.paused = true;
|
|
269
|
+
if (this.audio && this.audio.canPlay) {
|
|
270
|
+
this.audioOut.stop();
|
|
271
|
+
this.seek(this.currentTime)
|
|
272
|
+
}
|
|
273
|
+
if (this.options.onPause) {
|
|
274
|
+
this.options.onPause(this)
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
Player.prototype.getVolume = function() {
|
|
278
|
+
return this.audioOut ? this.audioOut.volume : 0
|
|
279
|
+
};
|
|
280
|
+
Player.prototype.setVolume = function(volume) {
|
|
281
|
+
if (this.audioOut) {
|
|
282
|
+
this.audioOut.volume = volume
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
Player.prototype.stop = function(ev) {
|
|
286
|
+
this.pause();
|
|
287
|
+
this.seek(0);
|
|
288
|
+
if (this.video && this.options.decodeFirstFrame !== false) {
|
|
289
|
+
this.video.decode()
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
Player.prototype.destroy = function() {
|
|
293
|
+
this.pause();
|
|
294
|
+
this.source.destroy();
|
|
295
|
+
this.video && this.video.destroy();
|
|
296
|
+
this.renderer && this.renderer.destroy();
|
|
297
|
+
this.audio && this.audio.destroy();
|
|
298
|
+
this.audioOut && this.audioOut.destroy()
|
|
299
|
+
};
|
|
300
|
+
Player.prototype.seek = function(time) {
|
|
301
|
+
var startOffset = this.audio && this.audio.canPlay ? this.audio.startTime : this.video.startTime;
|
|
302
|
+
if (this.video) {
|
|
303
|
+
this.video.seek(time + startOffset)
|
|
304
|
+
}
|
|
305
|
+
if (this.audio) {
|
|
306
|
+
this.audio.seek(time + startOffset)
|
|
307
|
+
}
|
|
308
|
+
this.startTime = JSMpeg.Now() - time
|
|
309
|
+
};
|
|
310
|
+
Player.prototype.getCurrentTime = function() {
|
|
311
|
+
return this.audio && this.audio.canPlay ? this.audio.currentTime - this.audio.startTime : this.video.currentTime - this.video.startTime
|
|
312
|
+
};
|
|
313
|
+
Player.prototype.setCurrentTime = function(time) {
|
|
314
|
+
this.seek(time)
|
|
315
|
+
};
|
|
316
|
+
Player.prototype.update = function() {
|
|
317
|
+
this.animationId = requestAnimationFrame(this.update.bind(this));
|
|
318
|
+
if (!this.source.established) {
|
|
319
|
+
if (this.renderer) {
|
|
320
|
+
this.renderer.renderProgress(this.source.progress)
|
|
321
|
+
}
|
|
322
|
+
return
|
|
323
|
+
}
|
|
324
|
+
if (!this.isPlaying) {
|
|
325
|
+
this.isPlaying = true;
|
|
326
|
+
this.startTime = JSMpeg.Now() - this.currentTime;
|
|
327
|
+
if (this.options.onPlay) {
|
|
328
|
+
this.options.onPlay(this)
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (this.options.streaming) {
|
|
332
|
+
this.updateForStreaming()
|
|
333
|
+
} else {
|
|
334
|
+
this.updateForStaticFile()
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
Player.prototype.updateForStreaming = function() {
|
|
338
|
+
if (this.video) {
|
|
339
|
+
this.video.decode()
|
|
340
|
+
}
|
|
341
|
+
if (this.audio) {
|
|
342
|
+
var decoded = false;
|
|
343
|
+
do {
|
|
344
|
+
if (this.audioOut.enqueuedTime > this.maxAudioLag) {
|
|
345
|
+
this.audioOut.resetEnqueuedTime();
|
|
346
|
+
this.audioOut.enabled = false
|
|
347
|
+
}
|
|
348
|
+
decoded = this.audio.decode()
|
|
349
|
+
} while (decoded);
|
|
350
|
+
this.audioOut.enabled = true
|
|
351
|
+
}
|
|
352
|
+
};
|
|
353
|
+
Player.prototype.nextFrame = function() {
|
|
354
|
+
if (this.source.established && this.video) {
|
|
355
|
+
return this.video.decode()
|
|
356
|
+
}
|
|
357
|
+
return false
|
|
358
|
+
};
|
|
359
|
+
Player.prototype.updateForStaticFile = function() {
|
|
360
|
+
var notEnoughData = false,
|
|
361
|
+
headroom = 0;
|
|
362
|
+
if (this.audio && this.audio.canPlay) {
|
|
363
|
+
while (!notEnoughData && this.audio.decodedTime - this.audio.currentTime < .25) {
|
|
364
|
+
notEnoughData = !this.audio.decode()
|
|
365
|
+
}
|
|
366
|
+
if (this.video && this.video.currentTime < this.audio.currentTime) {
|
|
367
|
+
notEnoughData = !this.video.decode()
|
|
368
|
+
}
|
|
369
|
+
headroom = this.demuxer.currentTime - this.audio.currentTime
|
|
370
|
+
} else if (this.video) {
|
|
371
|
+
var targetTime = JSMpeg.Now() - this.startTime + this.video.startTime,
|
|
372
|
+
lateTime = targetTime - this.video.currentTime,
|
|
373
|
+
frameTime = 1 / this.video.frameRate;
|
|
374
|
+
if (this.video && lateTime > 0) {
|
|
375
|
+
if (lateTime > frameTime * 2) {
|
|
376
|
+
this.startTime += lateTime
|
|
377
|
+
}
|
|
378
|
+
notEnoughData = !this.video.decode()
|
|
379
|
+
}
|
|
380
|
+
headroom = this.demuxer.currentTime - targetTime
|
|
381
|
+
}
|
|
382
|
+
this.source.resume(headroom);
|
|
383
|
+
if (notEnoughData && this.source.completed) {
|
|
384
|
+
if (this.loop) {
|
|
385
|
+
this.seek(0)
|
|
386
|
+
} else {
|
|
387
|
+
this.pause();
|
|
388
|
+
if (this.options.onEnded) {
|
|
389
|
+
this.options.onEnded(this)
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
} else if (notEnoughData && this.options.onStalled) {
|
|
393
|
+
this.options.onStalled(this)
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
return Player
|
|
397
|
+
}();
|
|
398
|
+
JSMpeg.BitBuffer = function() {
|
|
399
|
+
"use strict";
|
|
400
|
+
var BitBuffer = function(bufferOrLength, mode) {
|
|
401
|
+
if (typeof bufferOrLength === "object") {
|
|
402
|
+
this.bytes = bufferOrLength instanceof Uint8Array ? bufferOrLength : new Uint8Array(bufferOrLength);
|
|
403
|
+
this.byteLength = this.bytes.length
|
|
404
|
+
} else {
|
|
405
|
+
this.bytes = new Uint8Array(bufferOrLength || 1024 * 1024);
|
|
406
|
+
this.byteLength = 0
|
|
407
|
+
}
|
|
408
|
+
this.mode = mode || BitBuffer.MODE.EXPAND;
|
|
409
|
+
this.index = 0
|
|
410
|
+
};
|
|
411
|
+
BitBuffer.prototype.resize = function(size) {
|
|
412
|
+
var newBytes = new Uint8Array(size);
|
|
413
|
+
if (this.byteLength !== 0) {
|
|
414
|
+
this.byteLength = Math.min(this.byteLength, size);
|
|
415
|
+
newBytes.set(this.bytes, 0, this.byteLength)
|
|
416
|
+
}
|
|
417
|
+
this.bytes = newBytes;
|
|
418
|
+
this.index = Math.min(this.index, this.byteLength << 3)
|
|
419
|
+
};
|
|
420
|
+
BitBuffer.prototype.evict = function(sizeNeeded) {
|
|
421
|
+
var bytePos = this.index >> 3,
|
|
422
|
+
available = this.bytes.length - this.byteLength;
|
|
423
|
+
if (this.index === this.byteLength << 3 || sizeNeeded > available + bytePos) {
|
|
424
|
+
this.byteLength = 0;
|
|
425
|
+
this.index = 0;
|
|
426
|
+
return
|
|
427
|
+
} else if (bytePos === 0) {
|
|
428
|
+
return
|
|
429
|
+
}
|
|
430
|
+
if (this.bytes.copyWithin) {
|
|
431
|
+
this.bytes.copyWithin(0, bytePos, this.byteLength)
|
|
432
|
+
} else {
|
|
433
|
+
this.bytes.set(this.bytes.subarray(bytePos, this.byteLength))
|
|
434
|
+
}
|
|
435
|
+
this.byteLength = this.byteLength - bytePos;
|
|
436
|
+
this.index -= bytePos << 3;
|
|
437
|
+
return
|
|
438
|
+
};
|
|
439
|
+
BitBuffer.prototype.write = function(buffers) {
|
|
440
|
+
var isArrayOfBuffers = typeof buffers[0] === "object",
|
|
441
|
+
totalLength = 0,
|
|
442
|
+
available = this.bytes.length - this.byteLength;
|
|
443
|
+
if (isArrayOfBuffers) {
|
|
444
|
+
var totalLength = 0;
|
|
445
|
+
for (var i = 0; i < buffers.length; i++) {
|
|
446
|
+
totalLength += buffers[i].byteLength
|
|
447
|
+
}
|
|
448
|
+
} else {
|
|
449
|
+
totalLength = buffers.byteLength
|
|
450
|
+
}
|
|
451
|
+
if (totalLength > available) {
|
|
452
|
+
if (this.mode === BitBuffer.MODE.EXPAND) {
|
|
453
|
+
var newSize = Math.max(this.bytes.length * 2, totalLength - available);
|
|
454
|
+
this.resize(newSize)
|
|
455
|
+
} else {
|
|
456
|
+
this.evict(totalLength)
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
if (isArrayOfBuffers) {
|
|
460
|
+
for (var i = 0; i < buffers.length; i++) {
|
|
461
|
+
this.appendSingleBuffer(buffers[i])
|
|
462
|
+
}
|
|
463
|
+
} else {
|
|
464
|
+
this.appendSingleBuffer(buffers)
|
|
465
|
+
}
|
|
466
|
+
return totalLength
|
|
467
|
+
};
|
|
468
|
+
BitBuffer.prototype.appendSingleBuffer = function(buffer) {
|
|
469
|
+
buffer = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
|
|
470
|
+
this.bytes.set(buffer, this.byteLength);
|
|
471
|
+
this.byteLength += buffer.length
|
|
472
|
+
};
|
|
473
|
+
BitBuffer.prototype.findNextStartCode = function() {
|
|
474
|
+
for (var i = this.index + 7 >> 3; i < this.byteLength; i++) {
|
|
475
|
+
if (this.bytes[i] == 0 && this.bytes[i + 1] == 0 && this.bytes[i + 2] == 1) {
|
|
476
|
+
this.index = i + 4 << 3;
|
|
477
|
+
return this.bytes[i + 3]
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
this.index = this.byteLength << 3;
|
|
481
|
+
return -1
|
|
482
|
+
};
|
|
483
|
+
BitBuffer.prototype.findStartCode = function(code) {
|
|
484
|
+
var current = 0;
|
|
485
|
+
while (true) {
|
|
486
|
+
current = this.findNextStartCode();
|
|
487
|
+
if (current === code || current === -1) {
|
|
488
|
+
return current
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
return -1
|
|
492
|
+
};
|
|
493
|
+
BitBuffer.prototype.nextBytesAreStartCode = function() {
|
|
494
|
+
var i = this.index + 7 >> 3;
|
|
495
|
+
return i >= this.byteLength || this.bytes[i] == 0 && this.bytes[i + 1] == 0 && this.bytes[i + 2] == 1
|
|
496
|
+
};
|
|
497
|
+
BitBuffer.prototype.peek = function(count) {
|
|
498
|
+
var offset = this.index;
|
|
499
|
+
var value = 0;
|
|
500
|
+
while (count) {
|
|
501
|
+
var currentByte = this.bytes[offset >> 3],
|
|
502
|
+
remaining = 8 - (offset & 7),
|
|
503
|
+
read = remaining < count ? remaining : count,
|
|
504
|
+
shift = remaining - read,
|
|
505
|
+
mask = 255 >> 8 - read;
|
|
506
|
+
value = value << read | (currentByte & mask << shift) >> shift;
|
|
507
|
+
offset += read;
|
|
508
|
+
count -= read
|
|
509
|
+
}
|
|
510
|
+
return value
|
|
511
|
+
};
|
|
512
|
+
BitBuffer.prototype.read = function(count) {
|
|
513
|
+
var value = this.peek(count);
|
|
514
|
+
this.index += count;
|
|
515
|
+
return value
|
|
516
|
+
};
|
|
517
|
+
BitBuffer.prototype.skip = function(count) {
|
|
518
|
+
return this.index += count
|
|
519
|
+
};
|
|
520
|
+
BitBuffer.prototype.rewind = function(count) {
|
|
521
|
+
this.index = Math.max(this.index - count, 0)
|
|
522
|
+
};
|
|
523
|
+
BitBuffer.prototype.has = function(count) {
|
|
524
|
+
return (this.byteLength << 3) - this.index >= count
|
|
525
|
+
};
|
|
526
|
+
BitBuffer.MODE = {
|
|
527
|
+
EVICT: 1,
|
|
528
|
+
EXPAND: 2
|
|
529
|
+
};
|
|
530
|
+
return BitBuffer
|
|
531
|
+
}();
|
|
532
|
+
JSMpeg.Source.Ajax = function() {
|
|
533
|
+
"use strict";
|
|
534
|
+
var AjaxSource = function(url, options) {
|
|
535
|
+
this.url = url;
|
|
536
|
+
this.destination = null;
|
|
537
|
+
this.request = null;
|
|
538
|
+
this.streaming = false;
|
|
539
|
+
this.completed = false;
|
|
540
|
+
this.established = false;
|
|
541
|
+
this.progress = 0;
|
|
542
|
+
this.onEstablishedCallback = options.onSourceEstablished;
|
|
543
|
+
this.onCompletedCallback = options.onSourceCompleted
|
|
544
|
+
};
|
|
545
|
+
AjaxSource.prototype.connect = function(destination) {
|
|
546
|
+
this.destination = destination
|
|
547
|
+
};
|
|
548
|
+
AjaxSource.prototype.start = function() {
|
|
549
|
+
this.request = new XMLHttpRequest;
|
|
550
|
+
this.request.onreadystatechange = function() {
|
|
551
|
+
if (this.request.readyState === this.request.DONE && this.request.status === 200) {
|
|
552
|
+
this.onLoad(this.request.response)
|
|
553
|
+
}
|
|
554
|
+
}.bind(this);
|
|
555
|
+
this.request.onprogress = this.onProgress.bind(this);
|
|
556
|
+
this.request.open("GET", this.url);
|
|
557
|
+
this.request.responseType = "arraybuffer";
|
|
558
|
+
this.request.send()
|
|
559
|
+
};
|
|
560
|
+
AjaxSource.prototype.resume = function(secondsHeadroom) {};
|
|
561
|
+
AjaxSource.prototype.destroy = function() {
|
|
562
|
+
this.request.abort()
|
|
563
|
+
};
|
|
564
|
+
AjaxSource.prototype.onProgress = function(ev) {
|
|
565
|
+
this.progress = ev.loaded / ev.total
|
|
566
|
+
};
|
|
567
|
+
AjaxSource.prototype.onLoad = function(data) {
|
|
568
|
+
this.established = true;
|
|
569
|
+
this.completed = true;
|
|
570
|
+
this.progress = 1;
|
|
571
|
+
if (this.onEstablishedCallback) {
|
|
572
|
+
this.onEstablishedCallback(this)
|
|
573
|
+
}
|
|
574
|
+
if (this.onCompletedCallback) {
|
|
575
|
+
this.onCompletedCallback(this)
|
|
576
|
+
}
|
|
577
|
+
if (this.destination) {
|
|
578
|
+
this.destination.write(data)
|
|
579
|
+
}
|
|
580
|
+
};
|
|
581
|
+
return AjaxSource
|
|
582
|
+
}();
|
|
583
|
+
JSMpeg.Source.Fetch = function() {
|
|
584
|
+
"use strict";
|
|
585
|
+
var FetchSource = function(url, options) {
|
|
586
|
+
this.url = url;
|
|
587
|
+
this.destination = null;
|
|
588
|
+
this.request = null;
|
|
589
|
+
this.streaming = true;
|
|
590
|
+
this.completed = false;
|
|
591
|
+
this.established = false;
|
|
592
|
+
this.progress = 0;
|
|
593
|
+
this.aborted = false;
|
|
594
|
+
this.onEstablishedCallback = options.onSourceEstablished;
|
|
595
|
+
this.onCompletedCallback = options.onSourceCompleted
|
|
596
|
+
};
|
|
597
|
+
FetchSource.prototype.connect = function(destination) {
|
|
598
|
+
this.destination = destination
|
|
599
|
+
};
|
|
600
|
+
FetchSource.prototype.start = function() {
|
|
601
|
+
var params = {
|
|
602
|
+
method: "GET",
|
|
603
|
+
headers: new Headers,
|
|
604
|
+
cache: "default"
|
|
605
|
+
};
|
|
606
|
+
self.fetch(this.url, params).then(function(res) {
|
|
607
|
+
if (res.ok && (res.status >= 200 && res.status <= 299)) {
|
|
608
|
+
this.progress = 1;
|
|
609
|
+
this.established = true;
|
|
610
|
+
return this.pump(res.body.getReader())
|
|
611
|
+
} else {}
|
|
612
|
+
}.bind(this)).catch(function(err) {
|
|
613
|
+
throw err
|
|
614
|
+
})
|
|
615
|
+
};
|
|
616
|
+
FetchSource.prototype.pump = function(reader) {
|
|
617
|
+
return reader.read().then(function(result) {
|
|
618
|
+
if (result.done) {
|
|
619
|
+
this.completed = true
|
|
620
|
+
} else {
|
|
621
|
+
if (this.aborted) {
|
|
622
|
+
return reader.cancel()
|
|
623
|
+
}
|
|
624
|
+
if (this.destination) {
|
|
625
|
+
this.destination.write(result.value.buffer)
|
|
626
|
+
}
|
|
627
|
+
return this.pump(reader)
|
|
628
|
+
}
|
|
629
|
+
}.bind(this)).catch(function(err) {
|
|
630
|
+
throw err
|
|
631
|
+
})
|
|
632
|
+
};
|
|
633
|
+
FetchSource.prototype.resume = function(secondsHeadroom) {};
|
|
634
|
+
FetchSource.prototype.abort = function() {
|
|
635
|
+
this.aborted = true
|
|
636
|
+
};
|
|
637
|
+
return FetchSource
|
|
638
|
+
}();
|
|
639
|
+
JSMpeg.Source.AjaxProgressive = function() {
|
|
640
|
+
"use strict";
|
|
641
|
+
var AjaxProgressiveSource = function(url, options) {
|
|
642
|
+
this.url = url;
|
|
643
|
+
this.destination = null;
|
|
644
|
+
this.request = null;
|
|
645
|
+
this.streaming = false;
|
|
646
|
+
this.completed = false;
|
|
647
|
+
this.established = false;
|
|
648
|
+
this.progress = 0;
|
|
649
|
+
this.fileSize = 0;
|
|
650
|
+
this.loadedSize = 0;
|
|
651
|
+
this.chunkSize = options.chunkSize || 1024 * 1024;
|
|
652
|
+
this.isLoading = false;
|
|
653
|
+
this.loadStartTime = 0;
|
|
654
|
+
this.throttled = options.throttled !== false;
|
|
655
|
+
this.aborted = false;
|
|
656
|
+
this.onEstablishedCallback = options.onSourceEstablished;
|
|
657
|
+
this.onCompletedCallback = options.onSourceCompleted
|
|
658
|
+
};
|
|
659
|
+
AjaxProgressiveSource.prototype.connect = function(destination) {
|
|
660
|
+
this.destination = destination
|
|
661
|
+
};
|
|
662
|
+
AjaxProgressiveSource.prototype.start = function() {
|
|
663
|
+
this.request = new XMLHttpRequest;
|
|
664
|
+
this.request.onreadystatechange = function() {
|
|
665
|
+
if (this.request.readyState === this.request.DONE) {
|
|
666
|
+
this.fileSize = parseInt(this.request.getResponseHeader("Content-Length"));
|
|
667
|
+
this.loadNextChunk()
|
|
668
|
+
}
|
|
669
|
+
}.bind(this);
|
|
670
|
+
this.request.onprogress = this.onProgress.bind(this);
|
|
671
|
+
this.request.open("HEAD", this.url);
|
|
672
|
+
this.request.send()
|
|
673
|
+
};
|
|
674
|
+
AjaxProgressiveSource.prototype.resume = function(secondsHeadroom) {
|
|
675
|
+
if (this.isLoading || !this.throttled) {
|
|
676
|
+
return
|
|
677
|
+
}
|
|
678
|
+
var worstCaseLoadingTime = this.loadTime * 8 + 2;
|
|
679
|
+
if (worstCaseLoadingTime > secondsHeadroom) {
|
|
680
|
+
this.loadNextChunk()
|
|
681
|
+
}
|
|
682
|
+
};
|
|
683
|
+
AjaxProgressiveSource.prototype.destroy = function() {
|
|
684
|
+
this.request.abort();
|
|
685
|
+
this.aborted = true
|
|
686
|
+
};
|
|
687
|
+
AjaxProgressiveSource.prototype.loadNextChunk = function() {
|
|
688
|
+
var start = this.loadedSize,
|
|
689
|
+
end = Math.min(this.loadedSize + this.chunkSize - 1, this.fileSize - 1);
|
|
690
|
+
if (start >= this.fileSize || this.aborted) {
|
|
691
|
+
this.completed = true;
|
|
692
|
+
if (this.onCompletedCallback) {
|
|
693
|
+
this.onCompletedCallback(this)
|
|
694
|
+
}
|
|
695
|
+
return
|
|
696
|
+
}
|
|
697
|
+
this.isLoading = true;
|
|
698
|
+
this.loadStartTime = JSMpeg.Now();
|
|
699
|
+
this.request = new XMLHttpRequest;
|
|
700
|
+
this.request.onreadystatechange = function() {
|
|
701
|
+
if (this.request.readyState === this.request.DONE && this.request.status >= 200 && this.request.status < 300) {
|
|
702
|
+
this.onChunkLoad(this.request.response)
|
|
703
|
+
} else if (this.request.readyState === this.request.DONE) {
|
|
704
|
+
if (this.loadFails++ < 3) {
|
|
705
|
+
this.loadNextChunk()
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
}.bind(this);
|
|
709
|
+
if (start === 0) {
|
|
710
|
+
this.request.onprogress = this.onProgress.bind(this)
|
|
711
|
+
}
|
|
712
|
+
this.request.open("GET", this.url + "?" + start + "-" + end);
|
|
713
|
+
this.request.setRequestHeader("Range", "bytes=" + start + "-" + end);
|
|
714
|
+
this.request.responseType = "arraybuffer";
|
|
715
|
+
this.request.send()
|
|
716
|
+
};
|
|
717
|
+
AjaxProgressiveSource.prototype.onProgress = function(ev) {
|
|
718
|
+
this.progress = ev.loaded / ev.total
|
|
719
|
+
};
|
|
720
|
+
AjaxProgressiveSource.prototype.onChunkLoad = function(data) {
|
|
721
|
+
var isFirstChunk = !this.established;
|
|
722
|
+
this.established = true;
|
|
723
|
+
this.progress = 1;
|
|
724
|
+
this.loadedSize += data.byteLength;
|
|
725
|
+
this.loadFails = 0;
|
|
726
|
+
this.isLoading = false;
|
|
727
|
+
if (isFirstChunk && this.onEstablishedCallback) {
|
|
728
|
+
this.onEstablishedCallback(this)
|
|
729
|
+
}
|
|
730
|
+
if (this.destination) {
|
|
731
|
+
this.destination.write(data)
|
|
732
|
+
}
|
|
733
|
+
this.loadTime = JSMpeg.Now() - this.loadStartTime;
|
|
734
|
+
if (!this.throttled) {
|
|
735
|
+
this.loadNextChunk()
|
|
736
|
+
}
|
|
737
|
+
};
|
|
738
|
+
return AjaxProgressiveSource
|
|
739
|
+
}();
|
|
740
|
+
JSMpeg.Source.WebSocket = function() {
|
|
741
|
+
"use strict";
|
|
742
|
+
var WSSource = function(url, options) {
|
|
743
|
+
this.url = url;
|
|
744
|
+
this.options = options;
|
|
745
|
+
this.socket = null;
|
|
746
|
+
this.streaming = true;
|
|
747
|
+
this.callbacks = {
|
|
748
|
+
connect: [],
|
|
749
|
+
data: []
|
|
750
|
+
};
|
|
751
|
+
this.destination = null;
|
|
752
|
+
this.reconnectInterval = options.reconnectInterval !== undefined ? options.reconnectInterval : 5;
|
|
753
|
+
this.shouldAttemptReconnect = !!this.reconnectInterval;
|
|
754
|
+
this.completed = false;
|
|
755
|
+
this.established = false;
|
|
756
|
+
this.progress = 0;
|
|
757
|
+
this.reconnectTimeoutId = 0;
|
|
758
|
+
this.onEstablishedCallback = options.onSourceEstablished;
|
|
759
|
+
this.onCompletedCallback = options.onSourceCompleted
|
|
760
|
+
};
|
|
761
|
+
WSSource.prototype.connect = function(destination) {
|
|
762
|
+
this.destination = destination
|
|
763
|
+
};
|
|
764
|
+
WSSource.prototype.destroy = function() {
|
|
765
|
+
clearTimeout(this.reconnectTimeoutId);
|
|
766
|
+
this.shouldAttemptReconnect = false;
|
|
767
|
+
this.socket.close()
|
|
768
|
+
};
|
|
769
|
+
WSSource.prototype.start = function() {
|
|
770
|
+
this.shouldAttemptReconnect = !!this.reconnectInterval;
|
|
771
|
+
this.progress = 0;
|
|
772
|
+
this.established = false;
|
|
773
|
+
this.socket = new WebSocket(this.url, this.options.protocols || null);
|
|
774
|
+
this.socket.binaryType = "arraybuffer";
|
|
775
|
+
this.socket.onmessage = this.onMessage.bind(this);
|
|
776
|
+
this.socket.onopen = this.onOpen.bind(this);
|
|
777
|
+
this.socket.onerror = this.onClose.bind(this);
|
|
778
|
+
this.socket.onclose = this.onClose.bind(this)
|
|
779
|
+
};
|
|
780
|
+
WSSource.prototype.resume = function(secondsHeadroom) {};
|
|
781
|
+
WSSource.prototype.onOpen = function() {
|
|
782
|
+
this.progress = 1
|
|
783
|
+
};
|
|
784
|
+
WSSource.prototype.onClose = function() {
|
|
785
|
+
if (this.shouldAttemptReconnect) {
|
|
786
|
+
clearTimeout(this.reconnectTimeoutId);
|
|
787
|
+
this.reconnectTimeoutId = setTimeout(function() {
|
|
788
|
+
this.start()
|
|
789
|
+
}.bind(this), this.reconnectInterval * 1e3)
|
|
790
|
+
}
|
|
791
|
+
};
|
|
792
|
+
WSSource.prototype.onMessage = function(ev) {
|
|
793
|
+
var isFirstChunk = !this.established;
|
|
794
|
+
this.established = true;
|
|
795
|
+
if (isFirstChunk && this.onEstablishedCallback) {
|
|
796
|
+
this.onEstablishedCallback(this)
|
|
797
|
+
}
|
|
798
|
+
if (this.destination) {
|
|
799
|
+
this.destination.write(ev.data)
|
|
800
|
+
}
|
|
801
|
+
};
|
|
802
|
+
return WSSource
|
|
803
|
+
}();
|
|
804
|
+
JSMpeg.Demuxer.TS = function() {
|
|
805
|
+
"use strict";
|
|
806
|
+
var TS = function(options) {
|
|
807
|
+
this.bits = null;
|
|
808
|
+
this.leftoverBytes = null;
|
|
809
|
+
this.guessVideoFrameEnd = true;
|
|
810
|
+
this.pidsToStreamIds = {};
|
|
811
|
+
this.pesPacketInfo = {};
|
|
812
|
+
this.startTime = 0;
|
|
813
|
+
this.currentTime = 0
|
|
814
|
+
};
|
|
815
|
+
TS.prototype.connect = function(streamId, destination) {
|
|
816
|
+
this.pesPacketInfo[streamId] = {
|
|
817
|
+
destination: destination,
|
|
818
|
+
currentLength: 0,
|
|
819
|
+
totalLength: 0,
|
|
820
|
+
pts: 0,
|
|
821
|
+
buffers: []
|
|
822
|
+
}
|
|
823
|
+
};
|
|
824
|
+
TS.prototype.write = function(buffer) {
|
|
825
|
+
if (this.leftoverBytes) {
|
|
826
|
+
var totalLength = buffer.byteLength + this.leftoverBytes.byteLength;
|
|
827
|
+
this.bits = new JSMpeg.BitBuffer(totalLength);
|
|
828
|
+
this.bits.write([this.leftoverBytes, buffer])
|
|
829
|
+
} else {
|
|
830
|
+
this.bits = new JSMpeg.BitBuffer(buffer)
|
|
831
|
+
}
|
|
832
|
+
while (this.bits.has(188 << 3) && this.parsePacket()) {}
|
|
833
|
+
var leftoverCount = this.bits.byteLength - (this.bits.index >> 3);
|
|
834
|
+
this.leftoverBytes = leftoverCount > 0 ? this.bits.bytes.subarray(this.bits.index >> 3) : null
|
|
835
|
+
};
|
|
836
|
+
TS.prototype.parsePacket = function() {
|
|
837
|
+
if (this.bits.read(8) !== 71) {
|
|
838
|
+
if (!this.resync()) {
|
|
839
|
+
return false
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
var end = (this.bits.index >> 3) + 187;
|
|
843
|
+
var transportError = this.bits.read(1),
|
|
844
|
+
payloadStart = this.bits.read(1),
|
|
845
|
+
transportPriority = this.bits.read(1),
|
|
846
|
+
pid = this.bits.read(13),
|
|
847
|
+
transportScrambling = this.bits.read(2),
|
|
848
|
+
adaptationField = this.bits.read(2),
|
|
849
|
+
continuityCounter = this.bits.read(4);
|
|
850
|
+
var streamId = this.pidsToStreamIds[pid];
|
|
851
|
+
if (payloadStart && streamId) {
|
|
852
|
+
var pi = this.pesPacketInfo[streamId];
|
|
853
|
+
if (pi && pi.currentLength) {
|
|
854
|
+
this.packetComplete(pi)
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
if (adaptationField & 1) {
|
|
858
|
+
if (adaptationField & 2) {
|
|
859
|
+
var adaptationFieldLength = this.bits.read(8);
|
|
860
|
+
this.bits.skip(adaptationFieldLength << 3)
|
|
861
|
+
}
|
|
862
|
+
if (payloadStart && this.bits.nextBytesAreStartCode()) {
|
|
863
|
+
this.bits.skip(24);
|
|
864
|
+
streamId = this.bits.read(8);
|
|
865
|
+
this.pidsToStreamIds[pid] = streamId;
|
|
866
|
+
var packetLength = this.bits.read(16);
|
|
867
|
+
this.bits.skip(8);
|
|
868
|
+
var ptsDtsFlag = this.bits.read(2);
|
|
869
|
+
this.bits.skip(6);
|
|
870
|
+
var headerLength = this.bits.read(8);
|
|
871
|
+
var payloadBeginIndex = this.bits.index + (headerLength << 3);
|
|
872
|
+
var pi = this.pesPacketInfo[streamId];
|
|
873
|
+
if (pi) {
|
|
874
|
+
var pts = 0;
|
|
875
|
+
if (ptsDtsFlag & 2) {
|
|
876
|
+
this.bits.skip(4);
|
|
877
|
+
var p32_30 = this.bits.read(3);
|
|
878
|
+
this.bits.skip(1);
|
|
879
|
+
var p29_15 = this.bits.read(15);
|
|
880
|
+
this.bits.skip(1);
|
|
881
|
+
var p14_0 = this.bits.read(15);
|
|
882
|
+
this.bits.skip(1);
|
|
883
|
+
pts = (p32_30 * 1073741824 + p29_15 * 32768 + p14_0) / 9e4;
|
|
884
|
+
this.currentTime = pts;
|
|
885
|
+
if (this.startTime === -1) {
|
|
886
|
+
this.startTime = pts
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
var payloadLength = packetLength ? packetLength - headerLength - 3 : 0;
|
|
890
|
+
this.packetStart(pi, pts, payloadLength)
|
|
891
|
+
}
|
|
892
|
+
this.bits.index = payloadBeginIndex
|
|
893
|
+
}
|
|
894
|
+
if (streamId) {
|
|
895
|
+
var pi = this.pesPacketInfo[streamId];
|
|
896
|
+
if (pi) {
|
|
897
|
+
var start = this.bits.index >> 3;
|
|
898
|
+
var complete = this.packetAddData(pi, start, end);
|
|
899
|
+
var hasPadding = !payloadStart && adaptationField & 2;
|
|
900
|
+
if (complete || this.guessVideoFrameEnd && hasPadding) {
|
|
901
|
+
this.packetComplete(pi)
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
this.bits.index = end << 3;
|
|
907
|
+
return true
|
|
908
|
+
};
|
|
909
|
+
TS.prototype.resync = function() {
|
|
910
|
+
if (!this.bits.has(188 * 6 << 3)) {
|
|
911
|
+
return false
|
|
912
|
+
}
|
|
913
|
+
var byteIndex = this.bits.index >> 3;
|
|
914
|
+
for (var i = 0; i < 187; i++) {
|
|
915
|
+
if (this.bits.bytes[byteIndex + i] === 71) {
|
|
916
|
+
var foundSync = true;
|
|
917
|
+
for (var j = 1; j < 5; j++) {
|
|
918
|
+
if (this.bits.bytes[byteIndex + i + 188 * j] !== 71) {
|
|
919
|
+
foundSync = false;
|
|
920
|
+
break
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
if (foundSync) {
|
|
924
|
+
this.bits.index = byteIndex + i + 1 << 3;
|
|
925
|
+
return true
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
console.warn("JSMpeg: Possible garbage data. Skipping.");
|
|
930
|
+
this.bits.skip(187 << 3);
|
|
931
|
+
return false
|
|
932
|
+
};
|
|
933
|
+
TS.prototype.packetStart = function(pi, pts, payloadLength) {
|
|
934
|
+
pi.totalLength = payloadLength;
|
|
935
|
+
pi.currentLength = 0;
|
|
936
|
+
pi.pts = pts
|
|
937
|
+
};
|
|
938
|
+
TS.prototype.packetAddData = function(pi, start, end) {
|
|
939
|
+
pi.buffers.push(this.bits.bytes.subarray(start, end));
|
|
940
|
+
pi.currentLength += end - start;
|
|
941
|
+
var complete = pi.totalLength !== 0 && pi.currentLength >= pi.totalLength;
|
|
942
|
+
return complete
|
|
943
|
+
};
|
|
944
|
+
TS.prototype.packetComplete = function(pi) {
|
|
945
|
+
pi.destination.write(pi.pts, pi.buffers);
|
|
946
|
+
pi.totalLength = 0;
|
|
947
|
+
pi.currentLength = 0;
|
|
948
|
+
pi.buffers = []
|
|
949
|
+
};
|
|
950
|
+
TS.STREAM = {
|
|
951
|
+
PACK_HEADER: 186,
|
|
952
|
+
SYSTEM_HEADER: 187,
|
|
953
|
+
PROGRAM_MAP: 188,
|
|
954
|
+
PRIVATE_1: 189,
|
|
955
|
+
PADDING: 190,
|
|
956
|
+
PRIVATE_2: 191,
|
|
957
|
+
AUDIO_1: 192,
|
|
958
|
+
VIDEO_1: 224,
|
|
959
|
+
DIRECTORY: 255
|
|
960
|
+
};
|
|
961
|
+
return TS
|
|
962
|
+
}();
|
|
963
|
+
JSMpeg.Decoder.Base = function() {
|
|
964
|
+
"use strict";
|
|
965
|
+
var BaseDecoder = function(options) {
|
|
966
|
+
this.destination = null;
|
|
967
|
+
this.canPlay = false;
|
|
968
|
+
this.collectTimestamps = !options.streaming;
|
|
969
|
+
this.bytesWritten = 0;
|
|
970
|
+
this.timestamps = [];
|
|
971
|
+
this.timestampIndex = 0;
|
|
972
|
+
this.startTime = 0;
|
|
973
|
+
this.decodedTime = 0;
|
|
974
|
+
Object.defineProperty(this, "currentTime", {
|
|
975
|
+
get: this.getCurrentTime
|
|
976
|
+
})
|
|
977
|
+
};
|
|
978
|
+
BaseDecoder.prototype.destroy = function() {};
|
|
979
|
+
BaseDecoder.prototype.connect = function(destination) {
|
|
980
|
+
this.destination = destination
|
|
981
|
+
};
|
|
982
|
+
BaseDecoder.prototype.bufferGetIndex = function() {
|
|
983
|
+
return this.bits.index
|
|
984
|
+
};
|
|
985
|
+
BaseDecoder.prototype.bufferSetIndex = function(index) {
|
|
986
|
+
this.bits.index = index
|
|
987
|
+
};
|
|
988
|
+
BaseDecoder.prototype.bufferWrite = function(buffers) {
|
|
989
|
+
return this.bits.write(buffers)
|
|
990
|
+
};
|
|
991
|
+
BaseDecoder.prototype.write = function(pts, buffers) {
|
|
992
|
+
if (this.collectTimestamps) {
|
|
993
|
+
if (this.timestamps.length === 0) {
|
|
994
|
+
this.startTime = pts;
|
|
995
|
+
this.decodedTime = pts
|
|
996
|
+
}
|
|
997
|
+
this.timestamps.push({
|
|
998
|
+
index: this.bytesWritten << 3,
|
|
999
|
+
time: pts
|
|
1000
|
+
})
|
|
1001
|
+
}
|
|
1002
|
+
this.bytesWritten += this.bufferWrite(buffers);
|
|
1003
|
+
this.canPlay = true
|
|
1004
|
+
};
|
|
1005
|
+
BaseDecoder.prototype.seek = function(time) {
|
|
1006
|
+
if (!this.collectTimestamps) {
|
|
1007
|
+
return
|
|
1008
|
+
}
|
|
1009
|
+
this.timestampIndex = 0;
|
|
1010
|
+
for (var i = 0; i < this.timestamps.length; i++) {
|
|
1011
|
+
if (this.timestamps[i].time > time) {
|
|
1012
|
+
break
|
|
1013
|
+
}
|
|
1014
|
+
this.timestampIndex = i
|
|
1015
|
+
}
|
|
1016
|
+
var ts = this.timestamps[this.timestampIndex];
|
|
1017
|
+
if (ts) {
|
|
1018
|
+
this.bufferSetIndex(ts.index);
|
|
1019
|
+
this.decodedTime = ts.time
|
|
1020
|
+
} else {
|
|
1021
|
+
this.bufferSetIndex(0);
|
|
1022
|
+
this.decodedTime = this.startTime
|
|
1023
|
+
}
|
|
1024
|
+
};
|
|
1025
|
+
BaseDecoder.prototype.decode = function() {
|
|
1026
|
+
this.advanceDecodedTime(0)
|
|
1027
|
+
};
|
|
1028
|
+
BaseDecoder.prototype.advanceDecodedTime = function(seconds) {
|
|
1029
|
+
if (this.collectTimestamps) {
|
|
1030
|
+
var newTimestampIndex = -1;
|
|
1031
|
+
var currentIndex = this.bufferGetIndex();
|
|
1032
|
+
for (var i = this.timestampIndex; i < this.timestamps.length; i++) {
|
|
1033
|
+
if (this.timestamps[i].index > currentIndex) {
|
|
1034
|
+
break
|
|
1035
|
+
}
|
|
1036
|
+
newTimestampIndex = i
|
|
1037
|
+
}
|
|
1038
|
+
if (newTimestampIndex !== -1 && newTimestampIndex !== this.timestampIndex) {
|
|
1039
|
+
this.timestampIndex = newTimestampIndex;
|
|
1040
|
+
this.decodedTime = this.timestamps[this.timestampIndex].time;
|
|
1041
|
+
return
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
this.decodedTime += seconds
|
|
1045
|
+
};
|
|
1046
|
+
BaseDecoder.prototype.getCurrentTime = function() {
|
|
1047
|
+
return this.decodedTime
|
|
1048
|
+
};
|
|
1049
|
+
return BaseDecoder
|
|
1050
|
+
}();
|
|
1051
|
+
JSMpeg.Decoder.MPEG1Video = function() {
|
|
1052
|
+
"use strict";
|
|
1053
|
+
var MPEG1 = function(options) {
|
|
1054
|
+
JSMpeg.Decoder.Base.call(this, options);
|
|
1055
|
+
this.onDecodeCallback = options.onVideoDecode;
|
|
1056
|
+
var bufferSize = options.videoBufferSize || 512 * 1024;
|
|
1057
|
+
var bufferMode = options.streaming ? JSMpeg.BitBuffer.MODE.EVICT : JSMpeg.BitBuffer.MODE.EXPAND;
|
|
1058
|
+
this.bits = new JSMpeg.BitBuffer(bufferSize, bufferMode);
|
|
1059
|
+
this.customIntraQuantMatrix = new Uint8Array(64);
|
|
1060
|
+
this.customNonIntraQuantMatrix = new Uint8Array(64);
|
|
1061
|
+
this.blockData = new Int32Array(64);
|
|
1062
|
+
this.currentFrame = 0;
|
|
1063
|
+
this.decodeFirstFrame = options.decodeFirstFrame !== false
|
|
1064
|
+
};
|
|
1065
|
+
MPEG1.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
|
|
1066
|
+
MPEG1.prototype.constructor = MPEG1;
|
|
1067
|
+
MPEG1.prototype.write = function(pts, buffers) {
|
|
1068
|
+
JSMpeg.Decoder.Base.prototype.write.call(this, pts, buffers);
|
|
1069
|
+
if (!this.hasSequenceHeader) {
|
|
1070
|
+
if (this.bits.findStartCode(MPEG1.START.SEQUENCE) === -1) {
|
|
1071
|
+
return false
|
|
1072
|
+
}
|
|
1073
|
+
this.decodeSequenceHeader();
|
|
1074
|
+
if (this.decodeFirstFrame) {
|
|
1075
|
+
this.decode()
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
};
|
|
1079
|
+
MPEG1.prototype.decode = function() {
|
|
1080
|
+
var startTime = JSMpeg.Now();
|
|
1081
|
+
if (!this.hasSequenceHeader) {
|
|
1082
|
+
return false
|
|
1083
|
+
}
|
|
1084
|
+
if (this.bits.findStartCode(MPEG1.START.PICTURE) === -1) {
|
|
1085
|
+
var bufferedBytes = this.bits.byteLength - (this.bits.index >> 3);
|
|
1086
|
+
return false
|
|
1087
|
+
}
|
|
1088
|
+
this.decodePicture();
|
|
1089
|
+
this.advanceDecodedTime(1 / this.frameRate);
|
|
1090
|
+
var elapsedTime = JSMpeg.Now() - startTime;
|
|
1091
|
+
if (this.onDecodeCallback) {
|
|
1092
|
+
this.onDecodeCallback(this, elapsedTime)
|
|
1093
|
+
}
|
|
1094
|
+
return true
|
|
1095
|
+
};
|
|
1096
|
+
MPEG1.prototype.readHuffman = function(codeTable) {
|
|
1097
|
+
var state = 0;
|
|
1098
|
+
do {
|
|
1099
|
+
state = codeTable[state + this.bits.read(1)]
|
|
1100
|
+
} while (state >= 0 && codeTable[state] !== 0);
|
|
1101
|
+
return codeTable[state + 2]
|
|
1102
|
+
};
|
|
1103
|
+
MPEG1.prototype.frameRate = 30;
|
|
1104
|
+
MPEG1.prototype.decodeSequenceHeader = function() {
|
|
1105
|
+
var newWidth = this.bits.read(12),
|
|
1106
|
+
newHeight = this.bits.read(12);
|
|
1107
|
+
this.bits.skip(4);
|
|
1108
|
+
this.frameRate = MPEG1.PICTURE_RATE[this.bits.read(4)];
|
|
1109
|
+
this.bits.skip(18 + 1 + 10 + 1);
|
|
1110
|
+
if (newWidth !== this.width || newHeight !== this.height) {
|
|
1111
|
+
this.width = newWidth;
|
|
1112
|
+
this.height = newHeight;
|
|
1113
|
+
this.initBuffers();
|
|
1114
|
+
if (this.destination) {
|
|
1115
|
+
this.destination.resize(newWidth, newHeight)
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
if (this.bits.read(1)) {
|
|
1119
|
+
for (var i = 0; i < 64; i++) {
|
|
1120
|
+
this.customIntraQuantMatrix[MPEG1.ZIG_ZAG[i]] = this.bits.read(8)
|
|
1121
|
+
}
|
|
1122
|
+
this.intraQuantMatrix = this.customIntraQuantMatrix
|
|
1123
|
+
}
|
|
1124
|
+
if (this.bits.read(1)) {
|
|
1125
|
+
for (var i = 0; i < 64; i++) {
|
|
1126
|
+
var idx = MPEG1.ZIG_ZAG[i];
|
|
1127
|
+
this.customNonIntraQuantMatrix[idx] = this.bits.read(8)
|
|
1128
|
+
}
|
|
1129
|
+
this.nonIntraQuantMatrix = this.customNonIntraQuantMatrix
|
|
1130
|
+
}
|
|
1131
|
+
this.hasSequenceHeader = true
|
|
1132
|
+
};
|
|
1133
|
+
MPEG1.prototype.initBuffers = function() {
|
|
1134
|
+
this.intraQuantMatrix = MPEG1.DEFAULT_INTRA_QUANT_MATRIX;
|
|
1135
|
+
this.nonIntraQuantMatrix = MPEG1.DEFAULT_NON_INTRA_QUANT_MATRIX;
|
|
1136
|
+
this.mbWidth = this.width + 15 >> 4;
|
|
1137
|
+
this.mbHeight = this.height + 15 >> 4;
|
|
1138
|
+
this.mbSize = this.mbWidth * this.mbHeight;
|
|
1139
|
+
this.codedWidth = this.mbWidth << 4;
|
|
1140
|
+
this.codedHeight = this.mbHeight << 4;
|
|
1141
|
+
this.codedSize = this.codedWidth * this.codedHeight;
|
|
1142
|
+
this.halfWidth = this.mbWidth << 3;
|
|
1143
|
+
this.halfHeight = this.mbHeight << 3;
|
|
1144
|
+
this.currentY = new Uint8ClampedArray(this.codedSize);
|
|
1145
|
+
this.currentY32 = new Uint32Array(this.currentY.buffer);
|
|
1146
|
+
this.currentCr = new Uint8ClampedArray(this.codedSize >> 2);
|
|
1147
|
+
this.currentCr32 = new Uint32Array(this.currentCr.buffer);
|
|
1148
|
+
this.currentCb = new Uint8ClampedArray(this.codedSize >> 2);
|
|
1149
|
+
this.currentCb32 = new Uint32Array(this.currentCb.buffer);
|
|
1150
|
+
this.forwardY = new Uint8ClampedArray(this.codedSize);
|
|
1151
|
+
this.forwardY32 = new Uint32Array(this.forwardY.buffer);
|
|
1152
|
+
this.forwardCr = new Uint8ClampedArray(this.codedSize >> 2);
|
|
1153
|
+
this.forwardCr32 = new Uint32Array(this.forwardCr.buffer);
|
|
1154
|
+
this.forwardCb = new Uint8ClampedArray(this.codedSize >> 2);
|
|
1155
|
+
this.forwardCb32 = new Uint32Array(this.forwardCb.buffer)
|
|
1156
|
+
};
|
|
1157
|
+
MPEG1.prototype.currentY = null;
|
|
1158
|
+
MPEG1.prototype.currentCr = null;
|
|
1159
|
+
MPEG1.prototype.currentCb = null;
|
|
1160
|
+
MPEG1.prototype.pictureType = 0;
|
|
1161
|
+
MPEG1.prototype.forwardY = null;
|
|
1162
|
+
MPEG1.prototype.forwardCr = null;
|
|
1163
|
+
MPEG1.prototype.forwardCb = null;
|
|
1164
|
+
MPEG1.prototype.fullPelForward = false;
|
|
1165
|
+
MPEG1.prototype.forwardFCode = 0;
|
|
1166
|
+
MPEG1.prototype.forwardRSize = 0;
|
|
1167
|
+
MPEG1.prototype.forwardF = 0;
|
|
1168
|
+
MPEG1.prototype.decodePicture = function(skipOutput) {
|
|
1169
|
+
this.currentFrame++;
|
|
1170
|
+
this.bits.skip(10);
|
|
1171
|
+
this.pictureType = this.bits.read(3);
|
|
1172
|
+
this.bits.skip(16);
|
|
1173
|
+
if (this.pictureType <= 0 || this.pictureType >= MPEG1.PICTURE_TYPE.B) {
|
|
1174
|
+
return
|
|
1175
|
+
}
|
|
1176
|
+
if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
|
|
1177
|
+
this.fullPelForward = this.bits.read(1);
|
|
1178
|
+
this.forwardFCode = this.bits.read(3);
|
|
1179
|
+
if (this.forwardFCode === 0) {
|
|
1180
|
+
return
|
|
1181
|
+
}
|
|
1182
|
+
this.forwardRSize = this.forwardFCode - 1;
|
|
1183
|
+
this.forwardF = 1 << this.forwardRSize
|
|
1184
|
+
}
|
|
1185
|
+
var code = 0;
|
|
1186
|
+
do {
|
|
1187
|
+
code = this.bits.findNextStartCode()
|
|
1188
|
+
} while (code === MPEG1.START.EXTENSION || code === MPEG1.START.USER_DATA);
|
|
1189
|
+
while (code >= MPEG1.START.SLICE_FIRST && code <= MPEG1.START.SLICE_LAST) {
|
|
1190
|
+
this.decodeSlice(code & 255);
|
|
1191
|
+
code = this.bits.findNextStartCode()
|
|
1192
|
+
}
|
|
1193
|
+
if (code !== -1) {
|
|
1194
|
+
this.bits.rewind(32)
|
|
1195
|
+
}
|
|
1196
|
+
if (this.destination) {
|
|
1197
|
+
this.destination.render(this.currentY, this.currentCr, this.currentCb, true)
|
|
1198
|
+
}
|
|
1199
|
+
if (this.pictureType === MPEG1.PICTURE_TYPE.INTRA || this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
|
|
1200
|
+
var tmpY = this.forwardY,
|
|
1201
|
+
tmpY32 = this.forwardY32,
|
|
1202
|
+
tmpCr = this.forwardCr,
|
|
1203
|
+
tmpCr32 = this.forwardCr32,
|
|
1204
|
+
tmpCb = this.forwardCb,
|
|
1205
|
+
tmpCb32 = this.forwardCb32;
|
|
1206
|
+
this.forwardY = this.currentY;
|
|
1207
|
+
this.forwardY32 = this.currentY32;
|
|
1208
|
+
this.forwardCr = this.currentCr;
|
|
1209
|
+
this.forwardCr32 = this.currentCr32;
|
|
1210
|
+
this.forwardCb = this.currentCb;
|
|
1211
|
+
this.forwardCb32 = this.currentCb32;
|
|
1212
|
+
this.currentY = tmpY;
|
|
1213
|
+
this.currentY32 = tmpY32;
|
|
1214
|
+
this.currentCr = tmpCr;
|
|
1215
|
+
this.currentCr32 = tmpCr32;
|
|
1216
|
+
this.currentCb = tmpCb;
|
|
1217
|
+
this.currentCb32 = tmpCb32
|
|
1218
|
+
}
|
|
1219
|
+
};
|
|
1220
|
+
MPEG1.prototype.quantizerScale = 0;
|
|
1221
|
+
MPEG1.prototype.sliceBegin = false;
|
|
1222
|
+
MPEG1.prototype.decodeSlice = function(slice) {
|
|
1223
|
+
this.sliceBegin = true;
|
|
1224
|
+
this.macroblockAddress = (slice - 1) * this.mbWidth - 1;
|
|
1225
|
+
this.motionFwH = this.motionFwHPrev = 0;
|
|
1226
|
+
this.motionFwV = this.motionFwVPrev = 0;
|
|
1227
|
+
this.dcPredictorY = 128;
|
|
1228
|
+
this.dcPredictorCr = 128;
|
|
1229
|
+
this.dcPredictorCb = 128;
|
|
1230
|
+
this.quantizerScale = this.bits.read(5);
|
|
1231
|
+
while (this.bits.read(1)) {
|
|
1232
|
+
this.bits.skip(8)
|
|
1233
|
+
}
|
|
1234
|
+
do {
|
|
1235
|
+
this.decodeMacroblock()
|
|
1236
|
+
} while (!this.bits.nextBytesAreStartCode())
|
|
1237
|
+
};
|
|
1238
|
+
MPEG1.prototype.macroblockAddress = 0;
|
|
1239
|
+
MPEG1.prototype.mbRow = 0;
|
|
1240
|
+
MPEG1.prototype.mbCol = 0;
|
|
1241
|
+
MPEG1.prototype.macroblockType = 0;
|
|
1242
|
+
MPEG1.prototype.macroblockIntra = false;
|
|
1243
|
+
MPEG1.prototype.macroblockMotFw = false;
|
|
1244
|
+
MPEG1.prototype.motionFwH = 0;
|
|
1245
|
+
MPEG1.prototype.motionFwV = 0;
|
|
1246
|
+
MPEG1.prototype.motionFwHPrev = 0;
|
|
1247
|
+
MPEG1.prototype.motionFwVPrev = 0;
|
|
1248
|
+
MPEG1.prototype.decodeMacroblock = function() {
|
|
1249
|
+
var increment = 0,
|
|
1250
|
+
t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT);
|
|
1251
|
+
while (t === 34) {
|
|
1252
|
+
t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT);
|
|
1253
|
+
|
|
1254
|
+
}
|
|
1255
|
+
while (t === 35) {
|
|
1256
|
+
increment += 33;
|
|
1257
|
+
t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT)
|
|
1258
|
+
}
|
|
1259
|
+
increment += t;
|
|
1260
|
+
if (this.sliceBegin) {
|
|
1261
|
+
this.sliceBegin = false;
|
|
1262
|
+
this.macroblockAddress += increment
|
|
1263
|
+
} else {
|
|
1264
|
+
if (this.macroblockAddress + increment >= this.mbSize) {
|
|
1265
|
+
return
|
|
1266
|
+
}
|
|
1267
|
+
if (increment > 1) {
|
|
1268
|
+
this.dcPredictorY = 128;
|
|
1269
|
+
this.dcPredictorCr = 128;
|
|
1270
|
+
this.dcPredictorCb = 128;
|
|
1271
|
+
if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
|
|
1272
|
+
this.motionFwH = this.motionFwHPrev = 0;
|
|
1273
|
+
this.motionFwV = this.motionFwVPrev = 0
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
while (increment > 1) {
|
|
1277
|
+
this.macroblockAddress++;
|
|
1278
|
+
this.mbRow = this.macroblockAddress / this.mbWidth | 0;
|
|
1279
|
+
this.mbCol = this.macroblockAddress % this.mbWidth;
|
|
1280
|
+
this.copyMacroblock(this.motionFwH, this.motionFwV, this.forwardY, this.forwardCr, this.forwardCb);
|
|
1281
|
+
increment--
|
|
1282
|
+
}
|
|
1283
|
+
this.macroblockAddress++
|
|
1284
|
+
}
|
|
1285
|
+
this.mbRow = this.macroblockAddress / this.mbWidth | 0;
|
|
1286
|
+
this.mbCol = this.macroblockAddress % this.mbWidth;
|
|
1287
|
+
var mbTable = MPEG1.MACROBLOCK_TYPE[this.pictureType];
|
|
1288
|
+
this.macroblockType = this.readHuffman(mbTable);
|
|
1289
|
+
this.macroblockIntra = this.macroblockType & 1;
|
|
1290
|
+
this.macroblockMotFw = this.macroblockType & 8;
|
|
1291
|
+
if ((this.macroblockType & 16) !== 0) {
|
|
1292
|
+
this.quantizerScale = this.bits.read(5)
|
|
1293
|
+
}
|
|
1294
|
+
if (this.macroblockIntra) {
|
|
1295
|
+
this.motionFwH = this.motionFwHPrev = 0;
|
|
1296
|
+
this.motionFwV = this.motionFwVPrev = 0
|
|
1297
|
+
} else {
|
|
1298
|
+
this.dcPredictorY = 128;
|
|
1299
|
+
this.dcPredictorCr = 128;
|
|
1300
|
+
this.dcPredictorCb = 128;
|
|
1301
|
+
this.decodeMotionVectors();
|
|
1302
|
+
this.copyMacroblock(this.motionFwH, this.motionFwV, this.forwardY, this.forwardCr, this.forwardCb)
|
|
1303
|
+
}
|
|
1304
|
+
var cbp = (this.macroblockType & 2) !== 0 ? this.readHuffman(MPEG1.CODE_BLOCK_PATTERN) : this.macroblockIntra ? 63 : 0;
|
|
1305
|
+
for (var block = 0, mask = 32; block < 6; block++) {
|
|
1306
|
+
if ((cbp & mask) !== 0) {
|
|
1307
|
+
this.decodeBlock(block)
|
|
1308
|
+
}
|
|
1309
|
+
mask >>= 1
|
|
1310
|
+
}
|
|
1311
|
+
};
|
|
1312
|
+
MPEG1.prototype.decodeMotionVectors = function() {
|
|
1313
|
+
var code, d, r = 0;
|
|
1314
|
+
if (this.macroblockMotFw) {
|
|
1315
|
+
code = this.readHuffman(MPEG1.MOTION);
|
|
1316
|
+
if (code !== 0 && this.forwardF !== 1) {
|
|
1317
|
+
r = this.bits.read(this.forwardRSize);
|
|
1318
|
+
d = (Math.abs(code) - 1 << this.forwardRSize) + r + 1;
|
|
1319
|
+
if (code < 0) {
|
|
1320
|
+
d = -d
|
|
1321
|
+
}
|
|
1322
|
+
} else {
|
|
1323
|
+
d = code
|
|
1324
|
+
}
|
|
1325
|
+
this.motionFwHPrev += d;
|
|
1326
|
+
if (this.motionFwHPrev > (this.forwardF << 4) - 1) {
|
|
1327
|
+
this.motionFwHPrev -= this.forwardF << 5
|
|
1328
|
+
} else if (this.motionFwHPrev < -this.forwardF << 4) {
|
|
1329
|
+
this.motionFwHPrev += this.forwardF << 5
|
|
1330
|
+
}
|
|
1331
|
+
this.motionFwH = this.motionFwHPrev;
|
|
1332
|
+
if (this.fullPelForward) {
|
|
1333
|
+
this.motionFwH <<= 1
|
|
1334
|
+
}
|
|
1335
|
+
code = this.readHuffman(MPEG1.MOTION);
|
|
1336
|
+
if (code !== 0 && this.forwardF !== 1) {
|
|
1337
|
+
r = this.bits.read(this.forwardRSize);
|
|
1338
|
+
d = (Math.abs(code) - 1 << this.forwardRSize) + r + 1;
|
|
1339
|
+
if (code < 0) {
|
|
1340
|
+
d = -d
|
|
1341
|
+
}
|
|
1342
|
+
} else {
|
|
1343
|
+
d = code
|
|
1344
|
+
}
|
|
1345
|
+
this.motionFwVPrev += d;
|
|
1346
|
+
if (this.motionFwVPrev > (this.forwardF << 4) - 1) {
|
|
1347
|
+
this.motionFwVPrev -= this.forwardF << 5
|
|
1348
|
+
} else if (this.motionFwVPrev < -this.forwardF << 4) {
|
|
1349
|
+
this.motionFwVPrev += this.forwardF << 5
|
|
1350
|
+
}
|
|
1351
|
+
this.motionFwV = this.motionFwVPrev;
|
|
1352
|
+
if (this.fullPelForward) {
|
|
1353
|
+
this.motionFwV <<= 1
|
|
1354
|
+
}
|
|
1355
|
+
} else if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
|
|
1356
|
+
this.motionFwH = this.motionFwHPrev = 0;
|
|
1357
|
+
this.motionFwV = this.motionFwVPrev = 0
|
|
1358
|
+
}
|
|
1359
|
+
};
|
|
1360
|
+
MPEG1.prototype.copyMacroblock = function(motionH, motionV, sY, sCr, sCb) {
|
|
1361
|
+
var width, scan, H, V, oddH, oddV, src, dest, last;
|
|
1362
|
+
var dY = this.currentY32,
|
|
1363
|
+
dCb = this.currentCb32,
|
|
1364
|
+
dCr = this.currentCr32;
|
|
1365
|
+
width = this.codedWidth;
|
|
1366
|
+
scan = width - 16;
|
|
1367
|
+
H = motionH >> 1;
|
|
1368
|
+
V = motionV >> 1;
|
|
1369
|
+
oddH = (motionH & 1) === 1;
|
|
1370
|
+
oddV = (motionV & 1) === 1;
|
|
1371
|
+
src = ((this.mbRow << 4) + V) * width + (this.mbCol << 4) + H;
|
|
1372
|
+
dest = this.mbRow * width + this.mbCol << 2;
|
|
1373
|
+
last = dest + (width << 2);
|
|
1374
|
+
var x, y1, y2, y;
|
|
1375
|
+
if (oddH) {
|
|
1376
|
+
if (oddV) {
|
|
1377
|
+
while (dest < last) {
|
|
1378
|
+
y1 = sY[src] + sY[src + width];
|
|
1379
|
+
src++;
|
|
1380
|
+
for (x = 0; x < 4; x++) {
|
|
1381
|
+
y2 = sY[src] + sY[src + width];
|
|
1382
|
+
src++;
|
|
1383
|
+
y = y1 + y2 + 2 >> 2 & 255;
|
|
1384
|
+
y1 = sY[src] + sY[src + width];
|
|
1385
|
+
src++;
|
|
1386
|
+
y |= y1 + y2 + 2 << 6 & 65280;
|
|
1387
|
+
y2 = sY[src] + sY[src + width];
|
|
1388
|
+
src++;
|
|
1389
|
+
y |= y1 + y2 + 2 << 14 & 16711680;
|
|
1390
|
+
y1 = sY[src] + sY[src + width];
|
|
1391
|
+
src++;
|
|
1392
|
+
y |= y1 + y2 + 2 << 22 & 4278190080;
|
|
1393
|
+
dY[dest++] = y
|
|
1394
|
+
}
|
|
1395
|
+
dest += scan >> 2;
|
|
1396
|
+
src += scan - 1
|
|
1397
|
+
}
|
|
1398
|
+
} else {
|
|
1399
|
+
while (dest < last) {
|
|
1400
|
+
y1 = sY[src++];
|
|
1401
|
+
for (x = 0; x < 4; x++) {
|
|
1402
|
+
y2 = sY[src++];
|
|
1403
|
+
y = y1 + y2 + 1 >> 1 & 255;
|
|
1404
|
+
y1 = sY[src++];
|
|
1405
|
+
y |= y1 + y2 + 1 << 7 & 65280;
|
|
1406
|
+
y2 = sY[src++];
|
|
1407
|
+
y |= y1 + y2 + 1 << 15 & 16711680;
|
|
1408
|
+
y1 = sY[src++];
|
|
1409
|
+
y |= y1 + y2 + 1 << 23 & 4278190080;
|
|
1410
|
+
dY[dest++] = y
|
|
1411
|
+
}
|
|
1412
|
+
dest += scan >> 2;
|
|
1413
|
+
src += scan - 1
|
|
1414
|
+
}
|
|
1415
|
+
}
|
|
1416
|
+
} else {
|
|
1417
|
+
if (oddV) {
|
|
1418
|
+
while (dest < last) {
|
|
1419
|
+
for (x = 0; x < 4; x++) {
|
|
1420
|
+
y = sY[src] + sY[src + width] + 1 >> 1 & 255;
|
|
1421
|
+
src++;
|
|
1422
|
+
y |= sY[src] + sY[src + width] + 1 << 7 & 65280;
|
|
1423
|
+
src++;
|
|
1424
|
+
y |= sY[src] + sY[src + width] + 1 << 15 & 16711680;
|
|
1425
|
+
src++;
|
|
1426
|
+
y |= sY[src] + sY[src + width] + 1 << 23 & 4278190080;
|
|
1427
|
+
src++;
|
|
1428
|
+
dY[dest++] = y
|
|
1429
|
+
}
|
|
1430
|
+
dest += scan >> 2;
|
|
1431
|
+
src += scan
|
|
1432
|
+
}
|
|
1433
|
+
} else {
|
|
1434
|
+
while (dest < last) {
|
|
1435
|
+
for (x = 0; x < 4; x++) {
|
|
1436
|
+
y = sY[src];
|
|
1437
|
+
src++;
|
|
1438
|
+
y |= sY[src] << 8;
|
|
1439
|
+
src++;
|
|
1440
|
+
y |= sY[src] << 16;
|
|
1441
|
+
src++;
|
|
1442
|
+
y |= sY[src] << 24;
|
|
1443
|
+
src++;
|
|
1444
|
+
dY[dest++] = y
|
|
1445
|
+
}
|
|
1446
|
+
dest += scan >> 2;
|
|
1447
|
+
src += scan
|
|
1448
|
+
}
|
|
1449
|
+
}
|
|
1450
|
+
}
|
|
1451
|
+
width = this.halfWidth;
|
|
1452
|
+
scan = width - 8;
|
|
1453
|
+
H = motionH / 2 >> 1;
|
|
1454
|
+
V = motionV / 2 >> 1;
|
|
1455
|
+
oddH = (motionH / 2 & 1) === 1;
|
|
1456
|
+
oddV = (motionV / 2 & 1) === 1;
|
|
1457
|
+
src = ((this.mbRow << 3) + V) * width + (this.mbCol << 3) + H;
|
|
1458
|
+
dest = this.mbRow * width + this.mbCol << 1;
|
|
1459
|
+
last = dest + (width << 1);
|
|
1460
|
+
var cr1, cr2, cr, cb1, cb2, cb;
|
|
1461
|
+
if (oddH) {
|
|
1462
|
+
if (oddV) {
|
|
1463
|
+
while (dest < last) {
|
|
1464
|
+
cr1 = sCr[src] + sCr[src + width];
|
|
1465
|
+
cb1 = sCb[src] + sCb[src + width];
|
|
1466
|
+
src++;
|
|
1467
|
+
for (x = 0; x < 2; x++) {
|
|
1468
|
+
cr2 = sCr[src] + sCr[src + width];
|
|
1469
|
+
cb2 = sCb[src] + sCb[src + width];
|
|
1470
|
+
src++;
|
|
1471
|
+
cr = cr1 + cr2 + 2 >> 2 & 255;
|
|
1472
|
+
cb = cb1 + cb2 + 2 >> 2 & 255;
|
|
1473
|
+
cr1 = sCr[src] + sCr[src + width];
|
|
1474
|
+
cb1 = sCb[src] + sCb[src + width];
|
|
1475
|
+
src++;
|
|
1476
|
+
cr |= cr1 + cr2 + 2 << 6 & 65280;
|
|
1477
|
+
cb |= cb1 + cb2 + 2 << 6 & 65280;
|
|
1478
|
+
cr2 = sCr[src] + sCr[src + width];
|
|
1479
|
+
cb2 = sCb[src] + sCb[src + width];
|
|
1480
|
+
src++;
|
|
1481
|
+
cr |= cr1 + cr2 + 2 << 14 & 16711680;
|
|
1482
|
+
cb |= cb1 + cb2 + 2 << 14 & 16711680;
|
|
1483
|
+
cr1 = sCr[src] + sCr[src + width];
|
|
1484
|
+
cb1 = sCb[src] + sCb[src + width];
|
|
1485
|
+
src++;
|
|
1486
|
+
cr |= cr1 + cr2 + 2 << 22 & 4278190080;
|
|
1487
|
+
cb |= cb1 + cb2 + 2 << 22 & 4278190080;
|
|
1488
|
+
dCr[dest] = cr;
|
|
1489
|
+
dCb[dest] = cb;
|
|
1490
|
+
dest++
|
|
1491
|
+
}
|
|
1492
|
+
dest += scan >> 2;
|
|
1493
|
+
src += scan - 1
|
|
1494
|
+
}
|
|
1495
|
+
} else {
|
|
1496
|
+
while (dest < last) {
|
|
1497
|
+
cr1 = sCr[src];
|
|
1498
|
+
cb1 = sCb[src];
|
|
1499
|
+
src++;
|
|
1500
|
+
for (x = 0; x < 2; x++) {
|
|
1501
|
+
cr2 = sCr[src];
|
|
1502
|
+
cb2 = sCb[src++];
|
|
1503
|
+
cr = cr1 + cr2 + 1 >> 1 & 255;
|
|
1504
|
+
cb = cb1 + cb2 + 1 >> 1 & 255;
|
|
1505
|
+
cr1 = sCr[src];
|
|
1506
|
+
cb1 = sCb[src++];
|
|
1507
|
+
cr |= cr1 + cr2 + 1 << 7 & 65280;
|
|
1508
|
+
cb |= cb1 + cb2 + 1 << 7 & 65280;
|
|
1509
|
+
cr2 = sCr[src];
|
|
1510
|
+
cb2 = sCb[src++];
|
|
1511
|
+
cr |= cr1 + cr2 + 1 << 15 & 16711680;
|
|
1512
|
+
cb |= cb1 + cb2 + 1 << 15 & 16711680;
|
|
1513
|
+
cr1 = sCr[src];
|
|
1514
|
+
cb1 = sCb[src++];
|
|
1515
|
+
cr |= cr1 + cr2 + 1 << 23 & 4278190080;
|
|
1516
|
+
cb |= cb1 + cb2 + 1 << 23 & 4278190080;
|
|
1517
|
+
dCr[dest] = cr;
|
|
1518
|
+
dCb[dest] = cb;
|
|
1519
|
+
dest++
|
|
1520
|
+
}
|
|
1521
|
+
dest += scan >> 2;
|
|
1522
|
+
src += scan - 1
|
|
1523
|
+
}
|
|
1524
|
+
}
|
|
1525
|
+
} else {
|
|
1526
|
+
if (oddV) {
|
|
1527
|
+
while (dest < last) {
|
|
1528
|
+
for (x = 0; x < 2; x++) {
|
|
1529
|
+
cr = sCr[src] + sCr[src + width] + 1 >> 1 & 255;
|
|
1530
|
+
cb = sCb[src] + sCb[src + width] + 1 >> 1 & 255;
|
|
1531
|
+
src++;
|
|
1532
|
+
cr |= sCr[src] + sCr[src + width] + 1 << 7 & 65280;
|
|
1533
|
+
cb |= sCb[src] + sCb[src + width] + 1 << 7 & 65280;
|
|
1534
|
+
src++;
|
|
1535
|
+
cr |= sCr[src] + sCr[src + width] + 1 << 15 & 16711680;
|
|
1536
|
+
cb |= sCb[src] + sCb[src + width] + 1 << 15 & 16711680;
|
|
1537
|
+
src++;
|
|
1538
|
+
cr |= sCr[src] + sCr[src + width] + 1 << 23 & 4278190080;
|
|
1539
|
+
cb |= sCb[src] + sCb[src + width] + 1 << 23 & 4278190080;
|
|
1540
|
+
src++;
|
|
1541
|
+
dCr[dest] = cr;
|
|
1542
|
+
dCb[dest] = cb;
|
|
1543
|
+
dest++
|
|
1544
|
+
}
|
|
1545
|
+
dest += scan >> 2;
|
|
1546
|
+
src += scan
|
|
1547
|
+
}
|
|
1548
|
+
} else {
|
|
1549
|
+
while (dest < last) {
|
|
1550
|
+
for (x = 0; x < 2; x++) {
|
|
1551
|
+
cr = sCr[src];
|
|
1552
|
+
cb = sCb[src];
|
|
1553
|
+
src++;
|
|
1554
|
+
cr |= sCr[src] << 8;
|
|
1555
|
+
cb |= sCb[src] << 8;
|
|
1556
|
+
src++;
|
|
1557
|
+
cr |= sCr[src] << 16;
|
|
1558
|
+
cb |= sCb[src] << 16;
|
|
1559
|
+
src++;
|
|
1560
|
+
cr |= sCr[src] << 24;
|
|
1561
|
+
cb |= sCb[src] << 24;
|
|
1562
|
+
src++;
|
|
1563
|
+
dCr[dest] = cr;
|
|
1564
|
+
dCb[dest] = cb;
|
|
1565
|
+
dest++
|
|
1566
|
+
}
|
|
1567
|
+
dest += scan >> 2;
|
|
1568
|
+
src += scan
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1571
|
+
}
|
|
1572
|
+
};
|
|
1573
|
+
MPEG1.prototype.dcPredictorY = 0;
|
|
1574
|
+
MPEG1.prototype.dcPredictorCr = 0;
|
|
1575
|
+
MPEG1.prototype.dcPredictorCb = 0;
|
|
1576
|
+
MPEG1.prototype.blockData = null;
|
|
1577
|
+
MPEG1.prototype.decodeBlock = function(block) {
|
|
1578
|
+
var n = 0,
|
|
1579
|
+
quantMatrix;
|
|
1580
|
+
if (this.macroblockIntra) {
|
|
1581
|
+
var predictor, dctSize;
|
|
1582
|
+
if (block < 4) {
|
|
1583
|
+
predictor = this.dcPredictorY;
|
|
1584
|
+
dctSize = this.readHuffman(MPEG1.DCT_DC_SIZE_LUMINANCE)
|
|
1585
|
+
} else {
|
|
1586
|
+
predictor = block === 4 ? this.dcPredictorCr : this.dcPredictorCb;
|
|
1587
|
+
dctSize = this.readHuffman(MPEG1.DCT_DC_SIZE_CHROMINANCE)
|
|
1588
|
+
}
|
|
1589
|
+
if (dctSize > 0) {
|
|
1590
|
+
var differential = this.bits.read(dctSize);
|
|
1591
|
+
if ((differential & 1 << dctSize - 1) !== 0) {
|
|
1592
|
+
this.blockData[0] = predictor + differential
|
|
1593
|
+
} else {
|
|
1594
|
+
this.blockData[0] = predictor + (-1 << dctSize | differential + 1)
|
|
1595
|
+
}
|
|
1596
|
+
} else {
|
|
1597
|
+
this.blockData[0] = predictor
|
|
1598
|
+
}
|
|
1599
|
+
if (block < 4) {
|
|
1600
|
+
this.dcPredictorY = this.blockData[0]
|
|
1601
|
+
} else if (block === 4) {
|
|
1602
|
+
this.dcPredictorCr = this.blockData[0]
|
|
1603
|
+
} else {
|
|
1604
|
+
this.dcPredictorCb = this.blockData[0]
|
|
1605
|
+
}
|
|
1606
|
+
this.blockData[0] <<= 3 + 5;
|
|
1607
|
+
quantMatrix = this.intraQuantMatrix;
|
|
1608
|
+
n = 1
|
|
1609
|
+
} else {
|
|
1610
|
+
quantMatrix = this.nonIntraQuantMatrix
|
|
1611
|
+
}
|
|
1612
|
+
var level = 0;
|
|
1613
|
+
while (true) {
|
|
1614
|
+
var run = 0,
|
|
1615
|
+
coeff = this.readHuffman(MPEG1.DCT_COEFF);
|
|
1616
|
+
if (coeff === 1 && n > 0 && this.bits.read(1) === 0) {
|
|
1617
|
+
break
|
|
1618
|
+
}
|
|
1619
|
+
if (coeff === 65535) {
|
|
1620
|
+
run = this.bits.read(6);
|
|
1621
|
+
level = this.bits.read(8);
|
|
1622
|
+
if (level === 0) {
|
|
1623
|
+
level = this.bits.read(8)
|
|
1624
|
+
} else if (level === 128) {
|
|
1625
|
+
level = this.bits.read(8) - 256
|
|
1626
|
+
} else if (level > 128) {
|
|
1627
|
+
level = level - 256
|
|
1628
|
+
}
|
|
1629
|
+
} else {
|
|
1630
|
+
run = coeff >> 8;
|
|
1631
|
+
level = coeff & 255;
|
|
1632
|
+
if (this.bits.read(1)) {
|
|
1633
|
+
level = -level
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1636
|
+
n += run;
|
|
1637
|
+
var dezigZagged = MPEG1.ZIG_ZAG[n];
|
|
1638
|
+
n++;
|
|
1639
|
+
level <<= 1;
|
|
1640
|
+
if (!this.macroblockIntra) {
|
|
1641
|
+
level += level < 0 ? -1 : 1
|
|
1642
|
+
}
|
|
1643
|
+
level = level * this.quantizerScale * quantMatrix[dezigZagged] >> 4;
|
|
1644
|
+
if ((level & 1) === 0) {
|
|
1645
|
+
level -= level > 0 ? 1 : -1
|
|
1646
|
+
}
|
|
1647
|
+
if (level > 2047) {
|
|
1648
|
+
level = 2047
|
|
1649
|
+
} else if (level < -2048) {
|
|
1650
|
+
level = -2048
|
|
1651
|
+
}
|
|
1652
|
+
this.blockData[dezigZagged] = level * MPEG1.PREMULTIPLIER_MATRIX[dezigZagged]
|
|
1653
|
+
}
|
|
1654
|
+
var destArray, destIndex, scan;
|
|
1655
|
+
if (block < 4) {
|
|
1656
|
+
destArray = this.currentY;
|
|
1657
|
+
scan = this.codedWidth - 8;
|
|
1658
|
+
destIndex = this.mbRow * this.codedWidth + this.mbCol << 4;
|
|
1659
|
+
if ((block & 1) !== 0) {
|
|
1660
|
+
destIndex += 8
|
|
1661
|
+
}
|
|
1662
|
+
if ((block & 2) !== 0) {
|
|
1663
|
+
destIndex += this.codedWidth << 3
|
|
1664
|
+
}
|
|
1665
|
+
} else {
|
|
1666
|
+
destArray = block === 4 ? this.currentCb : this.currentCr;
|
|
1667
|
+
scan = (this.codedWidth >> 1) - 8;
|
|
1668
|
+
destIndex = (this.mbRow * this.codedWidth << 2) + (this.mbCol << 3)
|
|
1669
|
+
}
|
|
1670
|
+
if (this.macroblockIntra) {
|
|
1671
|
+
if (n === 1) {
|
|
1672
|
+
MPEG1.CopyValueToDestination(this.blockData[0] + 128 >> 8, destArray, destIndex, scan);
|
|
1673
|
+
this.blockData[0] = 0
|
|
1674
|
+
} else {
|
|
1675
|
+
MPEG1.IDCT(this.blockData);
|
|
1676
|
+
MPEG1.CopyBlockToDestination(this.blockData, destArray, destIndex, scan);
|
|
1677
|
+
JSMpeg.Fill(this.blockData, 0)
|
|
1678
|
+
}
|
|
1679
|
+
} else {
|
|
1680
|
+
if (n === 1) {
|
|
1681
|
+
MPEG1.AddValueToDestination(this.blockData[0] + 128 >> 8, destArray, destIndex, scan);
|
|
1682
|
+
this.blockData[0] = 0
|
|
1683
|
+
} else {
|
|
1684
|
+
MPEG1.IDCT(this.blockData);
|
|
1685
|
+
MPEG1.AddBlockToDestination(this.blockData, destArray, destIndex, scan);
|
|
1686
|
+
JSMpeg.Fill(this.blockData, 0)
|
|
1687
|
+
}
|
|
1688
|
+
}
|
|
1689
|
+
n = 0
|
|
1690
|
+
};
|
|
1691
|
+
MPEG1.CopyBlockToDestination = function(block, dest, index, scan) {
|
|
1692
|
+
for (var n = 0; n < 64; n += 8, index += scan + 8) {
|
|
1693
|
+
dest[index + 0] = block[n + 0];
|
|
1694
|
+
dest[index + 1] = block[n + 1];
|
|
1695
|
+
dest[index + 2] = block[n + 2];
|
|
1696
|
+
dest[index + 3] = block[n + 3];
|
|
1697
|
+
dest[index + 4] = block[n + 4];
|
|
1698
|
+
dest[index + 5] = block[n + 5];
|
|
1699
|
+
dest[index + 6] = block[n + 6];
|
|
1700
|
+
dest[index + 7] = block[n + 7]
|
|
1701
|
+
}
|
|
1702
|
+
};
|
|
1703
|
+
MPEG1.AddBlockToDestination = function(block, dest, index, scan) {
|
|
1704
|
+
for (var n = 0; n < 64; n += 8, index += scan + 8) {
|
|
1705
|
+
dest[index + 0] += block[n + 0];
|
|
1706
|
+
dest[index + 1] += block[n + 1];
|
|
1707
|
+
dest[index + 2] += block[n + 2];
|
|
1708
|
+
dest[index + 3] += block[n + 3];
|
|
1709
|
+
dest[index + 4] += block[n + 4];
|
|
1710
|
+
dest[index + 5] += block[n + 5];
|
|
1711
|
+
dest[index + 6] += block[n + 6];
|
|
1712
|
+
dest[index + 7] += block[n + 7]
|
|
1713
|
+
}
|
|
1714
|
+
};
|
|
1715
|
+
MPEG1.CopyValueToDestination = function(value, dest, index, scan) {
|
|
1716
|
+
for (var n = 0; n < 64; n += 8, index += scan + 8) {
|
|
1717
|
+
dest[index + 0] = value;
|
|
1718
|
+
dest[index + 1] = value;
|
|
1719
|
+
dest[index + 2] = value;
|
|
1720
|
+
dest[index + 3] = value;
|
|
1721
|
+
dest[index + 4] = value;
|
|
1722
|
+
dest[index + 5] = value;
|
|
1723
|
+
dest[index + 6] = value;
|
|
1724
|
+
dest[index + 7] = value
|
|
1725
|
+
}
|
|
1726
|
+
};
|
|
1727
|
+
MPEG1.AddValueToDestination = function(value, dest, index, scan) {
|
|
1728
|
+
for (var n = 0; n < 64; n += 8, index += scan + 8) {
|
|
1729
|
+
dest[index + 0] += value;
|
|
1730
|
+
dest[index + 1] += value;
|
|
1731
|
+
dest[index + 2] += value;
|
|
1732
|
+
dest[index + 3] += value;
|
|
1733
|
+
dest[index + 4] += value;
|
|
1734
|
+
dest[index + 5] += value;
|
|
1735
|
+
dest[index + 6] += value;
|
|
1736
|
+
dest[index + 7] += value
|
|
1737
|
+
}
|
|
1738
|
+
};
|
|
1739
|
+
MPEG1.IDCT = function(block) {
|
|
1740
|
+
var b1, b3, b4, b6, b7, tmp1, tmp2, m0, x0, x1, x2, x3, x4, y3, y4, y5, y6, y7;
|
|
1741
|
+
for (var i = 0; i < 8; ++i) {
|
|
1742
|
+
b1 = block[4 * 8 + i];
|
|
1743
|
+
b3 = block[2 * 8 + i] + block[6 * 8 + i];
|
|
1744
|
+
b4 = block[5 * 8 + i] - block[3 * 8 + i];
|
|
1745
|
+
tmp1 = block[1 * 8 + i] + block[7 * 8 + i];
|
|
1746
|
+
tmp2 = block[3 * 8 + i] + block[5 * 8 + i];
|
|
1747
|
+
b6 = block[1 * 8 + i] - block[7 * 8 + i];
|
|
1748
|
+
b7 = tmp1 + tmp2;
|
|
1749
|
+
m0 = block[0 * 8 + i];
|
|
1750
|
+
x4 = (b6 * 473 - b4 * 196 + 128 >> 8) - b7;
|
|
1751
|
+
x0 = x4 - ((tmp1 - tmp2) * 362 + 128 >> 8);
|
|
1752
|
+
x1 = m0 - b1;
|
|
1753
|
+
x2 = ((block[2 * 8 + i] - block[6 * 8 + i]) * 362 + 128 >> 8) - b3;
|
|
1754
|
+
x3 = m0 + b1;
|
|
1755
|
+
y3 = x1 + x2;
|
|
1756
|
+
y4 = x3 + b3;
|
|
1757
|
+
y5 = x1 - x2;
|
|
1758
|
+
y6 = x3 - b3;
|
|
1759
|
+
y7 = -x0 - (b4 * 473 + b6 * 196 + 128 >> 8);
|
|
1760
|
+
block[0 * 8 + i] = b7 + y4;
|
|
1761
|
+
block[1 * 8 + i] = x4 + y3;
|
|
1762
|
+
block[2 * 8 + i] = y5 - x0;
|
|
1763
|
+
block[3 * 8 + i] = y6 - y7;
|
|
1764
|
+
block[4 * 8 + i] = y6 + y7;
|
|
1765
|
+
block[5 * 8 + i] = x0 + y5;
|
|
1766
|
+
block[6 * 8 + i] = y3 - x4;
|
|
1767
|
+
block[7 * 8 + i] = y4 - b7
|
|
1768
|
+
}
|
|
1769
|
+
for (var i = 0; i < 64; i += 8) {
|
|
1770
|
+
b1 = block[4 + i];
|
|
1771
|
+
b3 = block[2 + i] + block[6 + i];
|
|
1772
|
+
b4 = block[5 + i] - block[3 + i];
|
|
1773
|
+
tmp1 = block[1 + i] + block[7 + i];
|
|
1774
|
+
tmp2 = block[3 + i] + block[5 + i];
|
|
1775
|
+
b6 = block[1 + i] - block[7 + i];
|
|
1776
|
+
b7 = tmp1 + tmp2;
|
|
1777
|
+
m0 = block[0 + i];
|
|
1778
|
+
x4 = (b6 * 473 - b4 * 196 + 128 >> 8) - b7;
|
|
1779
|
+
x0 = x4 - ((tmp1 - tmp2) * 362 + 128 >> 8);
|
|
1780
|
+
x1 = m0 - b1;
|
|
1781
|
+
x2 = ((block[2 + i] - block[6 + i]) * 362 + 128 >> 8) - b3;
|
|
1782
|
+
x3 = m0 + b1;
|
|
1783
|
+
y3 = x1 + x2;
|
|
1784
|
+
y4 = x3 + b3;
|
|
1785
|
+
y5 = x1 - x2;
|
|
1786
|
+
y6 = x3 - b3;
|
|
1787
|
+
y7 = -x0 - (b4 * 473 + b6 * 196 + 128 >> 8);
|
|
1788
|
+
block[0 + i] = b7 + y4 + 128 >> 8;
|
|
1789
|
+
block[1 + i] = x4 + y3 + 128 >> 8;
|
|
1790
|
+
block[2 + i] = y5 - x0 + 128 >> 8;
|
|
1791
|
+
block[3 + i] = y6 - y7 + 128 >> 8;
|
|
1792
|
+
block[4 + i] = y6 + y7 + 128 >> 8;
|
|
1793
|
+
block[5 + i] = x0 + y5 + 128 >> 8;
|
|
1794
|
+
block[6 + i] = y3 - x4 + 128 >> 8;
|
|
1795
|
+
block[7 + i] = y4 - b7 + 128 >> 8
|
|
1796
|
+
}
|
|
1797
|
+
};
|
|
1798
|
+
MPEG1.PICTURE_RATE = [0, 23.976, 24, 25, 29.97, 30, 50, 59.94, 60, 0, 0, 0, 0, 0, 0, 0];
|
|
1799
|
+
MPEG1.ZIG_ZAG = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);
|
|
1800
|
+
MPEG1.DEFAULT_INTRA_QUANT_MATRIX = new Uint8Array([8, 16, 19, 22, 26, 27, 29, 34, 16, 16, 22, 24, 27, 29, 34, 37, 19, 22, 26, 27, 29, 34, 34, 38, 22, 22, 26, 27, 29, 34, 37, 40, 22, 26, 27, 29, 32, 35, 40, 48, 26, 27, 29, 32, 35, 40, 48, 58, 26, 27, 29, 34, 38, 46, 56, 69, 27, 29, 35, 38, 46, 56, 69, 83]);
|
|
1801
|
+
MPEG1.DEFAULT_NON_INTRA_QUANT_MATRIX = new Uint8Array([16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]);
|
|
1802
|
+
MPEG1.PREMULTIPLIER_MATRIX = new Uint8Array([32, 44, 42, 38, 32, 25, 17, 9, 44, 62, 58, 52, 44, 35, 24, 12, 42, 58, 55, 49, 42, 33, 23, 12, 38, 52, 49, 44, 38, 30, 20, 10, 32, 44, 42, 38, 32, 25, 17, 9, 25, 35, 33, 30, 25, 20, 14, 7, 17, 24, 23, 20, 17, 14, 9, 5, 9, 12, 12, 10, 9, 7, 5, 2]);
|
|
1803
|
+
MPEG1.MACROBLOCK_ADDRESS_INCREMENT = new Int16Array([1 * 3, 2 * 3, 0, 3 * 3, 4 * 3, 0, 0, 0, 1, 5 * 3, 6 * 3, 0, 7 * 3, 8 * 3, 0, 9 * 3, 10 * 3, 0, 11 * 3, 12 * 3, 0, 0, 0, 3, 0, 0, 2, 13 * 3, 14 * 3, 0, 15 * 3, 16 * 3, 0, 0, 0, 5, 0, 0, 4, 17 * 3, 18 * 3, 0, 19 * 3, 20 * 3, 0, 0, 0, 7, 0, 0, 6, 21 * 3, 22 * 3, 0, 23 * 3, 24 * 3, 0, 25 * 3, 26 * 3, 0, 27 * 3, 28 * 3, 0, -1, 29 * 3, 0, -1, 30 * 3, 0, 31 * 3, 32 * 3, 0, 33 * 3, 34 * 3, 0, 35 * 3, 36 * 3, 0, 37 * 3, 38 * 3, 0, 0, 0, 9, 0, 0, 8, 39 * 3, 40 * 3, 0, 41 * 3, 42 * 3, 0, 43 * 3, 44 * 3, 0, 45 * 3, 46 * 3, 0, 0, 0, 15, 0, 0, 14, 0, 0, 13, 0, 0, 12, 0, 0, 11, 0, 0, 10, 47 * 3, -1, 0, -1, 48 * 3, 0, 49 * 3, 50 * 3, 0, 51 * 3, 52 * 3, 0, 53 * 3, 54 * 3, 0, 55 * 3, 56 * 3, 0, 57 * 3, 58 * 3, 0, 59 * 3, 60 * 3, 0, 61 * 3, -1, 0, -1, 62 * 3, 0, 63 * 3, 64 * 3, 0, 65 * 3, 66 * 3, 0, 67 * 3, 68 * 3, 0, 69 * 3, 70 * 3, 0, 71 * 3, 72 * 3, 0, 73 * 3, 74 * 3, 0, 0, 0, 21, 0, 0, 20, 0, 0, 19, 0, 0, 18, 0, 0, 17, 0, 0, 16, 0, 0, 35, 0, 0, 34, 0, 0, 33, 0, 0, 32, 0, 0, 31, 0, 0, 30, 0, 0, 29, 0, 0, 28, 0, 0, 27, 0, 0, 26, 0, 0, 25, 0, 0, 24, 0, 0, 23, 0, 0, 22]);
|
|
1804
|
+
MPEG1.MACROBLOCK_TYPE_INTRA = new Int8Array([1 * 3, 2 * 3, 0, -1, 3 * 3, 0, 0, 0, 1, 0, 0, 17]);
|
|
1805
|
+
MPEG1.MACROBLOCK_TYPE_PREDICTIVE = new Int8Array([1 * 3, 2 * 3, 0, 3 * 3, 4 * 3, 0, 0, 0, 10, 5 * 3, 6 * 3, 0, 0, 0, 2, 7 * 3, 8 * 3, 0, 0, 0, 8, 9 * 3, 10 * 3, 0, 11 * 3, 12 * 3, 0, -1, 13 * 3, 0, 0, 0, 18, 0, 0, 26, 0, 0, 1, 0, 0, 17]);
|
|
1806
|
+
MPEG1.MACROBLOCK_TYPE_B = new Int8Array([1 * 3, 2 * 3, 0, 3 * 3, 5 * 3, 0, 4 * 3, 6 * 3, 0, 8 * 3, 7 * 3, 0, 0, 0, 12, 9 * 3, 10 * 3, 0, 0, 0, 14, 13 * 3, 14 * 3, 0, 12 * 3, 11 * 3, 0, 0, 0, 4, 0, 0, 6, 18 * 3, 16 * 3, 0, 15 * 3, 17 * 3, 0, 0, 0, 8, 0, 0, 10, -1, 19 * 3, 0, 0, 0, 1, 20 * 3, 21 * 3, 0, 0, 0, 30, 0, 0, 17, 0, 0, 22, 0, 0, 26]);
|
|
1807
|
+
MPEG1.MACROBLOCK_TYPE = [null, MPEG1.MACROBLOCK_TYPE_INTRA, MPEG1.MACROBLOCK_TYPE_PREDICTIVE, MPEG1.MACROBLOCK_TYPE_B];
|
|
1808
|
+
MPEG1.CODE_BLOCK_PATTERN = new Int16Array([2 * 3, 1 * 3, 0, 3 * 3, 6 * 3, 0, 4 * 3, 5 * 3, 0, 8 * 3, 11 * 3, 0, 12 * 3, 13 * 3, 0, 9 * 3, 7 * 3, 0, 10 * 3, 14 * 3, 0, 20 * 3, 19 * 3, 0, 18 * 3, 16 * 3, 0, 23 * 3, 17 * 3, 0, 27 * 3, 25 * 3, 0, 21 * 3, 28 * 3, 0, 15 * 3, 22 * 3, 0, 24 * 3, 26 * 3, 0, 0, 0, 60, 35 * 3, 40 * 3, 0, 44 * 3, 48 * 3, 0, 38 * 3, 36 * 3, 0, 42 * 3, 47 * 3, 0, 29 * 3, 31 * 3, 0, 39 * 3, 32 * 3, 0, 0, 0, 32, 45 * 3, 46 * 3, 0, 33 * 3, 41 * 3, 0, 43 * 3, 34 * 3, 0, 0, 0, 4, 30 * 3, 37 * 3, 0, 0, 0, 8, 0, 0, 16, 0, 0, 44, 50 * 3, 56 * 3, 0, 0, 0, 28, 0, 0, 52, 0, 0, 62, 61 * 3, 59 * 3, 0, 52 * 3, 60 * 3, 0, 0, 0, 1, 55 * 3, 54 * 3, 0, 0, 0, 61, 0, 0, 56, 57 * 3, 58 * 3, 0, 0, 0, 2, 0, 0, 40, 51 * 3, 62 * 3, 0, 0, 0, 48, 64 * 3, 63 * 3, 0, 49 * 3, 53 * 3, 0, 0, 0, 20, 0, 0, 12, 80 * 3, 83 * 3, 0, 0, 0, 63, 77 * 3, 75 * 3, 0, 65 * 3, 73 * 3, 0, 84 * 3, 66 * 3, 0, 0, 0, 24, 0, 0, 36, 0, 0, 3, 69 * 3, 87 * 3, 0, 81 * 3, 79 * 3, 0, 68 * 3, 71 * 3, 0, 70 * 3, 78 * 3, 0, 67 * 3, 76 * 3, 0, 72 * 3, 74 * 3, 0, 86 * 3, 85 * 3, 0, 88 * 3, 82 * 3, 0, -1, 94 * 3, 0, 95 * 3, 97 * 3, 0, 0, 0, 33, 0, 0, 9, 106 * 3, 110 * 3, 0, 102 * 3, 116 * 3, 0, 0, 0, 5, 0, 0, 10, 93 * 3, 89 * 3, 0, 0, 0, 6, 0, 0, 18, 0, 0, 17, 0, 0, 34, 113 * 3, 119 * 3, 0, 103 * 3, 104 * 3, 0, 90 * 3, 92 * 3, 0, 109 * 3, 107 * 3, 0, 117 * 3, 118 * 3, 0, 101 * 3, 99 * 3, 0, 98 * 3, 96 * 3, 0, 100 * 3, 91 * 3, 0, 114 * 3, 115 * 3, 0, 105 * 3, 108 * 3, 0, 112 * 3, 111 * 3, 0, 121 * 3, 125 * 3, 0, 0, 0, 41, 0, 0, 14, 0, 0, 21, 124 * 3, 122 * 3, 0, 120 * 3, 123 * 3, 0, 0, 0, 11, 0, 0, 19, 0, 0, 7, 0, 0, 35, 0, 0, 13, 0, 0, 50, 0, 0, 49, 0, 0, 58, 0, 0, 37, 0, 0, 25, 0, 0, 45, 0, 0, 57, 0, 0, 26, 0, 0, 29, 0, 0, 38, 0, 0, 53, 0, 0, 23, 0, 0, 43, 0, 0, 46, 0, 0, 42, 0, 0, 22, 0, 0, 54, 0, 0, 51, 0, 0, 15, 0, 0, 30, 0, 0, 39, 0, 0, 47, 0, 0, 55, 0, 0, 27, 0, 0, 59, 0, 0, 31]);
|
|
1809
|
+
MPEG1.MOTION = new Int16Array([1 * 3, 2 * 3, 0, 4 * 3, 3 * 3, 0, 0, 0, 0, 6 * 3, 5 * 3, 0, 8 * 3, 7 * 3, 0, 0, 0, -1, 0, 0, 1, 9 * 3, 10 * 3, 0, 12 * 3, 11 * 3, 0, 0, 0, 2, 0, 0, -2, 14 * 3, 15 * 3, 0, 16 * 3, 13 * 3, 0, 20 * 3, 18 * 3, 0, 0, 0, 3, 0, 0, -3, 17 * 3, 19 * 3, 0, -1, 23 * 3, 0, 27 * 3, 25 * 3, 0, 26 * 3, 21 * 3, 0, 24 * 3, 22 * 3, 0, 32 * 3, 28 * 3, 0, 29 * 3, 31 * 3, 0, -1, 33 * 3, 0, 36 * 3, 35 * 3, 0, 0, 0, -4, 30 * 3, 34 * 3, 0, 0, 0, 4, 0, 0, -7, 0, 0, 5, 37 * 3, 41 * 3, 0, 0, 0, -5, 0, 0, 7, 38 * 3, 40 * 3, 0, 42 * 3, 39 * 3, 0, 0, 0, -6, 0, 0, 6, 51 * 3, 54 * 3, 0, 50 * 3, 49 * 3, 0, 45 * 3, 46 * 3, 0, 52 * 3, 47 * 3, 0, 43 * 3, 53 * 3, 0, 44 * 3, 48 * 3, 0, 0, 0, 10, 0, 0, 9, 0, 0, 8, 0, 0, -8, 57 * 3, 66 * 3, 0, 0, 0, -9, 60 * 3, 64 * 3, 0, 56 * 3, 61 * 3, 0, 55 * 3, 62 * 3, 0, 58 * 3, 63 * 3, 0, 0, 0, -10, 59 * 3, 65 * 3, 0, 0, 0, 12, 0, 0, 16, 0, 0, 13, 0, 0, 14, 0, 0, 11, 0, 0, 15, 0, 0, -16, 0, 0, -12, 0, 0, -14, 0, 0, -15, 0, 0, -11, 0, 0, -13]);
|
|
1810
|
+
MPEG1.DCT_DC_SIZE_LUMINANCE = new Int8Array([2 * 3, 1 * 3, 0, 6 * 3, 5 * 3, 0, 3 * 3, 4 * 3, 0, 0, 0, 1, 0, 0, 2, 9 * 3, 8 * 3, 0, 7 * 3, 10 * 3, 0, 0, 0, 0, 12 * 3, 11 * 3, 0, 0, 0, 4, 0, 0, 3, 13 * 3, 14 * 3, 0, 0, 0, 5, 0, 0, 6, 16 * 3, 15 * 3, 0, 17 * 3, -1, 0, 0, 0, 7, 0, 0, 8]);
|
|
1811
|
+
MPEG1.DCT_DC_SIZE_CHROMINANCE = new Int8Array([2 * 3, 1 * 3, 0, 4 * 3, 3 * 3, 0, 6 * 3, 5 * 3, 0, 8 * 3, 7 * 3, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 10 * 3, 9 * 3, 0, 0, 0, 3, 12 * 3, 11 * 3, 0, 0, 0, 4, 14 * 3, 13 * 3, 0, 0, 0, 5, 16 * 3, 15 * 3, 0, 0, 0, 6, 17 * 3, -1, 0, 0, 0, 7, 0, 0, 8]);
|
|
1812
|
+
MPEG1.DCT_COEFF = new Int32Array([1 * 3, 2 * 3, 0, 4 * 3, 3 * 3, 0, 0, 0, 1, 7 * 3, 8 * 3, 0, 6 * 3, 5 * 3, 0, 13 * 3, 9 * 3, 0, 11 * 3, 10 * 3, 0, 14 * 3, 12 * 3, 0, 0, 0, 257, 20 * 3, 22 * 3, 0, 18 * 3, 21 * 3, 0, 16 * 3, 19 * 3, 0, 0, 0, 513, 17 * 3, 15 * 3, 0, 0, 0, 2, 0, 0, 3, 27 * 3, 25 * 3, 0, 29 * 3, 31 * 3, 0, 24 * 3, 26 * 3, 0, 32 * 3, 30 * 3, 0, 0, 0, 1025, 23 * 3, 28 * 3, 0, 0, 0, 769, 0, 0, 258, 0, 0, 1793, 0, 0, 65535, 0, 0, 1537, 37 * 3, 36 * 3, 0, 0, 0, 1281, 35 * 3, 34 * 3, 0, 39 * 3, 38 * 3, 0, 33 * 3, 42 * 3, 0, 40 * 3, 41 * 3, 0, 52 * 3, 50 * 3, 0, 54 * 3, 53 * 3, 0, 48 * 3, 49 * 3, 0, 43 * 3, 45 * 3, 0, 46 * 3, 44 * 3, 0, 0, 0, 2049, 0, 0, 4, 0, 0, 514, 0, 0, 2305, 51 * 3, 47 * 3, 0, 55 * 3, 57 * 3, 0, 60 * 3, 56 * 3, 0, 59 * 3, 58 * 3, 0, 61 * 3, 62 * 3, 0, 0, 0, 2561, 0, 0, 3329, 0, 0, 6, 0, 0, 259, 0, 0, 5, 0, 0, 770, 0, 0, 2817, 0, 0, 3073, 76 * 3, 75 * 3, 0, 67 * 3, 70 * 3, 0, 73 * 3, 71 * 3, 0, 78 * 3, 74 * 3, 0, 72 * 3, 77 * 3, 0, 69 * 3, 64 * 3, 0, 68 * 3, 63 * 3, 0, 66 * 3, 65 * 3, 0, 81 * 3, 87 * 3, 0, 91 * 3, 80 * 3, 0, 82 * 3, 79 * 3, 0, 83 * 3, 86 * 3, 0, 93 * 3, 92 * 3, 0, 84 * 3, 85 * 3, 0, 90 * 3, 94 * 3, 0, 88 * 3, 89 * 3, 0, 0, 0, 515, 0, 0, 260, 0, 0, 7, 0, 0, 1026, 0, 0, 1282, 0, 0, 4097, 0, 0, 3841, 0, 0, 3585, 105 * 3, 107 * 3, 0, 111 * 3, 114 * 3, 0, 104 * 3, 97 * 3, 0, 125 * 3, 119 * 3, 0, 96 * 3, 98 * 3, 0, -1, 123 * 3, 0, 95 * 3, 101 * 3, 0, 106 * 3, 121 * 3, 0, 99 * 3, 102 * 3, 0, 113 * 3, 103 * 3, 0, 112 * 3, 116 * 3, 0, 110 * 3, 100 * 3, 0, 124 * 3, 115 * 3, 0, 117 * 3, 122 * 3, 0, 109 * 3, 118 * 3, 0, 120 * 3, 108 * 3, 0, 127 * 3, 136 * 3, 0, 139 * 3, 140 * 3, 0, 130 * 3, 126 * 3, 0, 145 * 3, 146 * 3, 0, 128 * 3, 129 * 3, 0, 0, 0, 2050, 132 * 3, 134 * 3, 0, 155 * 3, 154 * 3, 0, 0, 0, 8, 137 * 3, 133 * 3, 0, 143 * 3, 144 * 3, 0, 151 * 3, 138 * 3, 0, 142 * 3, 141 * 3, 0, 0, 0, 10, 0, 0, 9, 0, 0, 11, 0, 0, 5377, 0, 0, 1538, 0, 0, 771, 0, 0, 5121, 0, 0, 1794, 0, 0, 4353, 0, 0, 4609, 0, 0, 4865, 148 * 3, 152 * 3, 0, 0, 0, 1027, 153 * 3, 150 * 3, 0, 0, 0, 261, 131 * 3, 135 * 3, 0, 0, 0, 516, 149 * 3, 147 * 3, 0, 172 * 3, 173 * 3, 0, 162 * 3, 158 * 3, 0, 170 * 3, 161 * 3, 0, 168 * 3, 166 * 3, 0, 157 * 3, 179 * 3, 0, 169 * 3, 167 * 3, 0, 174 * 3, 171 * 3, 0, 178 * 3, 177 * 3, 0, 156 * 3, 159 * 3, 0, 164 * 3, 165 * 3, 0, 183 * 3, 182 * 3, 0, 175 * 3, 176 * 3, 0, 0, 0, 263, 0, 0, 2562, 0, 0, 2306, 0, 0, 5633, 0, 0, 5889, 0, 0, 6401, 0, 0, 6145, 0, 0, 1283, 0, 0, 772, 0, 0, 13, 0, 0, 12, 0, 0, 14, 0, 0, 15, 0, 0, 517, 0, 0, 6657, 0, 0, 262, 180 * 3, 181 * 3, 0, 160 * 3, 163 * 3, 0, 196 * 3, 199 * 3, 0, 0, 0, 27, 203 * 3, 185 * 3, 0, 202 * 3, 201 * 3, 0, 0, 0, 19, 0, 0, 22, 197 * 3, 207 * 3, 0, 0, 0, 18, 191 * 3, 192 * 3, 0, 188 * 3, 190 * 3, 0, 0, 0, 20, 184 * 3, 194 * 3, 0, 0, 0, 21, 186 * 3, 193 * 3, 0, 0, 0, 23, 204 * 3, 198 * 3, 0, 0, 0, 25, 0, 0, 24, 200 * 3, 205 * 3, 0, 0, 0, 31, 0, 0, 30, 0, 0, 28, 0, 0, 29, 0, 0, 26, 0, 0, 17, 0, 0, 16, 189 * 3, 206 * 3, 0, 187 * 3, 195 * 3, 0, 218 * 3, 211 * 3, 0, 0, 0, 37, 215 * 3, 216 * 3, 0, 0, 0, 36, 210 * 3, 212 * 3, 0, 0, 0, 34, 213 * 3, 209 * 3, 0, 221 * 3, 222 * 3, 0, 219 * 3, 208 * 3, 0, 217 * 3, 214 * 3, 0, 223 * 3, 220 * 3, 0, 0, 0, 35, 0, 0, 267, 0, 0, 40, 0, 0, 268, 0, 0, 266, 0, 0, 32, 0, 0, 264, 0, 0, 265, 0, 0, 38, 0, 0, 269, 0, 0, 270, 0, 0, 33, 0, 0, 39, 0, 0, 7937, 0, 0, 6913, 0, 0, 7681, 0, 0, 4098, 0, 0, 7425, 0, 0, 7169, 0, 0, 271, 0, 0, 274, 0, 0, 273, 0, 0, 272, 0, 0, 1539, 0, 0, 2818, 0, 0, 3586, 0, 0, 3330, 0, 0, 3074, 0, 0, 3842]);
|
|
1813
|
+
MPEG1.PICTURE_TYPE = {
|
|
1814
|
+
INTRA: 1,
|
|
1815
|
+
PREDICTIVE: 2,
|
|
1816
|
+
B: 3
|
|
1817
|
+
};
|
|
1818
|
+
MPEG1.START = {
|
|
1819
|
+
SEQUENCE: 179,
|
|
1820
|
+
SLICE_FIRST: 1,
|
|
1821
|
+
SLICE_LAST: 175,
|
|
1822
|
+
PICTURE: 0,
|
|
1823
|
+
EXTENSION: 181,
|
|
1824
|
+
USER_DATA: 178
|
|
1825
|
+
};
|
|
1826
|
+
return MPEG1
|
|
1827
|
+
}();
|
|
1828
|
+
JSMpeg.Decoder.MPEG1VideoWASM = function() {
|
|
1829
|
+
"use strict";
|
|
1830
|
+
var MPEG1WASM = function(options) {
|
|
1831
|
+
JSMpeg.Decoder.Base.call(this, options);
|
|
1832
|
+
this.onDecodeCallback = options.onVideoDecode;
|
|
1833
|
+
this.module = options.wasmModule;
|
|
1834
|
+
this.bufferSize = options.videoBufferSize || 512 * 1024;
|
|
1835
|
+
this.bufferMode = options.streaming ? JSMpeg.BitBuffer.MODE.EVICT : JSMpeg.BitBuffer.MODE.EXPAND;
|
|
1836
|
+
this.decodeFirstFrame = options.decodeFirstFrame !== false;
|
|
1837
|
+
this.hasSequenceHeader = false
|
|
1838
|
+
};
|
|
1839
|
+
MPEG1WASM.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
|
|
1840
|
+
MPEG1WASM.prototype.constructor = MPEG1WASM;
|
|
1841
|
+
MPEG1WASM.prototype.initializeWasmDecoder = function() {
|
|
1842
|
+
if (!this.module.instance) {
|
|
1843
|
+
console.warn("JSMpeg: WASM module not compiled yet");
|
|
1844
|
+
return
|
|
1845
|
+
}
|
|
1846
|
+
this.instance = this.module.instance;
|
|
1847
|
+
this.functions = this.module.instance.exports;
|
|
1848
|
+
this.decoder = this.functions._mpeg1_decoder_create(this.bufferSize, this.bufferMode)
|
|
1849
|
+
};
|
|
1850
|
+
MPEG1WASM.prototype.destroy = function() {
|
|
1851
|
+
if (!this.decoder) {
|
|
1852
|
+
return
|
|
1853
|
+
}
|
|
1854
|
+
this.functions._mpeg1_decoder_destroy(this.decoder)
|
|
1855
|
+
};
|
|
1856
|
+
MPEG1WASM.prototype.bufferGetIndex = function() {
|
|
1857
|
+
if (!this.decoder) {
|
|
1858
|
+
return
|
|
1859
|
+
}
|
|
1860
|
+
return this.functions._mpeg1_decoder_get_index(this.decoder)
|
|
1861
|
+
};
|
|
1862
|
+
MPEG1WASM.prototype.bufferSetIndex = function(index) {
|
|
1863
|
+
if (!this.decoder) {
|
|
1864
|
+
return
|
|
1865
|
+
}
|
|
1866
|
+
this.functions._mpeg1_decoder_set_index(this.decoder, index)
|
|
1867
|
+
};
|
|
1868
|
+
MPEG1WASM.prototype.bufferWrite = function(buffers) {
|
|
1869
|
+
if (!this.decoder) {
|
|
1870
|
+
this.initializeWasmDecoder()
|
|
1871
|
+
}
|
|
1872
|
+
var totalLength = 0;
|
|
1873
|
+
for (var i = 0; i < buffers.length; i++) {
|
|
1874
|
+
totalLength += buffers[i].length
|
|
1875
|
+
}
|
|
1876
|
+
var ptr = this.functions._mpeg1_decoder_get_write_ptr(this.decoder, totalLength);
|
|
1877
|
+
for (var i = 0; i < buffers.length; i++) {
|
|
1878
|
+
this.instance.heapU8.set(buffers[i], ptr);
|
|
1879
|
+
ptr += buffers[i].length
|
|
1880
|
+
}
|
|
1881
|
+
this.functions._mpeg1_decoder_did_write(this.decoder, totalLength);
|
|
1882
|
+
return totalLength
|
|
1883
|
+
};
|
|
1884
|
+
MPEG1WASM.prototype.write = function(pts, buffers) {
|
|
1885
|
+
JSMpeg.Decoder.Base.prototype.write.call(this, pts, buffers);
|
|
1886
|
+
if (!this.hasSequenceHeader && this.functions._mpeg1_decoder_has_sequence_header(this.decoder)) {
|
|
1887
|
+
this.loadSequnceHeader()
|
|
1888
|
+
}
|
|
1889
|
+
};
|
|
1890
|
+
MPEG1WASM.prototype.loadSequnceHeader = function() {
|
|
1891
|
+
this.hasSequenceHeader = true;
|
|
1892
|
+
this.frameRate = this.functions._mpeg1_decoder_get_frame_rate(this.decoder);
|
|
1893
|
+
this.codedSize = this.functions._mpeg1_decoder_get_coded_size(this.decoder);
|
|
1894
|
+
if (this.destination) {
|
|
1895
|
+
var w = this.functions._mpeg1_decoder_get_width(this.decoder);
|
|
1896
|
+
var h = this.functions._mpeg1_decoder_get_height(this.decoder);
|
|
1897
|
+
this.destination.resize(w, h)
|
|
1898
|
+
}
|
|
1899
|
+
if (this.decodeFirstFrame) {
|
|
1900
|
+
this.decode()
|
|
1901
|
+
}
|
|
1902
|
+
};
|
|
1903
|
+
MPEG1WASM.prototype.decode = function() {
|
|
1904
|
+
var startTime = JSMpeg.Now();
|
|
1905
|
+
if (!this.decoder) {
|
|
1906
|
+
return false
|
|
1907
|
+
}
|
|
1908
|
+
var didDecode = this.functions._mpeg1_decoder_decode(this.decoder);
|
|
1909
|
+
if (!didDecode) {
|
|
1910
|
+
return false
|
|
1911
|
+
}
|
|
1912
|
+
if (this.destination) {
|
|
1913
|
+
var ptrY = this.functions._mpeg1_decoder_get_y_ptr(this.decoder),
|
|
1914
|
+
ptrCr = this.functions._mpeg1_decoder_get_cr_ptr(this.decoder),
|
|
1915
|
+
ptrCb = this.functions._mpeg1_decoder_get_cb_ptr(this.decoder);
|
|
1916
|
+
var dy = this.instance.heapU8.subarray(ptrY, ptrY + this.codedSize);
|
|
1917
|
+
var dcr = this.instance.heapU8.subarray(ptrCr, ptrCr + (this.codedSize >> 2));
|
|
1918
|
+
var dcb = this.instance.heapU8.subarray(ptrCb, ptrCb + (this.codedSize >> 2));
|
|
1919
|
+
this.destination.render(dy, dcr, dcb, false)
|
|
1920
|
+
}
|
|
1921
|
+
this.advanceDecodedTime(1 / this.frameRate);
|
|
1922
|
+
var elapsedTime = JSMpeg.Now() - startTime;
|
|
1923
|
+
if (this.onDecodeCallback) {
|
|
1924
|
+
this.onDecodeCallback(this, elapsedTime)
|
|
1925
|
+
}
|
|
1926
|
+
return true
|
|
1927
|
+
};
|
|
1928
|
+
return MPEG1WASM
|
|
1929
|
+
}();
|
|
1930
|
+
JSMpeg.Decoder.MP2Audio = function() {
|
|
1931
|
+
"use strict";
|
|
1932
|
+
var MP2 = function(options) {
|
|
1933
|
+
JSMpeg.Decoder.Base.call(this, options);
|
|
1934
|
+
this.onDecodeCallback = options.onAudioDecode;
|
|
1935
|
+
var bufferSize = options.audioBufferSize || 128 * 1024;
|
|
1936
|
+
var bufferMode = options.streaming ? JSMpeg.BitBuffer.MODE.EVICT : JSMpeg.BitBuffer.MODE.EXPAND;
|
|
1937
|
+
this.bits = new JSMpeg.BitBuffer(bufferSize, bufferMode);
|
|
1938
|
+
this.left = new Float32Array(1152);
|
|
1939
|
+
this.right = new Float32Array(1152);
|
|
1940
|
+
this.sampleRate = 44100;
|
|
1941
|
+
this.D = new Float32Array(1024);
|
|
1942
|
+
this.D.set(MP2.SYNTHESIS_WINDOW, 0);
|
|
1943
|
+
this.D.set(MP2.SYNTHESIS_WINDOW, 512);
|
|
1944
|
+
this.V = new Float32Array(1024);
|
|
1945
|
+
this.U = new Int32Array(32);
|
|
1946
|
+
this.VPos = 0;
|
|
1947
|
+
this.allocation = [new Array(32), new Array(32)];
|
|
1948
|
+
this.scaleFactorInfo = [new Uint8Array(32), new Uint8Array(32)];
|
|
1949
|
+
this.scaleFactor = [new Array(32), new Array(32)];
|
|
1950
|
+
this.sample = [new Array(32), new Array(32)];
|
|
1951
|
+
for (var j = 0; j < 2; j++) {
|
|
1952
|
+
for (var i = 0; i < 32; i++) {
|
|
1953
|
+
this.scaleFactor[j][i] = [0, 0, 0];
|
|
1954
|
+
this.sample[j][i] = [0, 0, 0]
|
|
1955
|
+
}
|
|
1956
|
+
}
|
|
1957
|
+
};
|
|
1958
|
+
MP2.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
|
|
1959
|
+
MP2.prototype.constructor = MP2;
|
|
1960
|
+
MP2.prototype.decode = function() {
|
|
1961
|
+
var startTime = JSMpeg.Now();
|
|
1962
|
+
var pos = this.bits.index >> 3;
|
|
1963
|
+
if (pos >= this.bits.byteLength) {
|
|
1964
|
+
return false
|
|
1965
|
+
}
|
|
1966
|
+
var decoded = this.decodeFrame(this.left, this.right);
|
|
1967
|
+
this.bits.index = pos + decoded << 3;
|
|
1968
|
+
if (!decoded) {
|
|
1969
|
+
return false
|
|
1970
|
+
}
|
|
1971
|
+
if (this.destination) {
|
|
1972
|
+
this.destination.play(this.sampleRate, this.left, this.right)
|
|
1973
|
+
}
|
|
1974
|
+
this.advanceDecodedTime(this.left.length / this.sampleRate);
|
|
1975
|
+
var elapsedTime = JSMpeg.Now() - startTime;
|
|
1976
|
+
if (this.onDecodeCallback) {
|
|
1977
|
+
this.onDecodeCallback(this, elapsedTime)
|
|
1978
|
+
}
|
|
1979
|
+
return true
|
|
1980
|
+
};
|
|
1981
|
+
MP2.prototype.getCurrentTime = function() {
|
|
1982
|
+
var enqueuedTime = this.destination ? this.destination.enqueuedTime : 0;
|
|
1983
|
+
return this.decodedTime - enqueuedTime
|
|
1984
|
+
};
|
|
1985
|
+
MP2.prototype.decodeFrame = function(left, right) {
|
|
1986
|
+
var sync = this.bits.read(11),
|
|
1987
|
+
version = this.bits.read(2),
|
|
1988
|
+
layer = this.bits.read(2),
|
|
1989
|
+
hasCRC = !this.bits.read(1);
|
|
1990
|
+
if (sync !== MP2.FRAME_SYNC || version !== MP2.VERSION.MPEG_1 || layer !== MP2.LAYER.II) {
|
|
1991
|
+
return 0
|
|
1992
|
+
}
|
|
1993
|
+
var bitrateIndex = this.bits.read(4) - 1;
|
|
1994
|
+
if (bitrateIndex > 13) {
|
|
1995
|
+
return 0
|
|
1996
|
+
}
|
|
1997
|
+
var sampleRateIndex = this.bits.read(2);
|
|
1998
|
+
var sampleRate = MP2.SAMPLE_RATE[sampleRateIndex];
|
|
1999
|
+
if (sampleRateIndex === 3) {
|
|
2000
|
+
return 0
|
|
2001
|
+
}
|
|
2002
|
+
if (version === MP2.VERSION.MPEG_2) {
|
|
2003
|
+
sampleRateIndex += 4;
|
|
2004
|
+
bitrateIndex += 14
|
|
2005
|
+
}
|
|
2006
|
+
var padding = this.bits.read(1),
|
|
2007
|
+
privat = this.bits.read(1),
|
|
2008
|
+
mode = this.bits.read(2);
|
|
2009
|
+
var bound = 0;
|
|
2010
|
+
if (mode === MP2.MODE.JOINT_STEREO) {
|
|
2011
|
+
bound = this.bits.read(2) + 1 << 2
|
|
2012
|
+
} else {
|
|
2013
|
+
this.bits.skip(2);
|
|
2014
|
+
bound = mode === MP2.MODE.MONO ? 0 : 32
|
|
2015
|
+
}
|
|
2016
|
+
this.bits.skip(4);
|
|
2017
|
+
if (hasCRC) {
|
|
2018
|
+
this.bits.skip(16)
|
|
2019
|
+
}
|
|
2020
|
+
var bitrate = MP2.BIT_RATE[bitrateIndex],
|
|
2021
|
+
sampleRate = MP2.SAMPLE_RATE[sampleRateIndex],
|
|
2022
|
+
frameSize = 144e3 * bitrate / sampleRate + padding | 0;
|
|
2023
|
+
var tab3 = 0;
|
|
2024
|
+
var sblimit = 0;
|
|
2025
|
+
if (version === MP2.VERSION.MPEG_2) {
|
|
2026
|
+
tab3 = 2;
|
|
2027
|
+
sblimit = 30
|
|
2028
|
+
} else {
|
|
2029
|
+
var tab1 = mode === MP2.MODE.MONO ? 0 : 1;
|
|
2030
|
+
var tab2 = MP2.QUANT_LUT_STEP_1[tab1][bitrateIndex];
|
|
2031
|
+
tab3 = MP2.QUANT_LUT_STEP_2[tab2][sampleRateIndex];
|
|
2032
|
+
sblimit = tab3 & 63;
|
|
2033
|
+
tab3 >>= 6
|
|
2034
|
+
}
|
|
2035
|
+
if (bound > sblimit) {
|
|
2036
|
+
bound = sblimit
|
|
2037
|
+
}
|
|
2038
|
+
for (var sb = 0; sb < bound; sb++) {
|
|
2039
|
+
this.allocation[0][sb] = this.readAllocation(sb, tab3);
|
|
2040
|
+
this.allocation[1][sb] = this.readAllocation(sb, tab3)
|
|
2041
|
+
}
|
|
2042
|
+
for (var sb = bound; sb < sblimit; sb++) {
|
|
2043
|
+
this.allocation[0][sb] = this.allocation[1][sb] = this.readAllocation(sb, tab3)
|
|
2044
|
+
}
|
|
2045
|
+
var channels = mode === MP2.MODE.MONO ? 1 : 2;
|
|
2046
|
+
for (var sb = 0; sb < sblimit; sb++) {
|
|
2047
|
+
for (ch = 0; ch < channels; ch++) {
|
|
2048
|
+
if (this.allocation[ch][sb]) {
|
|
2049
|
+
this.scaleFactorInfo[ch][sb] = this.bits.read(2)
|
|
2050
|
+
}
|
|
2051
|
+
}
|
|
2052
|
+
if (mode === MP2.MODE.MONO) {
|
|
2053
|
+
this.scaleFactorInfo[1][sb] = this.scaleFactorInfo[0][sb]
|
|
2054
|
+
}
|
|
2055
|
+
}
|
|
2056
|
+
for (var sb = 0; sb < sblimit; sb++) {
|
|
2057
|
+
for (var ch = 0; ch < channels; ch++) {
|
|
2058
|
+
if (this.allocation[ch][sb]) {
|
|
2059
|
+
var sf = this.scaleFactor[ch][sb];
|
|
2060
|
+
switch (this.scaleFactorInfo[ch][sb]) {
|
|
2061
|
+
case 0:
|
|
2062
|
+
sf[0] = this.bits.read(6);
|
|
2063
|
+
sf[1] = this.bits.read(6);
|
|
2064
|
+
sf[2] = this.bits.read(6);
|
|
2065
|
+
break;
|
|
2066
|
+
case 1:
|
|
2067
|
+
sf[0] = sf[1] = this.bits.read(6);
|
|
2068
|
+
sf[2] = this.bits.read(6);
|
|
2069
|
+
break;
|
|
2070
|
+
case 2:
|
|
2071
|
+
sf[0] = sf[1] = sf[2] = this.bits.read(6);
|
|
2072
|
+
break;
|
|
2073
|
+
case 3:
|
|
2074
|
+
sf[0] = this.bits.read(6);
|
|
2075
|
+
sf[1] = sf[2] = this.bits.read(6);
|
|
2076
|
+
break
|
|
2077
|
+
}
|
|
2078
|
+
}
|
|
2079
|
+
}
|
|
2080
|
+
if (mode === MP2.MODE.MONO) {
|
|
2081
|
+
this.scaleFactor[1][sb][0] = this.scaleFactor[0][sb][0];
|
|
2082
|
+
this.scaleFactor[1][sb][1] = this.scaleFactor[0][sb][1];
|
|
2083
|
+
this.scaleFactor[1][sb][2] = this.scaleFactor[0][sb][2]
|
|
2084
|
+
}
|
|
2085
|
+
}
|
|
2086
|
+
var outPos = 0;
|
|
2087
|
+
for (var part = 0; part < 3; part++) {
|
|
2088
|
+
for (var granule = 0; granule < 4; granule++) {
|
|
2089
|
+
for (var sb = 0; sb < bound; sb++) {
|
|
2090
|
+
this.readSamples(0, sb, part);
|
|
2091
|
+
this.readSamples(1, sb, part)
|
|
2092
|
+
}
|
|
2093
|
+
for (var sb = bound; sb < sblimit; sb++) {
|
|
2094
|
+
this.readSamples(0, sb, part);
|
|
2095
|
+
this.sample[1][sb][0] = this.sample[0][sb][0];
|
|
2096
|
+
this.sample[1][sb][1] = this.sample[0][sb][1];
|
|
2097
|
+
this.sample[1][sb][2] = this.sample[0][sb][2]
|
|
2098
|
+
}
|
|
2099
|
+
for (var sb = sblimit; sb < 32; sb++) {
|
|
2100
|
+
this.sample[0][sb][0] = 0;
|
|
2101
|
+
this.sample[0][sb][1] = 0;
|
|
2102
|
+
this.sample[0][sb][2] = 0;
|
|
2103
|
+
this.sample[1][sb][0] = 0;
|
|
2104
|
+
this.sample[1][sb][1] = 0;
|
|
2105
|
+
this.sample[1][sb][2] = 0
|
|
2106
|
+
}
|
|
2107
|
+
for (var p = 0; p < 3; p++) {
|
|
2108
|
+
this.VPos = this.VPos - 64 & 1023;
|
|
2109
|
+
for (var ch = 0; ch < 2; ch++) {
|
|
2110
|
+
MP2.MatrixTransform(this.sample[ch], p, this.V, this.VPos);
|
|
2111
|
+
JSMpeg.Fill(this.U, 0);
|
|
2112
|
+
var dIndex = 512 - (this.VPos >> 1);
|
|
2113
|
+
var vIndex = this.VPos % 128 >> 1;
|
|
2114
|
+
while (vIndex < 1024) {
|
|
2115
|
+
for (var i = 0; i < 32; ++i) {
|
|
2116
|
+
this.U[i] += this.D[dIndex++] * this.V[vIndex++]
|
|
2117
|
+
}
|
|
2118
|
+
vIndex += 128 - 32;
|
|
2119
|
+
dIndex += 64 - 32
|
|
2120
|
+
}
|
|
2121
|
+
vIndex = 128 - 32 + 1024 - vIndex;
|
|
2122
|
+
dIndex -= 512 - 32;
|
|
2123
|
+
while (vIndex < 1024) {
|
|
2124
|
+
for (var i = 0; i < 32; ++i) {
|
|
2125
|
+
this.U[i] += this.D[dIndex++] * this.V[vIndex++]
|
|
2126
|
+
}
|
|
2127
|
+
vIndex += 128 - 32;
|
|
2128
|
+
dIndex += 64 - 32
|
|
2129
|
+
}
|
|
2130
|
+
var outChannel = ch === 0 ? left : right;
|
|
2131
|
+
for (var j = 0; j < 32; j++) {
|
|
2132
|
+
outChannel[outPos + j] = this.U[j] / 2147418112
|
|
2133
|
+
}
|
|
2134
|
+
}
|
|
2135
|
+
outPos += 32
|
|
2136
|
+
}
|
|
2137
|
+
}
|
|
2138
|
+
}
|
|
2139
|
+
this.sampleRate = sampleRate;
|
|
2140
|
+
return frameSize
|
|
2141
|
+
};
|
|
2142
|
+
MP2.prototype.readAllocation = function(sb, tab3) {
|
|
2143
|
+
var tab4 = MP2.QUANT_LUT_STEP_3[tab3][sb];
|
|
2144
|
+
var qtab = MP2.QUANT_LUT_STEP4[tab4 & 15][this.bits.read(tab4 >> 4)];
|
|
2145
|
+
return qtab ? MP2.QUANT_TAB[qtab - 1] : 0
|
|
2146
|
+
};
|
|
2147
|
+
MP2.prototype.readSamples = function(ch, sb, part) {
|
|
2148
|
+
var q = this.allocation[ch][sb],
|
|
2149
|
+
sf = this.scaleFactor[ch][sb][part],
|
|
2150
|
+
sample = this.sample[ch][sb],
|
|
2151
|
+
val = 0;
|
|
2152
|
+
if (!q) {
|
|
2153
|
+
sample[0] = sample[1] = sample[2] = 0;
|
|
2154
|
+
return
|
|
2155
|
+
}
|
|
2156
|
+
if (sf === 63) {
|
|
2157
|
+
sf = 0
|
|
2158
|
+
} else {
|
|
2159
|
+
var shift = sf / 3 | 0;
|
|
2160
|
+
sf = MP2.SCALEFACTOR_BASE[sf % 3] + (1 << shift >> 1) >> shift
|
|
2161
|
+
}
|
|
2162
|
+
var adj = q.levels;
|
|
2163
|
+
if (q.group) {
|
|
2164
|
+
val = this.bits.read(q.bits);
|
|
2165
|
+
sample[0] = val % adj;
|
|
2166
|
+
val = val / adj | 0;
|
|
2167
|
+
sample[1] = val % adj;
|
|
2168
|
+
sample[2] = val / adj | 0
|
|
2169
|
+
} else {
|
|
2170
|
+
sample[0] = this.bits.read(q.bits);
|
|
2171
|
+
sample[1] = this.bits.read(q.bits);
|
|
2172
|
+
sample[2] = this.bits.read(q.bits)
|
|
2173
|
+
}
|
|
2174
|
+
var scale = 65536 / (adj + 1) | 0;
|
|
2175
|
+
adj = (adj + 1 >> 1) - 1;
|
|
2176
|
+
val = (adj - sample[0]) * scale;
|
|
2177
|
+
sample[0] = val * (sf >> 12) + (val * (sf & 4095) + 2048 >> 12) >> 12;
|
|
2178
|
+
val = (adj - sample[1]) * scale;
|
|
2179
|
+
sample[1] = val * (sf >> 12) + (val * (sf & 4095) + 2048 >> 12) >> 12;
|
|
2180
|
+
val = (adj - sample[2]) * scale;
|
|
2181
|
+
sample[2] = val * (sf >> 12) + (val * (sf & 4095) + 2048 >> 12) >> 12
|
|
2182
|
+
};
|
|
2183
|
+
MP2.MatrixTransform = function(s, ss, d, dp) {
|
|
2184
|
+
var t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20, t21, t22, t23, t24, t25, t26, t27, t28, t29, t30, t31, t32, t33;
|
|
2185
|
+
t01 = s[0][ss] + s[31][ss];
|
|
2186
|
+
t02 = (s[0][ss] - s[31][ss]) * .500602998235;
|
|
2187
|
+
t03 = s[1][ss] + s[30][ss];
|
|
2188
|
+
t04 = (s[1][ss] - s[30][ss]) * .505470959898;
|
|
2189
|
+
t05 = s[2][ss] + s[29][ss];
|
|
2190
|
+
t06 = (s[2][ss] - s[29][ss]) * .515447309923;
|
|
2191
|
+
t07 = s[3][ss] + s[28][ss];
|
|
2192
|
+
t08 = (s[3][ss] - s[28][ss]) * .53104259109;
|
|
2193
|
+
t09 = s[4][ss] + s[27][ss];
|
|
2194
|
+
t10 = (s[4][ss] - s[27][ss]) * .553103896034;
|
|
2195
|
+
t11 = s[5][ss] + s[26][ss];
|
|
2196
|
+
t12 = (s[5][ss] - s[26][ss]) * .582934968206;
|
|
2197
|
+
t13 = s[6][ss] + s[25][ss];
|
|
2198
|
+
t14 = (s[6][ss] - s[25][ss]) * .622504123036;
|
|
2199
|
+
t15 = s[7][ss] + s[24][ss];
|
|
2200
|
+
t16 = (s[7][ss] - s[24][ss]) * .674808341455;
|
|
2201
|
+
t17 = s[8][ss] + s[23][ss];
|
|
2202
|
+
t18 = (s[8][ss] - s[23][ss]) * .744536271002;
|
|
2203
|
+
t19 = s[9][ss] + s[22][ss];
|
|
2204
|
+
t20 = (s[9][ss] - s[22][ss]) * .839349645416;
|
|
2205
|
+
t21 = s[10][ss] + s[21][ss];
|
|
2206
|
+
t22 = (s[10][ss] - s[21][ss]) * .972568237862;
|
|
2207
|
+
t23 = s[11][ss] + s[20][ss];
|
|
2208
|
+
t24 = (s[11][ss] - s[20][ss]) * 1.16943993343;
|
|
2209
|
+
t25 = s[12][ss] + s[19][ss];
|
|
2210
|
+
t26 = (s[12][ss] - s[19][ss]) * 1.48416461631;
|
|
2211
|
+
t27 = s[13][ss] + s[18][ss];
|
|
2212
|
+
t28 = (s[13][ss] - s[18][ss]) * 2.05778100995;
|
|
2213
|
+
t29 = s[14][ss] + s[17][ss];
|
|
2214
|
+
t30 = (s[14][ss] - s[17][ss]) * 3.40760841847;
|
|
2215
|
+
t31 = s[15][ss] + s[16][ss];
|
|
2216
|
+
t32 = (s[15][ss] - s[16][ss]) * 10.1900081235;
|
|
2217
|
+
t33 = t01 + t31;
|
|
2218
|
+
t31 = (t01 - t31) * .502419286188;
|
|
2219
|
+
t01 = t03 + t29;
|
|
2220
|
+
t29 = (t03 - t29) * .52249861494;
|
|
2221
|
+
t03 = t05 + t27;
|
|
2222
|
+
t27 = (t05 - t27) * .566944034816;
|
|
2223
|
+
t05 = t07 + t25;
|
|
2224
|
+
t25 = (t07 - t25) * .64682178336;
|
|
2225
|
+
t07 = t09 + t23;
|
|
2226
|
+
t23 = (t09 - t23) * .788154623451;
|
|
2227
|
+
t09 = t11 + t21;
|
|
2228
|
+
t21 = (t11 - t21) * 1.06067768599;
|
|
2229
|
+
t11 = t13 + t19;
|
|
2230
|
+
t19 = (t13 - t19) * 1.72244709824;
|
|
2231
|
+
t13 = t15 + t17;
|
|
2232
|
+
t17 = (t15 - t17) * 5.10114861869;
|
|
2233
|
+
t15 = t33 + t13;
|
|
2234
|
+
t13 = (t33 - t13) * .509795579104;
|
|
2235
|
+
t33 = t01 + t11;
|
|
2236
|
+
t01 = (t01 - t11) * .601344886935;
|
|
2237
|
+
t11 = t03 + t09;
|
|
2238
|
+
t09 = (t03 - t09) * .899976223136;
|
|
2239
|
+
t03 = t05 + t07;
|
|
2240
|
+
t07 = (t05 - t07) * 2.56291544774;
|
|
2241
|
+
t05 = t15 + t03;
|
|
2242
|
+
t15 = (t15 - t03) * .541196100146;
|
|
2243
|
+
t03 = t33 + t11;
|
|
2244
|
+
t11 = (t33 - t11) * 1.30656296488;
|
|
2245
|
+
t33 = t05 + t03;
|
|
2246
|
+
t05 = (t05 - t03) * .707106781187;
|
|
2247
|
+
t03 = t15 + t11;
|
|
2248
|
+
t15 = (t15 - t11) * .707106781187;
|
|
2249
|
+
t03 += t15;
|
|
2250
|
+
t11 = t13 + t07;
|
|
2251
|
+
t13 = (t13 - t07) * .541196100146;
|
|
2252
|
+
t07 = t01 + t09;
|
|
2253
|
+
t09 = (t01 - t09) * 1.30656296488;
|
|
2254
|
+
t01 = t11 + t07;
|
|
2255
|
+
t07 = (t11 - t07) * .707106781187;
|
|
2256
|
+
t11 = t13 + t09;
|
|
2257
|
+
t13 = (t13 - t09) * .707106781187;
|
|
2258
|
+
t11 += t13;
|
|
2259
|
+
t01 += t11;
|
|
2260
|
+
t11 += t07;
|
|
2261
|
+
t07 += t13;
|
|
2262
|
+
t09 = t31 + t17;
|
|
2263
|
+
t31 = (t31 - t17) * .509795579104;
|
|
2264
|
+
t17 = t29 + t19;
|
|
2265
|
+
t29 = (t29 - t19) * .601344886935;
|
|
2266
|
+
t19 = t27 + t21;
|
|
2267
|
+
t21 = (t27 - t21) * .899976223136;
|
|
2268
|
+
t27 = t25 + t23;
|
|
2269
|
+
t23 = (t25 - t23) * 2.56291544774;
|
|
2270
|
+
t25 = t09 + t27;
|
|
2271
|
+
t09 = (t09 - t27) * .541196100146;
|
|
2272
|
+
t27 = t17 + t19;
|
|
2273
|
+
t19 = (t17 - t19) * 1.30656296488;
|
|
2274
|
+
t17 = t25 + t27;
|
|
2275
|
+
t27 = (t25 - t27) * .707106781187;
|
|
2276
|
+
t25 = t09 + t19;
|
|
2277
|
+
t19 = (t09 - t19) * .707106781187;
|
|
2278
|
+
t25 += t19;
|
|
2279
|
+
t09 = t31 + t23;
|
|
2280
|
+
t31 = (t31 - t23) * .541196100146;
|
|
2281
|
+
t23 = t29 + t21;
|
|
2282
|
+
t21 = (t29 - t21) * 1.30656296488;
|
|
2283
|
+
t29 = t09 + t23;
|
|
2284
|
+
t23 = (t09 - t23) * .707106781187;
|
|
2285
|
+
t09 = t31 + t21;
|
|
2286
|
+
t31 = (t31 - t21) * .707106781187;
|
|
2287
|
+
t09 += t31;
|
|
2288
|
+
t29 += t09;
|
|
2289
|
+
t09 += t23;
|
|
2290
|
+
t23 += t31;
|
|
2291
|
+
t17 += t29;
|
|
2292
|
+
t29 += t25;
|
|
2293
|
+
t25 += t09;
|
|
2294
|
+
t09 += t27;
|
|
2295
|
+
t27 += t23;
|
|
2296
|
+
t23 += t19;
|
|
2297
|
+
t19 += t31;
|
|
2298
|
+
t21 = t02 + t32;
|
|
2299
|
+
t02 = (t02 - t32) * .502419286188;
|
|
2300
|
+
t32 = t04 + t30;
|
|
2301
|
+
t04 = (t04 - t30) * .52249861494;
|
|
2302
|
+
t30 = t06 + t28;
|
|
2303
|
+
t28 = (t06 - t28) * .566944034816;
|
|
2304
|
+
t06 = t08 + t26;
|
|
2305
|
+
t08 = (t08 - t26) * .64682178336;
|
|
2306
|
+
t26 = t10 + t24;
|
|
2307
|
+
t10 = (t10 - t24) * .788154623451;
|
|
2308
|
+
t24 = t12 + t22;
|
|
2309
|
+
t22 = (t12 - t22) * 1.06067768599;
|
|
2310
|
+
t12 = t14 + t20;
|
|
2311
|
+
t20 = (t14 - t20) * 1.72244709824;
|
|
2312
|
+
t14 = t16 + t18;
|
|
2313
|
+
t16 = (t16 - t18) * 5.10114861869;
|
|
2314
|
+
t18 = t21 + t14;
|
|
2315
|
+
t14 = (t21 - t14) * .509795579104;
|
|
2316
|
+
t21 = t32 + t12;
|
|
2317
|
+
t32 = (t32 - t12) * .601344886935;
|
|
2318
|
+
t12 = t30 + t24;
|
|
2319
|
+
t24 = (t30 - t24) * .899976223136;
|
|
2320
|
+
t30 = t06 + t26;
|
|
2321
|
+
t26 = (t06 - t26) * 2.56291544774;
|
|
2322
|
+
t06 = t18 + t30;
|
|
2323
|
+
t18 = (t18 - t30) * .541196100146;
|
|
2324
|
+
t30 = t21 + t12;
|
|
2325
|
+
t12 = (t21 - t12) * 1.30656296488;
|
|
2326
|
+
t21 = t06 + t30;
|
|
2327
|
+
t30 = (t06 - t30) * .707106781187;
|
|
2328
|
+
t06 = t18 + t12;
|
|
2329
|
+
t12 = (t18 - t12) * .707106781187;
|
|
2330
|
+
t06 += t12;
|
|
2331
|
+
t18 = t14 + t26;
|
|
2332
|
+
t26 = (t14 - t26) * .541196100146;
|
|
2333
|
+
t14 = t32 + t24;
|
|
2334
|
+
t24 = (t32 - t24) * 1.30656296488;
|
|
2335
|
+
t32 = t18 + t14;
|
|
2336
|
+
t14 = (t18 - t14) * .707106781187;
|
|
2337
|
+
t18 = t26 + t24;
|
|
2338
|
+
t24 = (t26 - t24) * .707106781187;
|
|
2339
|
+
t18 += t24;
|
|
2340
|
+
t32 += t18;
|
|
2341
|
+
t18 += t14;
|
|
2342
|
+
t26 = t14 + t24;
|
|
2343
|
+
t14 = t02 + t16;
|
|
2344
|
+
t02 = (t02 - t16) * .509795579104;
|
|
2345
|
+
t16 = t04 + t20;
|
|
2346
|
+
t04 = (t04 - t20) * .601344886935;
|
|
2347
|
+
t20 = t28 + t22;
|
|
2348
|
+
t22 = (t28 - t22) * .899976223136;
|
|
2349
|
+
t28 = t08 + t10;
|
|
2350
|
+
t10 = (t08 - t10) * 2.56291544774;
|
|
2351
|
+
t08 = t14 + t28;
|
|
2352
|
+
t14 = (t14 - t28) * .541196100146;
|
|
2353
|
+
t28 = t16 + t20;
|
|
2354
|
+
t20 = (t16 - t20) * 1.30656296488;
|
|
2355
|
+
t16 = t08 + t28;
|
|
2356
|
+
t28 = (t08 - t28) * .707106781187;
|
|
2357
|
+
t08 = t14 + t20;
|
|
2358
|
+
t20 = (t14 - t20) * .707106781187;
|
|
2359
|
+
t08 += t20;
|
|
2360
|
+
t14 = t02 + t10;
|
|
2361
|
+
t02 = (t02 - t10) * .541196100146;
|
|
2362
|
+
t10 = t04 + t22;
|
|
2363
|
+
t22 = (t04 - t22) * 1.30656296488;
|
|
2364
|
+
t04 = t14 + t10;
|
|
2365
|
+
t10 = (t14 - t10) * .707106781187;
|
|
2366
|
+
t14 = t02 + t22;
|
|
2367
|
+
t02 = (t02 - t22) * .707106781187;
|
|
2368
|
+
t14 += t02;
|
|
2369
|
+
t04 += t14;
|
|
2370
|
+
t14 += t10;
|
|
2371
|
+
t10 += t02;
|
|
2372
|
+
t16 += t04;
|
|
2373
|
+
t04 += t08;
|
|
2374
|
+
t08 += t14;
|
|
2375
|
+
t14 += t28;
|
|
2376
|
+
t28 += t10;
|
|
2377
|
+
t10 += t20;
|
|
2378
|
+
t20 += t02;
|
|
2379
|
+
t21 += t16;
|
|
2380
|
+
t16 += t32;
|
|
2381
|
+
t32 += t04;
|
|
2382
|
+
t04 += t06;
|
|
2383
|
+
t06 += t08;
|
|
2384
|
+
t08 += t18;
|
|
2385
|
+
t18 += t14;
|
|
2386
|
+
t14 += t30;
|
|
2387
|
+
t30 += t28;
|
|
2388
|
+
t28 += t26;
|
|
2389
|
+
t26 += t10;
|
|
2390
|
+
t10 += t12;
|
|
2391
|
+
t12 += t20;
|
|
2392
|
+
t20 += t24;
|
|
2393
|
+
t24 += t02;
|
|
2394
|
+
d[dp + 48] = -t33;
|
|
2395
|
+
d[dp + 49] = d[dp + 47] = -t21;
|
|
2396
|
+
d[dp + 50] = d[dp + 46] = -t17;
|
|
2397
|
+
d[dp + 51] = d[dp + 45] = -t16;
|
|
2398
|
+
d[dp + 52] = d[dp + 44] = -t01;
|
|
2399
|
+
d[dp + 53] = d[dp + 43] = -t32;
|
|
2400
|
+
d[dp + 54] = d[dp + 42] = -t29;
|
|
2401
|
+
d[dp + 55] = d[dp + 41] = -t04;
|
|
2402
|
+
d[dp + 56] = d[dp + 40] = -t03;
|
|
2403
|
+
d[dp + 57] = d[dp + 39] = -t06;
|
|
2404
|
+
d[dp + 58] = d[dp + 38] = -t25;
|
|
2405
|
+
d[dp + 59] = d[dp + 37] = -t08;
|
|
2406
|
+
d[dp + 60] = d[dp + 36] = -t11;
|
|
2407
|
+
d[dp + 61] = d[dp + 35] = -t18;
|
|
2408
|
+
d[dp + 62] = d[dp + 34] = -t09;
|
|
2409
|
+
d[dp + 63] = d[dp + 33] = -t14;
|
|
2410
|
+
d[dp + 32] = -t05;
|
|
2411
|
+
d[dp + 0] = t05;
|
|
2412
|
+
d[dp + 31] = -t30;
|
|
2413
|
+
d[dp + 1] = t30;
|
|
2414
|
+
d[dp + 30] = -t27;
|
|
2415
|
+
d[dp + 2] = t27;
|
|
2416
|
+
d[dp + 29] = -t28;
|
|
2417
|
+
d[dp + 3] = t28;
|
|
2418
|
+
d[dp + 28] = -t07;
|
|
2419
|
+
d[dp + 4] = t07;
|
|
2420
|
+
d[dp + 27] = -t26;
|
|
2421
|
+
d[dp + 5] = t26;
|
|
2422
|
+
d[dp + 26] = -t23;
|
|
2423
|
+
d[dp + 6] = t23;
|
|
2424
|
+
|
|
2425
|
+
d[dp + 25] = -t10;
|
|
2426
|
+
d[dp + 7] = t10;
|
|
2427
|
+
d[dp + 24] = -t15;
|
|
2428
|
+
d[dp + 8] = t15;
|
|
2429
|
+
d[dp + 23] = -t12;
|
|
2430
|
+
d[dp + 9] = t12;
|
|
2431
|
+
d[dp + 22] = -t19;
|
|
2432
|
+
d[dp + 10] = t19;
|
|
2433
|
+
d[dp + 21] = -t20;
|
|
2434
|
+
d[dp + 11] = t20;
|
|
2435
|
+
d[dp + 20] = -t13;
|
|
2436
|
+
d[dp + 12] = t13;
|
|
2437
|
+
d[dp + 19] = -t24;
|
|
2438
|
+
d[dp + 13] = t24;
|
|
2439
|
+
d[dp + 18] = -t31;
|
|
2440
|
+
d[dp + 14] = t31;
|
|
2441
|
+
d[dp + 17] = -t02;
|
|
2442
|
+
d[dp + 15] = t02;
|
|
2443
|
+
d[dp + 16] = 0
|
|
2444
|
+
};
|
|
2445
|
+
MP2.FRAME_SYNC = 2047;
|
|
2446
|
+
MP2.VERSION = {
|
|
2447
|
+
MPEG_2_5: 0,
|
|
2448
|
+
MPEG_2: 2,
|
|
2449
|
+
MPEG_1: 3
|
|
2450
|
+
};
|
|
2451
|
+
MP2.LAYER = {
|
|
2452
|
+
III: 1,
|
|
2453
|
+
II: 2,
|
|
2454
|
+
I: 3
|
|
2455
|
+
};
|
|
2456
|
+
MP2.MODE = {
|
|
2457
|
+
STEREO: 0,
|
|
2458
|
+
JOINT_STEREO: 1,
|
|
2459
|
+
DUAL_CHANNEL: 2,
|
|
2460
|
+
MONO: 3
|
|
2461
|
+
};
|
|
2462
|
+
MP2.SAMPLE_RATE = new Uint16Array([44100, 48e3, 32e3, 0, 22050, 24e3, 16e3, 0]);
|
|
2463
|
+
MP2.BIT_RATE = new Uint16Array([32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]);
|
|
2464
|
+
MP2.SCALEFACTOR_BASE = new Uint32Array([33554432, 26632170, 21137968]);
|
|
2465
|
+
MP2.SYNTHESIS_WINDOW = new Float32Array([0, -.5, -.5, -.5, -.5, -.5, -.5, -1, -1, -1, -1, -1.5, -1.5, -2, -2, -2.5, -2.5, -3, -3.5, -3.5, -4, -4.5, -5, -5.5, -6.5, -7, -8, -8.5, -9.5, -10.5, -12, -13, -14.5, -15.5, -17.5, -19, -20.5, -22.5, -24.5, -26.5, -29, -31.5, -34, -36.5, -39.5, -42.5, -45.5, -48.5, -52, -55.5, -58.5, -62.5, -66, -69.5, -73.5, -77, -80.5, -84.5, -88, -91.5, -95, -98, -101, -104, 106.5, 109, 111, 112.5, 113.5, 114, 114, 113.5, 112, 110.5, 107.5, 104, 100, 94.5, 88.5, 81.5, 73, 63.5, 53, 41.5, 28.5, 14.5, -1, -18, -36, -55.5, -76.5, -98.5, -122, -147, -173.5, -200.5, -229.5, -259.5, -290.5, -322.5, -355.5, -389.5, -424, -459.5, -495.5, -532, -568.5, -605, -641.5, -678, -714, -749, -783.5, -817, -849, -879.5, -908.5, -935, -959.5, -981, -1000.5, -1016, -1028.5, -1037.5, -1042.5, -1043.5, -1040, -1031.5, 1018.5, 1e3, 976, 946.5, 911, 869.5, 822, 767.5, 707, 640, 565.5, 485, 397, 302.5, 201, 92.5, -22.5, -144, -272.5, -407, -547.5, -694, -846, -1003, -1165, -1331.5, -1502, -1675.5, -1852.5, -2031.5, -2212.5, -2394, -2576.5, -2758.5, -2939.5, -3118.5, -3294.5, -3467.5, -3635.5, -3798.5, -3955, -4104.5, -4245.5, -4377.5, -4499, -4609.5, -4708, -4792.5, -4863.5, -4919, -4958, -4979.5, -4983, -4967.5, -4931.5, -4875, -4796, -4694.5, -4569.5, -4420, -4246, -4046, -3820, -3567, 3287, 2979.5, 2644, 2280.5, 1888, 1467.5, 1018.5, 541, 35, -499, -1061, -1650, -2266.5, -2909, -3577, -4270, -4987.5, -5727.5, -6490, -7274, -8077.5, -8899.5, -9739, -10594.5, -11464.5, -12347, -13241, -14144.5, -15056, -15973.5, -16895.5, -17820, -18744.5, -19668, -20588, -21503, -22410.5, -23308.5, -24195, -25068.5, -25926.5, -26767, -27589, -28389, -29166.5, -29919, -30644.5, -31342, -32009.5, -32645, -33247, -33814.5, -34346, -34839.5, -35295, -35710, -36084.5, -36417.5, -36707.5, -36954, -37156.5, -37315, -37428, -37496, 37519, 37496, 37428, 37315, 37156.5, 36954, 36707.5, 36417.5, 36084.5, 35710, 35295, 34839.5, 34346, 33814.5, 33247, 32645, 32009.5, 31342, 30644.5, 29919, 29166.5, 28389, 27589, 26767, 25926.5, 25068.5, 24195, 23308.5, 22410.5, 21503, 20588, 19668, 18744.5, 17820, 16895.5, 15973.5, 15056, 14144.5, 13241, 12347, 11464.5, 10594.5, 9739, 8899.5, 8077.5, 7274, 6490, 5727.5, 4987.5, 4270, 3577, 2909, 2266.5, 1650, 1061, 499, -35, -541, -1018.5, -1467.5, -1888, -2280.5, -2644, -2979.5, 3287, 3567, 3820, 4046, 4246, 4420, 4569.5, 4694.5, 4796, 4875, 4931.5, 4967.5, 4983, 4979.5, 4958, 4919, 4863.5, 4792.5, 4708, 4609.5, 4499, 4377.5, 4245.5, 4104.5, 3955, 3798.5, 3635.5, 3467.5, 3294.5, 3118.5, 2939.5, 2758.5, 2576.5, 2394, 2212.5, 2031.5, 1852.5, 1675.5, 1502, 1331.5, 1165, 1003, 846, 694, 547.5, 407, 272.5, 144, 22.5, -92.5, -201, -302.5, -397, -485, -565.5, -640, -707, -767.5, -822, -869.5, -911, -946.5, -976, -1e3, 1018.5, 1031.5, 1040, 1043.5, 1042.5, 1037.5, 1028.5, 1016, 1000.5, 981, 959.5, 935, 908.5, 879.5, 849, 817, 783.5, 749, 714, 678, 641.5, 605, 568.5, 532, 495.5, 459.5, 424, 389.5, 355.5, 322.5, 290.5, 259.5, 229.5, 200.5, 173.5, 147, 122, 98.5, 76.5, 55.5, 36, 18, 1, -14.5, -28.5, -41.5, -53, -63.5, -73, -81.5, -88.5, -94.5, -100, -104, -107.5, -110.5, -112, -113.5, -114, -114, -113.5, -112.5, -111, -109, 106.5, 104, 101, 98, 95, 91.5, 88, 84.5, 80.5, 77, 73.5, 69.5, 66, 62.5, 58.5, 55.5, 52, 48.5, 45.5, 42.5, 39.5, 36.5, 34, 31.5, 29, 26.5, 24.5, 22.5, 20.5, 19, 17.5, 15.5, 14.5, 13, 12, 10.5, 9.5, 8.5, 8, 7, 6.5, 5.5, 5, 4.5, 4, 3.5, 3.5, 3, 2.5, 2.5, 2, 2, 1.5, 1.5, 1, 1, 1, 1, .5, .5, .5, .5, .5, .5]);
|
|
2466
|
+
MP2.QUANT_LUT_STEP_1 = [
|
|
2467
|
+
[0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2],
|
|
2468
|
+
[0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2]
|
|
2469
|
+
];
|
|
2470
|
+
MP2.QUANT_TAB = {
|
|
2471
|
+
A: 27 | 64,
|
|
2472
|
+
B: 30 | 64,
|
|
2473
|
+
C: 8,
|
|
2474
|
+
D: 12
|
|
2475
|
+
};
|
|
2476
|
+
MP2.QUANT_LUT_STEP_2 = [
|
|
2477
|
+
[MP2.QUANT_TAB.C, MP2.QUANT_TAB.C, MP2.QUANT_TAB.D],
|
|
2478
|
+
[MP2.QUANT_TAB.A, MP2.QUANT_TAB.A, MP2.QUANT_TAB.A],
|
|
2479
|
+
[MP2.QUANT_TAB.B, MP2.QUANT_TAB.A, MP2.QUANT_TAB.B]
|
|
2480
|
+
];
|
|
2481
|
+
MP2.QUANT_LUT_STEP_3 = [
|
|
2482
|
+
[68, 68, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52],
|
|
2483
|
+
[67, 67, 67, 66, 66, 66, 66, 66, 66, 66, 66, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 32, 32, 32, 32, 32, 32, 32],
|
|
2484
|
+
[69, 69, 69, 69, 52, 52, 52, 52, 52, 52, 52, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36]
|
|
2485
|
+
];
|
|
2486
|
+
MP2.QUANT_LUT_STEP4 = [
|
|
2487
|
+
[0, 1, 2, 17],
|
|
2488
|
+
[0, 1, 2, 3, 4, 5, 6, 17],
|
|
2489
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17],
|
|
2490
|
+
[0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
|
|
2491
|
+
[0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17],
|
|
2492
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
|
|
2493
|
+
];
|
|
2494
|
+
MP2.QUANT_TAB = [{
|
|
2495
|
+
levels: 3,
|
|
2496
|
+
group: 1,
|
|
2497
|
+
bits: 5
|
|
2498
|
+
}, {
|
|
2499
|
+
levels: 5,
|
|
2500
|
+
group: 1,
|
|
2501
|
+
bits: 7
|
|
2502
|
+
}, {
|
|
2503
|
+
levels: 7,
|
|
2504
|
+
group: 0,
|
|
2505
|
+
bits: 3
|
|
2506
|
+
}, {
|
|
2507
|
+
levels: 9,
|
|
2508
|
+
group: 1,
|
|
2509
|
+
bits: 10
|
|
2510
|
+
}, {
|
|
2511
|
+
levels: 15,
|
|
2512
|
+
group: 0,
|
|
2513
|
+
bits: 4
|
|
2514
|
+
}, {
|
|
2515
|
+
levels: 31,
|
|
2516
|
+
group: 0,
|
|
2517
|
+
bits: 5
|
|
2518
|
+
}, {
|
|
2519
|
+
levels: 63,
|
|
2520
|
+
group: 0,
|
|
2521
|
+
bits: 6
|
|
2522
|
+
}, {
|
|
2523
|
+
levels: 127,
|
|
2524
|
+
group: 0,
|
|
2525
|
+
bits: 7
|
|
2526
|
+
}, {
|
|
2527
|
+
levels: 255,
|
|
2528
|
+
group: 0,
|
|
2529
|
+
bits: 8
|
|
2530
|
+
}, {
|
|
2531
|
+
levels: 511,
|
|
2532
|
+
group: 0,
|
|
2533
|
+
bits: 9
|
|
2534
|
+
}, {
|
|
2535
|
+
levels: 1023,
|
|
2536
|
+
group: 0,
|
|
2537
|
+
bits: 10
|
|
2538
|
+
}, {
|
|
2539
|
+
levels: 2047,
|
|
2540
|
+
group: 0,
|
|
2541
|
+
bits: 11
|
|
2542
|
+
}, {
|
|
2543
|
+
levels: 4095,
|
|
2544
|
+
group: 0,
|
|
2545
|
+
bits: 12
|
|
2546
|
+
}, {
|
|
2547
|
+
levels: 8191,
|
|
2548
|
+
group: 0,
|
|
2549
|
+
bits: 13
|
|
2550
|
+
}, {
|
|
2551
|
+
levels: 16383,
|
|
2552
|
+
group: 0,
|
|
2553
|
+
bits: 14
|
|
2554
|
+
}, {
|
|
2555
|
+
levels: 32767,
|
|
2556
|
+
group: 0,
|
|
2557
|
+
bits: 15
|
|
2558
|
+
}, {
|
|
2559
|
+
levels: 65535,
|
|
2560
|
+
group: 0,
|
|
2561
|
+
bits: 16
|
|
2562
|
+
}];
|
|
2563
|
+
return MP2
|
|
2564
|
+
}();
|
|
2565
|
+
JSMpeg.Decoder.MP2AudioWASM = function() {
|
|
2566
|
+
"use strict";
|
|
2567
|
+
var MP2WASM = function(options) {
|
|
2568
|
+
JSMpeg.Decoder.Base.call(this, options);
|
|
2569
|
+
this.onDecodeCallback = options.onAudioDecode;
|
|
2570
|
+
this.module = options.wasmModule;
|
|
2571
|
+
this.bufferSize = options.audioBufferSize || 128 * 1024;
|
|
2572
|
+
this.bufferMode = options.streaming ? JSMpeg.BitBuffer.MODE.EVICT : JSMpeg.BitBuffer.MODE.EXPAND;
|
|
2573
|
+
this.sampleRate = 0
|
|
2574
|
+
};
|
|
2575
|
+
MP2WASM.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
|
|
2576
|
+
MP2WASM.prototype.constructor = MP2WASM;
|
|
2577
|
+
MP2WASM.prototype.initializeWasmDecoder = function() {
|
|
2578
|
+
if (!this.module.instance) {
|
|
2579
|
+
console.warn("JSMpeg: WASM module not compiled yet");
|
|
2580
|
+
return
|
|
2581
|
+
}
|
|
2582
|
+
this.instance = this.module.instance;
|
|
2583
|
+
this.functions = this.module.instance.exports;
|
|
2584
|
+
this.decoder = this.functions._mp2_decoder_create(this.bufferSize, this.bufferMode)
|
|
2585
|
+
};
|
|
2586
|
+
MP2WASM.prototype.destroy = function() {
|
|
2587
|
+
if (!this.decoder) {
|
|
2588
|
+
return
|
|
2589
|
+
}
|
|
2590
|
+
this.functions._mp2_decoder_destroy(this.decoder)
|
|
2591
|
+
};
|
|
2592
|
+
MP2WASM.prototype.bufferGetIndex = function() {
|
|
2593
|
+
if (!this.decoder) {
|
|
2594
|
+
return
|
|
2595
|
+
}
|
|
2596
|
+
return this.functions._mp2_decoder_get_index(this.decoder)
|
|
2597
|
+
};
|
|
2598
|
+
MP2WASM.prototype.bufferSetIndex = function(index) {
|
|
2599
|
+
if (!this.decoder) {
|
|
2600
|
+
return
|
|
2601
|
+
}
|
|
2602
|
+
this.functions._mp2_decoder_set_index(this.decoder, index)
|
|
2603
|
+
};
|
|
2604
|
+
MP2WASM.prototype.bufferWrite = function(buffers) {
|
|
2605
|
+
if (!this.decoder) {
|
|
2606
|
+
this.initializeWasmDecoder()
|
|
2607
|
+
}
|
|
2608
|
+
var totalLength = 0;
|
|
2609
|
+
for (var i = 0; i < buffers.length; i++) {
|
|
2610
|
+
totalLength += buffers[i].length
|
|
2611
|
+
}
|
|
2612
|
+
var ptr = this.functions._mp2_decoder_get_write_ptr(this.decoder, totalLength);
|
|
2613
|
+
for (var i = 0; i < buffers.length; i++) {
|
|
2614
|
+
this.instance.heapU8.set(buffers[i], ptr);
|
|
2615
|
+
ptr += buffers[i].length
|
|
2616
|
+
}
|
|
2617
|
+
this.functions._mp2_decoder_did_write(this.decoder, totalLength);
|
|
2618
|
+
return totalLength
|
|
2619
|
+
};
|
|
2620
|
+
MP2WASM.prototype.decode = function() {
|
|
2621
|
+
var startTime = JSMpeg.Now();
|
|
2622
|
+
if (!this.decoder) {
|
|
2623
|
+
return false
|
|
2624
|
+
}
|
|
2625
|
+
var decodedBytes = this.functions._mp2_decoder_decode(this.decoder);
|
|
2626
|
+
if (decodedBytes === 0) {
|
|
2627
|
+
return false
|
|
2628
|
+
}
|
|
2629
|
+
if (!this.sampleRate) {
|
|
2630
|
+
this.sampleRate = this.functions._mp2_decoder_get_sample_rate(this.decoder)
|
|
2631
|
+
}
|
|
2632
|
+
if (this.destination) {
|
|
2633
|
+
var leftPtr = this.functions._mp2_decoder_get_left_channel_ptr(this.decoder),
|
|
2634
|
+
rightPtr = this.functions._mp2_decoder_get_right_channel_ptr(this.decoder);
|
|
2635
|
+
var leftOffset = leftPtr / Float32Array.BYTES_PER_ELEMENT,
|
|
2636
|
+
rightOffset = rightPtr / Float32Array.BYTES_PER_ELEMENT;
|
|
2637
|
+
var left = this.instance.heapF32.subarray(leftOffset, leftOffset + MP2WASM.SAMPLES_PER_FRAME),
|
|
2638
|
+
right = this.instance.heapF32.subarray(rightOffset, rightOffset + MP2WASM.SAMPLES_PER_FRAME);
|
|
2639
|
+
this.destination.play(this.sampleRate, left, right)
|
|
2640
|
+
}
|
|
2641
|
+
this.advanceDecodedTime(MP2WASM.SAMPLES_PER_FRAME / this.sampleRate);
|
|
2642
|
+
var elapsedTime = JSMpeg.Now() - startTime;
|
|
2643
|
+
if (this.onDecodeCallback) {
|
|
2644
|
+
this.onDecodeCallback(this, elapsedTime)
|
|
2645
|
+
}
|
|
2646
|
+
return true
|
|
2647
|
+
};
|
|
2648
|
+
MP2WASM.prototype.getCurrentTime = function() {
|
|
2649
|
+
var enqueuedTime = this.destination ? this.destination.enqueuedTime : 0;
|
|
2650
|
+
return this.decodedTime - enqueuedTime
|
|
2651
|
+
};
|
|
2652
|
+
MP2WASM.SAMPLES_PER_FRAME = 1152;
|
|
2653
|
+
return MP2WASM
|
|
2654
|
+
}();
|
|
2655
|
+
JSMpeg.Renderer.WebGL = function() {
|
|
2656
|
+
"use strict";
|
|
2657
|
+
var WebGLRenderer = function(options) {
|
|
2658
|
+
this.canvas = options.canvas || document.createElement("canvas");
|
|
2659
|
+
this.width = this.canvas.width;
|
|
2660
|
+
this.height = this.canvas.height;
|
|
2661
|
+
this.enabled = true;
|
|
2662
|
+
this.hasTextureData = {};
|
|
2663
|
+
var contextCreateOptions = {
|
|
2664
|
+
preserveDrawingBuffer: !!options.preserveDrawingBuffer,
|
|
2665
|
+
alpha: false,
|
|
2666
|
+
depth: false,
|
|
2667
|
+
stencil: false,
|
|
2668
|
+
antialias: false,
|
|
2669
|
+
premultipliedAlpha: false
|
|
2670
|
+
};
|
|
2671
|
+
this.gl = this.canvas.getContext("webgl", contextCreateOptions) || this.canvas.getContext("experimental-webgl", contextCreateOptions);
|
|
2672
|
+
if (!this.gl) {
|
|
2673
|
+
throw new Error("Failed to get WebGL Context")
|
|
2674
|
+
}
|
|
2675
|
+
var gl = this.gl;
|
|
2676
|
+
var vertexAttr = null;
|
|
2677
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
|
|
2678
|
+
this.vertexBuffer = gl.createBuffer();
|
|
2679
|
+
var vertexCoords = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);
|
|
2680
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
|
|
2681
|
+
gl.bufferData(gl.ARRAY_BUFFER, vertexCoords, gl.STATIC_DRAW);
|
|
2682
|
+
this.program = this.createProgram(WebGLRenderer.SHADER.VERTEX_IDENTITY, WebGLRenderer.SHADER.FRAGMENT_YCRCB_TO_RGBA);
|
|
2683
|
+
vertexAttr = gl.getAttribLocation(this.program, "vertex");
|
|
2684
|
+
gl.enableVertexAttribArray(vertexAttr);
|
|
2685
|
+
gl.vertexAttribPointer(vertexAttr, 2, gl.FLOAT, false, 0, 0);
|
|
2686
|
+
this.textureY = this.createTexture(0, "textureY");
|
|
2687
|
+
this.textureCb = this.createTexture(1, "textureCb");
|
|
2688
|
+
this.textureCr = this.createTexture(2, "textureCr");
|
|
2689
|
+
this.loadingProgram = this.createProgram(WebGLRenderer.SHADER.VERTEX_IDENTITY, WebGLRenderer.SHADER.FRAGMENT_LOADING);
|
|
2690
|
+
vertexAttr = gl.getAttribLocation(this.loadingProgram, "vertex");
|
|
2691
|
+
gl.enableVertexAttribArray(vertexAttr);
|
|
2692
|
+
gl.vertexAttribPointer(vertexAttr, 2, gl.FLOAT, false, 0, 0);
|
|
2693
|
+
this.shouldCreateUnclampedViews = !this.allowsClampedTextureData()
|
|
2694
|
+
};
|
|
2695
|
+
WebGLRenderer.prototype.destroy = function() {
|
|
2696
|
+
var gl = this.gl;
|
|
2697
|
+
this.deleteTexture(gl.TEXTURE0, this.textureY);
|
|
2698
|
+
this.deleteTexture(gl.TEXTURE1, this.textureCb);
|
|
2699
|
+
this.deleteTexture(gl.TEXTURE2, this.textureCr);
|
|
2700
|
+
gl.useProgram(null);
|
|
2701
|
+
gl.deleteProgram(this.program);
|
|
2702
|
+
gl.deleteProgram(this.loadingProgram);
|
|
2703
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
2704
|
+
gl.deleteBuffer(this.vertexBuffer);
|
|
2705
|
+
gl.getExtension("WEBGL_lose_context").loseContext();
|
|
2706
|
+
this.canvas.remove()
|
|
2707
|
+
};
|
|
2708
|
+
WebGLRenderer.prototype.resize = function(width, height) {
|
|
2709
|
+
this.width = width | 0;
|
|
2710
|
+
this.height = height | 0;
|
|
2711
|
+
this.canvas.width = this.width;
|
|
2712
|
+
this.canvas.height = this.height;
|
|
2713
|
+
this.gl.useProgram(this.program);
|
|
2714
|
+
var codedWidth = this.width + 15 >> 4 << 4;
|
|
2715
|
+
this.gl.viewport(0, 0, codedWidth, this.height)
|
|
2716
|
+
};
|
|
2717
|
+
WebGLRenderer.prototype.createTexture = function(index, name) {
|
|
2718
|
+
var gl = this.gl;
|
|
2719
|
+
var texture = gl.createTexture();
|
|
2720
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
2721
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
2722
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
2723
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
2724
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
2725
|
+
gl.uniform1i(gl.getUniformLocation(this.program, name), index);
|
|
2726
|
+
return texture
|
|
2727
|
+
};
|
|
2728
|
+
WebGLRenderer.prototype.createProgram = function(vsh, fsh) {
|
|
2729
|
+
var gl = this.gl;
|
|
2730
|
+
var program = gl.createProgram();
|
|
2731
|
+
gl.attachShader(program, this.compileShader(gl.VERTEX_SHADER, vsh));
|
|
2732
|
+
gl.attachShader(program, this.compileShader(gl.FRAGMENT_SHADER, fsh));
|
|
2733
|
+
gl.linkProgram(program);
|
|
2734
|
+
gl.useProgram(program);
|
|
2735
|
+
return program
|
|
2736
|
+
};
|
|
2737
|
+
WebGLRenderer.prototype.compileShader = function(type, source) {
|
|
2738
|
+
var gl = this.gl;
|
|
2739
|
+
var shader = gl.createShader(type);
|
|
2740
|
+
gl.shaderSource(shader, source);
|
|
2741
|
+
gl.compileShader(shader);
|
|
2742
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
2743
|
+
throw new Error(gl.getShaderInfoLog(shader))
|
|
2744
|
+
}
|
|
2745
|
+
return shader
|
|
2746
|
+
};
|
|
2747
|
+
WebGLRenderer.prototype.allowsClampedTextureData = function() {
|
|
2748
|
+
var gl = this.gl;
|
|
2749
|
+
var texture = gl.createTexture();
|
|
2750
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
2751
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, 1, 1, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, new Uint8ClampedArray([0]));
|
|
2752
|
+
return gl.getError() === 0
|
|
2753
|
+
};
|
|
2754
|
+
WebGLRenderer.prototype.renderProgress = function(progress) {
|
|
2755
|
+
var gl = this.gl;
|
|
2756
|
+
gl.useProgram(this.loadingProgram);
|
|
2757
|
+
var loc = gl.getUniformLocation(this.loadingProgram, "progress");
|
|
2758
|
+
gl.uniform1f(loc, progress);
|
|
2759
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)
|
|
2760
|
+
};
|
|
2761
|
+
WebGLRenderer.prototype.render = function(y, cb, cr, isClampedArray) {
|
|
2762
|
+
if (!this.enabled) {
|
|
2763
|
+
return
|
|
2764
|
+
}
|
|
2765
|
+
var gl = this.gl;
|
|
2766
|
+
var w = this.width + 15 >> 4 << 4,
|
|
2767
|
+
h = this.height,
|
|
2768
|
+
w2 = w >> 1,
|
|
2769
|
+
h2 = h >> 1;
|
|
2770
|
+
if (isClampedArray && this.shouldCreateUnclampedViews) {
|
|
2771
|
+
y = new Uint8Array(y.buffer), cb = new Uint8Array(cb.buffer), cr = new Uint8Array(cr.buffer)
|
|
2772
|
+
}
|
|
2773
|
+
gl.useProgram(this.program);
|
|
2774
|
+
this.updateTexture(gl.TEXTURE0, this.textureY, w, h, y);
|
|
2775
|
+
this.updateTexture(gl.TEXTURE1, this.textureCb, w2, h2, cb);
|
|
2776
|
+
this.updateTexture(gl.TEXTURE2, this.textureCr, w2, h2, cr);
|
|
2777
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)
|
|
2778
|
+
};
|
|
2779
|
+
WebGLRenderer.prototype.updateTexture = function(unit, texture, w, h, data) {
|
|
2780
|
+
var gl = this.gl;
|
|
2781
|
+
gl.activeTexture(unit);
|
|
2782
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
2783
|
+
if (this.hasTextureData[unit]) {
|
|
2784
|
+
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, w, h, gl.LUMINANCE, gl.UNSIGNED_BYTE, data)
|
|
2785
|
+
} else {
|
|
2786
|
+
this.hasTextureData[unit] = true;
|
|
2787
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, w, h, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data)
|
|
2788
|
+
}
|
|
2789
|
+
};
|
|
2790
|
+
WebGLRenderer.prototype.deleteTexture = function(unit, texture) {
|
|
2791
|
+
var gl = this.gl;
|
|
2792
|
+
gl.activeTexture(unit);
|
|
2793
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
2794
|
+
gl.deleteTexture(texture)
|
|
2795
|
+
};
|
|
2796
|
+
WebGLRenderer.IsSupported = function() {
|
|
2797
|
+
try {
|
|
2798
|
+
if (!window.WebGLRenderingContext) {
|
|
2799
|
+
return false
|
|
2800
|
+
}
|
|
2801
|
+
var canvas = document.createElement("canvas");
|
|
2802
|
+
return !!(canvas.getContext("webgl") || canvas.getContext("experimental-webgl"))
|
|
2803
|
+
} catch (err) {
|
|
2804
|
+
return false
|
|
2805
|
+
}
|
|
2806
|
+
};
|
|
2807
|
+
WebGLRenderer.SHADER = {
|
|
2808
|
+
FRAGMENT_YCRCB_TO_RGBA: ["precision mediump float;", "uniform sampler2D textureY;", "uniform sampler2D textureCb;", "uniform sampler2D textureCr;", "varying vec2 texCoord;", "mat4 rec601 = mat4(", "1.16438, 0.00000, 1.59603, -0.87079,", "1.16438, -0.39176, -0.81297, 0.52959,", "1.16438, 2.01723, 0.00000, -1.08139,", "0, 0, 0, 1", ");", "void main() {", "float y = texture2D(textureY, texCoord).r;", "float cb = texture2D(textureCb, texCoord).r;", "float cr = texture2D(textureCr, texCoord).r;", "gl_FragColor = vec4(y, cr, cb, 1.0) * rec601;", "}"].join("\n"),
|
|
2809
|
+
FRAGMENT_LOADING: ["precision mediump float;", "uniform float progress;", "varying vec2 texCoord;", "void main() {", "float c = ceil(progress-(1.0-texCoord.y));", "gl_FragColor = vec4(c,c,c,1);", "}"].join("\n"),
|
|
2810
|
+
VERTEX_IDENTITY: ["attribute vec2 vertex;", "varying vec2 texCoord;", "void main() {", "texCoord = vertex;", "gl_Position = vec4((vertex * 2.0 - 1.0) * vec2(1, -1), 0.0, 1.0);", "}"].join("\n")
|
|
2811
|
+
};
|
|
2812
|
+
return WebGLRenderer
|
|
2813
|
+
}();
|
|
2814
|
+
JSMpeg.Renderer.Canvas2D = function() {
|
|
2815
|
+
"use strict";
|
|
2816
|
+
var CanvasRenderer = function(options) {
|
|
2817
|
+
this.canvas = options.canvas || document.createElement("canvas");
|
|
2818
|
+
this.width = this.canvas.width;
|
|
2819
|
+
this.height = this.canvas.height;
|
|
2820
|
+
this.enabled = true;
|
|
2821
|
+
this.context = this.canvas.getContext("2d")
|
|
2822
|
+
};
|
|
2823
|
+
CanvasRenderer.prototype.destroy = function() {
|
|
2824
|
+
this.canvas.remove()
|
|
2825
|
+
};
|
|
2826
|
+
CanvasRenderer.prototype.resize = function(width, height) {
|
|
2827
|
+
this.width = width | 0;
|
|
2828
|
+
this.height = height | 0;
|
|
2829
|
+
this.canvas.width = this.width;
|
|
2830
|
+
this.canvas.height = this.height;
|
|
2831
|
+
this.imageData = this.context.getImageData(0, 0, this.width, this.height);
|
|
2832
|
+
JSMpeg.Fill(this.imageData.data, 255)
|
|
2833
|
+
};
|
|
2834
|
+
CanvasRenderer.prototype.renderProgress = function(progress) {
|
|
2835
|
+
var w = this.canvas.width,
|
|
2836
|
+
h = this.canvas.height,
|
|
2837
|
+
ctx = this.context;
|
|
2838
|
+
ctx.fillStyle = "#222";
|
|
2839
|
+
ctx.fillRect(0, 0, w, h);
|
|
2840
|
+
ctx.fillStyle = "#fff";
|
|
2841
|
+
ctx.fillRect(0, h - h * progress, w, h * progress)
|
|
2842
|
+
};
|
|
2843
|
+
CanvasRenderer.prototype.render = function(y, cb, cr) {
|
|
2844
|
+
this.YCbCrToRGBA(y, cb, cr, this.imageData.data);
|
|
2845
|
+
this.context.putImageData(this.imageData, 0, 0)
|
|
2846
|
+
};
|
|
2847
|
+
CanvasRenderer.prototype.YCbCrToRGBA = function(y, cb, cr, rgba) {
|
|
2848
|
+
if (!this.enabled) {
|
|
2849
|
+
return
|
|
2850
|
+
}
|
|
2851
|
+
var w = this.width + 15 >> 4 << 4,
|
|
2852
|
+
w2 = w >> 1;
|
|
2853
|
+
var yIndex1 = 0,
|
|
2854
|
+
yIndex2 = w,
|
|
2855
|
+
yNext2Lines = w + (w - this.width);
|
|
2856
|
+
var cIndex = 0,
|
|
2857
|
+
cNextLine = w2 - (this.width >> 1);
|
|
2858
|
+
var rgbaIndex1 = 0,
|
|
2859
|
+
rgbaIndex2 = this.width * 4,
|
|
2860
|
+
rgbaNext2Lines = this.width * 4;
|
|
2861
|
+
var cols = this.width >> 1,
|
|
2862
|
+
rows = this.height >> 1;
|
|
2863
|
+
var ccb, ccr, r, g, b;
|
|
2864
|
+
for (var row = 0; row < rows; row++) {
|
|
2865
|
+
for (var col = 0; col < cols; col++) {
|
|
2866
|
+
ccb = cb[cIndex];
|
|
2867
|
+
ccr = cr[cIndex];
|
|
2868
|
+
cIndex++;
|
|
2869
|
+
r = ccb + (ccb * 103 >> 8) - 179;
|
|
2870
|
+
g = (ccr * 88 >> 8) - 44 + (ccb * 183 >> 8) - 91;
|
|
2871
|
+
b = ccr + (ccr * 198 >> 8) - 227;
|
|
2872
|
+
var y1 = y[yIndex1++];
|
|
2873
|
+
var y2 = y[yIndex1++];
|
|
2874
|
+
rgba[rgbaIndex1] = y1 + r;
|
|
2875
|
+
rgba[rgbaIndex1 + 1] = y1 - g;
|
|
2876
|
+
rgba[rgbaIndex1 + 2] = y1 + b;
|
|
2877
|
+
rgba[rgbaIndex1 + 4] = y2 + r;
|
|
2878
|
+
rgba[rgbaIndex1 + 5] = y2 - g;
|
|
2879
|
+
rgba[rgbaIndex1 + 6] = y2 + b;
|
|
2880
|
+
rgbaIndex1 += 8;
|
|
2881
|
+
var y3 = y[yIndex2++];
|
|
2882
|
+
var y4 = y[yIndex2++];
|
|
2883
|
+
rgba[rgbaIndex2] = y3 + r;
|
|
2884
|
+
rgba[rgbaIndex2 + 1] = y3 - g;
|
|
2885
|
+
rgba[rgbaIndex2 + 2] = y3 + b;
|
|
2886
|
+
rgba[rgbaIndex2 + 4] = y4 + r;
|
|
2887
|
+
rgba[rgbaIndex2 + 5] = y4 - g;
|
|
2888
|
+
rgba[rgbaIndex2 + 6] = y4 + b;
|
|
2889
|
+
rgbaIndex2 += 8
|
|
2890
|
+
}
|
|
2891
|
+
yIndex1 += yNext2Lines;
|
|
2892
|
+
yIndex2 += yNext2Lines;
|
|
2893
|
+
rgbaIndex1 += rgbaNext2Lines;
|
|
2894
|
+
rgbaIndex2 += rgbaNext2Lines;
|
|
2895
|
+
cIndex += cNextLine
|
|
2896
|
+
}
|
|
2897
|
+
};
|
|
2898
|
+
return CanvasRenderer
|
|
2899
|
+
}();
|
|
2900
|
+
JSMpeg.AudioOutput.WebAudio = function() {
|
|
2901
|
+
"use strict";
|
|
2902
|
+
var WebAudioOut = function(options) {
|
|
2903
|
+
this.context = WebAudioOut.CachedContext = WebAudioOut.CachedContext || new(window.AudioContext || window.webkitAudioContext);
|
|
2904
|
+
this.gain = this.context.createGain();
|
|
2905
|
+
this.destination = this.gain;
|
|
2906
|
+
this.gain.connect(this.context.destination);
|
|
2907
|
+
this.context._connections = (this.context._connections || 0) + 1;
|
|
2908
|
+
this.startTime = 0;
|
|
2909
|
+
this.buffer = null;
|
|
2910
|
+
this.wallclockStartTime = 0;
|
|
2911
|
+
this.volume = 1;
|
|
2912
|
+
this.enabled = true;
|
|
2913
|
+
this.unlocked = !WebAudioOut.NeedsUnlocking();
|
|
2914
|
+
Object.defineProperty(this, "enqueuedTime", {
|
|
2915
|
+
get: this.getEnqueuedTime
|
|
2916
|
+
})
|
|
2917
|
+
};
|
|
2918
|
+
WebAudioOut.prototype.destroy = function() {
|
|
2919
|
+
this.gain.disconnect();
|
|
2920
|
+
this.context._connections--;
|
|
2921
|
+
if (this.context._connections === 0) {
|
|
2922
|
+
this.context.close();
|
|
2923
|
+
WebAudioOut.CachedContext = null
|
|
2924
|
+
}
|
|
2925
|
+
};
|
|
2926
|
+
WebAudioOut.prototype.play = function(sampleRate, left, right) {
|
|
2927
|
+
if (!this.enabled) {
|
|
2928
|
+
return
|
|
2929
|
+
}
|
|
2930
|
+
if (!this.unlocked) {
|
|
2931
|
+
var ts = JSMpeg.Now();
|
|
2932
|
+
if (this.wallclockStartTime < ts) {
|
|
2933
|
+
this.wallclockStartTime = ts
|
|
2934
|
+
}
|
|
2935
|
+
this.wallclockStartTime += left.length / sampleRate;
|
|
2936
|
+
return
|
|
2937
|
+
}
|
|
2938
|
+
this.gain.gain.value = this.volume;
|
|
2939
|
+
var buffer = this.context.createBuffer(2, left.length, sampleRate);
|
|
2940
|
+
buffer.getChannelData(0).set(left);
|
|
2941
|
+
buffer.getChannelData(1).set(right);
|
|
2942
|
+
var source = this.context.createBufferSource();
|
|
2943
|
+
source.buffer = buffer;
|
|
2944
|
+
source.connect(this.destination);
|
|
2945
|
+
var now = this.context.currentTime;
|
|
2946
|
+
var duration = buffer.duration;
|
|
2947
|
+
if (this.startTime < now) {
|
|
2948
|
+
this.startTime = now;
|
|
2949
|
+
this.wallclockStartTime = JSMpeg.Now()
|
|
2950
|
+
}
|
|
2951
|
+
source.start(this.startTime);
|
|
2952
|
+
this.startTime += duration;
|
|
2953
|
+
this.wallclockStartTime += duration
|
|
2954
|
+
};
|
|
2955
|
+
WebAudioOut.prototype.stop = function() {
|
|
2956
|
+
this.gain.gain.value = 0
|
|
2957
|
+
};
|
|
2958
|
+
WebAudioOut.prototype.getEnqueuedTime = function() {
|
|
2959
|
+
return Math.max(this.wallclockStartTime - JSMpeg.Now(), 0)
|
|
2960
|
+
};
|
|
2961
|
+
WebAudioOut.prototype.resetEnqueuedTime = function() {
|
|
2962
|
+
this.startTime = this.context.currentTime;
|
|
2963
|
+
this.wallclockStartTime = JSMpeg.Now()
|
|
2964
|
+
};
|
|
2965
|
+
WebAudioOut.prototype.unlock = function(callback) {
|
|
2966
|
+
if (this.unlocked) {
|
|
2967
|
+
if (callback) {
|
|
2968
|
+
callback()
|
|
2969
|
+
}
|
|
2970
|
+
return
|
|
2971
|
+
}
|
|
2972
|
+
this.unlockCallback = callback;
|
|
2973
|
+
var buffer = this.context.createBuffer(1, 1, 22050);
|
|
2974
|
+
var source = this.context.createBufferSource();
|
|
2975
|
+
source.buffer = buffer;
|
|
2976
|
+
source.connect(this.destination);
|
|
2977
|
+
source.start(0);
|
|
2978
|
+
setTimeout(this.checkIfUnlocked.bind(this, source, 0), 0)
|
|
2979
|
+
};
|
|
2980
|
+
WebAudioOut.prototype.checkIfUnlocked = function(source, attempt) {
|
|
2981
|
+
if (source.playbackState === source.PLAYING_STATE || source.playbackState === source.FINISHED_STATE) {
|
|
2982
|
+
this.unlocked = true;
|
|
2983
|
+
if (this.unlockCallback) {
|
|
2984
|
+
this.unlockCallback();
|
|
2985
|
+
this.unlockCallback = null
|
|
2986
|
+
}
|
|
2987
|
+
} else if (attempt < 10) {
|
|
2988
|
+
setTimeout(this.checkIfUnlocked.bind(this, source, attempt + 1), 100)
|
|
2989
|
+
}
|
|
2990
|
+
};
|
|
2991
|
+
WebAudioOut.NeedsUnlocking = function() {
|
|
2992
|
+
return /iPhone|iPad|iPod/i.test(navigator.userAgent)
|
|
2993
|
+
};
|
|
2994
|
+
WebAudioOut.IsSupported = function() {
|
|
2995
|
+
return window.AudioContext || window.webkitAudioContext
|
|
2996
|
+
};
|
|
2997
|
+
WebAudioOut.CachedContext = null;
|
|
2998
|
+
return WebAudioOut
|
|
2999
|
+
}();
|
|
3000
|
+
JSMpeg.WASMModule = function() {
|
|
3001
|
+
"use strict";
|
|
3002
|
+
var WASM = function() {
|
|
3003
|
+
this.stackSize = 5 * 1024 * 1024;
|
|
3004
|
+
this.pageSize = 64 * 1024;
|
|
3005
|
+
this.onInitCallback = null;
|
|
3006
|
+
this.ready = false
|
|
3007
|
+
};
|
|
3008
|
+
WASM.prototype.write = function(buffer) {
|
|
3009
|
+
this.loadFromBuffer(buffer, this.onInitCallback)
|
|
3010
|
+
};
|
|
3011
|
+
WASM.prototype.loadFromFile = function(url, callback) {
|
|
3012
|
+
this.onInitCallback = callback;
|
|
3013
|
+
var ajax = new JSMpeg.Source.Ajax(url, {});
|
|
3014
|
+
ajax.connect(this);
|
|
3015
|
+
ajax.start()
|
|
3016
|
+
};
|
|
3017
|
+
WASM.prototype.loadFromBuffer = function(buffer, callback) {
|
|
3018
|
+
this.moduleInfo = this.readDylinkSection(buffer);
|
|
3019
|
+
if (!this.moduleInfo) {
|
|
3020
|
+
this.callback && this.callback(null);
|
|
3021
|
+
return
|
|
3022
|
+
}
|
|
3023
|
+
this.memory = new WebAssembly.Memory({
|
|
3024
|
+
initial: 256
|
|
3025
|
+
});
|
|
3026
|
+
var env = {
|
|
3027
|
+
memory: this.memory,
|
|
3028
|
+
memoryBase: 0,
|
|
3029
|
+
__memory_base: 0,
|
|
3030
|
+
table: new WebAssembly.Table({
|
|
3031
|
+
initial: this.moduleInfo.tableSize,
|
|
3032
|
+
element: "anyfunc"
|
|
3033
|
+
}),
|
|
3034
|
+
tableBase: 0,
|
|
3035
|
+
__table_base: 0,
|
|
3036
|
+
abort: this.c_abort.bind(this),
|
|
3037
|
+
___assert_fail: this.c_assertFail.bind(this),
|
|
3038
|
+
_sbrk: this.c_sbrk.bind(this)
|
|
3039
|
+
};
|
|
3040
|
+
this.brk = this.align(this.moduleInfo.memorySize + this.stackSize);
|
|
3041
|
+
WebAssembly.instantiate(buffer, {
|
|
3042
|
+
env: env
|
|
3043
|
+
}).then(function(results) {
|
|
3044
|
+
this.instance = results.instance;
|
|
3045
|
+
if (this.instance.exports.__post_instantiate) {
|
|
3046
|
+
this.instance.exports.__post_instantiate()
|
|
3047
|
+
}
|
|
3048
|
+
this.createHeapViews();
|
|
3049
|
+
this.ready = true;
|
|
3050
|
+
callback && callback(this)
|
|
3051
|
+
}.bind(this))
|
|
3052
|
+
};
|
|
3053
|
+
WASM.prototype.createHeapViews = function() {
|
|
3054
|
+
this.instance.heapU8 = new Uint8Array(this.memory.buffer);
|
|
3055
|
+
this.instance.heapU32 = new Uint32Array(this.memory.buffer);
|
|
3056
|
+
this.instance.heapF32 = new Float32Array(this.memory.buffer)
|
|
3057
|
+
};
|
|
3058
|
+
WASM.prototype.align = function(addr) {
|
|
3059
|
+
var a = Math.pow(2, this.moduleInfo.memoryAlignment);
|
|
3060
|
+
return Math.ceil(addr / a) * a
|
|
3061
|
+
};
|
|
3062
|
+
WASM.prototype.c_sbrk = function(size) {
|
|
3063
|
+
var previousBrk = this.brk;
|
|
3064
|
+
this.brk += size;
|
|
3065
|
+
if (this.brk > this.memory.buffer.byteLength) {
|
|
3066
|
+
var bytesNeeded = this.brk - this.memory.buffer.byteLength;
|
|
3067
|
+
var pagesNeeded = Math.ceil(bytesNeeded / this.pageSize);
|
|
3068
|
+
this.memory.grow(pagesNeeded);
|
|
3069
|
+
this.createHeapViews()
|
|
3070
|
+
}
|
|
3071
|
+
return previousBrk
|
|
3072
|
+
};
|
|
3073
|
+
WASM.prototype.c_abort = function(size) {
|
|
3074
|
+
console.warn("JSMPeg: WASM abort", arguments)
|
|
3075
|
+
};
|
|
3076
|
+
WASM.prototype.c_assertFail = function(size) {
|
|
3077
|
+
console.warn("JSMPeg: WASM ___assert_fail", arguments)
|
|
3078
|
+
};
|
|
3079
|
+
WASM.prototype.readDylinkSection = function(buffer) {
|
|
3080
|
+
var bytes = new Uint8Array(buffer);
|
|
3081
|
+
var next = 0;
|
|
3082
|
+
var readVarUint = function() {
|
|
3083
|
+
var ret = 0;
|
|
3084
|
+
var mul = 1;
|
|
3085
|
+
while (1) {
|
|
3086
|
+
var byte = bytes[next++];
|
|
3087
|
+
ret += (byte & 127) * mul;
|
|
3088
|
+
mul *= 128;
|
|
3089
|
+
if (!(byte & 128)) {
|
|
3090
|
+
return ret
|
|
3091
|
+
}
|
|
3092
|
+
}
|
|
3093
|
+
};
|
|
3094
|
+
var matchNextBytes = function(expected) {
|
|
3095
|
+
for (var i = 0; i < expected.length; i++) {
|
|
3096
|
+
var b = typeof expected[i] === "string" ? expected[i].charCodeAt(0) : expected[i];
|
|
3097
|
+
if (bytes[next++] !== b) {
|
|
3098
|
+
return false
|
|
3099
|
+
}
|
|
3100
|
+
}
|
|
3101
|
+
return true
|
|
3102
|
+
};
|
|
3103
|
+
if (!matchNextBytes([0, "a", "s", "m"])) {
|
|
3104
|
+
console.warn("JSMpeg: WASM header not found");
|
|
3105
|
+
return null
|
|
3106
|
+
}
|
|
3107
|
+
var next = 9;
|
|
3108
|
+
var sectionSize = readVarUint();
|
|
3109
|
+
if (!matchNextBytes([6, "d", "y", "l", "i", "n", "k"])) {
|
|
3110
|
+
console.warn("JSMpeg: No dylink section found in WASM");
|
|
3111
|
+
return null
|
|
3112
|
+
}
|
|
3113
|
+
return {
|
|
3114
|
+
memorySize: readVarUint(),
|
|
3115
|
+
memoryAlignment: readVarUint(),
|
|
3116
|
+
tableSize: readVarUint(),
|
|
3117
|
+
tableAlignment: readVarUint()
|
|
3118
|
+
}
|
|
3119
|
+
};
|
|
3120
|
+
WASM.IsSupported = function() {
|
|
3121
|
+
return !!window.WebAssembly
|
|
3122
|
+
};
|
|
3123
|
+
WASM.GetModule = function() {
|
|
3124
|
+
WASM.CACHED_MODULE = WASM.CACHED_MODULE || new WASM;
|
|
3125
|
+
return WASM.CACHED_MODULE
|
|
3126
|
+
};
|
|
3127
|
+
return WASM
|
|
3128
|
+
}();
|
|
3129
|
+
JSMpeg.WASM_BINARY_INLINED = "AGFzbQEAAAAADwZkeWxpbmvwz8ACBAAAAAE0CWAEf39/fwBgAX8Bf2ACf38Bf2ABfwBgAn9/AGABfwF9YAZ/f39/f38AYAN/f38Bf2AAAAJGBANlbnYOX19fYXNzZXJ0X2ZhaWwAAANlbnYFX3NicmsAAQNlbnYNX19tZW1vcnlfYmFzZQN/AANlbnYGbWVtb3J5AgCAAgM9PAIDAgEEBAMBBQEBAQEBAQEDBAMGAwQAAwAAAAIDAgEEBAEBAQEBAAACAwIBAgECAQEBAQMEAwMCBwcHCAYLAn8BQQALfwFBAAsHggYfEl9fcG9zdF9pbnN0YW50aWF0ZQA9BV9mcmVlADgHX21hbGxvYwAxB19tZW1jcHkAOghfbWVtbW92ZQA7B19tZW1zZXQAPBNfbXAyX2RlY29kZXJfY3JlYXRlAB0TX21wMl9kZWNvZGVyX2RlY29kZQAmFF9tcDJfZGVjb2Rlcl9kZXN0cm95AB4WX21wMl9kZWNvZGVyX2RpZF93cml0ZQAiFl9tcDJfZGVjb2Rlcl9nZXRfaW5kZXgAICFfbXAyX2RlY29kZXJfZ2V0X2xlZnRfY2hhbm5lbF9wdHIAJCJfbXAyX2RlY29kZXJfZ2V0X3JpZ2h0X2NoYW5uZWxfcHRyACUcX21wMl9kZWNvZGVyX2dldF9zYW1wbGVfcmF0ZQAjGl9tcDJfZGVjb2Rlcl9nZXRfd3JpdGVfcHRyAB8WX21wMl9kZWNvZGVyX3NldF9pbmRleAAhFV9tcGVnMV9kZWNvZGVyX2NyZWF0ZQACFV9tcGVnMV9kZWNvZGVyX2RlY29kZQARFl9tcGVnMV9kZWNvZGVyX2Rlc3Ryb3kAAxhfbXBlZzFfZGVjb2Rlcl9kaWRfd3JpdGUABxlfbXBlZzFfZGVjb2Rlcl9nZXRfY2JfcHRyABAdX21wZWcxX2RlY29kZXJfZ2V0X2NvZGVkX3NpemUACxlfbXBlZzFfZGVjb2Rlcl9nZXRfY3JfcHRyAA8dX21wZWcxX2RlY29kZXJfZ2V0X2ZyYW1lX3JhdGUAChlfbXBlZzFfZGVjb2Rlcl9nZXRfaGVpZ2h0AA0YX21wZWcxX2RlY29kZXJfZ2V0X2luZGV4AAUYX21wZWcxX2RlY29kZXJfZ2V0X3dpZHRoAAwcX21wZWcxX2RlY29kZXJfZ2V0X3dy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BQJ/IANBzQBHDQIgACgCgAFBBhAwIQMCQAJAIAAoAoABQQgQMCIEIgYEQCAGQYABRgRADAIFDAMLAAsgACgCgAFBCBAwDAILIAAoAoABQQgQMEGAfmoMAQsgBEGAfmogBCAEQYABShsLCyEEDAELIAZB/wFxIgNBACADayAAKAKAAUEBEDBFGyEEIAZBCHUhAwsgAiADaiIGIwBBQGtqLQAAIgMgBWotAAAgACgCREEAIARBAXQiAkEfdUEBciAAKAJcGyACamxsIgJBBHVBAEEBQX8gAkEPShsgAkEQcRtrIgJBgHAgAkGAcEobIQIgAEGcAWogA0ECdGogAyMAQZA1amotAAAgAkH/DyACQf8PSBtsNgIAIAZBAWohAgwBCwsgAUEESARAIABBhAFqIQUgAUEDdEEIcSAAKAJUIAAoAhgiAyAAKAJQbGpBBHRyIANBA3RBACABQQJxG2ohBAUgAEGMAWogAEGIAWogAUEERhshBSAAKAJQIAAoAhgiAUECdGwgACgCVEEDdGohBCABQQF1IQMLIANBeGohAyAFKAIAIQUgAkEBRiECIABBnAFqIQEgACgCXARAIAIEQCABKAIAQYABakEIdSAFIAQgAxAYIAFBADYCAAUgARAZIAEgBSAEIAMQGiABQQBBgAIQPBoLBSACBEAgASgCAEGAAWpBCHUgBSAEIAMQGyABQQA2AgAFIAEQGSABIAUgBCADEBwgAUEAQYACEDwaCwsL7AYAIAEgAmogAEEAIABBAEobIgBB/wEgAEH/AUgbQf8BcSIAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAACABIAIgA0EIaiIDaiICaiAAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAACABIAIgA2oiAmogADoAACABIAJBAWpqIAA6AAAgASACQQJqaiAAOgAAIAEgAkEDamogADoAACABIAJBBGpqIAA6AAAgASACQQVqaiAAOgAAIAEgAkEGamogADoAACABIAJBB2pqIAA6AAAgASACIANqIgJqIAA6AAAgASACQQFqaiAAOgAAIAEgAkECamogADoAACABIAJBA2pqIAA6AAAgASACQQRqaiAAOgAAIAEgAkEFamogADoAACABIAJBBmpqIAA6AAAgASACQQdqaiAAOgAAIAEgAiADaiICaiAAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAACABIAIgA2oiAmogADoAACABIAJBAWpqIAA6AAAgASACQQJqaiAAOgAAIAEgAkEDamogADoAACABIAJBBGpqIAA6AAAgASACQQVqaiAAOgAAIAEgAkEGamogADoAACABIAJBB2pqIAA6AAAgASACIANqIgJqIAA6AAAgASACQQFqaiAAOgAAIAEgAkECamogADoAACABIAJBA2pqIAA6AAAgASACQQRqaiAAOgAAIAEgAkEFamogADoAACABIAJBBmpqIAA6AAAgASACQQdqaiAAOgAAIAEgAiADaiICaiAAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAAAubBgEUfwNAIAFBEGpBAnQgAGoiBygCACIGIAFBMGpBAnQgAGoiDSgCACIJaiEFIAFBCGpBAnQgAGoiDigCACICIAFBOGpBAnQgAGoiDygCACIDaiEEIAIgA2siEEHZA2wgAUEoakECdCAAaiIKKAIAIgIgAUEYakECdCAAaiIRKAIAIgNrIgtBvH5sQYABampBCHUgBCACIANqIghqIgJrIgMgBCAIa0HqAmxBgAFqQQh1ayEEIAFBAnQgAGoiCCgCACIMIAFBIGpBAnQgAGoiEigCACITayIUIAYgCWtB6gJsQYABakEIdSAFayIJaiEGIAggAiAMIBNqIgggBWoiDGo2AgAgDiADIAZqNgIAIAcgFCAJayIHIARrNgIAIBEgC0HZA2xBgAFqIBBBxAFsakEIdSAEaiIJIAggBWsiBWo2AgAgEiAFIAlrNgIAIAogBCAHajYCACANIAYgA2s2AgAgDyAMIAJr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aiABQQxsaiAAKAIIQQYQMCICNgLUAiAAIANBgANsaiABQQxsaiACNgLQAiAFIAI2AgAMAgsgBSAAKAIIQQYQMDYCACAAIANBgANsaiABQQxsaiAAKAIIQQYQMCICNgLUAiAAIANBgANsaiABQQxsaiACNgLQAgsLCyADQQFqIgMgCEkNAAsgAUEBaiIBIAtHDQALCwsLaiALQSBJIRwgAEHM9gBqIRYgAEHMlgFqIQQgAEHMCGohHSAAQcwLaiEeA0BBACEXIBQhAwNAIBkEQEEAIQEDQCAAQQAgASAOECggAEEBIAEgDhAoIAFBAWoiASANSA0ACwsgGgRAIA0hAQNAIABBACABIA4QKCAAQcwLaiABQQxsaiAAQcwIaiABQQxsaigCADYCACAAIAFBDGxqQdALaiAAIAFBDGxqQdAIaigCADYCACAAIAFBDGxqQdQLaiAAIAFBDGxqQdQIaigCADYCACABQQFqIgEgC0gNAAsLIBwEQCALIQEDQCAAQcwIaiABQQxsakEANgIAIAAgAUEMbGpB0AhqQQA2AgAgACABQQxsakHUCGpBADYCACAAQcwLaiABQQxsakEANgIAIAAgAUEMbGpB0AtqQQA2AgAgACABQQxsakHUC2pBADYCACABQQFqIgFBIEcNAAsLIAAoAgQhASADIRFBACESA0AgACABQcAHakH/B3EiATYCBCAdIBIgFiABECkgBEIANwIAIARCADcCCCAEQgA3AhAgBEIANwIYIARCADcCICAEQgA3AiggBEIANwIwIARCADcCOCAEQUBrQgA3AgAgBEIANwJIIARCADcCUCAEQgA3AlggBEIANwJgIARCADcCaCAEQgA3AnAgBEIANwJ4IAAoAgQiD0EBdSETQf8HIA9BgAFvQQF1IgxrIgFBgH9xIRUgAUEHdkEGdEHABGohEEGABCATayEGIAwhAQNAIAYhB0EAIQkgASECA0AgB0EBaiEIIAJBAWohBSAAQcyWAWogCUECdGoiCiAAQczWAGogB0ECdGoqAgAgAEHM9gBqIAJBAnRqKgIAlCAKKAIAspKoNgIAIAlBAWoiCUEgRwRAIAghByAFIQIMAQsLIAFBgAFqIQIgBkFAayEGIAFBgAdIBEAgAiEBDAELC0HgByAMIBVqayIBQYAISARAIBAgE2tBoHxqIQYDQCABQR9qIAYh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ujBFka7n9D+itiJLk7tEuEt/Zp6g5j+itiI6kiEqIANBMGpBAnQgAmogTSA8kow4AgAgA0EvakECdCACaiApICiSIEwgSZIgJJIiKJKMIik4AgAgA0ExakECdCACaiApOAIAIANBLmpBAnQgAmogRiBFkiAjkowiKTgCACADQTJqQQJ0IAJqICk4AgAgA0EtakECdCACaiAwIC2SIEAgPpIgJpIiKZIiPCAokowiKDgCACADQTNqQQJ0IAJqICg4AgAgA0EsakECdCACaiA2IE+SIFEgUJIgNZIiKJKMIjY4AgAgA0E0akECdCACaiA2OAIAIANBK2pBAnQgAmogPCA/IDiSIDOSIjwgJJIiJJKMIjY4AgAgA0E1akECdCACaiA2OAIAIANBKmpBAnQgAmogPSBSkiA7kiI9ICOSjCIjOAIAIANBNmpBAnQgAmogIzgCACADQSlqQQJ0IAJqIEsgSpIgOpIiIyAkkowiJDgCACADQTdqQQJ0IAJqICQ4AgAgA0EoakECdCACaiBIIE6SIDGSjCIkOAIAIANBOGpBAnQgAmogJDgCACADQSdqQQJ0IAJqICMgPCArkiIjkowiJDgCACADQTlqQQJ0IAJqICQ4AgAgA0EmakECdCACaiA9ICeSjCIkOAIAIANBOmpBAnQgAmogJDgCACADQSVqQQJ0IAJqICkgLSAwk7tEuEt/Zp6g5j+itiIpkiItICOSjCIjOAIAIANBO2pBAnQgAmogIzgCACADQSRqQQJ0IAJqICggR5KMIiM4AgAgA0E8akECdCACaiAjOAIAIANBI2pBAnQgAmogLSArIDKSIiOSjCIoOAIAIANBPWpBAnQgAmogKDgCACADQSJqQQJ0IAJqICcgU5KMIic4AgAgA0E+akECdCACaiAnOAIAIANBIWpBAnQgAmogIyBCkowiIzgCACADQT9qQQJ0IAJqICM4AgAgA0EgakECdCACaiA0jDgCACADQQJ0IAJqIDQ4AgAgA0EfakECdCACaiAsjDgCACADQQFqQQJ0IAJqICw4AgAgA0EeakECdCACaiA5jDgCACADQQJqQQJ0IAJqIDk4AgAgA0EdakECdCACaiApICaSIjQgQZIiI4w4AgAgA0EDakECdCACaiAjOAIAIANBHGpBAnQgAmogL4w4AgAgA0EEakECdCACaiAvOAIAIANBG2pBAnQgAmogNCA3IDOSIjSSIi+MOAIAIANBBWpBAnQgAmogLzgCACADQRpqQQJ0IAJqIEQgO5IiL4w4AgAgA0EGakECdCACaiAvOAIAIANBGWpBAnQgAmogNCA6kiI0jDgCACADQQdqQQJ0IAJqIDQ4AgAgA0EYakECdCACaiAxjDgCACADQQhqQQJ0IAJqIDE4AgAgA0EXakECdCACaiAqjDgCACADQQlqQQJ0IAJqICo4AgAgA0EWakECdCACaiA7IC6SIjGMOAIAIANBCmpBAnQgAmogMTgCACADQRVqQQJ0IAJqIEMgJpIiMYw4AgAgA0ELakECdCACaiAxOAIAIANBFGpBAnQgAmogNYw4AgAgA0EMakECdCACaiA1OAIAIANBE2pBAnQgAmogJiAlkiImjDgCACADQQ1qQQJ0IAJqICY4AgAgA0ESakECdCACaiAujDgCACADQQ5qQQJ0IAJqIC44AgAgA0ERakECdCACaiAljDgCACADQQ9qQQJ0IAJqICU4AgAgA0EQakECdCACakMAAAAAOAIACy8BAX9BFBAxIgIgATYCECACIAAQMTYCACACIAA2AgggAkEANgIMIAJBADYCBCACCw0AIAAoAgAQOCAAEDgL6QEBBH8gACgCCCIDIAAoAgwiAmsiBCABSQRAAkAgACgCEEECRgRAIAAgACgCACABIARrIANBAXQiAiACIARqIAFJGyIBEDk2AgAgACABNgIIIAAoAgQgACgCDCIBQQN0IgJNDQEgACACNgIEDAELIAIgACgCBCIFQQN2IgNGIAMgBGogAUlyBEAgAEEANgIMIABBADYCBEEAIQEMAQsgAwRAIAAoAgAiASABIANqIAIgA2sQOxogACAAKAIMIANrIgE2AgwgACAAKAIEIAVBeHFrNgIEBSACIQELCwUgAiEBCyAAKAIAIAFqC40BAQR/IAAoAgRBB2pBA3YiASAAKAIMIgRJBEACQCAAKAIAIQIDQAJAIAFBAWohAyABIAJqLAAARQRAIAIgA2osAABFBEAgAiABQQJqaiwAAEEBRg0CCwsgAyAETw0CIAMhAQwBCwsgACABQQN0QSBqNgIEIAIgAUEDamotAAAPCwsgACAEQQN0NgIEQX8LqQEBBH8gACgCBEEHakEDdiICIAAoAgwiBUkEQAJAIAAoAgAhBANAAkAgAkEB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IAlqIQMgCGshAiEBDAILIAMgASgCACIFOgAAIAMgASwAAToAASACQWxqQXBxIghBEmoiCSABaiACQW5qIANBAmohBCACQX5qIQYgAUECaiECIAUhAQNAIAQgAigCAiIFQRB0IAFBEHZyNgIAIAQgAigCBiIBQRB0IAVBEHZyNgIEIAQgAigCCiIFQRB0IAFBEHZyNgIIIAQgAigCDiIBQRB0IAVBEHZyNgIMIAJBEGohAiAEQRBqIQQgBkFwaiIGQRFLDQALIAMgCWohAyAIayECIQEMAQsgAyABKAIAIgU6AAAgAkFsakFwcSIIQRFqIgkgAWogAkFvaiADQQFqIQQgAkF/aiEGIAFBAWohAiAFIQEDQCAEIAIoAgMiBUEYdCABQQh2cjYCACAEIAIoAgciAUEYdCAFQQh2cjYCBCAEIAIoAgsiBUEYdCABQQh2cjYCCCAEIAIoAg8iAUEYdCAFQQh2cjYCDCACQRBqIQIgBEEQaiEEIAZBcGoiBkESSw0ACyADIAlqIQMgCGshAiEBCwsgAkEQcQRAIAMgASwAADoAACADIAEsAAE6AAEgAyABLAACOgACIAMgASwAAzoAAyADIAEsAAQ6AAQgAyABLAAFOgAFIAMgASwABjoABiADIAEsAAc6AAcgAyABLAAIOgAIIAMgASwACToACSADIAEsAAo6AAogAyABLAALOgALIAMgASwADDoADCADIAEsAA06AA0gAyABLAAOOgAOIAMgASwADzoADyADQRBqIQMgAUEQaiEBCyACQQhxBEAgAyABLAAAOgAAIAMgASwAAToAASADIAEsAAI6AAIgAyABLAADOgADIAMgASwABDoABCADIAEsAAU6AAUgAyABLAAGOgAGIAMgASwABzoAByADQQhqIQMgAUEIaiEBCyACQQRxBEAgAyABLAAAOgAAIAMgASwAAToAASADIAEsAAI6AAIgAyABLAADOgADIANBBGohAyABQQRqIQELIAJBAnEEQCADIAEsAAA6AAAgAyABLAABOgABIANBAmohAyABQQJqIQELIAJBAXFFBEAgAA8LIAMgASwAADoAACAAC8ADAQZ/IAAgAUYEQCAADwsgASACaiAASyAAIAJqIgUgAUtxRQRAIAAgASACEDoaIAAPCyABIAAiA3NBA3FFIQQgAyABSQR/IAQEQCADQQNxBEAC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JCQkJCQkAAAAAQIRAAAAAAAAAAAAAAAAAAECAwQFBhEAAAAAAAAAAAABAgMEBQYHCAkKCwwNDhEAAQMFBgcICQoLDA0ODxARAAECBAUGBwgJCgsMDQ4PEQABAgMEBQYHCAkKCwwNDg8DAAEFBQABBwcAAAMJAAEKDwAABB8AAAU/AAAGfwAAB/8AAAj/AQAJ/wMACv8HAAv/DwAM/x8ADf8/AA7/fwAP//8AEAAAAAAAAAAAAAAAAAAAAALqX5YBMIpCAQgIDFtbW15bXnNpemUgPiAwAEQ6L3Nydi9lbXNkay9lbXNjcmlwdGVuLzEuMzguNS9zeXN0ZW0vbGliL2VtbWFsbG9jLmNwcABnZXRGcmVlTGlzdEluZGV4AE1JTl9GUkVFTElTVF9JTkRFWCA8PSBpbmRleCAmJiBpbmRleCA8IE1BWF9GUkVFTElTVF9JTkRFWABnZXRBZnRlcihyZWdpb24pIDw9IHNicmsoMCkAZW1tYWxsb2NfbWFsbG9jAHJlZ2lvbi0+Z2V0VXNlZCgpAGdldFBheWxvYWQAKGNoYXIqKWV4dHJhUHRyID09IChjaGFyKilwdHIgKyBzYnJrU2l6ZQBhbGxvY2F0ZVJlZ2lvbgAhbGFzdFJlZ2lvbgAhZmlyc3RSZWdpb24AZmlyc3RSZWdpb24AcHRyID09IGdldEFmdGVyKGxhc3RSZWdpb24pAGV4dGVuZExhc3RSZWdpb24AYWRkVG9GcmVlTGlzdABnZXRCaWdFbm91Z2hGcmVlTGlzdEluZGV4AHBheWxvYWRTaXplID49IHNpemUAcG9zc2libHlTcGxpdFJlbWFpbmRlcgBleHRyYSA+PSBNSU5fUkVHSU9OX1NJWkUAdG90YWxTcGxpdFNpemUgPj0gTUlOX1JFR0lPTl9TSVpFAG1lcmdlSW50b0V4aXN0aW5nRnJlZVJlZ2lvbgByZWdpb24gPT0gbGFzdFJlZ2lvbgBlbW1hbGxvY19yZWFsbG9j";
|