From dca0fe12ec2e47be51884c4eb05ebe6f358cb9de Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 3 Aug 2020 16:03:52 +0200 Subject: [PATCH] Fix resolution for portrait videos --- client/src/assets/player/peertube-player-manager.ts | 9 ++++++++- server/helpers/ffmpeg-utils.ts | 4 ++-- server/lib/job-queue/handlers/video-transcoding.ts | 9 +++++---- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/client/src/assets/player/peertube-player-manager.ts b/client/src/assets/player/peertube-player-manager.ts index 7fa84e195..f12fb09ae 100644 --- a/client/src/assets/player/peertube-player-manager.ts +++ b/client/src/assets/player/peertube-player-manager.ts @@ -19,6 +19,7 @@ import './videojs-components/settings-panel' import './videojs-components/settings-panel-child' import './videojs-components/theater-button' import videojs from 'video.js' + import { isDefaultLocale } from '../../../../shared/models/i18n/i18n' import { VideoFile } from '../../../../shared/models/videos' import { RedundancyUrlManager } from './p2p-media-loader/redundancy-url-manager' @@ -300,7 +301,13 @@ export class PeertubePlayerManager { } const hlsjs = { levelLabelHandler: (level: { height: number, width: number }) => { - const file = p2pMediaLoaderOptions.videoFiles.find(f => f.resolution.id === level.height) + const resolution = Math.min(level.height || 0, level.width || 0) + + const file = p2pMediaLoaderOptions.videoFiles.find(f => f.resolution.id === resolution) + if (!file) { + console.error('Cannot find video file for level %d.', level.height) + return level.height + } let label = file.resolution.label if (file.fps >= 50) label += file.fps diff --git a/server/helpers/ffmpeg-utils.ts b/server/helpers/ffmpeg-utils.ts index 0cfc51775..7bfd5d44a 100644 --- a/server/helpers/ffmpeg-utils.ts +++ b/server/helpers/ffmpeg-utils.ts @@ -74,7 +74,7 @@ namespace audio { } } -function computeResolutionsToTranscode (videoFileHeight: number) { +function computeResolutionsToTranscode (videoFileResolution: number) { const resolutionsEnabled: number[] = [] const configResolutions = CONFIG.TRANSCODING.RESOLUTIONS @@ -90,7 +90,7 @@ function computeResolutionsToTranscode (videoFileHeight: number) { ] for (const resolution of resolutions) { - if (configResolutions[resolution + 'p'] === true && videoFileHeight > resolution) { + if (configResolutions[resolution + 'p'] === true && videoFileResolution > resolution) { resolutionsEnabled.push(resolution) } } diff --git a/server/lib/job-queue/handlers/video-transcoding.ts b/server/lib/job-queue/handlers/video-transcoding.ts index ce1c419e7..7ebef46b4 100644 --- a/server/lib/job-queue/handlers/video-transcoding.ts +++ b/server/lib/job-queue/handlers/video-transcoding.ts @@ -75,7 +75,7 @@ async function onVideoFileOptimizerSuccess (videoArg: MVideoWithFile, payload: O if (videoArg === undefined) return undefined // Outside the transaction (IO on disk) - const { videoFileResolution } = await videoArg.getMaxQualityResolution() + const { videoFileResolution, isPortraitMode } = await videoArg.getMaxQualityResolution() const { videoDatabase, videoPublished } = await sequelizeTypescript.transaction(async t => { // Maybe the video changed in database, refresh it @@ -86,7 +86,7 @@ async function onVideoFileOptimizerSuccess (videoArg: MVideoWithFile, payload: O // Create transcoding jobs if there are enabled resolutions const resolutionsEnabled = computeResolutionsToTranscode(videoFileResolution) logger.info( - 'Resolutions computed for video %s and origin file height of %d.', videoDatabase.uuid, videoFileResolution, + 'Resolutions computed for video %s and origin file resolution of %d.', videoDatabase.uuid, videoFileResolution, { resolutions: resolutionsEnabled } ) @@ -104,14 +104,15 @@ async function onVideoFileOptimizerSuccess (videoArg: MVideoWithFile, payload: O dataInput = { type: 'new-resolution' as 'new-resolution', videoUUID: videoDatabase.uuid, - resolution + resolution, + isPortraitMode } } else if (CONFIG.TRANSCODING.HLS.ENABLED) { dataInput = { type: 'hls', videoUUID: videoDatabase.uuid, resolution, - isPortraitMode: false, + isPortraitMode, copyCodecs: false } }