Skip to content

Commit

Permalink
slideshow: support video playing in presenter console
Browse files Browse the repository at this point in the history
Signed-off-by: Marco Cecchetti <[email protected]>
Change-Id: Ifbac6a2a642ba2b5cf57224c09543f1f0f53666e
  • Loading branch information
mcecchetti committed Jan 27, 2025
1 parent 7e3475b commit 0aa4e2f
Show file tree
Hide file tree
Showing 8 changed files with 518 additions and 269 deletions.
1 change: 1 addition & 0 deletions browser/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,7 @@ COOL_JS_LST =\
src/slideshow/LayerDrawing.ts \
src/slideshow/LayersCompositor.ts \
src/slideshow/RenderContext.ts \
src/slideshow/VideoRenderer.ts \
src/slideshow/SlideRenderer.ts \
src/slideshow/SlideShowPresenter.ts \
src/slideshow/PresenterConsole.js \
Expand Down
80 changes: 80 additions & 0 deletions browser/src/slideshow/LayerDrawing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ class LayerDrawing {
private offscreenCanvas: OffscreenCanvas = null;
private onSlideRenderingCompleteCallback: VoidFunction = null;
private layerRenderer: LayerRenderer;
private videoRenderers: Map<string, Array<VideoRenderer>> = new Map();

constructor(mapObj: any, helper: LayersCompositor) {
this.map = mapObj;
Expand All @@ -126,6 +127,7 @@ class LayerDrawing {
this.prefetchedSlideHash = null;
this.nextRequestedSlideHash = null;
this.nextPrefetchedSlideHash = null;
this.deleteVideosResources();
this.layerRenderer.dispose();
}

Expand Down Expand Up @@ -169,6 +171,75 @@ class LayerDrawing {
this.drawBackground(slideHash);
this.drawMasterPage(slideHash);
this.drawDrawPage(slideHash);
this.drawVideos(slideHash);
}

private handleVideos(slideHash: string) {
const slideInfo = this.getSlideInfo(slideHash);
const videosInfo = slideInfo.videos;
if (!videosInfo || videosInfo.length === 0) return;
this.videoRenderers.set(slideHash, []);

for (let i = 0; i < videosInfo.length; ++i) {
const videoInfo = videosInfo[i];
this.handleVideo(i, slideHash, videoInfo);
}
}

private handleVideo(index: number, slideHash: string, videoInfo: VideoInfo) {
const slideShowPresenter = app.map.slideShowPresenter;
const slideRenderer = slideShowPresenter._slideRenderer;
const metaPres = slideShowPresenter._metaPresentation;

const videoId = slideHash + index;
const videoRenderer = makeVideoRenderer(
videoId,
this.layerRenderer.getRenderContext(),
slideRenderer,
);
videoRenderer.prepareVideo(
videoInfo,
metaPres.docWidth,
metaPres.docHeight,
);

this.videoRenderers.get(slideHash).push(videoRenderer);
}

private drawVideos(slideHash: string) {
const videoRenderers = this.videoRenderers.get(slideHash);
if (!videoRenderers) return;

for (const videoRenderer of videoRenderers) {
videoRenderer.render();
}
}

public playVideos(slideHash: string) {
const videoRenderers = this.videoRenderers.get(slideHash);
if (!videoRenderers) return;

for (const videoRenderer of videoRenderers) {
videoRenderer.playVideo();
}
}

public pauseVideos(slideHash: string) {
const videoRenderers = this.videoRenderers.get(slideHash);
if (!videoRenderers) return;

for (const videoRenderer of videoRenderers) {
videoRenderer.pauseVideo();
}
}

private deleteVideosResources() {
this.videoRenderers.forEach((videoRenderers) => {
for (const videoRenderer of videoRenderers) {
videoRenderer.deleteResources();
}
});
VideoRendererGl.deleteProgram(this.layerRenderer.getRenderContext());
}

public getAnimatedLayerInfo(
Expand Down Expand Up @@ -210,6 +281,7 @@ class LayerDrawing {
this.cachedBackgrounds.clear();
this.cachedMasterPages.clear();
this.cachedDrawPages.clear();
this.videoRenderers.clear();
}

public getCanvasSize(): [number, number] {
Expand Down Expand Up @@ -241,6 +313,7 @@ class LayerDrawing {

try {
this.layerRenderer = new SlideShow.LayerRendererGl(this.offscreenCanvas);
VideoRendererGl.createProgram(this.layerRenderer.getRenderContext());
} catch (error) {
console.log('LayerDrawing: WebGl offscreen rendering not supported');
this.layerRenderer = new SlideShow.LayerRenderer2d(this.offscreenCanvas);
Expand Down Expand Up @@ -669,6 +742,13 @@ class LayerDrawing {
public getLayerRendererContext(): RenderContext {
return this.layerRenderer.getRenderContext();
}

public notifyTransitionEnd(slideHash: string) {
this.handleVideos(slideHash);
if (this.videoRenderers.has(slideHash)) {
this.playVideos(slideHash);
}
}
}

SlideShow.LayerDrawing = LayerDrawing;
8 changes: 8 additions & 0 deletions browser/src/slideshow/LayersCompositor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,14 @@ class LayersCompositor extends SlideCompositor {
public deleteResources() {
this.layerDrawing.deleteResources();
}

public pauseVideos(slideHash: string) {
this.layerDrawing.pauseVideos(slideHash);
}

public notifyTransitionEnd(slideHash: string) {
this.layerDrawing.notifyTransitionEnd(slideHash);
}
}

SlideShow.LayersCompositor = LayersCompositor;
4 changes: 4 additions & 0 deletions browser/src/slideshow/SlideCompositor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ abstract class SlideCompositor {
public abstract getLayerRendererContext(): RenderContext;

public abstract deleteResources(): void;

public abstract pauseVideos(slideHash: string): void;

public abstract notifyTransitionEnd(slideHash: string): void;
}

SlideShow.SlideCompositor = SlideCompositor;
Loading

0 comments on commit 0aa4e2f

Please sign in to comment.