@bvdmitri/gyroview 0.0.0-stage → 0.9.0-cutaway.2

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.
Files changed (302) hide show
  1. package/CHANGELOG.md +402 -0
  2. package/LICENSE +21 -0
  3. package/README.md +313 -2
  4. package/dist/define.d.ts +3 -0
  5. package/dist/define.js +4 -0
  6. package/dist/index.d.ts +1204 -0
  7. package/dist/index.js +12 -0
  8. package/dist/packages/adapters/blob/src/BlobRandomAccessSource.js +36 -0
  9. package/dist/packages/adapters/fetch/src/HttpByteStream.js +173 -0
  10. package/dist/packages/adapters/fetch/src/HttpRangeSource.js +37 -0
  11. package/dist/packages/adapters/fetch/src/HttpResource.js +227 -0
  12. package/dist/packages/adapters/fetch/src/HttpResourceLocator.js +35 -0
  13. package/dist/packages/adapters/fetch/src/contentRange.js +15 -0
  14. package/dist/packages/adapters/fetch/src/httpRequest.js +136 -0
  15. package/dist/packages/adapters/fetch/src/passingFailures.js +23 -0
  16. package/dist/packages/adapters/fetch/src/rangeFailures.js +16 -0
  17. package/dist/packages/adapters/fetch/src/recordingVersion.js +37 -0
  18. package/dist/packages/adapters/mediabunny/src/MediabunnyAudioPackager.js +162 -0
  19. package/dist/packages/adapters/mediabunny/src/MediabunnyCodecReader.js +93 -0
  20. package/dist/packages/adapters/mediabunny/src/SegmentChannel.js +135 -0
  21. package/dist/packages/adapters/mediabunny/src/bufferSources.js +12 -0
  22. package/dist/packages/adapters/mediabunny/src/decoderConfigurations.js +43 -0
  23. package/dist/packages/adapters/mediabunny/src/trackColour.js +20 -0
  24. package/dist/packages/adapters/mse-audio/src/MediaSourceAudioClock.js +138 -0
  25. package/dist/packages/adapters/mse-audio/src/SourceBufferFeeder.js +263 -0
  26. package/dist/packages/adapters/mse-audio/src/events.js +26 -0
  27. package/dist/packages/adapters/mse-audio/src/mediaSourceSupport.js +81 -0
  28. package/dist/packages/adapters/three/src/ThreeFrameRenderer.js +215 -0
  29. package/dist/packages/adapters/three/src/compileAndProve.js +14 -0
  30. package/dist/packages/adapters/three/src/conversionUniforms.js +60 -0
  31. package/dist/packages/adapters/three/src/drawSchedules.js +13 -0
  32. package/dist/packages/adapters/three/src/fullscreenPass.js +52 -0
  33. package/dist/packages/adapters/three/src/glslLiterals.js +10 -0
  34. package/dist/packages/adapters/three/src/lensTextures.js +34 -0
  35. package/dist/packages/adapters/three/src/matrixCorrections.js +34 -0
  36. package/dist/packages/adapters/three/src/pictureMaterials.js +44 -0
  37. package/dist/packages/adapters/three/src/renderInto.js +15 -0
  38. package/dist/packages/adapters/three/src/rendererParts.js +108 -0
  39. package/dist/packages/adapters/three/src/rendererUniforms.js +176 -0
  40. package/dist/packages/adapters/three/src/samplingStrategies.js +26 -0
  41. package/dist/packages/adapters/three/src/scissorBox.js +20 -0
  42. package/dist/packages/adapters/three/src/seamMeter/SeamMeterPass.js +85 -0
  43. package/dist/packages/adapters/three/src/seamMeter/rowMeans.js +42 -0
  44. package/dist/packages/adapters/three/src/shaderPrograms.js +68 -0
  45. package/dist/packages/adapters/three/src/shaders/analysis.frag.js +4 -0
  46. package/dist/packages/adapters/three/src/shaders/displayConversion.js +4 -0
  47. package/dist/packages/adapters/three/src/shaders/equirectangularRays.js +4 -0
  48. package/dist/packages/adapters/three/src/shaders/fixedJoin.js +4 -0
  49. package/dist/packages/adapters/three/src/shaders/fullscreen.vert.js +4 -0
  50. package/dist/packages/adapters/three/src/shaders/header.js +4 -0
  51. package/dist/packages/adapters/three/src/shaders/lensModels.js +4 -0
  52. package/dist/packages/adapters/three/src/shaders/lensSampling.js +4 -0
  53. package/dist/packages/adapters/three/src/shaders/lensTextures.js +4 -0
  54. package/dist/packages/adapters/three/src/shaders/rawLenses.frag.js +4 -0
  55. package/dist/packages/adapters/three/src/shaders/rectilinearRays.js +4 -0
  56. package/dist/packages/adapters/three/src/shaders/screenAreas.js +4 -0
  57. package/dist/packages/adapters/three/src/shaders/stitch.frag.js +4 -0
  58. package/dist/packages/adapters/three/src/threeMatrix.js +10 -0
  59. package/dist/packages/adapters/three/src/webglRenderer.js +37 -0
  60. package/dist/packages/adapters/webcodecs/src/WebCodecsVideoDecoderPort.js +152 -0
  61. package/dist/packages/adapters/webcodecs/src/colorSpaceOf.js +32 -0
  62. package/dist/packages/core/src/application/download/BlockStore.js +97 -0
  63. package/dist/packages/core/src/application/download/DownloadedAudioSamples.js +50 -0
  64. package/dist/packages/core/src/application/download/DownloadedVideoTrack.js +122 -0
  65. package/dist/packages/core/src/application/download/FileDownload.js +208 -0
  66. package/dist/packages/core/src/application/download/RecordingBuffer.js +22 -0
  67. package/dist/packages/core/src/application/download/SampleCursor.js +89 -0
  68. package/dist/packages/core/src/application/download/SourceByteStream.js +46 -0
  69. package/dist/packages/core/src/application/download/Transfers.js +82 -0
  70. package/dist/packages/core/src/application/download/startFileDownload.js +37 -0
  71. package/dist/packages/core/src/application/gainMatching/GainMatching.js +76 -0
  72. package/dist/packages/core/src/application/gainMatching/GainMatchingFrameSink.js +80 -0
  73. package/dist/packages/core/src/application/gainMatching/referenceLensOf.js +18 -0
  74. package/dist/packages/core/src/application/playback/Buffering.js +54 -0
  75. package/dist/packages/core/src/application/playback/ClockStart.js +55 -0
  76. package/dist/packages/core/src/application/playback/ClockWatch.js +76 -0
  77. package/dist/packages/core/src/application/playback/DecodePipeline.js +234 -0
  78. package/dist/packages/core/src/application/playback/DecodeRun.js +108 -0
  79. package/dist/packages/core/src/application/playback/FramePairQueue.js +93 -0
  80. package/dist/packages/core/src/application/playback/FramePairer.js +77 -0
  81. package/dist/packages/core/src/application/playback/PictureOnScreen.js +56 -0
  82. package/dist/packages/core/src/application/playback/PlaybackSession.js +410 -0
  83. package/dist/packages/core/src/application/playback/SeekOrder.js +35 -0
  84. package/dist/packages/core/src/application/playback/SessionLifecycle.js +42 -0
  85. package/dist/packages/core/src/application/playback/StartGate.js +69 -0
  86. package/dist/packages/core/src/application/playback/TimeUpdates.js +31 -0
  87. package/dist/packages/core/src/application/playback/WallClock.js +46 -0
  88. package/dist/packages/core/src/application/playback/keyframeTimeAt.js +15 -0
  89. package/dist/packages/core/src/application/playback/probeDecoding.js +182 -0
  90. package/dist/packages/core/src/application/recording/frameTimesOf.js +21 -0
  91. package/dist/packages/core/src/application/recording/inspectLayout.js +21 -0
  92. package/dist/packages/core/src/application/recording/inspectRecording.js +125 -0
  93. package/dist/packages/core/src/application/recording/locateOtherLensFile.js +18 -0
  94. package/dist/packages/core/src/application/recording/motionOf.js +43 -0
  95. package/dist/packages/core/src/application/recording/readRecording.js +31 -0
  96. package/dist/packages/core/src/application/recording/readRecordingFiles.js +130 -0
  97. package/dist/packages/core/src/application/recording/readSampleTable.js +27 -0
  98. package/dist/packages/core/src/application/recording/timeRecording.js +57 -0
  99. package/dist/packages/core/src/application/stabilization/StabilizingFrameSink.js +33 -0
  100. package/dist/packages/core/src/domain/colour/DisplayConversion.js +137 -0
  101. package/dist/packages/core/src/domain/colour/TrackColour.js +38 -0
  102. package/dist/packages/core/src/domain/colour/gainMatch.js +64 -0
  103. package/dist/packages/core/src/domain/colour/matrixCorrection.js +76 -0
  104. package/dist/packages/core/src/domain/container/KeyframeRule.js +7 -0
  105. package/dist/packages/core/src/domain/container/SampleTable.js +29 -0
  106. package/dist/packages/core/src/domain/container/TrackSampleTable.js +96 -0
  107. package/dist/packages/core/src/domain/container/presentationOrder.js +10 -0
  108. package/dist/packages/core/src/domain/download/DownloadPolicy.js +84 -0
  109. package/dist/packages/core/src/domain/download/isReadyToResume.js +27 -0
  110. package/dist/packages/core/src/domain/download/planDownloads.js +175 -0
  111. package/dist/packages/core/src/domain/download/trackNeeds.js +32 -0
  112. package/dist/packages/core/src/domain/format/boxes/BoxLayout.js +7 -0
  113. package/dist/packages/core/src/domain/format/boxes/boxConstants.js +16 -0
  114. package/dist/packages/core/src/domain/format/boxes/boxHeader.js +44 -0
  115. package/dist/packages/core/src/domain/format/boxes/scanBoxes.js +32 -0
  116. package/dist/packages/core/src/domain/format/calibration/CalibrationVersion.js +16 -0
  117. package/dist/packages/core/src/domain/format/calibration/layouts/CalibrationStringLayout.js +34 -0
  118. package/dist/packages/core/src/domain/format/calibration/layouts/LegacyCalibrationLayout.js +46 -0
  119. package/dist/packages/core/src/domain/format/calibration/layouts/MeiCalibrationLayout.js +121 -0
  120. package/dist/packages/core/src/domain/format/calibration/layouts/PolynomialCalibrationLayout.js +46 -0
  121. package/dist/packages/core/src/domain/format/calibration/offsetTokens.js +94 -0
  122. package/dist/packages/core/src/domain/format/calibration/parseOffsetString.js +77 -0
  123. package/dist/packages/core/src/domain/format/calibration/selectCalibration.js +59 -0
  124. package/dist/packages/core/src/domain/format/calibration/v6TermReading.js +20 -0
  125. package/dist/packages/core/src/domain/format/captureOrigin.js +34 -0
  126. package/dist/packages/core/src/domain/format/constants.js +35 -0
  127. package/dist/packages/core/src/domain/format/info/calibrationSources.js +27 -0
  128. package/dist/packages/core/src/domain/format/info/infoFields.js +116 -0
  129. package/dist/packages/core/src/domain/format/info/parseInfoRecord.js +107 -0
  130. package/dist/packages/core/src/domain/format/info/readInfoRecord.js +14 -0
  131. package/dist/packages/core/src/domain/format/layout/detectLensLayout.js +133 -0
  132. package/dist/packages/core/src/domain/format/mp4/hevcCodecString.js +161 -0
  133. package/dist/packages/core/src/domain/format/mp4/keyframeRules.js +81 -0
  134. package/dist/packages/core/src/domain/format/mp4/movieBoxes.js +52 -0
  135. package/dist/packages/core/src/domain/format/mp4/mp4BoxTypes.js +46 -0
  136. package/dist/packages/core/src/domain/format/mp4/mp4Layouts.js +183 -0
  137. package/dist/packages/core/src/domain/format/mp4/parseMovie.js +72 -0
  138. package/dist/packages/core/src/domain/format/mp4/readTable.js +31 -0
  139. package/dist/packages/core/src/domain/format/mp4/sampleLocations.js +76 -0
  140. package/dist/packages/core/src/domain/format/mp4/sampleTiming.js +120 -0
  141. package/dist/packages/core/src/domain/format/mp4/trackHeaders.js +88 -0
  142. package/dist/packages/core/src/domain/format/naming/RecordingFileName.js +70 -0
  143. package/dist/packages/core/src/domain/format/records/TrailerRecords.js +100 -0
  144. package/dist/packages/core/src/domain/format/records/exposure/parseExposureRecord.js +48 -0
  145. package/dist/packages/core/src/domain/format/records/gyro/FloatGyroSampleLayout.js +38 -0
  146. package/dist/packages/core/src/domain/format/records/gyro/RawGyroSampleLayout.js +55 -0
  147. package/dist/packages/core/src/domain/format/records/gyro/SampleColumns.js +89 -0
  148. package/dist/packages/core/src/domain/format/records/gyro/gyroLayouts.js +12 -0
  149. package/dist/packages/core/src/domain/format/records/gyro/parseGyroRecord.js +138 -0
  150. package/dist/packages/core/src/domain/format/records/trim/parseTrimRecord.js +24 -0
  151. package/dist/packages/core/src/domain/format/trailer/RecordHeader.js +23 -0
  152. package/dist/packages/core/src/domain/format/trailer/Trailer.js +23 -0
  153. package/dist/packages/core/src/domain/format/trailer/TrailerFooter.js +27 -0
  154. package/dist/packages/core/src/domain/format/trailer/locateRecords.js +80 -0
  155. package/dist/packages/core/src/domain/format/trailer/parseRecordIndex.js +28 -0
  156. package/dist/packages/core/src/domain/format/trailer/readTrailer.js +60 -0
  157. package/dist/packages/core/src/domain/motion/exposure/ExposureRecord.js +48 -0
  158. package/dist/packages/core/src/domain/motion/gyro/GyroTrack.js +70 -0
  159. package/dist/packages/core/src/domain/motion/gyro/medianStep.js +11 -0
  160. package/dist/packages/core/src/domain/motion/gyro/repairedTimeline.js +101 -0
  161. package/dist/packages/core/src/domain/motion/imu/ImuFrame.js +178 -0
  162. package/dist/packages/core/src/domain/motion/mounting/Mounting.js +131 -0
  163. package/dist/packages/core/src/domain/motion/orientation/OrientationTrack.js +142 -0
  164. package/dist/packages/core/src/domain/motion/orientation/estimateGyroBias.js +72 -0
  165. package/dist/packages/core/src/domain/motion/orientation/gravity.js +97 -0
  166. package/dist/packages/core/src/domain/motion/stabilization/Stabilizer.js +13 -0
  167. package/dist/packages/core/src/domain/motion/stabilization/stabilizers.js +86 -0
  168. package/dist/packages/core/src/domain/motion/timing/CaptureClock.js +41 -0
  169. package/dist/packages/core/src/domain/motion/timing/FrameTimes.js +85 -0
  170. package/dist/packages/core/src/domain/motion/timing/frameTimeSources.js +58 -0
  171. package/dist/packages/core/src/domain/motion/timing/resolveFrameTimes.js +68 -0
  172. package/dist/packages/core/src/domain/optics/EquidistantModel.js +34 -0
  173. package/dist/packages/core/src/domain/optics/MeiDistortion.js +27 -0
  174. package/dist/packages/core/src/domain/optics/MeiModel.js +27 -0
  175. package/dist/packages/core/src/domain/optics/PolynomialModel.js +39 -0
  176. package/dist/packages/core/src/domain/optics/lensPose.js +49 -0
  177. package/dist/packages/core/src/domain/optics/opticsConstants.js +5 -0
  178. package/dist/packages/core/src/domain/optics/scaledProjection.js +30 -0
  179. package/dist/packages/core/src/domain/playback/PlayerState.js +83 -0
  180. package/dist/packages/core/src/domain/rendition/RenditionSpan.js +70 -0
  181. package/dist/packages/core/src/domain/stitching/LensLayout.js +21 -0
  182. package/dist/packages/core/src/domain/stitching/StitchingSetup.js +87 -0
  183. package/dist/packages/core/src/domain/stitching/seamRing.js +4 -0
  184. package/dist/packages/core/src/domain/view/Framing.js +37 -0
  185. package/dist/packages/core/src/domain/view/Picture.js +12 -0
  186. package/dist/packages/core/src/domain/view/PictureQuality.js +26 -0
  187. package/dist/packages/core/src/domain/view/ViewMode.js +9 -0
  188. package/dist/packages/core/src/domain/view/ViewState.js +54 -0
  189. package/dist/packages/core/src/domain/view/lensTilesView.js +64 -0
  190. package/dist/packages/core/src/domain/view/magnification.js +103 -0
  191. package/dist/packages/core/src/domain/view/motionLookView.js +100 -0
  192. package/dist/packages/core/src/domain/view/normalView.js +37 -0
  193. package/dist/packages/core/src/domain/view/panoramaView.js +95 -0
  194. package/dist/packages/core/src/domain/view/rectilinear.js +53 -0
  195. package/dist/packages/core/src/domain/view/screenLayout.js +129 -0
  196. package/dist/packages/core/src/domain/view/screenLook.js +74 -0
  197. package/dist/packages/core/src/domain/view/viewGestures.js +104 -0
  198. package/dist/packages/core/src/domain/view/viewModes.js +31 -0
  199. package/dist/packages/core/src/ports/FramePair.js +6 -0
  200. package/dist/packages/core/src/shared/async/Deferred.js +42 -0
  201. package/dist/packages/core/src/shared/async/RunStop.js +40 -0
  202. package/dist/packages/core/src/shared/async/iteration.js +24 -0
  203. package/dist/packages/core/src/shared/binary/ByteRange.js +50 -0
  204. package/dist/packages/core/src/shared/binary/ByteRangeSet.js +85 -0
  205. package/dist/packages/core/src/shared/binary/ByteReader.js +104 -0
  206. package/dist/packages/core/src/shared/binary/concatenated.js +15 -0
  207. package/dist/packages/core/src/shared/errors/GyroViewError.js +140 -0
  208. package/dist/packages/core/src/shared/errors/reportLater.js +11 -0
  209. package/dist/packages/core/src/shared/events/Outbox.js +68 -0
  210. package/dist/packages/core/src/shared/events/TypedEmitter.js +55 -0
  211. package/dist/packages/core/src/shared/keysOf.js +10 -0
  212. package/dist/packages/core/src/shared/lazy.js +11 -0
  213. package/dist/packages/core/src/shared/mapRecord.js +11 -0
  214. package/dist/packages/core/src/shared/math/Matrix3.js +121 -0
  215. package/dist/packages/core/src/shared/math/Quaternion.js +133 -0
  216. package/dist/packages/core/src/shared/math/Vector3.js +58 -0
  217. package/dist/packages/core/src/shared/math/clamp.js +9 -0
  218. package/dist/packages/core/src/shared/math/countAtOrBelow.js +31 -0
  219. package/dist/packages/core/src/shared/math/minimum.js +17 -0
  220. package/dist/packages/core/src/shared/protobuf/ProtobufMessage.js +143 -0
  221. package/dist/packages/core/src/shared/protobuf/wireFormat.js +16 -0
  222. package/dist/packages/core/src/shared/text/urlPath.js +31 -0
  223. package/dist/packages/core/src/shared/text/utf8.js +12 -0
  224. package/dist/packages/core/src/shared/units/angle.js +22 -0
  225. package/dist/packages/core/src/shared/units/time.js +13 -0
  226. package/dist/packages/player/src/PlayerSource.js +14 -0
  227. package/dist/packages/player/src/browserPlayer.js +20 -0
  228. package/dist/packages/player/src/choices.js +24 -0
  229. package/dist/packages/player/src/composition/AnimationFrameDraws.js +38 -0
  230. package/dist/packages/player/src/composition/BrowserAttitudeSensor.js +191 -0
  231. package/dist/packages/player/src/composition/Disposables.js +31 -0
  232. package/dist/packages/player/src/composition/DrawingBufferFit.js +119 -0
  233. package/dist/packages/player/src/composition/animationFrames.js +9 -0
  234. package/dist/packages/player/src/composition/attitudeSensor.js +18 -0
  235. package/dist/packages/player/src/composition/browserPorts.js +80 -0
  236. package/dist/packages/player/src/composition/buildPipeline.js +186 -0
  237. package/dist/packages/player/src/composition/ensureDecodable.js +62 -0
  238. package/dist/packages/player/src/composition/openInputs.js +120 -0
  239. package/dist/packages/player/src/composition/openRecording.js +41 -0
  240. package/dist/packages/player/src/composition/readInputs.js +25 -0
  241. package/dist/packages/player/src/composition/renditionFrames.js +160 -0
  242. package/dist/packages/player/src/controls/ChoiceMenu.js +125 -0
  243. package/dist/packages/player/src/controls/FullscreenButton.js +29 -0
  244. package/dist/packages/player/src/controls/MotionLookButton.js +34 -0
  245. package/dist/packages/player/src/controls/PictureMenus.js +60 -0
  246. package/dist/packages/player/src/controls/SeekBar.js +126 -0
  247. package/dist/packages/player/src/controls/SoundControls.js +43 -0
  248. package/dist/packages/player/src/controls/TransportButtons.js +28 -0
  249. package/dist/packages/player/src/controls/ViewGestures.js +135 -0
  250. package/dist/packages/player/src/controls/Wording.js +79 -0
  251. package/dist/packages/player/src/controls/controlParts.js +38 -0
  252. package/dist/packages/player/src/controls/controls.js +4 -0
  253. package/dist/packages/player/src/controls/controlsBar.js +33 -0
  254. package/dist/packages/player/src/controls/controlsMarkup.js +100 -0
  255. package/dist/packages/player/src/controls/customControls.js +43 -0
  256. package/dist/packages/player/src/controls/formatTime.js +19 -0
  257. package/dist/packages/player/src/controls/icons.js +66 -0
  258. package/dist/packages/player/src/controls/keyboard.js +120 -0
  259. package/dist/packages/player/src/controls/messages.js +130 -0
  260. package/dist/packages/player/src/controls/nativeFullscreen.js +27 -0
  261. package/dist/packages/player/src/controls/parseMarkup.js +30 -0
  262. package/dist/packages/player/src/controls/resetViewButton.js +11 -0
  263. package/dist/packages/player/src/controls/sliderFill.js +15 -0
  264. package/dist/packages/player/src/element/ElementLoads.js +130 -0
  265. package/dist/packages/player/src/element/FullscreenToggle.js +93 -0
  266. package/dist/packages/player/src/element/GyroViewElement.js +358 -0
  267. package/dist/packages/player/src/element/IdleWatcher.js +71 -0
  268. package/dist/packages/player/src/element/PlayerCanvas.js +72 -0
  269. package/dist/packages/player/src/element/TypedEventElement.js +22 -0
  270. package/dist/packages/player/src/element/accessibleRegion.js +19 -0
  271. package/dist/packages/player/src/element/attributeNames.js +62 -0
  272. package/dist/packages/player/src/element/attributes.js +123 -0
  273. package/dist/packages/player/src/element/defineGyroView.js +20 -0
  274. package/dist/packages/player/src/element/earlyProperties.js +35 -0
  275. package/dist/packages/player/src/element/elementProperties.js +34 -0
  276. package/dist/packages/player/src/element/elementSource.js +39 -0
  277. package/dist/packages/player/src/element/fetchProperty.js +48 -0
  278. package/dist/packages/player/src/element/liveSettings.js +137 -0
  279. package/dist/packages/player/src/element/playbackAttributes.js +52 -0
  280. package/dist/packages/player/src/element/playerEventMirror.js +33 -0
  281. package/dist/packages/player/src/element/reflectedProperties.js +96 -0
  282. package/dist/packages/player/src/element/styles.js +4 -0
  283. package/dist/packages/player/src/element/template.js +46 -0
  284. package/dist/packages/player/src/inspectRecording.js +21 -0
  285. package/dist/packages/player/src/player/FrameLoop.js +35 -0
  286. package/dist/packages/player/src/player/MotionLook.js +150 -0
  287. package/dist/packages/player/src/player/PictureSettings.js +59 -0
  288. package/dist/packages/player/src/player/PlaybackStarts.js +38 -0
  289. package/dist/packages/player/src/player/Player.js +379 -0
  290. package/dist/packages/player/src/player/PlayerEvents.js +28 -0
  291. package/dist/packages/player/src/player/PlayerPhase.js +38 -0
  292. package/dist/packages/player/src/player/PlayerSound.js +60 -0
  293. package/dist/packages/player/src/player/PlayerView.js +143 -0
  294. package/dist/packages/player/src/player/SessionRelay.js +74 -0
  295. package/dist/packages/player/src/player/StatusAnnouncer.js +29 -0
  296. package/dist/packages/player/src/player/ensureFinite.js +26 -0
  297. package/dist/packages/player/src/player/loadRecording.js +47 -0
  298. package/dist/packages/player/src/player/transportEvents.js +30 -0
  299. package/dist/packages/player/src/player/viewAngles.js +17 -0
  300. package/dist/packages/player/src/rendition.js +52 -0
  301. package/dist/standalone.js +5633 -0
  302. package/package.json +70 -3
package/CHANGELOG.md ADDED
@@ -0,0 +1,402 @@
1
+ # Changelog
2
+
3
+ What changed for a page using the package, newest first. Until 1.0, a minor version may change
4
+ the API.
5
+
6
+ ## Unreleased
7
+
8
+ Added (ADR 0045, a recording is rendered frame by frame at the pace its consumer takes the frames):
9
+
10
+ - `openRendition(source, { width, from, to, stabilization, gainMatching, quality, canvas, signal })`
11
+ renders a recording frame by frame for an encoder: `rendition.frames()` yields every frame of
12
+ the span once, in order, as an equirectangular `VideoFrame` `width` pixels across and half as
13
+ many down, timed in microseconds from `from`, whenever the page asks for the next; nothing is
14
+ dropped for a slow encoder. It draws on an `OffscreenCanvas` of its own, so it runs in a
15
+ dedicated worker too. The settings are the player's defaults unless given. A width that is not
16
+ a multiple of four, or a span that holds no frame, is refused with `invalid-argument`. Its types,
17
+ `Rendition` and `RenditionOptions`, are exported.
18
+
19
+ Fixed:
20
+
21
+ - A clip trimmed in the Insta360 app is stabilized with the gyro of its own frames. The app keeps
22
+ the original's timing records, so every frame was timed as the original's frame of the same
23
+ number, as far off as the cut was from the start; the trim record the app adds now says where
24
+ the clip begins.
25
+ - The two files of a split-lens clip trimmed in the Insta360 app (`VID_..._00_002-trim.insv`) are
26
+ found as a pair: the name's suffix after the sequence number is kept for the other lens's file.
27
+ - An Insta360 ONE R recording is stabilized in its own IMU frame. Its info record names it
28
+ "Insta360 OneR", which no entry matched, so it was stabilized under the aligned guess and lock
29
+ turned its picture more than leaving it alone; `ONE_R_IMU_FRAME` is measured (ADR 0009).
30
+
31
+ ## 0.8.1 (2026-10-08)
32
+
33
+ What a page may notice (ADR 0044, a server slow to answer is asked in fewer, larger ranges):
34
+
35
+ - A recording on a server that takes 0.3 s or more to answer each byte range, as Google Drive's
36
+ API does, is downloaded a refill at a time (32 MiB for an X5), three ranges at a time for a
37
+ lone file, two for each file of a split pair; it plays at the rate of the link rather than of
38
+ the server's waits. Every other server is asked as before. The wait is the shortest a byte
39
+ range of the file took to be answered while it opened, so a CDN whose cache missed on every
40
+ opening read, or a long round trip, may count too; what is read before the first play is
41
+ unchanged.
42
+
43
+ ## 0.8.0 (2026-10-08)
44
+
45
+ Added (ADR 0043, a recording behind a token is read through the page's fetch):
46
+
47
+ - `<gyro-view>` takes a `fetch` property, set from script: a function called in place of the
48
+ platform's `fetch` for every request made for the recording and its other lens's file, to add
49
+ a header such as `Authorization` or to sign each request. `null`, the default, keeps the
50
+ platform's own; a change loads a recording named by URL again, the same function set again
51
+ changes nothing. Its type, `RecordingFetch`, is exported.
52
+ - `UrlInput.fetch` does the same for a URL given to `createBrowserPlayer`'s `load`, in place of
53
+ the player's `http.fetch` for that recording.
54
+
55
+ Changed:
56
+
57
+ - A byte range answered `429 Too Many Requests` is asked for again after the same waits as one
58
+ answered with a server error, instead of failing the read at once (ADR 0019, amended); the
59
+ first size request, as before, is not.
60
+ - `createBrowserPlayer`'s `http.fetch` is typed by how the player calls it,
61
+ `(url: string, init: RequestInit) => Promise<Response>`; `window.fetch` still fits it.
62
+
63
+ ## 0.7.0 (2026-10-06)
64
+
65
+ Changed (ADR 0042, the player keeps a media element's promises):
66
+
67
+ - `seeked` comes once the first picture at the new position is drawn, as a video's does, rather
68
+ than the moment the seek was asked for; meanwhile the status is `seeking`, which pages could
69
+ not see before. A seek made while playing goes on playing after that picture, so `playing`
70
+ follows `seeked`. The spinner shows only once a seek or a wait has lasted 0.3 seconds.
71
+ - At its natural end a recording fires `timeupdate`, `pause`, then `ended`; a page driving its
72
+ own play button from `play` and `pause` now sees it stop. With `loop`, the recording goes back
73
+ to the start without `ended`, `play`, `pause` or a buffering status at each turn.
74
+ - `play()` resolves once playback runs. It rejects with the new `usage` codes `no-source` when
75
+ nothing is loaded or loading, and `play-interrupted` when a newer load, `unload()` or the
76
+ element's removal replaces the load it waited for; out of the document it waits for the
77
+ connection and the load that starts. A `play()` made while buffering after a seek resolves
78
+ once the clock runs.
79
+ - `load()` with `autoplay` resolves once the recording is ready; autoplay starts it then, a
80
+ refusal still a warning.
81
+
82
+ Changed:
83
+
84
+ - Chrome and Edge 111 are the oldest that play: the player sorts with `toSorted` (Chrome 110)
85
+ and colours its controls with `color-mix()` (Chrome 111). The README said 107. Safari stays
86
+ 16.4 on a Mac and 17.1 on an iPhone or iPad.
87
+ - `Player.events` and the iframe handle's `events` are for listening only: their types no longer
88
+ offer `emit` or `removeAll`, which let a page forge an event or silence every listener.
89
+ - `Player.togglePlayback()` pauses, or starts and reports a refused start as a `warning`;
90
+ `attachViewGestures` and `attachKeyboard` take it in place of `isPaused`, `pause`, `play` and
91
+ `events`.
92
+ - `el.messages` is read-only; a page changes the words through the `messages` setter. The
93
+ defaults could be changed in place for every player on the page.
94
+ - `ignored-attribute` and `refused-property` arrive a microtask after the element is defined or
95
+ connected, so a listener added right after `define()` hears them.
96
+ - The iframe handle's `error` event is a `GyroViewError` with its `category`, as its rejected
97
+ promises were. A frame that loads and never answers fails the commands that wait on it with
98
+ the new `usage` code `embed-unreachable`, after 10 seconds, instead of leaving them waiting; a
99
+ command a frame of an earlier build does not know rejects with `invalid-argument`.
100
+ - `window.GyroView` from `embed.js` offers `embed` alone; `EmbedHandle` is a type.
101
+ - The hosted `gyro-view.js` is the package's `standalone.js`, the whole API with it. The
102
+ standalone file, `gyro-view.js` and the embed page carry Three.js's and mediabunny's license
103
+ notices, about 1 kB more compressed. `embed.js` is smaller, about 11 kB.
104
+
105
+ Fixed:
106
+
107
+ - A new recording, a failed one or a removed `src` no longer shows the last recording's final
108
+ frame under the spinner, the error or nothing at all.
109
+ - The Fullscreen button says whether the player fills the screen (`aria-pressed`, and an icon
110
+ to leave), in the browser's fullscreen and in the pinned fill alike. The Escape that leaves
111
+ it goes no further, so a dialog around the player stays open. A `popover` attribute the page
112
+ set on the element stays when the player leaves fullscreen.
113
+ - A removed element gives up its WebGL context at once, rather than holding it until garbage
114
+ collection, where pages that create a player per preview could run into the browser's limit
115
+ of contexts. A context the browser took away between recordings, as an iPhone may in a tab
116
+ left in the background, gets a fresh canvas at the next load; every later load failed with
117
+ `render-unavailable`.
118
+ - At a fractional pixel ratio (125 or 150 percent) the canvas takes its own device pixels in
119
+ Chromium, so the picture is no longer softened by a pixel's rounding.
120
+ - F without a Fullscreen API (iPhone with a keyboard) does nothing rather than throwing, and a
121
+ refused fullscreen is no unhandled rejection.
122
+
123
+ - Split recordings (two files, older cameras): the file that carries the trailer is lens 0, so
124
+ files renamed, or served from URLs that hide `_00_` and `_10_`, are no longer stitched with
125
+ the lenses swapped. Names only break a tie.
126
+ - Gain matching keeps the exposure of the lens the view opens facing, as ADR 0012 intends; since
127
+ 0.5.0 (ADR 0039) it kept the lens behind the viewer and re-exposed the view in front. It also
128
+ compares the lenses only where neither is blown out, so flare in one lens no longer brightens
129
+ the other's whole hemisphere.
130
+ - On a portrait screen the normal view spans at most 120 degrees from top to bottom; it spanned
131
+ up to 150, its edges stretched. `fov` still gives the field across.
132
+ - A zoom toward the pointer keeps that point under the pointer in a rolled view (motion look).
133
+ - A read-ahead range that failed during a short network outage is asked for again once
134
+ playback needs it, instead of failing playback later with `source-unreadable`.
135
+ - Audio the browser evicts at the playhead, as a managed media source may, is fetched again, and
136
+ a full sound buffer makes room, instead of freezing the picture or failing.
137
+ - Lens tracks whose frames never pair fail with `unsupported-layout` instead of playing to the
138
+ end over a still picture.
139
+ - A scrub or seek to a key frame shows it at once; WebCodecs' whole-microsecond timestamps had
140
+ it waiting for the next frame.
141
+ - A seek or scrub closes the previous decoders at once, instead of keeping them open beside the
142
+ new ones for a moment at every step of a drag.
143
+ - A canvas whose WebGL context the browser took away fails the next load with
144
+ `render-unavailable` (the browser's side) instead of `invariant-violation`, and a frame larger
145
+ than the GPU's largest texture is refused with it instead of being shrunk on the CPU at every
146
+ upload.
147
+ - After a lost context comes back, every shader is compiled at once, so switching view modes
148
+ stays instant.
149
+ - The letterbox bars around a fitted picture are cleared, not stitched and painted black.
150
+ - An HLG recording's colours past white are read as white, not brighter.
151
+ - Damaged or hostile files fail with the recording's own codes (ADR 0030) instead of hanging,
152
+ exhausting memory or blaming the player: sample tables counting billions of samples, a
153
+ timescale of zero, a malformed sync sample table, a picture track without a decoder
154
+ configuration (`unsupported-container`, was `codec-unsupported`).
155
+ - A metadata track the player does not play, an info field it only reports, or a calibration
156
+ string that parses but fits no camera no longer keeps a recording from opening; the next
157
+ calibration string is used.
158
+ - Gyro slots a camera never wrote no longer add a "damaged gyro samples" warning to `ready`.
159
+ - An HEVC sample with an empty NAL unit is no longer mistaken for a delta frame.
160
+
161
+ ## 0.6.1 (2026-10-05)
162
+
163
+ Fixed:
164
+
165
+ - Where the browser has no fullscreen for the element (iPhone Safari), the pinned player covers
166
+ the whole viewport from inside a modal, a carousel or any container with a transform, a filter
167
+ or containment: it is shown in the top layer, as the browser's own fullscreen is (ADR 0041).
168
+ It filled only that container, and the page showed around it. It also stays above the page's
169
+ own layers, whatever their `z-index`, and keeps none of the page's corners, `translate`,
170
+ `rotate` or `scale` for it.
171
+
172
+ What a page may notice:
173
+
174
+ - While pinned, the element has `popover="manual"` beside `data-fill`; a page never sets the
175
+ attribute itself. A popover or dialog the page opens meanwhile shows above it, as over the
176
+ browser's fullscreen. Where the browser has no popovers of its own (Safari before 17), the
177
+ element is pinned in place as before.
178
+ - While pinned, the element's background, colour, font and overflow are its own: a page's styles
179
+ for every `[popover]`, and the page's own `background`, `color` or `font-family` on
180
+ `gyro-view`, no longer reach it; the `--gyro-view-*` properties still theme it. A page's
181
+ shadow or opacity for every popover would.
182
+ - An element the page removes while pinned leaves the fill, as one in the browser's fullscreen
183
+ does. One it moves within the same task, taken out and put back before a microtask runs, stays
184
+ pinned.
185
+
186
+ ## 0.6.0 (2026-10-05)
187
+
188
+ New:
189
+
190
+ - Motion look: on a phone or tablet, a toggle in the normal view lets the device turn the view, the
191
+ screen a window into the recording with its horizon level with the real one (ADR 0040). The
192
+ element and the player have `motionLook` (`on`, `off` or `unavailable`), `startMotionLook()`,
193
+ which iOS honours only from a tap's handler, and `stopMotionLook()`; `motionlookchange` reports
194
+ it, and the warnings `motion-look-refused` and `motion-look-needs-gesture` say why it did not
195
+ start.
196
+
197
+ What a page may notice:
198
+
199
+ - `PlayerEvents`, `GyroViewElementEventMap` and `WarningCode` have the new event and codes; a
200
+ record keyed on every event or code needs them.
201
+ - `view` and `viewchange` give a fresh object of `yaw`, `pitch` and `fieldOfView` each time.
202
+ - The iframe the snippet creates allows `accelerometer; gyroscope; magnetometer`; a hand-written
203
+ iframe needs them for motion look. Without them, Chromium offers no toggle; iOS offers it and
204
+ refuses at the first press (`motion-look-refused`).
205
+ - On the narrowest players with the motion look toggle shown, the Stabilization menu gives way
206
+ to it.
207
+
208
+ ## 0.5.0 (2026-10-03)
209
+
210
+ New:
211
+
212
+ - Antigravity A1 recordings play. The A1 leaves the profile, tier and level of its HEVC
213
+ configuration blank, so the codec string is read from the stream's SPS instead (ADR 0037), and
214
+ its IMU frame is measured (ADR 0009): the `ready` event's `imuFrame` is
215
+ `{ name: 'A1', isVerified: true }`.
216
+
217
+ What a page may notice:
218
+
219
+ - An HEVC recording's codec in the `ready` event's `tracks[].codec` begins with the track's
220
+ sample entry type, `hvc1` on every camera seen, where it began with `hev1`; its profile, tier
221
+ and level are unchanged (ADR 0037).
222
+ - `off` and `follow` stand a recording upright as its camera stood, where its IMU frame is
223
+ measured (ADR 0038). An X3, X4 Air, X5 or X6 held upright on a stick or a tripod, its usual
224
+ pose, holds its body frame a quarter turn from upright, and these modes drew its recordings
225
+ turned a quarter turn; a camera upside down or with its lens axis vertical stands upright too.
226
+ Under `horizon`, such a camera's view keeps its heading while the camera pitches.
227
+ - An Insta360 X3 recording is stabilized about the right axes: its IMU frame is measured
228
+ (ADR 0009). The `ready` event's `imuFrame` is `{ name: 'X3', isVerified: true }` where it was
229
+ the unverified aligned frame, the load no longer warns that it has not been verified, and an
230
+ X3 on a stick or a tripod stands upright in `off` and `follow` too.
231
+ - An Insta360 ONE RS recording stands upright under `lock` and `horizon`, which turned it on its
232
+ side. Its IMU frame is assumed from one recording of a camera that never turned: `imuFrame` is
233
+ `{ name: 'ONE RS (unverified)', isVerified: false }`, and the load still warns.
234
+ - The view opens where Insta360 Studio centres the recording, in every mode: a half turn from
235
+ lens 0, where it opened, for a camera whose lens axis lies level, and a quarter turn from lens 0
236
+ for one whose lens axis is vertical, as the A1's (ADR 0038, ADR 0039). `yaw` 0 looks there: a
237
+ page that set `yaw` to face a direction faces the opposite one on a level camera until it adds
238
+ 180 degrees. The equirectangular panorama is centred as Studio's export is.
239
+
240
+ ## 0.4.2 (2026-10-02)
241
+
242
+ What a page may notice:
243
+
244
+ - Dragging, pinching or turning the wheel over a playing recording draws the picture once per
245
+ animation frame: in Safari, a fast mouse no longer slows the recording down. A change of the
246
+ view, the view mode, the quality or the exposure matching shows at the next animation frame
247
+ rather than at the call (ADR 0035).
248
+ - Opening a recording keeps the page busy for less time: its gyro is read and integrated in two
249
+ thirds of the time.
250
+ - Playing takes less of the page's main thread: the download plans what to fetch every few
251
+ mebibytes rather than at every frame (ADR 0036).
252
+ - A bundle that includes the package is smaller: mediabunny's demuxers for formats other than
253
+ MP4 and QuickTime are left out. The standalone module is about 40 KB smaller compressed.
254
+
255
+ ## 0.4.1 (2026-10-01)
256
+
257
+ What a page may notice:
258
+
259
+ - An Insta360 X4 Air recording is stabilized about the right axes: its IMU frame is measured
260
+ (ADR 0009) where it was assumed. The `ready` event's `imuFrame` is
261
+ `{ name: 'X4 Air', isVerified: true }` where it was the unverified aligned frame, and the load
262
+ no longer warns (`recording-degraded`) that the IMU frame has not been verified on a recording.
263
+ - A camera is given a measured IMU frame only by its whole model name: a model whose name merely
264
+ begins with a measured camera's, such as a later "X5 Pro", gets the unverified frame and its
265
+ warning until a recording of it is measured.
266
+
267
+ ## 0.4.0 (2026-10-01)
268
+
269
+ New:
270
+
271
+ - Insta360 X6 recordings play. Their only calibration is a v6 string, now read as the Mei model
272
+ with more terms (ADR 0032); the X6's IMU frame and the radial scale its lenses want are
273
+ measured (ADR 0009, ADR 0023); and its 10-bit HLG video is shown as SDR, as Insta360 Studio
274
+ shows it (ADR 0033).
275
+ - Each of the `ready` event's `tracks` has a `colour`: its primaries, transfer, matrix and range
276
+ as the track's bitstream says (`TrackColour`, with the types `ColourPrimaries`,
277
+ `TransferCharacteristics`, `MatrixCoefficients` and `ColourRange`).
278
+ - `inspectRecording`'s calibration strings include `offsetV6`, and `calibrationVersion` may be
279
+ 6, the v6 string's.
280
+
281
+ What a page may notice:
282
+
283
+ - A recording whose only calibration is a v6 string plays where it failed with
284
+ `no-calibration`.
285
+ - Stabilization samples the gyro half way through each frame's shutter, no longer half a
286
+ readout later. An X5's stabilized picture shifts by that half readout (4 ms at 5.7K60, 10.6 ms
287
+ at 8K30), and a swinging camera's world holds stiller (ADR 0034).
288
+ - A track whose colour the player cannot show as it should is drawn with a
289
+ `recording-degraded` warning: a PQ or linear-light transfer is drawn as recorded, SDR of wider
290
+ primaries than BT.709's is shown as BT.709, HLG of primaries other than BT.709's or BT.2020's
291
+ keeps its gamut.
292
+ - The decoder is told the track's whole colour, not only its range (the range alone where the
293
+ browser's WebCodecs does not know one of its values).
294
+ - Where a browser's decoder converts a track's colour through another matrix than the track's
295
+ own, as Safari's does with the X6's BT.2020, the picture is brought back to the track's.
296
+ - Seeking again and again, or dragging the seek bar, no longer stops playback now and then with
297
+ `decode` ("the audio element failed (media error 3)"): the sound is handed to the browser in
298
+ whole segments, so a seek can no longer cut one in half.
299
+
300
+ ## 0.3.1 (2026-09-30)
301
+
302
+ New:
303
+
304
+ - Every error has a `category`, derived from its code, that says whose side the failure is on:
305
+ `browser`, `recording`, `source`, `usage` or `internal`; `GYRO_VIEW_ERROR_CATEGORIES` and the
306
+ type `GyroViewErrorCategory` list them. The README's "When a recording cannot play" gives the
307
+ codes of each, and what a `<video>` fallback can and cannot do (ADR 0030).
308
+ - The `webcodecs-unavailable` error: the browser has no WebCodecs, on a page not served over
309
+ HTTPS or in an old browser.
310
+
311
+ What a page may notice:
312
+
313
+ - A page on plain HTTP, or a browser without WebCodecs, hears `webcodecs-unavailable` where it
314
+ heard `codec-unsupported`, whose message blamed the codec.
315
+
316
+ ## 0.3.0 (2026-09-30)
317
+
318
+ What a page may notice:
319
+
320
+ - A recording named by URL is downloaded in file order as it plays, the picture and the sound
321
+ from the same bytes, each fetched about once (ADR 0029). Over a simulated link a little
322
+ slower than an X5 recording at its highest setting (200 Mbit/s against 210), it starts in
323
+ half the time, fetches under half the bytes, and after a seek shows the target in half the
324
+ time, asking for nothing of the old position.
325
+
326
+ | State | What it downloads |
327
+ | ---------------------- | --------------------------------------------------------------------- |
328
+ | Loaded, never played | What opening and the first frame need; with `preload="none"` no frame |
329
+ | Playing | Up to 10 s or 128 MiB ahead, whichever is less, topped up as it plays |
330
+ | Paused after playing | On up to that budget, then nothing |
331
+ | A seek | The old position's requests end at once; the target first |
332
+ | Starved by the network | Waits until the next 4 s are downloaded, then plays on |
333
+
334
+ - A range that breaks off or brings nothing for 10 s is asked for again from its next byte.
335
+
336
+ New:
337
+
338
+ - The `source-changed` error: the recording at the URL was replaced while it played, as its
339
+ `ETag` tells, or else its `Last-Modified` and size. Exposing `ETag` across origins is
340
+ optional, and now named in the CORS advice.
341
+
342
+ ## 0.2.0 (2026-09-29)
343
+
344
+ What a page may notice:
345
+
346
+ - The controls are restyled, and fit the player's own width and the pointer (ADR 0028): a
347
+ shaded bar with a thin seek bar, Stabilization and View buttons that show the icon of the
348
+ choice in effect and open menus of the choices with their icons and a line describing each,
349
+ and on a narrow player menus over the whole player and fewer parts; on touch, 44-pixel
350
+ targets.
351
+ - The Stop button is gone; `stop()` and the S key remain. `labels.stop` goes with it.
352
+ - The theme's defaults follow the new look: `--gyro-view-accent` and `--gyro-view-text` are
353
+ white, `--gyro-view-controls-background` is `rgb(0 0 0 / 60%)` and `--gyro-view-radius` is
354
+ `8px`; `--gyro-view-menu-background` is new. A page's own values keep working.
355
+
356
+ New:
357
+
358
+ - `crossorigin` on `<gyro-view>`, with a media element's keywords: `use-credentials` fetches the
359
+ recording, its byte ranges and the other lens's file of a split pair with the visitor's
360
+ cookies, for recordings kept private behind cookies on another origin. `crossOrigin` reflects
361
+ it, `null` while absent. Changing it reloads a recording named by URL; the iframe embed never
362
+ carries it. Nothing changes for a page that does not set it.
363
+ - `credentials` on a `UrlInput` (`player.load({ main: { url, credentials: 'include' } })`), in
364
+ place of the player's shared `http.requestInit.credentials` for that recording.
365
+ - A `cors` error for a request sent with credentials names what the host must add: the page's
366
+ origin by name, not `*`, and `Access-Control-Allow-Credentials: true`.
367
+ - The equirectangular panorama and the raw lenses zoom up to eight times, from four, for fine
368
+ detail in 5.7K and 8K recordings. The normal view keeps its 30 to 120 degrees.
369
+ - `messages` takes `stabilizationModeDescriptions`, `viewModeDescriptions` and `labels.close`.
370
+
371
+ Fixed:
372
+
373
+ - The raw lenses no longer show a faint grey line along the tiles' edges on Apple GPUs, where a
374
+ player's size put an edge between two pixels the GPU shades together.
375
+
376
+ ## 0.1.0 (2026-09-29)
377
+
378
+ The first release:
379
+
380
+ - `<gyro-view>`, registered by `@bubo-squared/gyroview/define` or `defineGyroView()`, safe to
381
+ import while a server renders the page. It runs under a strict CSP (`trusted-types gyroview`,
382
+ no inline styles), speaks the page's language through `messages`, shows visitors plain failure
383
+ texts and names its overlays as parts. It opens on the raw lenses; the view menu offers them
384
+ first, then the equirectangular panorama and the normal view. The stitch reads the legacy
385
+ calibration string's radius as 96 degrees from the lens axis, where Insta360 Studio's own stitch
386
+ puts the far field; `ready` reports `offset` as the calibration version. The lens pose reads
387
+ the calibration's roll mirrored and turns both lenses alike by their yaw and pitch, which
388
+ removes the step at the side seams of the X5 recordings. The `quality`
389
+ attribute (`fast`, `balanced`, `high`, listed in `PICTURE_QUALITIES`, with `setQuality` and
390
+ `qualitychange`) sets how finely
391
+ the lens images are read and how many device pixels are drawn; `balanced` reads them through a
392
+ mip chain along each pixel's footprint, so fine detail no longer shimmers.
393
+ - `createBrowserPlayer`, the player without the element, for an interface of your own, with
394
+ `attachViewGestures` and `attachKeyboard` for the element's gestures and shortcuts.
395
+ - `inspectRecording`, which reads what a recording holds from a file or a URL.
396
+ - `@bubo-squared/gyroview/standalone`, one file with Three.js and mediabunny inside, for a page
397
+ without a bundler.
398
+ - Events in media-element terms, each `warning` with a `code` a page can act on beside its
399
+ message; times, durations and views in plain seconds and degrees.
400
+ - `GyroViewError` and its codes (`GYRO_VIEW_ERROR_CODES`), and the types of the settings,
401
+ metadata, events and inspection, with `GyroViewAttributes` for a framework's JSX declaration
402
+ of the element.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Bubo²
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.