Browse Source

Fix videos with unsupported colorspace not being transcoded (#13242)

ThibG 4 years ago
parent
commit
2c6099125d
2 changed files with 11 additions and 8 deletions
  1. 3 2
      app/models/media_attachment.rb
  2. 8 6
      lib/paperclip/video_transcoder.rb

+ 3 - 2
app/models/media_attachment.rb

@@ -78,8 +78,9 @@ class MediaAttachment < ApplicationRecord
   }.freeze
 
   VIDEO_PASSTHROUGH_OPTIONS = {
-    video_codec_whitelist: ['h264'],
-    audio_codec_whitelist: ['aac', nil],
+    video_codecs: ['h264'],
+    audio_codecs: ['aac', nil],
+    colorspaces: ['yuv420p'],
     options: {
       format: 'mp4',
       convert_options: {

+ 8 - 6
lib/paperclip/video_transcoder.rb

@@ -6,19 +6,21 @@ module Paperclip
   class VideoTranscoder < Paperclip::Processor
     def make
       movie = FFMPEG::Movie.new(@file.path)
-      actual_options = options
-      passthrough_options = actual_options[:passthrough_options]
-      actual_options = passthrough_options[:options] if passthrough?(movie, passthrough_options)
 
       attachment.instance.type = MediaAttachment.types[:gifv] unless movie.audio_codec
 
-      Paperclip::Transcoder.make(file, actual_options, attachment)
+      Paperclip::Transcoder.make(file, actual_options(movie), attachment)
     end
 
     private
 
-    def passthrough?(movie, options)
-      options && options[:video_codec_whitelist].include?(movie.video_codec) && options[:audio_codec_whitelist].include?(movie.audio_codec)
+    def actual_options(movie)
+      opts = options[:passthrough_options]
+      if opts && opts[:video_codecs].include?(movie.video_codec) && opts[:audio_codecs].include?(movie.audio_codec) && opts[:colorspaces].include?(movie.colorspace)
+        opts[:options]
+      else
+        options
+      end
     end
   end
 end