{
  "version": 3,
  "sources": ["../src/index.ts", "../src/MediaStreamPlayer.tsx", "../src/BasicPlayer.tsx", "../src/components/Button.tsx", "../src/components/Limiter.tsx", "../src/components/MediaStreamPlayerContainer.tsx", "../src/Container.tsx", "../src/Controls.tsx", "../src/hooks/useUserActive.ts", "../src/img/CogWheel.tsx", "../src/img/Pause.tsx", "../src/img/Play.tsx", "../src/img/Refresh.tsx", "../src/img/Screenshot.tsx", "../src/img/Spinner.tsx", "../src/img/Stop.tsx", "../src/img/StreamStats.tsx", "../src/Settings.tsx", "../src/components/Switch.tsx", "../src/PlaybackArea.tsx", "../src/HttpMp4Video.tsx", "../src/constants.ts", "../src/hooks/useEventState.ts", "../src/hooks/useVideoDebug.ts", "../src/types.ts", "../src/StillImage.tsx", "../src/WsRtspCanvas.tsx", "../src/WsRtspVideo.tsx", "../src/metadata.ts", "../src/Player.tsx", "../src/Feedback.tsx", "../src/hooks/useSwitch.ts", "../src/Stats.tsx", "../src/utils/browserSupportedFormats.ts", "../src/utils/GetImageURL.tsx"],
  "sourcesContent": ["import { MediaStreamPlayer } from './MediaStreamPlayer'\n\nexport * from './BasicPlayer'\nexport * from './Container'\nexport * from './PlaybackArea'\nexport * from './Player'\nexport * from './Stats'\nexport * from './types'\nexport * from './utils'\n\nwindow.customElements.define('media-stream-player', MediaStreamPlayer)\n", "import React, { useEffect, useMemo, useState } from 'react'\nimport { createRoot, Root } from 'react-dom/client'\n\nimport { BasicPlayer } from './BasicPlayer'\nimport { VapixParameters } from './PlaybackArea'\nimport { Player } from './Player'\nimport { Format } from './types'\n\nenum PlayerVariants {\n  BASIC = 'basic',\n  ADVANCED = 'advanced',\n}\ninterface InitialAttributes {\n  readonly variant: string\n  readonly hostname: string\n  readonly autoplay: boolean\n  readonly autoretry: boolean\n  readonly format: string\n  readonly compression: string\n  readonly resolution: string\n  readonly rotation: string\n  readonly camera: string\n  readonly fps: string\n  readonly audio: string\n  readonly clock: string\n  readonly date: string\n  readonly text: string\n  readonly textstring: string\n  readonly textcolor: string\n  readonly textbackgroundcolor: string\n  readonly textpos: string\n  readonly secure: boolean\n}\n\ntype SetStateType = React.Dispatch<React.SetStateAction<InitialAttributes>>\n\n/**\n * Create a custom element that uses React to mount the actual Player component.\n *\n * Note that this does not use a shadow DOM to avoid certain issues with React.\n */\nexport class MediaStreamPlayer extends HTMLElement {\n  private _setState?: SetStateType\n  private _root?: Root\n\n  public attributeChangeSubscriber(cb: SetStateType) {\n    this._setState = cb\n  }\n\n  public static get observedAttributes() {\n    return [\n      'variant',\n      'hostname',\n      'autoplay',\n      'autoretry',\n      'format',\n      'compression',\n      'resolution',\n      'rotation',\n      'camera',\n      'fps',\n      'audio',\n      'clock',\n      'date',\n      'text',\n      'textstring',\n      'textcolor',\n      'textbackgroundcolor',\n      'textpos',\n      'secure',\n    ]\n  }\n\n  private get allAttributes() {\n    const {\n      variant,\n      hostname,\n      autoplay,\n      autoretry,\n      format,\n      compression,\n      resolution,\n      rotation,\n      camera,\n      fps,\n      audio,\n      clock,\n      date,\n      text,\n      textstring,\n      textcolor,\n      textbackgroundcolor,\n      textpos,\n      secure,\n    } = this\n\n    return {\n      variant,\n      hostname,\n      autoplay,\n      autoretry,\n      format,\n      compression,\n      resolution,\n      rotation,\n      camera,\n      fps,\n      audio,\n      clock,\n      date,\n      text,\n      textstring,\n      textcolor,\n      textbackgroundcolor,\n      textpos,\n      secure,\n    }\n  }\n\n  public get variant() {\n    return this.getAttribute('variant') ?? PlayerVariants.ADVANCED\n  }\n\n  public set variant(value: string) {\n    this.setAttribute('variant', value)\n  }\n\n  public get hostname() {\n    return this.getAttribute('hostname') ?? ''\n  }\n\n  public set hostname(value: string) {\n    this.setAttribute('hostname', value)\n  }\n\n  public get autoplay() {\n    return this.hasAttribute('autoplay')\n  }\n\n  public set autoplay(value) {\n    if (value !== undefined) {\n      this.setAttribute('autoplay', '')\n    } else {\n      this.removeAttribute('autoplay')\n    }\n  }\n\n  public get autoretry() {\n    return this.hasAttribute('autoretry')\n  }\n\n  public set autoretry(value) {\n    if (value !== undefined) {\n      this.setAttribute('autoretry', '')\n    } else {\n      this.removeAttribute('autoretry')\n    }\n  }\n\n  public get format() {\n    return this.getAttribute('format') ?? 'JPEG'\n  }\n\n  public set format(value: string) {\n    this.setAttribute('format', value)\n  }\n\n  public get compression() {\n    return this.getAttribute('compression') ?? ''\n  }\n\n  public set compression(value: string) {\n    this.setAttribute('compression', value)\n  }\n\n  public get resolution() {\n    return this.getAttribute('resolution') ?? ''\n  }\n\n  public set resolution(value: string) {\n    this.setAttribute('resolution', value)\n  }\n\n  public get rotation() {\n    return this.getAttribute('rotation') ?? ''\n  }\n\n  public set rotation(value: string) {\n    this.setAttribute('rotation', value)\n  }\n\n  public get camera() {\n    return this.getAttribute('camera') ?? ''\n  }\n\n  public set camera(value: string) {\n    this.setAttribute('camera', value)\n  }\n\n  public get fps() {\n    return this.getAttribute('fps') ?? ''\n  }\n\n  public set fps(value: string) {\n    this.setAttribute('fps', value)\n  }\n\n  public get audio() {\n    return this.getAttribute('audio') ?? ''\n  }\n\n  public set audio(value: string) {\n    this.setAttribute('audio', value)\n  }\n\n  public get clock() {\n    return this.getAttribute('clock') ?? ''\n  }\n\n  public set clock(value: string) {\n    this.setAttribute('clock', value)\n  }\n\n  public get date() {\n    return this.getAttribute('date') ?? ''\n  }\n\n  public set date(value: string) {\n    this.setAttribute('date', value)\n  }\n\n  public get text() {\n    return this.getAttribute('text') ?? ''\n  }\n\n  public set text(value: string) {\n    this.setAttribute('text', value)\n  }\n\n  public get textstring() {\n    return this.getAttribute('textstring') ?? ''\n  }\n\n  public set textstring(value: string) {\n    this.setAttribute('textstring', value)\n  }\n\n  public get textcolor() {\n    return this.getAttribute('textcolor') ?? ''\n  }\n\n  public set textcolor(value: string) {\n    this.setAttribute('textcolor', value)\n  }\n\n  public get textbackgroundcolor() {\n    return this.getAttribute('textbackgroundcolor') ?? ''\n  }\n\n  public set textbackgroundcolor(value: string) {\n    this.setAttribute('textbackgroundcolor', value)\n  }\n\n  public get textpos() {\n    return this.getAttribute('textpos') ?? ''\n  }\n\n  public set textpos(value: string) {\n    this.setAttribute('textpos', value)\n  }\n\n  public get secure() {\n    return this.hasAttribute('secure')\n  }\n\n  public set secure(value) {\n    if (value !== undefined) {\n      this.setAttribute('secure', '')\n    } else {\n      this.removeAttribute('secure')\n    }\n  }\n\n  public connectedCallback() {\n    this._root = createRoot(this)\n    const userGroupUrl = new URL(\n      `http://${this.hostname}/axis-cgi/usergroup.cgi`\n    )\n    userGroupUrl.protocol = this.secure === true ? 'https' : 'http'\n\n    window\n      .fetch(userGroupUrl.href, {\n        credentials: 'include',\n        mode: 'no-cors',\n      })\n      .then(() => {\n        this._root?.render(\n          <PlayerComponent\n            // eslint-disable-next-line react/jsx-no-bind\n            subscribeAttributesChanged={(cb) =>\n              this.attributeChangeSubscriber(cb)}\n            initialAttributes={{\n              ...this.allAttributes,\n            }}\n          />\n        )\n      })\n      .catch((err) => {\n        console.error(`Authorization failed: ${err.message}`)\n      })\n  }\n\n  public disconnectedCallback() {\n    this._root?.unmount()\n    this._root = undefined\n  }\n\n  public attributeChangedCallback(attrName: string, _: string, value: string) {\n    if (this._setState === undefined) {\n      console.warn(`ignored attribute change: ${attrName}=${value}`)\n      return\n    }\n\n    this._setState({\n      ...this.allAttributes,\n    })\n  }\n}\n\ninterface PlayerComponentProps {\n  readonly initialAttributes: InitialAttributes\n  readonly subscribeAttributesChanged: (cb: SetStateType) => void\n}\n\nconst PlayerComponent: React.FC<PlayerComponentProps> = ({\n  subscribeAttributesChanged,\n  initialAttributes,\n}) => {\n  const [state, setState] = useState(initialAttributes)\n\n  useEffect(() => {\n    subscribeAttributesChanged(setState)\n  }, [subscribeAttributesChanged])\n\n  const {\n    variant,\n    hostname,\n    autoplay,\n    autoretry,\n    format,\n    compression,\n    resolution,\n    rotation,\n    camera,\n    fps,\n    audio,\n    clock,\n    date,\n    text,\n    textstring,\n    textcolor,\n    textbackgroundcolor,\n    textpos,\n    secure,\n  } = state\n\n  const vapixParameters = useMemo(() => {\n    const params = [\n      { compression },\n      { resolution },\n      { rotation },\n      { camera },\n      { fps },\n      { audio },\n      { clock },\n      { date },\n      { text },\n      { textstring },\n      { textcolor },\n      { textbackgroundcolor },\n      { textpos },\n    ]\n      .filter((item) => Object.values(item)[0] !== '')\n      .map((item) => {\n        return { [Object.keys(item)[0]]: Object.values(item)[0] ?? '' }\n      })\n\n    return Object.assign({}, ...params) as VapixParameters\n  }, [\n    compression,\n    resolution,\n    rotation,\n    camera,\n    fps,\n    audio,\n    clock,\n    date,\n    text,\n    textstring,\n    textcolor,\n    textbackgroundcolor,\n    textpos,\n  ])\n\n  switch (variant) {\n    case PlayerVariants.ADVANCED:\n      return (\n        <Player\n          hostname={hostname}\n          autoPlay={autoplay}\n          autoRetry={autoretry}\n          initialFormat={format as Format}\n          vapixParams={vapixParameters}\n          secure={secure}\n        />\n      )\n    case PlayerVariants.BASIC:\n      return (\n        <BasicPlayer\n          hostname={hostname}\n          autoPlay={autoplay}\n          autoRetry={autoretry}\n          format={format as Format}\n          vapixParams={vapixParameters}\n          secure={secure}\n        />\n      )\n    default:\n      console.error('No player variant selected')\n      return null\n  }\n}\n", "import React, {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react'\n\nimport { Button } from './components/Button'\nimport { Limiter } from './components/Limiter'\nimport { MediaStreamPlayerContainer } from './components/MediaStreamPlayerContainer'\nimport { Container, Layer } from './Container'\nimport { ControlArea, ControlBar } from './Controls'\nimport { useUserActive } from './hooks/useUserActive'\nimport { Pause, Play } from './img'\nimport {\n  PlaybackArea,\n  PlayerNativeElement,\n  VapixParameters,\n  VideoProperties,\n} from './PlaybackArea'\nimport { Format } from './types'\n\nconst DEFAULT_FORMAT = Format.JPEG\n\ninterface BasicPlayerProps {\n  readonly hostname: string\n  readonly vapixParams?: VapixParameters\n  readonly format?: Format\n  readonly autoPlay?: boolean\n  /**\n   * Set to true if the camera requires a secure\n   * connection, \"https\" and \"wss\" protocols.\n   */\n  readonly secure?: boolean\n  readonly className?: string\n  /**\n   * Activate automatic retries on RTSP errors.\n   */\n  readonly autoRetry?: boolean\n}\n\nexport const BasicPlayer = forwardRef<PlayerNativeElement, BasicPlayerProps>(\n  (\n    {\n      hostname,\n      vapixParams = {},\n      format = DEFAULT_FORMAT,\n      autoPlay = false,\n      autoRetry = false,\n      secure,\n      className,\n    },\n    ref\n  ) => {\n    const [play, setPlay] = useState(autoPlay)\n    const [host, setHost] = useState(hostname)\n\n    /**\n     * Controls\n     */\n    const [videoProperties, setVideoProperties] = useState<VideoProperties>()\n\n    const onPlaying = useCallback(\n      (props: VideoProperties) => {\n        setVideoProperties(props)\n      },\n      [setVideoProperties]\n    )\n\n    const onPlayPause = useCallback(() => {\n      if (play) {\n        setPlay(false)\n      } else {\n        setHost(hostname)\n        setPlay(true)\n      }\n    }, [play, hostname])\n\n    useEffect(() => {\n      const cb = () => {\n        if (document.visibilityState === 'visible') {\n          setPlay(true)\n          setHost(hostname)\n        } else if (document.visibilityState === 'hidden') {\n          setPlay(false)\n          setHost('')\n        }\n      }\n\n      document.addEventListener('visibilitychange', cb)\n\n      return () => document.removeEventListener('visibilitychange', cb)\n    }, [hostname])\n\n    /**\n     * Aspect ratio\n     *\n     * This needs to be set so make the Container (and Layers) match the size of\n     * the visible image of the video or still image.\n     */\n\n    const naturalAspectRatio = useMemo(() => {\n      if (videoProperties === undefined) {\n        return undefined\n      }\n\n      const { width, height } = videoProperties\n\n      return width / height\n    }, [videoProperties])\n\n    /**\n     * Limit video size.\n     *\n     * The video size should not expand outside the available container, and\n     * should be recomputed on resize.\n     */\n\n    const limiterRef = useRef<HTMLDivElement>(null)\n    useLayoutEffect(() => {\n      if (naturalAspectRatio === undefined || limiterRef.current === null) {\n        return\n      }\n\n      const observer = new window.ResizeObserver(([entry]) => {\n        const element = entry.target as HTMLElement\n        const maxWidth = element.clientHeight * naturalAspectRatio\n        element.style.maxWidth = `${maxWidth}px`\n      })\n      observer.observe(limiterRef.current)\n\n      return () => observer.disconnect()\n    }, [naturalAspectRatio])\n\n    const controlArea = useRef(null)\n    const userActive = useUserActive(controlArea)\n\n    /**\n     * Render\n     *\n     * Each layer is positioned exactly on top of the visible image, since the\n     * aspect ratio is carried over to the container, and the layers match the\n     * container size.\n     */\n\n    return (\n      <MediaStreamPlayerContainer className={className}>\n        <Limiter ref={limiterRef}>\n          <Container aspectRatio={naturalAspectRatio}>\n            <Layer>\n              <PlaybackArea\n                forwardedRef={ref}\n                refresh={0}\n                play={play}\n                host={host}\n                format={format}\n                parameters={vapixParams}\n                onPlaying={onPlaying}\n                secure={secure}\n                autoRetry={autoRetry}\n              />\n            </Layer>\n            <Layer>\n              <ControlArea\n                ref={controlArea}\n                visible={play !== true || userActive}\n              >\n                <ControlBar>\n                  <Button onClick={onPlayPause}>\n                    {play === true\n                      ? <Pause title=\"Pause\" />\n                      : <Play title=\"Play\" />}\n                  </Button>\n                </ControlBar>\n              </ControlArea>\n            </Layer>\n          </Container>\n        </Limiter>\n      </MediaStreamPlayerContainer>\n    )\n  }\n)\n\nBasicPlayer.displayName = 'BasicPlayer'\n", "import styled from 'styled-components'\n\nexport const Button = styled.button`\n  background: transparent;\n  fill: white;\n  border: none;\n  box-sizing: border-box;\n  padding: 0;\n  margin: 0;\n  line-height: 0;\n\n  :focus {\n    outline: none;\n  }\n`\n", "import styled from 'styled-components'\n\n/**\n * The limiter prevents the video element to use up all of the available width.\n * The player container will automatically limit it's own height based on the\n * available width (keeping aspect ratio).\n */\nexport const Limiter = styled.div`\n  position: absolute;\n  left: 50%;\n  transform: translateX(-50%);\n  width: 100%;\n  top: 0;\n  bottom: 0;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n`\n", "import styled from 'styled-components'\n\n/**\n * Wrapper for the entire player that will take up all available place from the\n * parent.\n */\nexport const MediaStreamPlayerContainer = styled.div`\n  position: relative;\n  width: 100%;\n  height: 100%;\n`\n", "import React, { ReactNode } from 'react'\n\nimport styled from 'styled-components'\n\n/**\n * Aspect ratio\n *\n * The aspect ratio will determine how much padding-top\n * is necessary to fit the video in the container.\n *\n *          +---- 100% -----+\n *          |               |\n *   video  |               |\n *   height |               | (100 / (AR))%\n *          |               |\n *          +---------------+\n *             video width\n *\n * AR = width / height\n * width = 100%\n * height = (video-height / video-width) * 100%\n *  => padding-top = (1 / AR) * 100%\n */\n\n// Default aspect ratio is fixed to 16:9, but can be modified by changing the\n// aspectRatio property on the Container component.\nconst DEFAULT_ASPECT_RATIO = 16 / 9\n\nconst getHeightPct = (aspectRatio: number) => {\n  if (aspectRatio === 0) {\n    throw new Error('Cannot handle aspect ratio 0')\n  }\n  return 100 / aspectRatio\n}\n\nconst ContainerBody = styled.div.attrs<{ readonly aspectRatio: number }>(\n  ({ aspectRatio }) => {\n    return { style: { paddingTop: `${getHeightPct(aspectRatio)}%` } }\n  }\n)<{ readonly aspectRatio: number }>`\n  width: 100%;\n  background: black;\n  position: relative;\n`\n\nexport const Layer = styled.div`\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n`\n\ninterface ContainerProps {\n  readonly aspectRatio?: number\n  readonly children: ReactNode\n}\n\nexport const Container: React.FC<ContainerProps> = ({\n  aspectRatio = DEFAULT_ASPECT_RATIO,\n  children,\n}) => <ContainerBody aspectRatio={aspectRatio}>{children}</ContainerBody>\n", "import React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { DateTime, Duration } from 'luxon'\nimport styled from 'styled-components'\n\nimport { Button } from './components/Button'\nimport { useUserActive } from './hooks/useUserActive'\nimport { CogWheel, Pause, Play, Refresh, Screenshot, Stop } from './img'\nimport { VapixParameters, VideoProperties } from './PlaybackArea'\nimport { Settings } from './Settings'\nimport { Format } from './types'\n\nfunction isHTMLMediaElement(el: HTMLElement): el is HTMLMediaElement {\n  return (el as HTMLMediaElement).buffered !== undefined\n}\n\nexport const ControlArea = styled.div<{ readonly visible: boolean }>`\n  width: 100%;\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-end;\n  opacity: ${({ visible }) => (visible ? 1 : 0)};\n  transition: opacity 0.3s ease-in-out;\n`\n\nexport const ControlBar = styled.div`\n  width: 100%;\n  height: 32px;\n  background: rgb(0, 0, 0, 0.66);\n  display: flex;\n  align-items: center;\n  padding: 0 16px;\n  box-sizing: border-box;\n`\n\nconst VolumeContainer = styled.div`\n  margin-left: 8px;\n`\n\nconst Progress = styled.div`\n  flex-grow: 2;\n  padding: 0 32px;\n  display: flex;\n  align-items: center;\n`\n\nconst ProgressBarContainer = styled.div`\n  margin: 0;\n  width: 100%;\n  height: 24px;\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n`\n\nconst ProgressBar = styled.div`\n  background-color: rgba(255, 255, 255, 0.1);\n  height: 1px;\n  position: relative;\n  width: 100%;\n\n  ${ProgressBarContainer}:hover > & {\n    height: 3px;\n  }\n`\n\nconst ProgressBarPlayed = styled.div.attrs<{ readonly fraction: number }>(\n  ({ fraction }) => {\n    return {\n      style: { transform: `scaleX(${fraction})` },\n    }\n  }\n)<{ readonly fraction: number }>`\n  background-color: rgb(240, 180, 0);\n  height: 100%;\n  position: absolute;\n  top: 0;\n  transform: scaleX(0);\n  transform-origin: 0 0;\n  width: 100%;\n`\n\nconst ProgressBarBuffered = styled.div.attrs<{ readonly fraction: number }>(\n  ({ fraction }) => {\n    return {\n      style: { transform: `scaleX(${fraction})` },\n    }\n  }\n)<{ readonly fraction: number }>`\n  background-color: rgba(255, 255, 255, 0.2);\n  height: 100%;\n  position: absolute;\n  top: 0;\n  transform: scaleX(0);\n  transform-origin: 0 0;\n  width: 100%;\n`\n\nconst ProgressTimestamp = styled.div.attrs<{ readonly left: number }>(\n  ({ left }) => {\n    return {\n      style: { left: `${left}px` },\n    }\n  }\n)<{ readonly left: number }>`\n  background-color: rgb(56, 55, 51);\n  border-radius: 3px;\n  bottom: 200%;\n  color: #fff;\n  font-size: 9px;\n  padding: 5px;\n  position: absolute;\n  text-align: center;\n`\n\nconst ProgressIndicator = styled.div`\n  color: rgb(240, 180, 0);\n  padding-left: 24px;\n  font-size: 10px;\n  white-space: nowrap;\n`\n\ninterface ControlsProps {\n  readonly play?: boolean\n  readonly videoProperties?: VideoProperties\n  readonly startTime?: string // 2021-02-03T12:21:57.465715Z\n  readonly duration?: number\n  readonly src?: string\n  readonly parameters: VapixParameters\n  readonly onPlay: () => void\n  readonly onStop: () => void\n  readonly onRefresh: () => void\n  readonly onSeek: (offset: number) => void\n  readonly onScreenshot: () => void\n  readonly onFormat: (format: Format) => void\n  readonly onVapix: (key: string, value: string) => void\n  readonly labels?: {\n    readonly play?: string\n    readonly pause?: string\n    readonly stop?: string\n    readonly refresh?: string\n    readonly screenshot?: string\n    readonly settings?: string\n    readonly volume?: string\n  }\n  readonly showStatsOverlay: boolean\n  readonly toggleStats: () => void\n  readonly format: Format\n  readonly volume?: number\n  readonly setVolume?: (v: number) => void\n}\n\nexport const Controls: React.FC<ControlsProps> = ({\n  play,\n  videoProperties,\n  duration,\n  startTime,\n  src,\n  parameters,\n  onPlay,\n  onStop,\n  onRefresh,\n  onSeek,\n  onScreenshot,\n  onFormat,\n  onVapix,\n  labels,\n  showStatsOverlay,\n  toggleStats,\n  format,\n  volume,\n  setVolume,\n}) => {\n  const controlArea = useRef(null)\n  const userActive = useUserActive(controlArea)\n\n  const [settings, setSettings] = useState(false)\n  const toggleSettings = useCallback(\n    () => setSettings((currentSettings) => !currentSettings),\n    [setSettings]\n  )\n\n  const onVolumeChange = useCallback(\n    (e: React.ChangeEvent<HTMLInputElement>) => {\n      if (setVolume !== undefined) {\n        setVolume(parseFloat(e.target.value))\n      }\n    },\n    [setVolume]\n  )\n\n  const [totalDuration, setTotalDuration] = useState(duration)\n  const __mediaTimeline = useRef({\n    startDateTime: startTime !== undefined\n      ? DateTime.fromISO(startTime)\n      : undefined,\n  })\n\n  /**\n   * Progress\n   *\n   * Compute progress of played and buffered amounts of media. This includes any\n   * media before the actual start of the video.\n   *\n   * The range on videoProperties specifies where we started to play (meaning,\n   * the time corresponding to currentTime = 0), and where the playback stops.\n   * To avoid having to collect extra data about the actual media length, we\n   * treat the end of the range as the end of the actual media (i.e. a simple\n   * way to establish the duration).\n   *\n   * Example:\n   *  - range = [0, undefined] => start from the beginning, unknown end\n   *  - range = [8, 19] => start from 8s into the media, stop at 19s in which\n   *    case currentTime = 0 is actually 8s. In this case the media is actually\n   *    25s long, but we cannot display that in our progress. So this system\n   *    only works correctly when playing back from any starting point till the\n   *    end of the media (i.e. no \"chunks\" within).\n   *\n   *    media        0 ------------------------------------------------- 25s\n   *    range                     8s ----------------------------- 19s\n   *    currentTime               0s ----------------------------- 11s\n   *    progress     0 ------------------------------------------- 19s\n   *\n   *  So we treat the start of the range as offset for total progress, and the\n   *  end of the range as total duration. That means we do not handle situations\n   *  where the duration is longer than the end of the range.\n   *\n   * When computing progress, if the duration is Infinity (live playback), we\n   * use the total buffered time as a (temporary) duration.\n   */\n  const [progress, setProgress] = useState({\n    playedFraction: 0,\n    bufferedFraction: 0,\n    counter: '',\n  })\n  useEffect(() => {\n    if (videoProperties === undefined) {\n      return\n    }\n    const { el, pipeline, range } = videoProperties\n    if (el === null || pipeline === undefined) {\n      return\n    }\n\n    // Extract range and update duration accordingly.\n    const [start = 0, end = duration] = range ?? [0, duration]\n    const __duration = duration ?? end ?? Infinity\n    setTotalDuration(__duration)\n\n    const updateProgress = () => {\n      const played = start + pipeline.currentTime\n      const buffered = isHTMLMediaElement(el) && el.buffered.length > 0\n        ? start + el.buffered.end(el.buffered.length - 1)\n        : played\n      const total = __duration === Infinity ? buffered : __duration\n\n      const counter = `${\n        Duration.fromMillis(played * 1000).toFormat(\n          'h:mm:ss'\n        )\n      } / ${Duration.fromMillis(total * 1000).toFormat('h:mm:ss')}`\n      setProgress({\n        playedFraction: played / total,\n        bufferedFraction: buffered / total,\n        counter,\n      })\n    }\n    updateProgress()\n\n    // Use progress events on media elements\n    if (isHTMLMediaElement(el)) {\n      el.addEventListener('ended', updateProgress)\n      el.addEventListener('progress', updateProgress)\n      el.addEventListener('timeupdate', updateProgress)\n      return () => {\n        el.removeEventListener('timeupdate', updateProgress)\n        el.removeEventListener('progress', updateProgress)\n        el.removeEventListener('ended', updateProgress)\n      }\n    }\n\n    // Use polling when not a media element\n    const progressInterval = setInterval(updateProgress, 1000)\n    return () => {\n      clearInterval(progressInterval)\n    }\n  }, [videoProperties, duration, startTime, setTotalDuration])\n\n  const seek = useCallback(\n    (e: React.PointerEvent<HTMLDivElement>) => {\n      if (totalDuration === undefined) {\n        return\n      }\n\n      const { left, width } = e.currentTarget.getBoundingClientRect()\n      const fraction = (e.pageX - left) / width\n\n      onSeek(fraction * totalDuration)\n    },\n    [totalDuration, onSeek]\n  )\n\n  const [timestamp, setTimestamp] = useState({ left: 0, label: '' })\n  const __progressBarContainerRef = useRef<HTMLDivElement>(null)\n  useEffect(() => {\n    if (startTime !== undefined) {\n      __mediaTimeline.current.startDateTime = DateTime.fromISO(startTime)\n    }\n\n    const el = __progressBarContainerRef.current\n    if (el === null || totalDuration === undefined) {\n      return\n    }\n\n    const { left, width } = el.getBoundingClientRect()\n    const showTimestamp = (e: Event) => {\n      const offset = (e as PointerEvent).pageX - left\n      const offsetMillis = (offset / width) * totalDuration * 1000\n\n      setTimestamp({\n        left: offset,\n        label: __mediaTimeline.current.startDateTime !== undefined\n          ? __mediaTimeline.current.startDateTime\n            .plus(offsetMillis)\n            .toLocaleString(DateTime.DATETIME_FULL_WITH_SECONDS)\n          : Duration.fromMillis(offsetMillis).toFormat('h:mm:ss'),\n      })\n    }\n\n    const start = () => {\n      el.addEventListener('pointermove', showTimestamp)\n    }\n    const stop = () => {\n      setTimestamp({ left: 0, label: '' })\n      el.removeEventListener('pointermove', showTimestamp)\n    }\n\n    el.addEventListener('pointerover', start)\n    el.addEventListener('pointerout', stop)\n    return () => {\n      el.removeEventListener('pointerout', stop)\n      el.removeEventListener('pointerover', start)\n    }\n  }, [startTime, totalDuration])\n\n  return (\n    <ControlArea\n      ref={controlArea}\n      visible={play !== true || settings || userActive}\n    >\n      <ControlBar>\n        <Button onClick={onPlay}>\n          {play === true\n            ? <Pause title={labels?.pause} />\n            : <Play title={labels?.play} />}\n        </Button>\n        {src !== undefined && (\n          <Button onClick={onStop}>\n            <Stop title={labels?.stop} />\n          </Button>\n        )}\n        {src !== undefined && (\n          <Button onClick={onRefresh}>\n            <Refresh title={labels?.refresh} />\n          </Button>\n        )}\n        {src !== undefined && (\n          <Button onClick={onScreenshot}>\n            <Screenshot title={labels?.screenshot} />\n          </Button>\n        )}\n        {volume !== undefined\n          ? (\n            <VolumeContainer title={labels?.volume}>\n              <input\n                type=\"range\"\n                min=\"0\"\n                max=\"1\"\n                step=\"0.05\"\n                onChange={onVolumeChange}\n                value={volume ?? 0}\n              />\n            </VolumeContainer>\n          )\n          : null}\n        <Progress>\n          <ProgressBarContainer onClick={seek} ref={__progressBarContainerRef}>\n            <ProgressBar>\n              <ProgressBarPlayed fraction={progress.playedFraction} />\n              <ProgressBarBuffered fraction={progress.bufferedFraction} />\n              {timestamp.left !== 0\n                ? (\n                  <ProgressTimestamp left={timestamp.left}>\n                    {timestamp.label}\n                  </ProgressTimestamp>\n                )\n                : null}\n            </ProgressBar>\n          </ProgressBarContainer>\n          <ProgressIndicator>\n            {totalDuration === Infinity ? '\u2219 LIVE' : progress.counter}\n          </ProgressIndicator>\n        </Progress>\n        <Button onClick={toggleSettings}>\n          <CogWheel title={labels?.settings} />\n        </Button>\n      </ControlBar>\n      {settings && (\n        <Settings\n          parameters={parameters}\n          format={format}\n          onFormat={onFormat}\n          onVapix={onVapix}\n          showStatsOverlay={showStatsOverlay}\n          toggleStats={toggleStats}\n        />\n      )}\n    </ControlArea>\n  )\n}\n", "import { RefObject, useEffect, useState } from 'react'\n\nconst DEFAULT_TIMEOUT = 3000\n\n/**\n * Listen to activity on an element by the user.\n *\n * @param {Object} ref A React ref for the element\n * @param {Number} duration The duration of inactivity\n * @return {Boolean} The current user activity state\n */\nexport const useUserActive = (\n  ref: RefObject<HTMLElement>,\n  duration = DEFAULT_TIMEOUT\n) => {\n  const [userActive, setUserActive] = useState(false)\n  const startUserActive = () => setUserActive(true)\n  const stopUserActive = () => setUserActive(false)\n\n  useEffect(() => {\n    if (userActive) {\n      const timer = setTimeout(stopUserActive, duration)\n      return () => {\n        clearTimeout(timer)\n      }\n    }\n  })\n\n  useEffect(() => {\n    const el = ref.current\n\n    if (el === null) {\n      return\n    }\n\n    el.addEventListener('pointermove', startUserActive)\n    if (userActive) {\n      el.addEventListener('pointerleave', stopUserActive)\n    }\n\n    return () => {\n      el.removeEventListener('pointermove', startUserActive)\n      if (userActive) {\n        el.removeEventListener('pointerleave', stopUserActive)\n      }\n    }\n  }, [userActive, ref])\n\n  return userActive\n}\n", "import React from 'react'\n\nexport const CogWheel = ({ title }: { readonly title?: string }) => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"20\"\n      height=\"20\"\n      viewBox=\"0 0 20 20\"\n    >\n      {title !== undefined ? <title>{title}</title> : null}\n      <path fill=\"none\" d=\"M0 0h20v20H0V0z\" />\n      <path d=\"M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z\" />\n    </svg>\n  )\n}\n", "import React from 'react'\n\nexport const Pause = ({ title }: { readonly title?: string }) => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n    >\n      {title !== undefined ? <title>{title}</title> : null}\n      <path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\" />\n      <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n    </svg>\n  )\n}\n", "import React from 'react'\n\nexport const Play = ({ title }: { readonly title?: string }) => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n    >\n      {title !== undefined ? <title>{title}</title> : null}\n      <path d=\"M8 5v14l11-7z\" />\n      <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n    </svg>\n  )\n}\n", "import React from 'react'\n\nexport const Refresh = ({ title }: { readonly title?: string }) => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n      width=\"24\"\n    >\n      {title !== undefined ? <title>{title}</title> : null}\n      <path d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\" />\n      <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n    </svg>\n  )\n}\n", "import React from 'react'\n\nexport const Screenshot = ({ title }: { readonly title?: string }) => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n    >\n      {title !== undefined ? <title>{title}</title> : null}\n      <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n      <circle cx=\"12\" cy=\"12\" r=\"3.2\" />\n      <path d=\"M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z\" />\n    </svg>\n  )\n}\n", "import React from 'react'\n\n// By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL\n\nexport const Spinner = () => {\n  return (\n    <svg\n      width=\"38\"\n      height=\"38\"\n      viewBox=\"0 0 38 38\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <linearGradient x1=\"8.042%\" y1=\"0%\" x2=\"65.682%\" y2=\"23.865%\" id=\"a\">\n          <stop stopColor=\"#fff\" stopOpacity=\"0\" offset=\"0%\" />\n          <stop stopColor=\"#fff\" stopOpacity=\".631\" offset=\"63.146%\" />\n          <stop stopColor=\"#fff\" offset=\"100%\" />\n        </linearGradient>\n      </defs>\n      <g fill=\"none\" fillRule=\"evenodd\">\n        <g transform=\"translate(1 1)\">\n          <path\n            d=\"M36 18c0-9.94-8.06-18-18-18\"\n            id=\"Oval-2\"\n            stroke=\"url(#a)\"\n            strokeWidth=\"2\"\n          >\n            <animateTransform\n              attributeName=\"transform\"\n              type=\"rotate\"\n              from=\"0 18 18\"\n              to=\"360 18 18\"\n              dur=\"0.9s\"\n              repeatCount=\"indefinite\"\n            />\n          </path>\n          <circle fill=\"#fff\" cx=\"36\" cy=\"18\" r=\"1\">\n            <animateTransform\n              attributeName=\"transform\"\n              type=\"rotate\"\n              from=\"0 18 18\"\n              to=\"360 18 18\"\n              dur=\"0.9s\"\n              repeatCount=\"indefinite\"\n            />\n          </circle>\n        </g>\n      </g>\n    </svg>\n  )\n}\n", "import React from 'react'\n\nexport const Stop = ({ title }: { readonly title?: string }) => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n    >\n      {title !== undefined ? <title>{title}</title> : null}\n      <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n      <path d=\"M6 6h12v12H6z\" />\n    </svg>\n  )\n}\n", "import React from 'react'\n\nexport const StreamStats = ({ title }: { readonly title?: string }) => {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n      {title !== undefined ? <title>{title}</title> : null}\n      <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\" />\n    </svg>\n  )\n}\n", "import React, { ChangeEventHandler, useCallback, useRef, useState } from 'react'\n\nimport styled from 'styled-components'\n\nimport { Switch } from './components/Switch'\nimport { VapixParameters } from './PlaybackArea'\nimport { Format } from './types'\n\nconst SettingsMenu = styled.div`\n  font-family: sans-serif;\n  display: flex;\n  flex-direction: column;\n  position: absolute;\n  bottom: 32px;\n  right: 0;\n  background: rgb(0, 0, 0, 0.66);\n  padding: 8px 16px;\n  margin-bottom: 16px;\n  margin-right: 8px;\n\n  &:after {\n    content: '';\n    width: 10px;\n    height: 10px;\n    transform: rotate(45deg);\n    position: absolute;\n    bottom: -5px;\n    right: 12px;\n    background: rgb(0, 0, 0, 0.66);\n  }\n`\n\nconst SettingsItem = styled.div`\n  display: flex;\n  flex-direction: row;\n  color: white;\n  height: 24px;\n  width: 320px;\n  align-items: center;\n  justify-content: space-between;\n  margin: 4px 0;\n`\n\ninterface SettingsProps {\n  readonly parameters: VapixParameters\n  readonly format: Format\n  readonly onFormat: (format: Format) => void\n  readonly onVapix: (key: string, value: string) => void\n  readonly showStatsOverlay: boolean\n  readonly toggleStats: (newValue?: boolean) => void\n}\n\nexport const Settings: React.FC<SettingsProps> = ({\n  parameters,\n  format,\n  onFormat,\n  onVapix,\n  showStatsOverlay,\n  toggleStats,\n}) => {\n  const [textString, setTextString] = useState(parameters['textstring'])\n  const textStringTimeout = useRef<number>()\n\n  const changeParam: ChangeEventHandler<HTMLInputElement> = useCallback(\n    (e) => {\n      const { name, value } = e.target\n\n      switch (name) {\n        case 'textstring':\n          setTextString(value)\n\n          clearTimeout(textStringTimeout.current)\n          textStringTimeout.current = window.setTimeout(() => {\n            onVapix(name, value)\n          }, 300)\n\n          break\n\n        case 'text':\n          onVapix(name, value ? '1' : '0')\n          break\n        default:\n          console.warn('internal error')\n      }\n    },\n    [onVapix]\n  )\n\n  const changeStatsOverlay: ChangeEventHandler<HTMLInputElement> = useCallback(\n    (e) => toggleStats(e.target.checked),\n    [toggleStats]\n  )\n\n  const changeFormat: ChangeEventHandler<HTMLSelectElement> = useCallback(\n    (e) => onFormat(e.target.value as Format),\n    [onFormat]\n  )\n\n  const changeResolution: ChangeEventHandler<HTMLSelectElement> = useCallback(\n    (e) => onVapix('resolution', e.target.value),\n    [onVapix]\n  )\n\n  const changeRotation: ChangeEventHandler<HTMLSelectElement> = useCallback(\n    (e) => onVapix('rotation', e.target.value),\n    [onVapix]\n  )\n\n  const changeCompression: ChangeEventHandler<HTMLSelectElement> = useCallback(\n    (e) => onVapix('compression', e.target.value),\n    [onVapix]\n  )\n\n  return (\n    <SettingsMenu>\n      <SettingsItem>\n        <div>Format</div>\n        <select onChange={changeFormat} defaultValue={format}>\n          <option value=\"RTP_H264\">H.264 (RTP over WS)</option>\n          <option value=\"MP4_H264\">H.264 (MP4 over HTTP)</option>\n          <option value=\"RTP_JPEG\">Motion JPEG</option>\n          <option value=\"JPEG\">Still image</option>\n        </select>\n      </SettingsItem>\n      <SettingsItem>\n        <div>Resolution</div>\n        <select value={parameters['resolution']} onChange={changeResolution}>\n          <option value=\"\">default</option>\n          <option value=\"1920x1080\">1920 x 1080 (FHD)</option>\n          <option value=\"1280x720\">1280 x 720 (HD)</option>\n          <option value=\"800x600\">800 x 600 (VGA)</option>\n        </select>\n      </SettingsItem>\n      <SettingsItem>\n        <div>Rotation</div>\n        <select value={parameters['rotation']} onChange={changeRotation}>\n          <option value=\"0\">0</option>\n          <option value=\"90\">90</option>\n          <option value=\"180\">180</option>\n          <option value=\"270\">270</option>\n        </select>\n      </SettingsItem>\n      <SettingsItem>\n        <div>Compression</div>\n        <select value={parameters['compression']} onChange={changeCompression}>\n          <option value=\"\">default</option>\n          <option value=\"0\">0</option>\n          <option value=\"10\">10</option>\n          <option value=\"20\">20</option>\n          <option value=\"30\">30</option>\n          <option value=\"40\">40</option>\n          <option value=\"50\">50</option>\n          <option value=\"60\">60</option>\n          <option value=\"70\">70</option>\n          <option value=\"80\">80</option>\n          <option value=\"90\">90</option>\n          <option value=\"100\">100</option>\n        </select>\n      </SettingsItem>\n      <SettingsItem>\n        <div>Text overlay</div>\n        <input name=\"textstring\" value={textString} onChange={changeParam} />\n        <Switch\n          name=\"text\"\n          checked={parameters['text'] === '1'}\n          onChange={changeParam}\n        />\n      </SettingsItem>\n      <SettingsItem>\n        <div>Stats overlay</div>\n        <Switch checked={showStatsOverlay} onChange={changeStatsOverlay} />\n      </SettingsItem>\n    </SettingsMenu>\n  )\n}\n", "import React, { ChangeEventHandler } from 'react'\n\nimport styled from 'styled-components'\n\nconst Container = styled.label`\n  position: relative;\n  display: inline-block;\n  width: 28px;\n  height: 16px;\n`\n\nconst Input = styled.input`\n  opacity: 0;\n  width: 0;\n  height: 0;\n`\n\nconst Slider = styled.span`\n  border-radius: 16px;\n  cursor: pointer;\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: #ccc;\n  transition: 0.4s;\n\n  &:before {\n    border-radius: 50%;\n    content: '';\n    position: absolute;\n    height: 12px;\n    width: 12px;\n    left: 2px;\n    bottom: 2px;\n    background-color: white;\n    transition: 0.4s;\n  }\n\n  ${Input}:checked + & {\n    background-color: #2196f3;\n  }\n\n  ${Input}:checked + &:before {\n    transform: translateX(12px);\n  }\n\n  ${Input}:focus + & {\n    box-shadow: 0 0 1px #2196f3;\n  }\n`\n\nexport interface SwitchProps {\n  readonly name?: string\n  readonly checked: boolean\n  readonly onChange: ChangeEventHandler<HTMLInputElement>\n}\n\nexport const Switch: React.FC<SwitchProps> = (props) => {\n  return (\n    <Container>\n      <Input type=\"checkbox\" {...props} />\n      <Slider />\n    </Container>\n  )\n}\n", "import React, { Ref } from 'react'\n\nimport debug from 'debug'\nimport {\n  Html5CanvasPipeline,\n  Html5VideoPipeline,\n  HttpMsePipeline,\n  Rtcp,\n  Sdp,\n  TransformationMatrix,\n} from 'media-stream-library'\n\nimport { HttpMp4Video } from './HttpMp4Video'\nimport { MetadataHandler } from './metadata'\nimport { StillImage } from './StillImage'\nimport { Format } from './types'\nimport { WsRtspCanvas } from './WsRtspCanvas'\nimport { WsRtspVideo } from './WsRtspVideo'\n\nexport type PlayerNativeElement =\n  | HTMLVideoElement\n  | HTMLCanvasElement\n  | HTMLImageElement\n\nexport type PlayerPipeline =\n  | Html5VideoPipeline\n  | Html5CanvasPipeline\n  | HttpMsePipeline\n\nconst debugLog = debug('msp:api')\n\nexport enum AxisApi {\n  'AXIS_IMAGE_CGI' = 'AXIS_IMAGE_CGI',\n  'AXIS_MEDIA_AMP' = 'AXIS_MEDIA_AMP',\n  'AXIS_MEDIA_CGI' = 'AXIS_MEDIA_CGI',\n}\n\nexport enum Protocol {\n  'HTTP' = 'http:',\n  'HTTPS' = 'https:',\n  'WS' = 'ws:',\n  'WSS' = 'wss:',\n}\n\nexport const FORMAT_API: Record<Format, AxisApi> = {\n  RTP_H264: AxisApi.AXIS_MEDIA_AMP,\n  RTP_JPEG: AxisApi.AXIS_MEDIA_AMP,\n  MP4_H264: AxisApi.AXIS_MEDIA_CGI,\n  JPEG: AxisApi.AXIS_IMAGE_CGI,\n}\n\nexport interface VapixParameters {\n  readonly [key: string]: string\n}\n\nexport type Range = readonly [number | undefined, number | undefined]\n\nexport interface VideoProperties {\n  readonly el: PlayerNativeElement\n  readonly width: number\n  readonly height: number\n  readonly formatSupportsAudio: boolean\n  readonly pipeline?: PlayerPipeline\n  readonly media?: ReadonlyArray<{\n    readonly type: 'video' | 'audio' | 'data'\n    readonly mime: string\n  }>\n  readonly volume?: number\n  readonly range?: Range\n  readonly sensorTm?: TransformationMatrix\n}\n\ninterface PlaybackAreaProps {\n  readonly forwardedRef?: Ref<PlayerNativeElement>\n  readonly host: string\n  readonly format: Format\n  readonly parameters?: VapixParameters\n  readonly play?: boolean\n  readonly offset?: number\n  readonly refresh: number\n  readonly onPlaying: (properties: VideoProperties) => void\n  readonly onEnded?: () => void\n  readonly onSdp?: (msg: Sdp) => void\n  readonly onRtcp?: (msg: Rtcp) => void\n  readonly metadataHandler?: MetadataHandler\n  readonly secure?: boolean\n  /**\n   * Activate automatic retries on RTSP errors.\n   */\n  readonly autoRetry?: boolean\n}\n\nconst wsUri = (protocol: Protocol.WS | Protocol.WSS, host: string) => {\n  return host.length !== 0 ? `${protocol}//${host}/rtsp-over-websocket` : ''\n}\n\nconst rtspUri = (host: string, searchParams: string) => {\n  return host.length !== 0\n    ? `rtsp://${host}/axis-media/media.amp?${searchParams}`\n    : ''\n}\n\nconst mediaUri = (\n  protocol: Protocol.HTTP | Protocol.HTTPS,\n  host: string,\n  searchParams: string\n) => {\n  return host.length !== 0\n    ? `${protocol}//${host}/axis-cgi/media.cgi?${searchParams}`\n    : ''\n}\n\nconst imgUri = (\n  protocol: Protocol.HTTP | Protocol.HTTPS,\n  host: string,\n  searchParams: string\n) => {\n  return host.length !== 0\n    ? `${protocol}//${host}/axis-cgi/jpg/image.cgi?${searchParams}`\n    : ''\n}\n\n/**\n * User-specified URI parameters.\n *\n * Note that parameters such as `videocodec` or `container` are automatically\n * set based on the chosen format (since they effect which component to use).\n */\nconst PARAMETERS: Record<AxisApi, ReadonlyArray<string>> = {\n  [AxisApi.AXIS_IMAGE_CGI]: [\n    'resolution',\n    'camera',\n    'compression',\n    'rotation',\n    'palette',\n    'squarepixel',\n    'timestamp',\n  ],\n  [AxisApi.AXIS_MEDIA_AMP]: [\n    'camera',\n    'resolution',\n    'h264profile',\n    'streamprofile',\n    'recordingid',\n    'audio',\n    'compression',\n    'colorlevel',\n    'color',\n    'palette',\n    'clock',\n    'date',\n    'text',\n    'textstring',\n    'textcolor',\n    'textbackgroundcolor',\n    'rotation',\n    'textpos',\n    'overlayimage',\n    'overlaypos',\n    'duration',\n    'nbrofframes',\n    'fps',\n    'pull',\n    'event',\n    'timestamp',\n    'videocodec',\n  ],\n  [AxisApi.AXIS_MEDIA_CGI]: [\n    'container',\n    'camera',\n    'resolution',\n    'h264profile',\n    'streamprofile',\n    'recordingid',\n    'audio',\n    'compression',\n    'colorlevel',\n    'color',\n    'palette',\n    'clock',\n    'date',\n    'text',\n    'textstring',\n    'textcolor',\n    'textbackgroundcolor',\n    'rotation',\n    'textpos',\n    'overlayimage',\n    'overlaypos',\n    'duration',\n    'nbrofframes',\n    'fps',\n    'pull',\n    'event',\n    'timestamp',\n    'videocodec',\n  ],\n}\n\n/**\n * searchParams\n *\n * Produce a (URI-encoded) search parameter string for use in a URL\n * from a list of key,value pairs. The keys are checked against the\n * known keys for a particular API.\n *\n * @param searchParamList a list of [key, value] pairs\n */\nconst searchParams = (api: AxisApi, parameters: VapixParameters = {}) => {\n  const parameterList = PARAMETERS[api]\n  return Object.entries(parameters)\n    .map(([key, value]) => {\n      if (!parameterList.includes(key)) {\n        debugLog(`undocumented VAPIX parameter ${key}`)\n      }\n      return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`\n    })\n    .join('&')\n}\n\nexport const PlaybackArea: React.FC<PlaybackAreaProps> = ({\n  forwardedRef,\n  host,\n  format,\n  parameters = {},\n  play,\n  offset,\n  refresh,\n  onPlaying,\n  onEnded,\n  onSdp,\n  onRtcp,\n  metadataHandler,\n  secure = window.location.protocol === Protocol.HTTPS,\n  autoRetry = false,\n}) => {\n  const timestamp = refresh.toString()\n\n  if (format === Format.RTP_H264) {\n    const ws = wsUri(secure ? Protocol.WSS : Protocol.WS, host)\n    const rtsp = rtspUri(\n      host,\n      searchParams(FORMAT_API[format], {\n        ...parameters,\n        timestamp,\n        videocodec: 'h264',\n      })\n    )\n\n    return (\n      <WsRtspVideo\n        key={refresh}\n        forwardedRef={forwardedRef as Ref<HTMLVideoElement>}\n        {...{\n          ws,\n          rtsp,\n          play,\n          offset,\n          onPlaying,\n          onEnded,\n          onSdp,\n          onRtcp,\n          metadataHandler,\n          autoRetry,\n        }}\n      />\n    )\n  }\n\n  if (format === Format.RTP_JPEG) {\n    const ws = wsUri(secure ? Protocol.WSS : Protocol.WS, host)\n    const rtsp = rtspUri(\n      host,\n      searchParams(FORMAT_API[format], {\n        ...parameters,\n        timestamp,\n        videocodec: 'jpeg',\n      })\n    )\n\n    return (\n      <WsRtspCanvas\n        key={refresh}\n        forwardedRef={forwardedRef as Ref<HTMLCanvasElement>}\n        {...{ ws, rtsp, play, offset, onPlaying, onEnded, onSdp, onRtcp }}\n      />\n    )\n  }\n\n  if (format === Format.JPEG) {\n    const src = imgUri(\n      secure ? Protocol.HTTPS : Protocol.HTTP,\n      host,\n      searchParams(FORMAT_API[format], {\n        ...parameters,\n        timestamp,\n      })\n    )\n\n    return (\n      <StillImage\n        key={refresh}\n        forwardedRef={forwardedRef as Ref<HTMLImageElement>}\n        {...{ src, play, onPlaying }}\n      />\n    )\n  }\n\n  if (format === Format.MP4_H264) {\n    const src = mediaUri(\n      secure ? Protocol.HTTPS : Protocol.HTTP,\n      host,\n      searchParams(FORMAT_API[format], {\n        ...parameters,\n        timestamp,\n        videocodec: 'h264',\n        container: 'mp4',\n      })\n    )\n\n    return (\n      <HttpMp4Video\n        key={refresh}\n        forwardedRef={forwardedRef as Ref<HTMLVideoElement>}\n        {...{ src, play, onPlaying, onEnded }}\n      />\n    )\n  }\n\n  console.warn(`Error: unknown format: ${format},\nplease use one of ${\n    [\n      Format.RTP_H264,\n      Format.JPEG,\n      Format.MP4_H264,\n      Format.RTP_JPEG,\n    ].join(', ')\n  }`)\n\n  return null\n}\n", "import React, { useEffect, useRef, useState } from 'react'\n\nimport debug from 'debug'\nimport { pipelines, TransformationMatrix } from 'media-stream-library'\nimport styled from 'styled-components'\n\nimport { FORMAT_SUPPORTS_AUDIO } from './constants'\nimport { useEventState } from './hooks/useEventState'\nimport { useVideoDebug } from './hooks/useVideoDebug'\nimport { MetadataHandler } from './metadata'\nimport { VideoProperties } from './PlaybackArea'\nimport { Format } from './types'\n\nconst debugLog = debug('msp:http-mp4-video')\n\nconst VideoNative = styled.video`\n  max-height: 100%;\n  object-fit: contain;\n  width: 100%;\n`\n\n/**\n * WebSocket + RTSP playback component.\n */\n\ninterface HttpMp4VideoProps {\n  readonly forwardedRef?: React.Ref<HTMLVideoElement>\n  /**\n   * The _intended_ playback state.\n   */\n  readonly play?: boolean\n  /**\n   * The HTTP/HTTPS source for the MP4 data (URI).\n   */\n  readonly src?: string\n  /**\n   * Activate automatic playback.\n   */\n  readonly autoPlay?: boolean\n  /**\n   * Default mute state.\n   */\n  readonly muted?: boolean\n  /**\n   * Callback to signal video is playing.\n   */\n  readonly onPlaying?: (videoProperties: VideoProperties) => void\n  /**\n   * Callback to signal video ended.\n   */\n  readonly onEnded?: () => void\n\n  readonly metadataHandler?: MetadataHandler\n}\n\nexport const HttpMp4Video: React.FC<HttpMp4VideoProps> = ({\n  forwardedRef,\n  play = false,\n  src,\n  autoPlay = true,\n  muted = true,\n  onPlaying,\n  onEnded,\n  metadataHandler,\n}) => {\n  let videoRef = useRef<HTMLVideoElement>(null)\n\n  // Forwarded refs can either be a callback or the result of useRef\n  if (typeof forwardedRef === 'function') {\n    forwardedRef(videoRef.current)\n  } else if (forwardedRef) {\n    videoRef = forwardedRef\n  }\n\n  /**\n   * Internal state:\n   * -> canplay: there is enough data on the video element to play.\n   * -> playing: the video element playback is progressing.\n   */\n  const [canplay, unsetCanplay] = useEventState(videoRef, 'canplay')\n  const [playing, unsetPlaying] = useEventState(videoRef, 'playing')\n\n  // State tied to resources\n  const [pipeline, setPipeline] = useState<null | pipelines.HttpMsePipeline>(\n    null\n  )\n  const [fetching, setFetching] = useState(false)\n\n  // keep a stable reference to the external onPlaying callback\n  const __onPlayingRef = useRef(onPlaying)\n  __onPlayingRef.current = onPlaying\n\n  // keep a stable reference to the external onEnded callback\n  const __onEndedRef = useRef(onEnded)\n  __onEndedRef.current = onEnded\n\n  const __sensorTmRef = useRef<TransformationMatrix>()\n\n  useVideoDebug(videoRef.current, debugLog)\n\n  useEffect(() => {\n    const videoEl = videoRef.current\n\n    if (videoEl === null) {\n      return\n    }\n\n    if (play && canplay === true && playing === false) {\n      debugLog('play')\n      videoEl.play().catch((err) => {\n        console.error('VideoElement error: ', err.message)\n      })\n\n      const { videoHeight, videoWidth } = videoEl\n      debugLog('%o', {\n        videoHeight,\n        videoWidth,\n      })\n    } else if (!play && playing === true) {\n      debugLog('pause')\n      videoEl.pause()\n      unsetPlaying()\n    } else if (play && playing === true) {\n      if (__onPlayingRef.current !== undefined) {\n        __onPlayingRef.current({\n          el: videoEl,\n          width: videoEl.videoWidth,\n          height: videoEl.videoHeight,\n          sensorTm: __sensorTmRef.current,\n          formatSupportsAudio: FORMAT_SUPPORTS_AUDIO[Format.MP4_H264],\n          // TODO: no volume, need to expose tracks?\n          // TODO: no pipeline, can we even get stats?\n        })\n      }\n    }\n  }, [play, canplay, playing, unsetPlaying, pipeline])\n\n  // keep a stable reference to the external metadatahandler\n  const __metadataHandlerRef = useRef(metadataHandler)\n  __metadataHandlerRef.current = metadataHandler\n\n  useEffect(() => {\n    const videoEl = videoRef.current\n\n    if (src !== undefined && src.length > 0 && videoEl !== null) {\n      const endedCallback = () => {\n        __onEndedRef.current?.()\n      }\n      debugLog('create pipeline', src)\n      const newPipeline = new pipelines.HttpMsePipeline({\n        http: { uri: src },\n        mediaElement: videoEl,\n      })\n      setPipeline(newPipeline)\n\n      newPipeline.onServerClose = endedCallback\n\n      return () => {\n        debugLog('close pipeline and clear video')\n        newPipeline.close()\n        videoEl.src = ''\n        setPipeline(null)\n        setFetching(false)\n        unsetCanplay()\n        unsetPlaying()\n      }\n    }\n  }, [src, unsetCanplay, unsetPlaying])\n\n  useEffect(() => {\n    if (play && pipeline && !fetching) {\n      pipeline.onHeaders = (headers) => {\n        __sensorTmRef.current = parseTransformHeader(\n          headers.get('video-sensor-transform')\n            ?? headers.get('video-metadata-transform')\n        )\n      }\n      pipeline.http.play()\n      debugLog('initiated data fetching')\n      setFetching(true)\n    }\n  }, [play, pipeline, fetching])\n\n  return <VideoNative autoPlay={autoPlay} muted={muted} ref={videoRef} />\n}\n\nconst parseTransformHeader = (\n  value: string | null | undefined\n): TransformationMatrix | undefined => {\n  if (value === undefined || value === null) {\n    return undefined\n  }\n  return value\n    .split(';')\n    .map((row) => row.split(',').map(Number)) as unknown as TransformationMatrix\n}\n", "import { Format } from './types'\n\nexport const FORMAT_SUPPORTS_AUDIO: Record<Format, boolean> = {\n  RTP_H264: true,\n  RTP_JPEG: false,\n  MP4_H264: true,\n  JPEG: false,\n}\n", "import { RefObject, useCallback, useEffect, useState } from 'react'\n\n/**\n * Use a state set by an event:\n *  - default state is false\n *  - when event fired, state is true\n *\n * @param {Object} ref A React ref for the element\n * @param {String} eventName The name of the event setting the state to true\n * @return {Array} The boolean state and a function to switch state to false\n */\nexport const useEventState = (\n  ref: RefObject<HTMLElement>,\n  eventName: string\n): readonly [boolean, () => void] => {\n  const [eventState, setEventState] = useState(false)\n\n  const setEventStateTrue = useCallback(() => setEventState(true), [])\n  const setEventStateFalse = useCallback(() => setEventState(false), [])\n\n  useEffect(() => {\n    const el = ref.current\n    if (!eventState && el !== null) {\n      el.addEventListener(eventName, setEventStateTrue)\n\n      return () => {\n        el.removeEventListener(eventName, setEventStateTrue)\n      }\n    }\n  }, [eventState, eventName, ref, setEventStateTrue])\n\n  return [eventState, setEventStateFalse]\n}\n", "import { useEffect } from 'react'\n\nimport { Debugger } from 'debug'\n\n/**\n * Show debug logs with information received from\n * 'progress' & 'timeupdate' events including the current\n * up time, delay and end time of last buffer.\n * bufferedEnd: the last buffered time\n * currentTime: current playback time\n * delay: the last buffered time - current playback time\n */\nexport const useVideoDebug = (\n  videoEl: HTMLVideoElement | null,\n  debugLog: Debugger\n) => {\n  useEffect(() => {\n    if (videoEl === null) {\n      return\n    }\n\n    const onUpdate = () => {\n      try {\n        const currentTime = videoEl.currentTime\n        const bufferedEnd = videoEl.buffered.end(videoEl.buffered.length - 1)\n\n        debugLog('%o', {\n          delay: bufferedEnd - currentTime,\n          currentTime,\n          bufferedEnd,\n        })\n      } catch (err) {\n        debugLog('%o', err)\n      }\n    }\n\n    videoEl.addEventListener('timeupdate', onUpdate)\n    videoEl.addEventListener('progress', onUpdate)\n\n    return () => {\n      videoEl.removeEventListener('timeupdate', onUpdate)\n      videoEl.removeEventListener('progress', onUpdate)\n    }\n  }, [debugLog, videoEl])\n}\n", "export enum Format {\n  'RTP_H264' = 'RTP_H264',\n  'RTP_JPEG' = 'RTP_JPEG',\n  'JPEG' = 'JPEG',\n  'MP4_H264' = 'MP4_H264',\n}\n", "import React, { useEffect, useRef } from 'react'\n\nimport debug from 'debug'\nimport styled from 'styled-components'\n\nimport { FORMAT_SUPPORTS_AUDIO } from './constants'\nimport { useEventState } from './hooks/useEventState'\nimport { VideoProperties } from './PlaybackArea'\nimport { Format } from './types'\n\nconst debugLog = debug('msp:still-image')\n\nconst ImageNative = styled.img`\n  max-height: 100%;\n  object-fit: contain;\n  width: 100%;\n`\n\ninterface StillImageProps {\n  readonly forwardedRef?: React.Ref<HTMLImageElement>\n  readonly play?: boolean\n  readonly src?: string\n  readonly onPlaying: (props: VideoProperties) => void\n}\n\n/**\n * Properties:\n *\n * play: indicated the _intended_ playback state\n * ws/rtsp: src URIs for WebSocket/RTP server\n *\n * Internal state:\n * canplay: there is enough data on the video element to play\n * playing: the video element playback is progressing\n */\n\nlet cachebust = 0\nexport const StillImage: React.FC<StillImageProps> = ({\n  forwardedRef,\n  play = false,\n  onPlaying,\n  src,\n}) => {\n  let imgRef = useRef<HTMLImageElement>(null)\n\n  // Forwarded refs can either be a callback or the result of useRef\n  if (typeof forwardedRef === 'function') {\n    forwardedRef(imgRef.current)\n  } else if (forwardedRef) {\n    imgRef = forwardedRef\n  }\n\n  // State tied to events\n  const [loaded, unsetLoaded] = useEventState(imgRef, 'load')\n\n  useEffect(() => {\n    const imgEl = imgRef.current\n    if (imgEl === null) {\n      return\n    }\n    if (play && src !== undefined) {\n      imgEl.src = `${src}&cachebust=${cachebust++}`\n      return () => {\n        imgEl.src = ''\n        unsetLoaded()\n      }\n    }\n  }, [play, src, unsetLoaded])\n\n  // keep a stable reference to the external onPlaying callback\n  const __onPlayingRef = useRef(onPlaying)\n  __onPlayingRef.current = onPlaying\n\n  useEffect(() => {\n    const el = imgRef.current\n    if (loaded && el !== null && __onPlayingRef.current !== undefined) {\n      __onPlayingRef.current({\n        el,\n        width: el.naturalWidth,\n        height: el.naturalHeight,\n        formatSupportsAudio: FORMAT_SUPPORTS_AUDIO[Format.JPEG],\n      })\n    }\n  }, [loaded])\n\n  debugLog('render image', loaded)\n  return <ImageNative ref={imgRef} />\n}\n", "import React, { useEffect, useRef, useState } from 'react'\n\nimport debug from 'debug'\nimport {\n  isRtcpBye,\n  pipelines,\n  Rtcp,\n  Sdp,\n  TransformationMatrix,\n  utils,\n  VideoMedia,\n} from 'media-stream-library'\nimport styled from 'styled-components'\n\nimport { FORMAT_SUPPORTS_AUDIO } from './constants'\nimport { Range, VideoProperties } from './PlaybackArea'\nimport { Format } from './types'\n\nconst debugLog = debug('msp:ws-rtsp-video')\n\nconst CanvasNative = styled.canvas`\n  max-height: 100%;\n  object-fit: contain;\n  width: 100%;\n`\n\ninterface WsRtspCanvasProps {\n  readonly forwardedRef?: React.Ref<HTMLCanvasElement>\n  /**\n   * The _intended_ playback state.\n   */\n  readonly play?: boolean\n  /**\n   * The source URI for the WebSocket server.\n   */\n  readonly ws?: string\n  /**\n   * The RTSP URI.\n   */\n  readonly rtsp?: string\n  /**\n   * Callback to signal video is playing.\n   */\n  readonly onPlaying: (props: VideoProperties) => void\n  /**\n   * Callback to signal video ended.\n   */\n  readonly onEnded?: () => void\n  /**\n   * Callback when SDP data is received.\n   */\n  readonly onSdp?: (msg: Sdp) => void\n  /**\n   * Callback when RTCP data is received.\n   */\n  readonly onRtcp?: (msg: Rtcp) => void\n  /**\n   * Start playing from a specific offset (in seconds)\n   */\n  readonly offset?: number\n\n  /**\n   * Activate automatic retries on RTSP errors.\n   */\n  readonly autoRetry?: boolean\n}\n\n/**\n * Properties:\n *\n * play: indicated the _intended_ playback state\n * ws/rtsp: src URIs for WebSocket/RTP server\n *\n * Internal state:\n * canplay: there is enough data on the video element to play\n * playing: the video element playback is progressing\n */\n\nexport const WsRtspCanvas: React.FC<WsRtspCanvasProps> = ({\n  forwardedRef,\n  play = true,\n  ws = '',\n  rtsp = '',\n  onPlaying,\n  onEnded,\n  onSdp,\n  onRtcp,\n  offset = 0,\n  autoRetry = false,\n}) => {\n  let canvasRef = useRef<HTMLCanvasElement>(null)\n\n  // Forwarded refs can either be a callback or the result of useRef\n  if (typeof forwardedRef === 'function') {\n    forwardedRef(canvasRef.current)\n  } else if (forwardedRef) {\n    canvasRef = forwardedRef\n  }\n\n  // State tied to resources\n  const [pipeline, setPipeline] = useState<\n    null | pipelines.Html5CanvasPipeline\n  >(null)\n  const [fetching, setFetching] = useState(false)\n\n  // keep track of changes in starting time\n  // (offset in seconds to start playing from)\n  const __offsetRef = useRef(offset)\n  const __rangeRef = useRef<Range>([offset, undefined])\n\n  /**\n   * Show debug log for current time.\n   * currentTime: current playback time\n   */\n  const timeout = useRef<number | undefined>(undefined)\n  useEffect(() => {\n    if (pipeline === null) {\n      return\n    }\n\n    timeout.current = window.setInterval(() => {\n      const { currentTime } = pipeline\n      debugLog('%o', { currentTime })\n    }, 1000)\n\n    return () => window.clearTimeout(timeout.current)\n  }, [pipeline])\n\n  useEffect(() => {\n    __offsetRef.current = offset\n    const canvas = canvasRef.current\n    if (ws && rtsp && canvas) {\n      debugLog('create pipeline')\n      const newPipeline = new pipelines.Html5CanvasPipeline({\n        ws: { uri: ws },\n        rtsp: { uri: rtsp },\n        mediaElement: canvas,\n      })\n      if (autoRetry) {\n        utils.addRTSPRetry(newPipeline.rtsp)\n      }\n      setPipeline(newPipeline)\n\n      return () => {\n        debugLog('destroy pipeline')\n        newPipeline.pause()\n        newPipeline.close()\n        setPipeline(null)\n        setFetching(false)\n        debugLog('canvas cleared')\n      }\n    }\n  }, [ws, rtsp, offset, autoRetry])\n\n  // keep a stable reference to the external onPlaying callback\n  const __onPlayingRef = useRef(onPlaying)\n  __onPlayingRef.current = onPlaying\n\n  // keep a stable reference to the external onEnded callback\n  const __onEndedRef = useRef(onEnded)\n  __onEndedRef.current = onEnded\n\n  // keep a stable reference to the external SDP handler\n  const __onSdpRef = useRef(onSdp)\n  __onSdpRef.current = onSdp\n\n  // keep a stable reference to the external RTCP handler\n  const __onRtcpRef = useRef(onRtcp)\n  __onRtcpRef.current = onRtcp\n\n  const __sensorTmRef = useRef<TransformationMatrix>()\n\n  useEffect(() => {\n    if (play && pipeline && !fetching) {\n      pipeline.ready\n        .then(() => {\n          debugLog('fetch')\n          pipeline.onSdp = (sdp) => {\n            const videoMedia = sdp.media.find((m): m is VideoMedia => {\n              return m.type === 'video'\n            })\n            if (videoMedia !== undefined) {\n              __sensorTmRef.current = videoMedia['x-sensor-transform']\n                ?? videoMedia['transform']\n            }\n            if (__onSdpRef.current !== undefined) {\n              __onSdpRef.current(sdp)\n            }\n          }\n\n          pipeline.rtsp.onRtcp = (rtcp) => {\n            __onRtcpRef.current?.(rtcp)\n\n            if (isRtcpBye(rtcp)) {\n              __onEndedRef.current?.()\n            }\n          }\n\n          pipeline.rtsp.onPlay = (range) => {\n            if (range !== undefined) {\n              __rangeRef.current = [\n                parseFloat(range[0]) || 0,\n                parseFloat(range[1]) || undefined,\n              ]\n            }\n          }\n          pipeline.rtsp.play(__offsetRef.current)\n          setFetching(true)\n        })\n        .catch(console.error)\n    } else if (play && pipeline !== null) {\n      debugLog('play')\n      pipeline.play()\n\n      // Callback `onCanPlay` is called when the canvas element is ready to\n      // play. We need to wait for that event to get the correct width/height.\n      pipeline.onCanplay = () => {\n        if (\n          canvasRef.current !== null\n          && __onPlayingRef.current !== undefined\n        ) {\n          __onPlayingRef.current({\n            el: canvasRef.current,\n            width: canvasRef.current.width,\n            height: canvasRef.current.height,\n            formatSupportsAudio: FORMAT_SUPPORTS_AUDIO[Format.RTP_JPEG],\n            range: __rangeRef.current,\n            sensorTm: __sensorTmRef.current,\n          })\n        }\n      }\n    } else if (!play && pipeline) {\n      debugLog('pause')\n      pipeline.pause()\n    }\n  }, [play, pipeline, fetching])\n\n  return <CanvasNative ref={canvasRef} />\n}\n", "import React, { useEffect, useRef, useState } from 'react'\n\nimport debug from 'debug'\nimport {\n  isRtcpBye,\n  pipelines,\n  Rtcp,\n  Sdp,\n  TransformationMatrix,\n  utils,\n  VideoMedia,\n} from 'media-stream-library'\nimport styled from 'styled-components'\n\nimport { FORMAT_SUPPORTS_AUDIO } from './constants'\nimport { useEventState } from './hooks/useEventState'\nimport { useVideoDebug } from './hooks/useVideoDebug'\nimport {\n  attachMetadataHandler,\n  MetadataHandler,\n  ScheduledMessage,\n} from './metadata'\nimport { Range, VideoProperties } from './PlaybackArea'\nimport { Format } from './types'\n\nconst debugLog = debug('msp:ws-rtsp-video')\n\nconst VideoNative = styled.video`\n  max-height: 100%;\n  object-fit: contain;\n  width: 100%;\n`\n\n/**\n * WebSocket + RTSP playback component.\n */\n\ninterface WsRtspVideoProps {\n  readonly forwardedRef?: React.Ref<HTMLVideoElement>\n  /**\n   * The _intended_ playback state.\n   */\n  readonly play?: boolean\n  /**\n   * The source URI for the WebSocket server.\n   */\n  readonly ws?: string\n  /**\n   * The RTSP URI.\n   */\n  readonly rtsp?: string\n  /**\n   * Activate automatic playback.\n   */\n  readonly autoPlay?: boolean\n  /**\n   * Default mute state.\n   */\n  readonly muted?: boolean\n  /**\n   * Callback to signal video is playing.\n   */\n  readonly onPlaying?: (videoProperties: VideoProperties) => void\n  /**\n   * Callback to signal video ended.\n   */\n  readonly onEnded?: () => void\n  /**\n   * Callback when SDP data is received.\n   */\n  readonly onSdp?: (msg: Sdp) => void\n  /**\n   * Callback when RTCP data is received.\n   */\n  readonly onRtcp?: (msg: Rtcp) => void\n  readonly metadataHandler?: MetadataHandler\n  /**\n   * Start playing from a specific offset (in seconds)\n   */\n  readonly offset?: number\n\n  /**\n   * Activate automatic retries on RTSP errors.\n   */\n  readonly autoRetry?: boolean\n}\n\nexport const WsRtspVideo: React.FC<WsRtspVideoProps> = ({\n  forwardedRef,\n  play = false,\n  ws,\n  rtsp,\n  autoPlay = true,\n  muted = true,\n  onPlaying,\n  onEnded,\n  onSdp,\n  onRtcp,\n  metadataHandler,\n  offset = 0,\n  autoRetry = false,\n}) => {\n  let videoRef = useRef<HTMLVideoElement>(null)\n\n  // Forwarded refs can either be a callback or the result of useRef\n  if (typeof forwardedRef === 'function') {\n    forwardedRef(videoRef.current)\n  } else if (forwardedRef) {\n    videoRef = forwardedRef\n  }\n\n  /**\n   * Internal state:\n   * -> canplay: there is enough data on the video element to play.\n   * -> playing: the video element playback is progressing.\n   */\n  const [canplay, unsetCanplay] = useEventState(videoRef, 'canplay')\n  const [playing, unsetPlaying] = useEventState(videoRef, 'playing')\n\n  // State tied to resources\n  const [pipeline, setPipeline] = useState<null | pipelines.Html5VideoPipeline>(\n    null\n  )\n  const [fetching, setFetching] = useState(false)\n\n  // keep track of changes in starting time\n  // (offset in seconds to start playing from)\n  const __offsetRef = useRef(offset)\n  const __rangeRef = useRef<Range>([offset, undefined])\n\n  // keep a stable reference to the external onPlaying callback\n  const __onPlayingRef = useRef(onPlaying)\n  __onPlayingRef.current = onPlaying\n\n  // keep a stable reference to the external onEnded callback\n  const __onEndedRef = useRef(onEnded)\n  __onEndedRef.current = onEnded\n\n  const __sensorTmRef = useRef<TransformationMatrix>()\n\n  useVideoDebug(videoRef.current, debugLog)\n\n  useEffect(() => {\n    const videoEl = videoRef.current\n\n    if (videoEl === null) {\n      return\n    }\n\n    if (play && canplay === true && playing === false) {\n      debugLog('play')\n      videoEl.play().catch((err) => {\n        console.error('VideoElement error: ', err.message)\n      })\n\n      const { videoHeight, videoWidth } = videoEl\n      debugLog('%o', {\n        videoHeight,\n        videoWidth,\n      })\n    } else if (!play && playing === true) {\n      debugLog('pause')\n      videoEl.pause()\n      unsetPlaying()\n    } else if (play && playing === true) {\n      if (__onPlayingRef.current !== undefined) {\n        __onPlayingRef.current({\n          el: videoEl,\n          pipeline: pipeline ?? undefined,\n          width: videoEl.videoWidth,\n          height: videoEl.videoHeight,\n          formatSupportsAudio: FORMAT_SUPPORTS_AUDIO[Format.RTP_H264],\n          volume: pipeline?.tracks?.find((track) => track.type === 'audio')\n            ? videoEl.volume\n            : undefined,\n          range: __rangeRef.current,\n          sensorTm: __sensorTmRef.current,\n        })\n      }\n    }\n  }, [play, canplay, playing, unsetPlaying, pipeline])\n\n  // keep a stable reference to the external metadatahandler\n  const __metadataHandlerRef = useRef(metadataHandler)\n  __metadataHandlerRef.current = metadataHandler\n\n  useEffect(() => {\n    const videoEl = videoRef.current\n    __offsetRef.current = offset\n\n    if (\n      ws !== undefined\n      && ws.length > 0\n      && rtsp !== undefined\n      && rtsp.length > 0\n      && videoEl !== null\n    ) {\n      debugLog('create pipeline', ws, rtsp)\n      const newPipeline = new pipelines.Html5VideoPipeline({\n        ws: { uri: ws },\n        rtsp: { uri: rtsp },\n        mediaElement: videoEl,\n      })\n      if (autoRetry) {\n        utils.addRTSPRetry(newPipeline.rtsp)\n      }\n      setPipeline(newPipeline)\n\n      let scheduler: utils.Scheduler<ScheduledMessage> | undefined\n      if (__metadataHandlerRef.current !== undefined) {\n        scheduler = attachMetadataHandler(\n          newPipeline,\n          __metadataHandlerRef.current\n        )\n      }\n\n      return () => {\n        debugLog('close pipeline and clear video')\n        newPipeline.close()\n        videoEl.src = ''\n        scheduler?.reset()\n        setPipeline(null)\n        setFetching(false)\n        unsetCanplay()\n        unsetPlaying()\n      }\n    }\n  }, [ws, rtsp, offset, unsetCanplay, unsetPlaying, autoRetry])\n\n  // keep a stable reference to the external SDP handler\n  const __onSdpRef = useRef(onSdp)\n  __onSdpRef.current = onSdp\n\n  // keep a stable reference to the external RTCP handler\n  const __onRtcpRef = useRef(onRtcp)\n  __onRtcpRef.current = onRtcp\n\n  useEffect(() => {\n    if (play && pipeline && !fetching) {\n      pipeline.ready\n        .then(() => {\n          pipeline.onSdp = (sdp) => {\n            const videoMedia = sdp.media.find((m): m is VideoMedia => {\n              return m.type === 'video'\n            })\n            if (videoMedia !== undefined) {\n              __sensorTmRef.current = videoMedia['x-sensor-transform']\n                ?? videoMedia['transform']\n            }\n            if (__onSdpRef.current !== undefined) {\n              __onSdpRef.current(sdp)\n            }\n          }\n\n          pipeline.rtsp.onRtcp = (rtcp) => {\n            __onRtcpRef.current?.(rtcp)\n\n            if (isRtcpBye(rtcp)) {\n              __onEndedRef.current?.()\n            }\n          }\n\n          pipeline.rtsp.onPlay = (range) => {\n            if (range !== undefined) {\n              __rangeRef.current = [\n                parseFloat(range[0]) || 0,\n                parseFloat(range[1]) || undefined,\n              ]\n            }\n          }\n          pipeline.rtsp.play(__offsetRef.current)\n        })\n        .catch((err) => {\n          console.error(err)\n        })\n      debugLog('initiated data fetching')\n      setFetching(true)\n    }\n  }, [play, pipeline, fetching])\n\n  return <VideoNative autoPlay={autoPlay} muted={muted} ref={videoRef} />\n}\n", "import {\n  components,\n  MessageType,\n  pipelines,\n  utils,\n  XmlMessage,\n} from 'media-stream-library'\n\n/**\n * Metadata handlers\n *\n * For video streams that also include ONVIF metadata,\n * once can specify a parser + synced callback to be run\n * whenever metadata occurs on the stream.\n *\n * The `parser` provided produces a scheduled message, that\n * will be returned later through the `cb` synched callback,\n * whenever the message is synchronized with the presentation.\n */\nexport interface MetadataXMLMessage extends XmlMessage {\n  readonly xmlDocument: XMLDocument\n}\nexport interface ScheduledMessage {\n  readonly ntpTimestamp: number | undefined\n  readonly data: unknown\n}\nexport type MetadataParser = (msg: MetadataXMLMessage) => ScheduledMessage\nexport type MetadataCallback = (msg: ScheduledMessage) => void\nexport interface MetadataHandler {\n  /**\n   * A parser that will receive an XML message and should return\n   * a new message with at least an ntpTimestamp.\n   */\n  readonly parser: MetadataParser\n  /**\n   * A synchronized callback that will be called whenever the message\n   * produced by the parser is in sync with the video.\n   */\n  readonly cb: MetadataCallback\n}\n\n/**\n * Attach ONVIF metadata handlers to a pipeline\n *\n * @param pipeline The (HTML5 video) pipeline to modify\n * @param handlers The handlers to deal with XML data\n */\nexport const attachMetadataHandler = (\n  pipeline: pipelines.Html5VideoPipeline,\n  { parser, cb }: MetadataHandler\n): utils.Scheduler<ScheduledMessage> => {\n  /**\n   * When a metadata handler is available on this component, it will be\n   * called in sync with the player, using a scheduler to synchronize the\n   * callback with the video presentation time.\n   */\n  const scheduler = new utils.Scheduler(pipeline, cb, 30)\n  const xmlParser = new DOMParser()\n\n  const xmlMessageHandler = (msg: XmlMessage) => {\n    const xmlDocument = xmlParser.parseFromString(\n      msg.data.toString(),\n      'text/xml'\n    )\n    const newMsg = parser({ ...msg, xmlDocument })\n    if (msg.ntpTimestamp !== undefined) {\n      scheduler.run(newMsg)\n    }\n  }\n\n  // Add extra components to the pipeline.\n  const onvifDepay = new components.ONVIFDepay()\n  const onvifHandlerPipe = components.Tube.fromHandlers((msg) => {\n    if (msg.type === MessageType.XML) {\n      xmlMessageHandler(msg)\n    }\n  }, undefined)\n  pipeline.insertAfter(pipeline.rtsp, onvifDepay)\n  pipeline.insertAfter(onvifDepay, onvifHandlerPipe)\n\n  // Initialize the scheduler when presentation time is ready\n  pipeline.onSync = (ntpPresentationTime: number) =>\n    scheduler.init(ntpPresentationTime)\n\n  return scheduler\n}\n", "import React, {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react'\n\nimport { Sdp } from 'media-stream-library'\n\nimport { Limiter } from './components/Limiter'\nimport { MediaStreamPlayerContainer } from './components/MediaStreamPlayerContainer'\nimport { Container, Layer } from './Container'\nimport { Controls } from './Controls'\nimport { Feedback } from './Feedback'\nimport { useSwitch } from './hooks/useSwitch'\nimport { MetadataHandler } from './metadata'\nimport {\n  PlaybackArea,\n  PlayerNativeElement,\n  VapixParameters,\n  VideoProperties,\n} from './PlaybackArea'\nimport { Stats } from './Stats'\nimport { Format } from './types'\nimport { getImageURL } from './utils'\n\nconst DEFAULT_FORMAT = Format.JPEG\n\ninterface PlayerProps {\n  readonly hostname: string\n  readonly vapixParams?: VapixParameters\n  readonly initialFormat?: Format\n  readonly autoPlay?: boolean\n  readonly onSdp?: (msg: Sdp) => void\n  readonly metadataHandler?: MetadataHandler\n  /**\n   * Set to true if the camera requires a secure\n   * connection, \"https\" and \"wss\" protocols.\n   */\n  readonly secure?: boolean\n  readonly aspectRatio?: number\n  readonly className?: string\n  /**\n   * When playing a recording, the time the video started\n   * (used for labeling with an absolute time) formatted\n   * as an ISO time, e.g.: 2021-02-03T12:21:57.465715Z\n   */\n  readonly startTime?: string\n  /**\n   * When playing a recording, the total duration of the video\n   * if known by the user (and not reported from backend) in\n   * seconds.\n   */\n  readonly duration?: number\n\n  /**\n   * Activate automatic retries on RTSP errors.\n   */\n  readonly autoRetry?: boolean\n}\n\nexport const Player = forwardRef<PlayerNativeElement, PlayerProps>(\n  (\n    {\n      hostname,\n      vapixParams = {},\n      initialFormat = DEFAULT_FORMAT,\n      autoPlay = false,\n      onSdp,\n      metadataHandler,\n      secure,\n      className,\n      startTime,\n      duration,\n      autoRetry = false,\n    },\n    ref\n  ) => {\n    const [play, setPlay] = useState(autoPlay)\n    const [offset, setOffset] = useState(0)\n    const [refresh, setRefresh] = useState(0)\n    const [host, setHost] = useState(hostname)\n    const [waiting, setWaiting] = useState(autoPlay)\n    const [volume, setVolume] = useState<number>()\n    const [format, setFormat] = useState<Format>(initialFormat)\n\n    /**\n     * VAPIX parameters\n     */\n    const [parameters, setParameters] = useState(vapixParams)\n\n    useEffect(() => {\n      /**\n       * Check if localStorage actually exists, since if you\n       * server side render, localStorage won't be available.\n       */\n      if (window?.localStorage !== undefined) {\n        window.localStorage.setItem('vapix', JSON.stringify(parameters))\n      }\n    }, [parameters])\n\n    /**\n     * Stats overlay\n     */\n    const [showStatsOverlay, toggleStatsOverlay] = useSwitch(\n      window?.localStorage !== undefined\n        ? window.localStorage.getItem('stats-overlay') === 'on'\n        : false\n    )\n    const [statsExpanded, setStatsExpanded] = useState(true)\n\n    useEffect(() => {\n      if (window?.localStorage !== undefined) {\n        window.localStorage.setItem(\n          'stats-overlay',\n          showStatsOverlay ? 'on' : 'off'\n        )\n      }\n    }, [showStatsOverlay])\n\n    /**\n     * Controls\n     */\n    const [videoProperties, setVideoProperties] = useState<VideoProperties>()\n\n    const onPlaying = useCallback(\n      (props: VideoProperties) => {\n        setVideoProperties(props)\n        setWaiting(false)\n        setVolume(props.volume)\n      },\n      [setWaiting]\n    )\n\n    const onPlayPause = useCallback(() => {\n      if (play) {\n        setPlay(false)\n      } else {\n        setWaiting(true)\n        setHost(hostname)\n        setPlay(true)\n      }\n    }, [play, hostname])\n\n    const onRefresh = useCallback(() => {\n      setPlay(true)\n      setRefresh((value) => value + 1)\n      setWaiting(true)\n    }, [])\n\n    const onScreenshot = useCallback(() => {\n      if (videoProperties === undefined) {\n        return undefined\n      }\n\n      const { el, width, height } = videoProperties\n      const imageURL = getImageURL(el, { width, height })\n      const link = document.createElement('a')\n      const event = new window.MouseEvent('click')\n\n      link.download = `snapshot_${Date.now()}.jpg`\n      link.href = imageURL\n      link.dispatchEvent(event)\n    }, [videoProperties])\n\n    const onStop = useCallback(() => {\n      setPlay(false)\n      setHost('')\n      setWaiting(false)\n    }, [])\n\n    const onVapix = useCallback((key: string, value: string) => {\n      setParameters((p: typeof vapixParams) => {\n        const newParams = { ...p, [key]: value }\n        if (value === '') {\n          delete newParams[key]\n        }\n        return newParams\n      })\n      setRefresh((refreshCount) => refreshCount + 1)\n    }, [])\n\n    /**\n     * Refresh when changing visibility (e.g. when you leave a tab the\n     * video will halt, so when you return we need to play again).\n     */\n    useEffect(() => {\n      const cb = () => {\n        if (document.visibilityState === 'visible') {\n          setPlay(true)\n          setHost(hostname)\n        } else if (document.visibilityState === 'hidden') {\n          setPlay(false)\n          setWaiting(false)\n          setHost('')\n        }\n      }\n\n      document.addEventListener('visibilitychange', cb)\n\n      return () => document.removeEventListener('visibilitychange', cb)\n    }, [hostname])\n\n    /**\n     * Aspect ratio\n     *\n     * This needs to be set so make the Container (and Layers) match the size of\n     * the visible image of the video or still image.\n     */\n\n    const naturalAspectRatio = useMemo(() => {\n      if (videoProperties === undefined) {\n        return undefined\n      }\n\n      const { width, height } = videoProperties\n\n      return width / height\n    }, [videoProperties])\n\n    /**\n     * Limit video size.\n     *\n     * The video size should not expand outside the available container, and\n     * should be recomputed on resize.\n     */\n\n    const limiterRef = useRef<HTMLDivElement>(null)\n    useLayoutEffect(() => {\n      if (naturalAspectRatio === undefined || limiterRef.current === null) {\n        return\n      }\n\n      const observer = new window.ResizeObserver(([entry]) => {\n        const element = entry.target as HTMLElement\n        const maxWidth = element.clientHeight * naturalAspectRatio\n        element.style.maxWidth = `${maxWidth}px`\n      })\n      observer.observe(limiterRef.current)\n\n      return () => observer.disconnect()\n    }, [naturalAspectRatio])\n\n    /**\n     * Volume control on the VideoElement (h264 only)\n     */\n    useEffect(() => {\n      if (videoProperties?.volume !== undefined && volume !== undefined) {\n        const videoEl = videoProperties.el as HTMLVideoElement\n        videoEl.muted = volume === 0\n        videoEl.volume = volume\n      }\n    }, [videoProperties, volume])\n\n    /**\n     * Refresh on stream end\n     */\n    const onEnded = useCallback(() => {\n      if (autoRetry) {\n        onRefresh()\n      }\n    }, [autoRetry, onRefresh])\n\n    /**\n     * Render\n     *\n     * Each layer is positioned exactly on top of the visible image, since the\n     * aspect ratio is carried over to the container, and the layers match the\n     * container size.\n     *\n     * There is a layer for the spinner (feedback), a statistics overlay, and a\n     * control bar with play/pause/stop/refresh and a settings menu.\n     */\n\n    return (\n      <MediaStreamPlayerContainer className={className}>\n        <Limiter ref={limiterRef}>\n          <Container aspectRatio={naturalAspectRatio}>\n            <Layer>\n              <PlaybackArea\n                forwardedRef={ref}\n                refresh={refresh}\n                play={play}\n                offset={offset}\n                host={host}\n                format={format}\n                parameters={parameters}\n                onPlaying={onPlaying}\n                onEnded={onEnded}\n                onSdp={onSdp}\n                metadataHandler={metadataHandler}\n                secure={secure}\n                autoRetry={autoRetry}\n              />\n            </Layer>\n            <Layer>\n              <Feedback waiting={waiting} />\n            </Layer>\n            <Layer>\n              <Controls\n                play={play}\n                videoProperties={videoProperties}\n                src={host}\n                parameters={parameters}\n                onPlay={onPlayPause}\n                onStop={onStop}\n                onRefresh={onRefresh}\n                onScreenshot={onScreenshot}\n                onFormat={setFormat}\n                onVapix={onVapix}\n                onSeek={setOffset}\n                labels={{\n                  play: 'Play',\n                  pause: 'Pause',\n                  stop: 'Stop',\n                  refresh: 'Refresh',\n                  settings: 'Settings',\n                  screenshot: 'Take a snapshot',\n                  volume: 'Volume',\n                }}\n                showStatsOverlay={showStatsOverlay}\n                toggleStats={toggleStatsOverlay}\n                format={format}\n                volume={volume}\n                setVolume={setVolume}\n                startTime={startTime}\n                duration={duration}\n              />\n            </Layer>\n            {showStatsOverlay && videoProperties !== undefined\n              ? (\n                <Stats\n                  format={format}\n                  videoProperties={videoProperties}\n                  refresh={refresh}\n                  volume={volume}\n                  expanded={statsExpanded}\n                  onToggleExpanded={setStatsExpanded}\n                />\n              )\n              : null}\n          </Container>\n        </Limiter>\n      </MediaStreamPlayerContainer>\n    )\n  }\n)\n\nPlayer.displayName = 'Player'\n", "import React from 'react'\n\nimport styled from 'styled-components'\n\nimport { Spinner } from './img'\n\nconst FeedbackArea = styled.div`\n  width: 100%;\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n`\n\ninterface FeedbackProps {\n  readonly waiting?: boolean\n}\n\nexport const Feedback: React.FC<FeedbackProps> = ({ waiting = false }) => (\n  <FeedbackArea>{waiting && <Spinner />}</FeedbackArea>\n)\n", "import { useCallback, useState } from 'react'\n\nexport const useSwitch = (\n  initialValue = false\n): readonly [boolean, (state?: boolean) => void] => {\n  const [value, setValue] = useState(initialValue)\n\n  const toggleValue = useCallback(\n    (state?: boolean) => {\n      if (state !== undefined) {\n        setValue(state)\n      } else {\n        setValue((oldValue) => !oldValue)\n      }\n    },\n    [setValue]\n  )\n\n  return [value, toggleValue]\n}\n", "import React, {\n  MouseEventHandler,\n  useCallback,\n  useEffect,\n  useState,\n} from 'react'\n\nimport { Html5VideoPipeline } from 'media-stream-library'\nimport { useInterval } from 'react-hooks-shareable'\nimport styled from 'styled-components'\n\nimport { StreamStats } from './img'\nimport { PlayerPipeline, VideoProperties } from './PlaybackArea'\nimport { Format } from './types'\n\nconst isHtml5VideoPipeline = (\n  pipeline: PlayerPipeline | null | undefined\n): pipeline is Html5VideoPipeline => {\n  return (pipeline as Html5VideoPipeline)?.tracks !== undefined\n}\n\nconst StatsWrapper = styled.div`\n  position: absolute;\n  top: 24px;\n  left: 24px;\n  width: 360px;\n  min-width: 240px;\n  max-width: 80%;\n  max-height: 80%;\n  border-radius: 4px;\n  background: #292929 0% 0% no-repeat padding-box;\n  opacity: 0.88;\n`\n\nconst StatsHeader = styled.div`\n  padding: 8px 24px;\n  border-bottom: 1px solid #525252;\n`\n\nconst StatsIcon = styled.span<{ readonly clickable: boolean }>`\n  width: 24px;\n  height: 24px;\n  float: left;\n  cursor: ${({ clickable }) => (clickable ? 'pointer' : 'default')};\n\n  & > svg {\n    fill: #e0e0e0;\n  }\n`\n\nconst StatsTitle = styled.span`\n  display: inline-block;\n  margin-left: 8px;\n  vertical-align: sub;\n  text-align: left;\n  font-size: 16px;\n  font-family: 'Open Sans', Sans-Serif;\n  line-height: 22px;\n  color: #f5f5f5;\n`\n\nconst StatsHide = styled.span`\n  float: right;\n  text-align: right;\n`\n\nconst HideLink = styled.a`\n  vertical-align: sub;\n  text-decoration: none;\n  font-size: 16px;\n  font-family: 'Open Sans', Sans-Serif;\n  line-height: 22px;\n  color: #b8b8b8;\n`\n\nconst Data = styled.div`\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  column-gap: 24px;\n  row-gap: 16px;\n  width: 100%;\n  padding: 16px 24px 24px;\n`\n\nconst StatItem = styled.div`\n  text-align: left;\n  font-family: 'Open Sans', Sans-Serif;\n`\n\nconst StatName = styled.div`\n  font-size: 12px;\n  line-height: 17px;\n  color: #b8b8b8;\n`\n\nconst StatValue = styled.div`\n  font-size: 13px;\n  line-height: 18px;\n  color: #e0e0e0;\n`\n\nconst StatsShow = styled.div`\n  position: absolute;\n  top: 24px;\n  left: 24px;\n  width: 32px;\n  height: 32px;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  border-radius: 4px;\n  background: #292929 0% 0% no-repeat padding-box;\n  opacity: 0.88;\n`\n\ninterface StatsProps {\n  readonly format: string\n  readonly videoProperties: VideoProperties\n  readonly refresh: number\n  readonly volume?: number\n  readonly expanded: boolean\n  readonly onToggleExpanded: (value: boolean) => void\n}\n\ninterface Stat {\n  readonly name: string\n  readonly value: string | number\n  readonly unit?: string\n}\n\nconst StatsData: React.FC<\n  Omit<StatsProps, 'expanded' | 'onToggleExpanded'>\n> = ({ format, videoProperties, refresh, volume }) => {\n  const [stats, setStats] = useState<Array<Stat>>([])\n\n  // Updates stat values\n  const updateValues = useCallback(() => {\n    let streamType = 'Unknown'\n    if (format === Format.JPEG) {\n      streamType = 'Still image'\n    } else if (format === Format.RTP_H264) {\n      streamType = 'RTSP (WebSocket)'\n    } else if (format === Format.RTP_JPEG) {\n      streamType = 'MJPEG'\n    } else if (format === Format.MP4_H264) {\n      streamType = 'MP4 (HTTP)'\n    }\n    const { width, height, pipeline } = videoProperties\n    let statsData: Array<Stat> = [\n      {\n        name: 'Stream type',\n        value: streamType,\n      },\n      {\n        name: 'Resolution',\n        value: `${width}x${height}`,\n      },\n      {\n        name: 'Refreshed',\n        value: refresh,\n        unit: refresh > 1 ? 'times' : 'time',\n      },\n    ]\n    if (isHtml5VideoPipeline(pipeline)) {\n      const tracks = pipeline.tracks?.map((track, index) =>\n        Object.assign({ index }, track)\n      )\n      const videoTrack = tracks?.find((track) => track.type === 'video')\n      if (videoTrack !== undefined) {\n        const { coding, profile, level } = videoTrack?.codec\n        const framerate = Number(\n          pipeline.framerate[videoTrack.index].toFixed(2)\n        )\n        const bitrate = Math.round(pipeline.bitrate[videoTrack.index] / 1000)\n\n        statsData = statsData.concat([\n          {\n            name: 'Encoding',\n            value: `${coding} ${profile} (${level})`,\n          },\n          {\n            name: 'Frame rate',\n            value: framerate,\n            unit: 'fps',\n          },\n          {\n            name: 'Bitrate',\n            value: bitrate,\n            unit: 'kbit/s',\n          },\n        ])\n      }\n    }\n\n    if (volume !== undefined) {\n      statsData.push({\n        name: 'Volume',\n        value: Math.floor(volume * 100),\n        unit: '%',\n      })\n    }\n\n    setStats(statsData)\n  }, [format, refresh, videoProperties, volume])\n\n  useEffect(() => {\n    updateValues()\n  }, [updateValues])\n\n  useInterval(updateValues, 1000)\n\n  return (\n    <Data>\n      {stats.length > 0\n        ? stats.map((stat) => {\n          return (\n            <StatItem key={stat.name}>\n              <StatName>{stat.name}</StatName>\n              <StatValue>\n                {`${stat.value} ${stat.unit !== undefined ? stat.unit : ''}`}\n              </StatValue>\n            </StatItem>\n          )\n        })\n        : null}\n    </Data>\n  )\n}\n\nexport const Stats: React.FC<StatsProps> = ({\n  format,\n  videoProperties,\n  refresh,\n  volume,\n  expanded,\n  onToggleExpanded,\n}) => {\n  // Handles show/hide stats\n  const onToggleStats = useCallback<MouseEventHandler<HTMLAnchorElement>>(\n    (e) => {\n      e.preventDefault()\n      onToggleExpanded(!expanded)\n    },\n    [expanded, onToggleExpanded]\n  )\n\n  return (\n    <>\n      {expanded\n        ? (\n          <StatsWrapper>\n            <StatsHeader>\n              <StatsIcon clickable={false}>\n                <StreamStats />\n              </StatsIcon>\n              <StatsTitle>Client stream data</StatsTitle>\n              <StatsHide>\n                <HideLink href=\"\" onClick={onToggleStats}>\n                  Hide\n                </HideLink>\n              </StatsHide>\n            </StatsHeader>\n            <StatsData\n              format={format}\n              videoProperties={videoProperties}\n              refresh={refresh}\n              volume={volume}\n            />\n          </StatsWrapper>\n        )\n        : (\n          <StatsShow>\n            <StatsIcon onClick={onToggleStats} clickable={true}>\n              <StreamStats title=\"Show client stream data\" />\n            </StatsIcon>\n          </StatsShow>\n        )}\n    </>\n  )\n}\n", "import { Format } from '../types'\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/MediaSource\n * Most browsers supports this, except Safari on iPhone\n */\nconst MSE_SUPPORT = 'MediaSource' in window\n\nconst isMJPEGSupported = () => {\n  const isInternetExplorer = navigator.userAgent.includes('MSIE')\n    || 'ActiveXObject' in window\n  return !isInternetExplorer\n}\n\nconst isH264Supported = () => {\n  const element = document.createElement('video')\n\n  const type = element.canPlayType('video/mp4; codecs=\"avc1.640029\"')\n\n  // Note: 'maybe' and 'probably' are both considered true here\n  return type !== ''\n}\n\nexport const browserSupportedFormats: Record<Format, boolean> = {\n  [Format.RTP_H264]: isH264Supported() && MSE_SUPPORT,\n  [Format.RTP_JPEG]: isMJPEGSupported(),\n  [Format.JPEG]: true,\n  [Format.MP4_H264]: isH264Supported(),\n}\n", "export const getImageURL = (\n  el: CanvasImageSource,\n  { width, height }: { readonly width: number; readonly height: number }\n) => {\n  const canvas = document.createElement('canvas')\n\n  canvas.width = width\n  canvas.height = height\n\n  /**\n   * This has been tested and works on Chrome and Firefox.\n   * Might not work on some versions of MS Edge and IE.\n   *\n   * 2020-07-15\n   */\n  canvas?.getContext('2d')?.drawImage(el, 0, 0, width, height)\n\n  return canvas?.toDataURL('image/jpeg')\n}\n"],
  "mappings": "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",
  "names": ["import_react", "import_react", "styled", "import_styled_components", "styled", "import_styled_components", "styled", "import_styled_components", "styled", "React", "import_react", "import_styled_components", "import_react", "import_react", "React", "import_react", "React", "import_react", "React", "import_react", "React", "import_react", "React", "import_react", "React", "import_react", "React", "import_react", "React", "import_react", "import_styled_components", "import_react", "import_styled_components", "Container", "styled", "React", "styled", "React", "styled", "React", "import_react", "import_debug", "import_react", "import_styled_components", "import_react", "import_react", "debugLog", "Format", "debug", "styled", "React", "import_react", "import_debug", "import_styled_components", "debugLog", "debug", "styled", "React", "import_react", "import_debug", "import_media_stream_library", "import_styled_components", "debugLog", "debug", "styled", "React", "import_react", "import_debug", "import_media_stream_library", "import_styled_components", "import_media_stream_library", "debugLog", "debug", "VideoNative", "styled", "React", "debugLog", "debug", "AxisApi", "Protocol", "searchParams", "React", "React", "import_react", "import_react", "import_styled_components", "styled", "React", "import_react", "import_react", "import_styled_components", "styled", "React", "DEFAULT_FORMAT", "React", "React"]
}
