From 7ed2c1a46fd11caca16d5aec80d9f90d7a2d3429 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Sat, 4 May 2019 03:18:32 +0200 Subject: [PATCH] fixed formatting, added test case --- server/helpers/ffmpeg-utils.ts | 19 ++++++++++------- server/lib/video-transcoding.ts | 2 +- server/tests/api/videos/video-transcoder.ts | 23 +++++++++++++++++---- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/server/helpers/ffmpeg-utils.ts b/server/helpers/ffmpeg-utils.ts index 13bb2e894..af92d1ba9 100644 --- a/server/helpers/ffmpeg-utils.ts +++ b/server/helpers/ffmpeg-utils.ts @@ -173,7 +173,7 @@ function transcode (options: TranscodeOptions) { }) } -async function canDoQuickTranscode (path: string) { +async function canDoQuickTranscode (path: string): Promise { // NOTE: This could be optimized by running ffprobe only once (but it runs fast anyway) const videoStream = await getVideoStreamFromFile(path) const parsedAudio = await audio.get(path) @@ -182,22 +182,27 @@ async function canDoQuickTranscode (path: string) { const resolution = await getVideoFileResolution(path) // check video params - if (videoStream[ 'codec_name' ] !== 'h264') + if (videoStream[ 'codec_name' ] !== 'h264') { return false - if (fps < VIDEO_TRANSCODING_FPS.MIN || fps > VIDEO_TRANSCODING_FPS.MAX) + } + if (fps < VIDEO_TRANSCODING_FPS.MIN || fps > VIDEO_TRANSCODING_FPS.MAX) { return false - if (bitRate > getMaxBitrate(resolution.videoFileResolution, fps, VIDEO_TRANSCODING_FPS)) + } + if (bitRate > getMaxBitrate(resolution.videoFileResolution, fps, VIDEO_TRANSCODING_FPS)) { return false + } // check audio params (if audio stream exists) if (parsedAudio.audioStream) { - if (parsedAudio.audioStream[ 'codec_name' ] !== 'aac') + if (parsedAudio.audioStream[ 'codec_name' ] !== 'aac') { return false + } const maxAudioBitrate = audio.bitrate[ 'aac' ](parsedAudio.audioStream[ 'bit_rate' ]) - if (maxAudioBitrate != -1 && parsedAudio.audioStream[ 'bit_rate' ] > maxAudioBitrate) + if (maxAudioBitrate !== -1 && parsedAudio.audioStream[ 'bit_rate' ] > maxAudioBitrate) { return false + } } - + return true } diff --git a/server/lib/video-transcoding.ts b/server/lib/video-transcoding.ts index 05afb44d1..81aa7a4c4 100644 --- a/server/lib/video-transcoding.ts +++ b/server/lib/video-transcoding.ts @@ -1,4 +1,4 @@ -import { HLS_STREAMING_PLAYLIST_DIRECTORY, P2P_MEDIA_LOADER_PEER_VERSION, WEBSERVER, VIDEO_TRANSCODING_FPS } from '../initializers/constants' +import { HLS_STREAMING_PLAYLIST_DIRECTORY, P2P_MEDIA_LOADER_PEER_VERSION, WEBSERVER } from '../initializers/constants' import { join } from 'path' import { getVideoFileFPS, transcode, canDoQuickTranscode } from '../helpers/ffmpeg-utils' import { ensureDir, move, remove, stat } from 'fs-extra' diff --git a/server/tests/api/videos/video-transcoder.ts b/server/tests/api/videos/video-transcoder.ts index 3cd43e99b..4923759da 100644 --- a/server/tests/api/videos/video-transcoder.ts +++ b/server/tests/api/videos/video-transcoder.ts @@ -4,7 +4,7 @@ import * as chai from 'chai' import 'mocha' import { omit } from 'lodash' import { getMaxBitrate, VideoDetails, VideoResolution, VideoState } from '../../../../shared/models/videos' -import { audio, getVideoFileBitrate, getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffmpeg-utils' +import { audio, getVideoFileBitrate, getVideoFileFPS, getVideoFileResolution, canDoQuickTranscode } from '../../../helpers/ffmpeg-utils' import { buildAbsoluteFixturePath, cleanupTests, doubleFollow, @@ -13,15 +13,14 @@ import { getMyVideos, getVideo, getVideosList, - killallServers, + waitJobs, root, ServerInfo, setAccessTokensToServers, uploadVideo, webtorrentAdd } from '../../../../shared/extra-utils' -import { extname, join } from 'path' -import { waitJobs } from '../../../../shared/extra-utils/server/jobs' +import { join } from 'path' import { VIDEO_TRANSCODING_FPS } from '../../../../server/initializers/constants' const expect = chai.expect @@ -324,6 +323,15 @@ describe('Test video transcoding', function () { it('Should accept and transcode additional extensions', async function () { this.timeout(300000) + let tempFixturePath: string + + { + tempFixturePath = await generateHighBitrateVideo() + + const bitrate = await getVideoFileBitrate(tempFixturePath) + expect(bitrate).to.be.above(getMaxBitrate(VideoResolution.H_1080P, 60, VIDEO_TRANSCODING_FPS)) + } + for (const fixture of [ 'video_short.mkv', 'video_short.avi' ]) { const videoAttributes = { name: fixture, @@ -349,6 +357,13 @@ describe('Test video transcoding', function () { } }) + it('Should correctly detect if quick transcode is possible', async function () { + this.timeout(10000) + + expect(await canDoQuickTranscode(buildAbsoluteFixturePath('video_short.mp4'))).to.be.true + expect(await canDoQuickTranscode(buildAbsoluteFixturePath('video_short.webm'))).to.be.false + }) + after(async function () { await cleanupTests(servers) })