Skip to content

Commit

Permalink
Revert "fix: browser freezes when using shaka on long live streams"
Browse files Browse the repository at this point in the history
This reverts commit 02af012.
  • Loading branch information
DimaDemchenko committed Jan 20, 2025
1 parent dd9856a commit 6e9e093
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 42 deletions.
12 changes: 4 additions & 8 deletions packages/p2p-media-loader-shaka/src/manifest-parser-decorator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,13 +136,9 @@ export class ManifestParserDecorator implements shaka.extern.ManifestParser {

segmentIndex.get = originalGet;
try {
const referencesCount = segmentIndex.getNumReferences();
const firstItemReference = segmentIndex.get(0);
const lastItemReference = segmentIndex.get(referencesCount - 1);

if (!firstItemReference || !lastItemReference) {
return reference;
}
const references = [...segmentIndex];
const firstItemReference = references[0];
const lastItemReference = references[references.length - 1];

if (
firstItemReference === prevFirstItemReference &&
Expand All @@ -154,7 +150,7 @@ export class ManifestParserDecorator implements shaka.extern.ManifestParser {
prevLastItemReference = lastItemReference;

// Segment index have been updated
segmentManager.updateStreamSegments(stream);
segmentManager.updateStreamSegments(stream, references);
stream.isSegmentIndexAlreadyRead = true;
this.debug(`Stream ${stream.id} is updated`);
} catch {
Expand Down
51 changes: 27 additions & 24 deletions packages/p2p-media-loader-shaka/src/segment-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,26 +32,37 @@ export class SegmentManager {
if (shakaStream.segmentIndex) this.updateStreamSegments(shakaStream);
}

updateStreamSegments(shakaStream: HookedStream) {
updateStreamSegments(
shakaStream: HookedStream,
segmentReferences?: shaka.media.SegmentReference[],
) {
const stream = this.core.getStream(shakaStream.id.toString());
if (!stream) return;

const { segmentIndex } = stream.shakaStream;
if (!segmentReferences && segmentIndex) {
try {
segmentReferences = [...segmentIndex];
} catch {
return;
}
}
if (!segmentReferences) return;

if (this.streamInfo.protocol === "hls") {
this.processHlsSegmentReferences(stream);
this.processHlsSegmentReferences(stream, segmentReferences);
} else {
this.processDashSegmentReferences(stream);
this.processDashSegmentReferences(stream, segmentReferences);
}
}

private processDashSegmentReferences(
managerStream: StreamWithReadonlySegments,
segmentReferences: shaka.media.SegmentReference[],
) {
const { segmentIndex } = managerStream.shakaStream;
if (!segmentIndex) return;

const staleSegmentsIds = new Set(managerStream.segments.keys());
const newSegments: Segment[] = [];
for (const reference of segmentIndex) {
for (const reference of segmentReferences) {
const externalId = Math.trunc(
reference.getStartTime() / SEGMENT_ID_RESOLUTION_IN_SECONDS,
);
Expand All @@ -78,30 +89,22 @@ export class SegmentManager {

private processHlsSegmentReferences(
managerStream: StreamWithReadonlySegments,
segmentReferences: shaka.media.SegmentReference[],
) {
const { segmentIndex } = managerStream.shakaStream;
const { segments } = managerStream;

if (!segmentIndex) return;

const lastMediaSequence = Utils.getStreamLastMediaSequence(managerStream);
const segmentRefsCount = segmentIndex.getNumReferences();

const newSegments: Segment[] = [];
if (segments.size === 0) {
const firstReferenceMediaSequence =
lastMediaSequence === undefined
? 0
: lastMediaSequence - segmentRefsCount + 1;

for (let i = 0; i < segmentRefsCount; i++) {
const reference = segmentIndex.get(i);

if (!reference) continue;
: lastMediaSequence - segmentReferences.length + 1;

for (const [index, reference] of segmentReferences.entries()) {
const segment = Utils.createSegment({
segmentReference: reference,
externalId: firstReferenceMediaSequence + i,
externalId: firstReferenceMediaSequence + index,
});
newSegments.push(segment);
}
Expand All @@ -112,13 +115,9 @@ export class SegmentManager {
if (!lastMediaSequence) return;
let mediaSequence = lastMediaSequence;

for (let i = segmentRefsCount - 1; i >= 0; i--) {
const reference = segmentIndex.get(i);
if (!reference) continue;

for (const reference of itemsBackwards(segmentReferences)) {
const runtimeId = Utils.getSegmentRuntimeIdFromReference(reference);
if (segments.has(runtimeId)) break;

const segment = Utils.createSegment({
runtimeId,
segmentReference: reference,
Expand All @@ -144,6 +143,10 @@ export class SegmentManager {
}
}

function* itemsBackwards<T>(items: T[]) {
for (let i = items.length - 1; i >= 0; i--) yield items[i];
}

function* nSegmentsBackwards(
segments: ReadonlyMap<string, Segment>,
count: number,
Expand Down
10 changes: 0 additions & 10 deletions packages/p2p-media-loader-shaka/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,3 @@ export type HookedNetworkingEngine = shaka.net.NetworkingEngine & {
export type StreamWithReadonlySegments = Stream & {
segments: ReadonlyMap<string, SegmentWithStream>;
};

declare global {
// eslint-disable-next-line @typescript-eslint/no-namespace
namespace shaka.media {
interface SegmentIndex {
get(position: number): shaka.media.SegmentReference | null;
getNumReferences(): number;
}
}
}

0 comments on commit 6e9e093

Please sign in to comment.