diff --git a/src/database-migration.js b/src/database-migration.js index 1c6f0ef..0df83c7 100644 --- a/src/database-migration.js +++ b/src/database-migration.js @@ -20,7 +20,7 @@ const path = require('path'); var fs = require('fs'); -const TARGET_VERSION = 701; +const TARGET_VERSION = 702; const STEPS = [ // [v, v2, x] : if the current version is v, call x(db), and version becomes v2 @@ -34,6 +34,7 @@ const STEPS = [ [ 600, 601, (db) => addFPS(db) ], [ 601, 700, (db) => migrateWatermark(db) ], [ 700, 701, (db) => addScalingAlgorithm(db) ], + [ 701, 702, (db) => addDeinterlaceFilter(db) ] ] const { v4: uuidv4 } = require('uuid'); @@ -397,6 +398,7 @@ function ffmpeg() { normalizeAudio: true, maxFPS: 60, scalingAlgorithm: "bicubic", + deinterlaceFilter: "none" } } @@ -755,6 +757,12 @@ function addScalingAlgorithm(db) { fs.writeFileSync( f, JSON.stringify( [ffmpegSettings] ) ); } +function addDeinterlaceFilter(db) { + let ffmpegSettings = db['ffmpeg-settings'].find()[0]; + let f = path.join(process.env.DATABASE, 'ffmpeg-settings.json'); + ffmpegSettings.deinterlaceFilter = "none"; + fs.writeFileSync( f, JSON.stringify( [ffmpegSettings] ) ); +} module.exports = { initDB: initDB, diff --git a/src/ffmpeg.js b/src/ffmpeg.js index b884c1c..f2403df 100644 --- a/src/ffmpeg.js +++ b/src/ffmpeg.js @@ -165,6 +165,12 @@ class FFMPEG extends events.EventEmitter { currentVideo ="[fpchange]"; } + // deinterlace if desired + if (streamStats.videoScanType == 'interlaced' && this.opts.deinterlaceFilter != 'none') { + videoComplex += `;${currentVideo}${this.opts.deinterlaceFilter}[deinterlaced]`; + currentVideo = "[deinterlaced]"; + } + // prepare input streams if ( typeof(streamUrl.errorTitle) !== 'undefined') { doOverlay = false; //never show icon in the error screen diff --git a/src/plexTranscoder.js b/src/plexTranscoder.js index 11f3def..ca40040 100644 --- a/src/plexTranscoder.js +++ b/src/plexTranscoder.js @@ -236,6 +236,7 @@ lang=en` // Rounding framerate avoids scenarios where // 29.9999999 & 30 don't match. ret.videoDecision = (typeof stream.decision === 'undefined') ? 'copy' : stream.decision; + ret.videoScanType = stream.scanType; } // Audio. Only look at stream being used if (stream["streamType"] == "2" && stream["selected"] == "1") { diff --git a/web/directives/ffmpeg-settings.js b/web/directives/ffmpeg-settings.js index f4f66c7..52c507d 100644 --- a/web/directives/ffmpeg-settings.js +++ b/web/directives/ffmpeg-settings.js @@ -66,6 +66,14 @@ module.exports = function (dizquetv, resolutionOptions) { {id: "lanczos", description: "lanczos"}, {id: "spline", description: "spline"}, ]; + scope.deinterlaceOptions = [ + {value: "none", description: "do not deinterlace"}, + {value: "bwdif=0", description: "bwdif send frame"}, + {value: "bwdif=1", description: "bwdif send field"}, + {value: "w3fdif", description: "w3fdif"}, + {value: "yadif=0", description: "yadif send frame"}, + {value: "yadif=1", description: "yadif send field"} + ]; } } diff --git a/web/public/templates/ffmpeg-settings.html b/web/public/templates/ffmpeg-settings.html index 71a66bb..09fb68f 100644 --- a/web/public/templates/ffmpeg-settings.html +++ b/web/public/templates/ffmpeg-settings.html @@ -103,6 +103,11 @@ ng-options="o.id as o.description for o in scalingOptions" > Scaling algorithm to use when the transcoder needs to change the video size. +
+ + + Deinterlace filter to use when video is interlaced. This is only needed when Plex transcoding is not used.