lib/carrierwave/video/ffmpeg_options.rb in carrierwave-video-0.2.3 vs lib/carrierwave/video/ffmpeg_options.rb in carrierwave-video-0.3.0

- old
+ new

@@ -1,25 +1,19 @@ module CarrierWave module Video class FfmpegOptions - attr_reader :watermark_path, :watermark_position, :watermark_pixels, - :format, :resolution, :custom, :callbacks + attr_reader :format, :resolution, :custom, :callbacks def initialize(format, options) @format = format.to_s - @watermark = options[:watermark].present? @resolution = options[:resolution] || "640x360" @custom = options[:custom] @callbacks = options[:callbacks] || {} @logger = options[:logger] @unparsed = options - if watermark? - @watermark_path = options[:watermark][:path] - @watermark_position = options[:watermark][:position].to_s || :bottom_right - @watermark_pixels = options[:watermark][:pixels_from_edge] || 10 - end + @format_options = defaults.merge(options) end def raw @unparsed end @@ -27,61 +21,69 @@ def logger(model) model.send(@logger) if @logger.present? end def encoder_options - {preserve_aspect_ratio: :width} + { preserve_aspect_ratio: :width } end + # input def format_options - @format_options ||= begin - result = case format - when "mp4" - { - video_codec: 'libx264', - audio_codec: 'libfaac', - custom: "-qscale 0 -vpre slow -vpre baseline -g 30 #{watermark_params}" - } - when "webm" - { - video_codec: 'libvpx', - audio_codec: 'libvorbis', - custom: "-b 1500k -ab 160000 -f webm -g 30 #{watermark_params}" - } - when "ogv" - { - video_codec: 'libtheora', - audio_codec: 'libvorbis', - custom: "-b 1500k -ab 160000 -g 30 #{watermark_params}" - } - else - {} - end + @format_options + end - { resolution: resolution }.merge(result).tap do |h| - h[:custom] = "#{custom} #{watermark_params}".strip if custom.present? - end - end + # output + def format_params + params = @format_options.dup + params[:custom] = [params[:custom], watermark_params].compact.join(' ') + params end def watermark? - @watermark + @format_options[:watermark].present? end def watermark_params - return "" unless watermark? - positioning = case watermark_position - when 'bottom_left' - "#{watermark_pixels}:main_h-overlay_h-#{watermark_pixels}" - when 'bottom_right' - "main_w-overlay_w-#{watermark_pixels}:main_h-overlay_h-#{watermark_pixels}" - when 'top_left' - "#{watermark_pixels}:#{watermark_pixels}" - when 'top_right' - "main_w-overlay_w-#{watermark_pixels}:#{watermark_pixels}" - end + return nil unless watermark? - "-vf \"movie=#{watermark_path} [logo]; [in][logo] overlay=#{positioning} [out]\"" + @watermark_params ||= begin + path = @format_options[:watermark][:path] + position = @format_options[:watermark][:position].to_s || :bottom_right + margin = @format_options[:watermark][:pixels_from_edge] || @format_options[:watermark][:margin] || 10 + positioning = case position + when 'bottom_left' + "#{margin}:main_h-overlay_h-#{margin}" + when 'bottom_right' + "main_w-overlay_w-#{margin}:main_h-overlay_h-#{margin}" + when 'top_left' + "#{margin}:#{margin}" + when 'top_right' + "main_w-overlay_w-#{margin}:#{margin}" + end + + "-vf \"movie=#{path} [logo]; [in][logo] overlay=#{positioning} [out]\"" + end end + + private + + def defaults + @defaults ||= { resolution: '640x360', watermark: {} }.tap do |h| + case format + when 'mp4' + h[:video_codec] = 'libx264' + h[:audio_codec] = 'libfaac' + h[:custom] = '-qscale 0 -vpre slow -vpre baseline -g 30' + when 'ogv' + h[:video_codec] = 'libtheora' + h[:audio_codec] = 'libvorbis' + h[:custom] = '-b 1500k -ab 160000 -g 30' + when 'webm' + h[:video_codec] = 'libvpx' + h[:audio_codec] = 'libvorbis' + h[:custom] = '-b 1500k -ab 160000 -f webm -g 30' + end + end + end end end end