From cd687070233cce45580a2f5394ed74f5d7d497e9 Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Thu, 1 Aug 2024 18:15:27 -0700 Subject: [PATCH] bframes fix (#569) * fix: storage on lvpr.tv * fix: lvpr.tv * ci: bump * fix: localstorage null * fix: lvpr.tv * fix: build * fix: storage * Deploy lvpr.tv (#529) * fix: remove element load (#518) * chore: version packages (#519) * chore: version packages * ci: bump --------- Co-authored-by: github-actions[bot] Co-authored-by: Chase Adams * feat: added broadcast config (#521) * fix: types * chore: version packages (#522) Co-authored-by: github-actions[bot] * Added playing event (#526) * fix: added playing event listener * fix: formatting * fix: tests * No cache failed playback info (#528) * fix: no cache failed playback info * fix: redundant logs * fix: lvpr.tv * chore: version packages (#527) * chore: version packages * ci: bump --------- Co-authored-by: github-actions[bot] Co-authored-by: Chase Adams --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] * Latest (#538) * Fix boot ms (#533) * fix: moved boot time into addmediametrics * chore: changeset * test: fix tests * test: fix tests * test: fix * test: remove flaky test * chore: version packages (#534) * chore: version packages * ci: bump --------- Co-authored-by: github-actions[bot] Co-authored-by: Chase Adams * fix: resolve issue with onError (#535) * chore: version packages (#536) * chore: version packages * ci: bump --------- Co-authored-by: github-actions[bot] Co-authored-by: Chase Adams * iframe Force Enabled (#537) * fix: force enabled * fix: default to true * fix: added hideEnabled --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] * chore: version packages * ci: bump * latest (#544) * chore: version packages (#541) * chore: version packages * ci: bump --------- Co-authored-by: github-actions[bot] Co-authored-by: Chase Adams * fix: access key in lvpr.tv (#543) --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] * fix: added fallback to HLS only when no tracks have bframes != 1 * chore: changeset --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] --- .changeset/short-experts-repeat.md | 8 +++ .../core-web/src/media/controls/controller.ts | 24 +++++++- packages/core/src/media/controller.ts | 58 ++++++++++++++++++- packages/core/src/media/metrics.ts | 17 ++---- packages/core/src/version.ts | 4 +- 5 files changed, 91 insertions(+), 20 deletions(-) create mode 100644 .changeset/short-experts-repeat.md diff --git a/.changeset/short-experts-repeat.md b/.changeset/short-experts-repeat.md new file mode 100644 index 00000000..afc47c32 --- /dev/null +++ b/.changeset/short-experts-repeat.md @@ -0,0 +1,8 @@ +--- +"@livepeer/core-react": patch +"@livepeer/core-web": patch +"@livepeer/react": patch +"@livepeer/core": patch +--- + +**Fix:** added fallback to HLS if webrtc is not possible for one track, or if bframes is 0. \ No newline at end of file diff --git a/packages/core-web/src/media/controls/controller.ts b/packages/core-web/src/media/controls/controller.ts index 9c04bdd3..13b33d9a 100644 --- a/packages/core-web/src/media/controls/controller.ts +++ b/packages/core-web/src/media/controls/controller.ts @@ -426,9 +426,27 @@ const addEffectsToStore = ( if (source.type === "webrtc") { const unsubscribeBframes = store.subscribe( - (state) => Boolean(state?.__metadata?.bframes), - (bframes) => { - if (bframes && !unmounted) { + (state) => state?.__metadata, + (metadata) => { + let webrtcIsPossibleForOneTrack = false; + + // Check if metadata and meta tracks are available + if (metadata?.meta?.tracks) { + // Iterate over each track in the metadata + for (const trackId of Object.keys(metadata.meta.tracks)) { + // Check if the track does not have bframes equal to 1 + if (metadata?.meta?.tracks[trackId]?.bframes !== 1) { + webrtcIsPossibleForOneTrack = true; + } + } + } + + // Determine if fallback to HLS is necessary + const shouldFallBackToHLS = + !webrtcIsPossibleForOneTrack || metadata?.meta?.bframes !== 0; + + // If fallback to HLS is needed and component is not unmounted, handle the error + if (shouldFallBackToHLS && !unmounted) { onErrorComposed(new Error(BFRAMES_ERROR_MESSAGE)); } }, diff --git a/packages/core/src/media/controller.ts b/packages/core/src/media/controller.ts index 66e74756..3a2d78c2 100644 --- a/packages/core/src/media/controller.ts +++ b/packages/core/src/media/controller.ts @@ -254,10 +254,64 @@ export type ElementSize = { width: number; height: number; }; +type MetaTrack = { + bps?: number; + channels?: number; + codec?: string; + codecstring?: string; + firstms?: number; + idx?: number; + init?: string; + jitter?: number; + lastms?: number; + maxbps?: number; + rate?: number; + size?: number; + trackid?: number; + type?: string; + height?: number; + width?: number; + fpks?: number; + bframes?: number; +}; -export type Metadata = { +type Meta = { bframes?: number; - bufferWindow?: number; + buffer_window?: number; + jitter?: number; + live?: number; + maxkeepaway?: number; + tracks?: { + [key: string]: MetaTrack; + }; + uuid?: string; + version?: number; +}; + +type Source = { + priority?: number; + relurl?: string; + simul_tracks?: number; + total_matches?: number; + type?: string; + url?: string; + hrn?: string; + player_url?: string; + RTCIceServers?: { + urls?: string; + credential?: string; + username?: string; + }[]; +}; + +export type Metadata = { + height?: number; + meta?: Meta; + selver?: number; + source?: Source[]; + type?: string; + unixoffset?: number; + width?: number; }; export type ClipLength = 90 | 60 | 45 | 30 | 15 | 10; diff --git a/packages/core/src/media/metrics.ts b/packages/core/src/media/metrics.ts index b5a195a3..e2c8b236 100644 --- a/packages/core/src/media/metrics.ts +++ b/packages/core/src/media/metrics.ts @@ -1,4 +1,4 @@ -import type { MediaControllerStore } from "./controller"; +import type { MediaControllerStore, Metadata } from "./controller"; import { getMetricsReportingWebsocketUrl } from "./metrics-utils"; import type { MimeType } from "./mime"; @@ -526,18 +526,9 @@ export function addLegacyMediaMetricsToStore( newWebSocket.addEventListener("message", (event) => { try { if (event?.data) { - const json = JSON.parse(event.data); - - if (json?.meta?.bframes || json?.meta?.buffer_window) { - store.getState().__controlsFunctions.setWebsocketMetadata({ - bframes: json?.meta?.bframes - ? Number(json?.meta?.bframes) - : undefined, - bufferWindow: json?.meta?.buffer_window - ? Number(json?.meta?.buffer_window) - : undefined, - }); - } + const json = JSON.parse(event.data) as Metadata; + + store.getState().__controlsFunctions.setWebsocketMetadata(json); } } catch (e) { console.warn("Failed to parse metadata from websocket."); diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index e81fad46..78128b0a 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -1,5 +1,5 @@ -const core = "@livepeer/core@3.2.0"; -const react = "@livepeer/react@4.2.0"; +const core = "@livepeer/core@3.2.2"; +const react = "@livepeer/react@4.2.2"; export const version = { core,