video2gif 0.0.9 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: de00f9f371c9632397ca52a27968a790f7e68fc58580b5438dfe9a73600a072e
4
- data.tar.gz: 159321148a290683426e35b76aa5a9f2ebe2cc1e78f122ebc07b2738e67f02c9
3
+ metadata.gz: f5e988966072feb88cc7335dc5133930c704011f7caf45ab30cb9172dc7f07c2
4
+ data.tar.gz: 4c7d0cda62bebd3350ef7f949f447b30d50e767177ec0fb78761f7456ec6221a
5
5
  SHA512:
6
- metadata.gz: 8a067a16a488490ac8d076cac3802b1f4d99428507b59f1abd72f414fdc90c7a3eea80f345a40aaa95c78faeff04016ebffe2908a15ca00b6fb5f7f365bed56d
7
- data.tar.gz: 0fa948c4872e6ca1297e2a6c4c9b5dffdb89ff2ecd232b2c16bfea75bb085cbdc9779bceb353ef552cbc4741ed8a1c5559f7a3160b59578d5f46dd46a5ab16a1
6
+ metadata.gz: 26c279eff6a44ad910662335e838375b77b4f754314d81784f0dc2cec30721e07f4c7ac1a8b5c52aab99fffaba9d91149b0cfb2597096020ec24193a2e701c81
7
+ data.tar.gz: 3a3f4f8c4ac6e399cc6b67e11a6627121a67f968b2d0406410cdb112007c63cd8ad1ed34df547811e3a9e1bdb0117d6874f0bae984dd5ec6287cdb424fc8b38f
@@ -4,83 +4,73 @@
4
4
  module Video2gif
5
5
  module FFMpeg
6
6
  def self.filter_complex(options)
7
- fps = options[:fps] || 10
8
- max_colors = options[:palette] ? "max_colors=#{options[:palette]}:" : ''
9
- width = options[:width] # default is not to scale at all
10
-
11
- # create filter elements
12
- fps_filter = "fps=#{fps}"
13
- crop_filter = options[:autocrop] || 'crop=' + %W[
14
- w=#{ options[:wregion] || 'in_w' }
15
- h=#{ options[:hregion] || 'in_h' }
16
- x=#{ options[:xoffset] || 0 }
17
- y=#{ options[:yoffset] || 0 }
18
- ].join(':')
19
- scale_filter = "scale=#{width}:-1:flags=lanczos:sws_dither=none" if options[:width] unless options[:tonemap]
20
- tonemap_filters = if options[:tonemap] # TODO: detect input format
21
- %W[
22
- zscale=dither=none:filter=lanczos:width=#{width}:height=-1
23
- zscale=transfer=linear:npl=100
24
- format=yuv420p10le
25
- zscale=primaries=bt709
26
- tonemap=tonemap=#{options[:tonemap]}:desat=0
27
- zscale=transfer=bt709:matrix=bt709:range=tv
28
- format=yuv420p
29
- ].join(',')
30
- end
31
- eq_filter = if options[:eq]
32
- 'eq=' + %W[
33
- contrast=#{ options[:contrast] || 1 }
34
- brightness=#{ options[:brightness] || 0 }
35
- saturation=#{ options[:saturation] || 1 }
36
- gamma=#{ options[:gamma] || 1 }
37
- gamma_r=#{ options[:gamma_r] || 1 }
38
- gamma_g=#{ options[:gamma_g] || 1 }
39
- gamma_b=#{ options[:gamma_b] || 1 }
40
- ].join(':')
41
- end
42
- split_filter = 'split [o1] [o2]'
43
- palettegen_filter = "[o1] palettegen=#{max_colors}stats_mode=diff [p]"
44
- fifo_filter = '[o2] fifo [o3]'
45
- paletteuse_filter = '[o3] [p] paletteuse=dither=floyd_steinberg:diff_mode=rectangle'
46
- drawtext_filter = if options[:text]
47
- count_of_lines = options[:text].scan(/\\n/).count + 1
48
-
49
- x = options[:xpos] || '(main_w/2-text_w/2)'
50
- y = options[:ypos] || "(main_h-line_h*1.5*#{count_of_lines})"
51
- size = options[:textsize] || 32
52
- color = options[:textcolor] || 'white'
53
- border = options[:textborder] || 3
54
- font = options[:textfont] || 'Arial'
55
- style = options[:textvariant] || 'Bold'
56
- text = options[:text]
57
- .gsub(/\\n/, ' ')
58
- .gsub(/([:])/, '\\\\\\\\\\1')
59
- .gsub(/([,])/, '\\\\\\1')
60
- .gsub(/\b'\b/, "\u2019")
61
- .gsub(/\B"\b([^"\u201C\u201D\u201E\u201F\u2033\u2036\r\n]+)\b?"\B/, "\u201C\\1\u201D")
62
- .gsub(/\B'\b([^'\u2018\u2019\u201A\u201B\u2032\u2035\r\n]+)\b?'\B/, "\u2018\\1\u2019")
63
-
64
- 'drawtext=' + %W[
65
- x='#{x}'
66
- y='#{y}'
67
- fontsize='#{size}'
68
- fontcolor='#{color}'
69
- borderw='#{border}'
70
- fontfile='#{font}'\\\\:style='#{style}'
71
- text='#{text}'
72
- ].join(':')
73
- end
74
-
75
7
  filter_complex = []
76
8
 
77
- filter_complex << fps_filter
78
- filter_complex << crop_filter if crop_filter
79
- filter_complex << scale_filter if options[:width] unless options[:tonemap]
80
- filter_complex << tonemap_filters if options[:tonemap]
81
- filter_complex << eq_filter if options[:eq]
82
- filter_complex << drawtext_filter if options[:text]
83
- filter_complex << split_filter << palettegen_filter << fifo_filter << paletteuse_filter
9
+ filter_complex << "fps=#{ options[:fps] || 10 }"
10
+
11
+ if options[:autocrop]
12
+ filter_complex << options[:autocrop]
13
+ else
14
+ filter_complex << 'crop=' + [
15
+ "w=#{ options[:wregion] || 'in_w' }",
16
+ "h=#{ options[:hregion] || 'in_h' }",
17
+ "x=#{ options[:xoffset] || 0 }",
18
+ "y=#{ options[:yoffset] || 0 }",
19
+ ].join(':')
20
+ end
21
+
22
+ if options[:width] && !options[:tonemap]
23
+ filter_complex << "scale=flags=lanczos:sws_dither=none:width=#{options[:width]}:height=-1"
24
+ end
25
+
26
+ if options[:tonemap]
27
+ filter_complex << "zscale=dither=none:filter=lanczos:width=#{options[:width]}:height=-1" if options[:width]
28
+ filter_complex << 'zscale=transfer=linear:npl=100'
29
+ filter_complex << 'zscale=npl=100'
30
+ filter_complex << 'format=gbrpf32le'
31
+ filter_complex << 'zscale=primaries=bt709'
32
+ filter_complex << "tonemap=tonemap=#{options[:tonemap]}:desat=0"
33
+ filter_complex << 'zscale=transfer=bt709:matrix=bt709:range=tv'
34
+ filter_complex << 'format=yuv420p'
35
+ end
36
+
37
+ filter_complex << "eq=contrast=#{options[:contrast]}" if options[:contrast]
38
+ filter_complex << "eq=brightness=#{options[:brightness]}" if options[:brightness]
39
+ filter_complex << "eq=saturation=#{options[:saturation]}" if options[:saturation]
40
+ filter_complex << "eq=gamma=#{options[:gamma]}" if options[:gamma]
41
+ filter_complex << "eq=gamma_r=#{options[:gamma_r]}" if options[:gamma_r]
42
+ filter_complex << "eq=gamma_g=#{options[:gamma_g]}" if options[:gamma_g]
43
+ filter_complex << "eq=gamma_b=#{options[:gamma_b]}" if options[:gamma_b]
44
+
45
+ if options[:text]
46
+ count_of_lines = options[:text].scan(/\\n/).count + 1
47
+ text = options[:text]
48
+ .gsub(/\\n/, ' ')
49
+ .gsub(/([:])/, '\\\\\\\\\\1')
50
+ .gsub(/([,])/, '\\\\\\1')
51
+ .gsub(/\b'\b/, "\u2019")
52
+ .gsub(/\B"\b([^"\u201C\u201D\u201E\u201F\u2033\u2036\r\n]+)\b?"\B/, "\u201C\\1\u201D")
53
+ .gsub(/\B'\b([^'\u2018\u2019\u201A\u201B\u2032\u2035\r\n]+)\b?'\B/, "\u2018\\1\u2019")
54
+
55
+ filter_complex << 'drawtext=' + [
56
+ "x='#{ options[:xpos] || '(main_w/2-text_w/2)' }'",
57
+ "y='#{ options[:ypos] || "(main_h-line_h*1.5*#{count_of_lines})" }'",
58
+ "fontsize='#{ options[:textsize] || 32 }'",
59
+ "fontcolor='#{ options[:textcolor] || 'white' }'",
60
+ "borderw='#{ options[:textborder] || 3 }'",
61
+ "fontfile='#{ options[:textfont] || 'Arial'}'\\\\:style='#{options[:textvariant] || 'Bold' }'",
62
+ "text='#{text}'",
63
+ ].join(':')
64
+ end
65
+
66
+ filter_complex << 'split [o1] [o2]'
67
+ if options[:palette]
68
+ filter_complex << "[o1] palettegen=#{options[:palette]}:stats_mode=diff [p]"
69
+ else
70
+ filter_complex << "[o1] palettegen=stats_mode=diff [p]"
71
+ end
72
+ filter_complex << '[o2] fifo [o3]'
73
+ filter_complex << '[o3] [p] paletteuse=dither=floyd_steinberg:diff_mode=rectangle'
84
74
 
85
75
  filter_complex.join(',')
86
76
  end
@@ -104,6 +94,7 @@ module Video2gif
104
94
  command = ['ffmpeg']
105
95
  command << '-y' # always overwrite
106
96
  command << '-analyzeduration' << '2147483647' << '-probesize' << '2147483647'
97
+ command << '-loglevel' << 'level+verbose'
107
98
  command << '-ss' << options[:seek] if options[:seek]
108
99
  command << '-t' << options[:time] if options[:time]
109
100
  command << '-i' << options[:input_filename]
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Video2gif
4
- VERSION = '0.0.9'
4
+ VERSION = '0.0.10'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: video2gif
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emily St.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-04-22 00:00:00.000000000 Z
11
+ date: 2019-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler