other_video_transcoding 0.2.0 → 0.3.0

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: fbe4654304564db44ba76d5b6b4a805a853e4ae2fca1238f69d7ceac6152970b
4
- data.tar.gz: 5104621d3963ddacfd90796a2dd9cad57fc04f03c47e6122cc7dccd3794df16c
3
+ metadata.gz: cd29131688402599d3de0635a670005c8f32e7bda45f3b314dd7b47948d55be3
4
+ data.tar.gz: 1af9708f4b3639fd81d935b9c96ec120ecdc63411caa00a94783d44c2fb4d1f6
5
5
  SHA512:
6
- metadata.gz: 6eec714eb59091c7ee48b74a4ac6dba65b3333bfa3dbb76b24ef5afb334e0c7434cc16234fe8e056cb7328eecc820794a8f54433082a49db6e06c02b812c690d
7
- data.tar.gz: ff5ee96313996a08b9433e223c64e01b492c7bebc1735c5533d6f263373c56e8202d13e78bd9c07221f6b08c502577d9ae8701a53f5741a4ce57911b8024b826
6
+ metadata.gz: 4ed431c314fc122ac855827c7ca831b67d1e7b5cb7dfe89500ce7bff6ec410a4e6893fc308f7724d8cb070dcc3c38eec92fbb57acd6e860690925c0691cde13a
7
+ data.tar.gz: 1442f616f7f8aed6aaafd2104f503c29e3bfa4c37a5f139c832f99b3a31c8f027f2636d7d2671734170d08dc97df53eae1b3d96270cef0badbf56d88ef95ca6c
data/CHANGELOG.md CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
  This single document contains all of the notes created for each [release](https://github.com/donmelton/other_video_transcoding/releases).
4
4
 
5
+ ## [0.3.0](https://github.com/donmelton/other_video_transcoding/releases/tag/0.3.0)
6
+
7
+ Thursday, February 27, 2020
8
+
9
+ * Add a `--scan` option to `other-transcode`. This prints media information and then exits, allowing easy identification of track numbers and formats. Via [ #11](https://github.com/donmelton/other_video_transcoding/issues/11).
10
+ * Add a `--mono-bitrate` option to `other-transcode`. This sets the mono audio bitrate, which is otherwise 50% of the stereo bitrate.
11
+ * Raise the maximum bitrates for audio in AAC format to 320 Kbps for stereo and 256 Kbps for mono. The default birates remain the same.
12
+ * Add a `--all-eac3` option to `other-transcode`. This uses the Dolby Digital Plus (Enhanced AC-3) format for all transcoded audio. The behavior of the `--eac3` option, which uses Dolby Digital Plus for surround audio only, remains the same.
13
+ * Add a `--keep-ac3-stereo` option to `other-transcode`. This copies stereo and mono audio in AC-3 format even when the original source bitrate is above the output transcoding bitrate.
14
+ * Add a `--pass-dts` option to `other-transcode`. This enables passthrough of audio in DTS and DTS-ES formats. However, such audio also in surround format will still be transcoded if that audio is output to a stereo-width track.
15
+ * Add `--rc-maxrate` and `--rc-bufsize` options to `other-transcode`. These set the ratecontrol maximum rate and/or the buffer size as a multiple of the video bitrate target, but only for certain encoders and ratecontrol systems.
16
+ * Add a `--x264-mbtree` option to `other-transcode`. This uses macroblock-tree ratecontrol and disables AVBR if in use.
17
+ * In order to ensure compatible H.264 levels, limit the number of reference frames when using the `x264` encoder with slower presets.
18
+ * Remove the deprecated `--name` option of `other-transcode`.
19
+ * Add a link to a Docker container for Linux in the "README" document. Thanks, @ttyS0!
20
+
5
21
  ## [0.2.0](https://github.com/donmelton/other_video_transcoding/releases/tag/0.2.0)
6
22
 
7
23
  Monday, January 13, 2020
data/README.md CHANGED
@@ -62,6 +62,10 @@ See "[Download FFmpeg](https://ffmpeg.org/download.html)," "[MKVToolNix Download
62
62
 
63
63
  Additional documentation for installing these programs on Windows is available in the [wiki](https://github.com/donmelton/other_video_transcoding/wiki/Windows).
64
64
 
65
+ A [Docker](https://en.wikipedia.org/wiki/Docker_(software)) container for Linux, including installation instructions, is available here:
66
+
67
+ https://github.com/ttyS0/docker-transcode-vaapi
68
+
65
69
  On macOS, all of these programs can be easily installed via [Homebrew](http://brew.sh/), an optional package manager:
66
70
 
67
71
  brew install ffmpeg
data/bin/ask-ffmpeg-log CHANGED
@@ -16,7 +16,7 @@ module Transcoding
16
16
  class Command
17
17
  def about
18
18
  <<HERE
19
- ask-ffmpeg-log 0.2.0
19
+ ask-ffmpeg-log 0.3.0
20
20
  Copyright (c) 2019-2020 Don Melton
21
21
  HERE
22
22
  end
@@ -65,6 +65,7 @@ HERE
65
65
  end
66
66
 
67
67
  fail UsageError, 'missing argument' if ARGV.empty?
68
+
68
69
  ARGV.each { |arg| process_input arg }
69
70
  complete
70
71
  exit
@@ -92,10 +93,12 @@ HERE
92
93
  if File.directory? input
93
94
  logs = Dir[input + File::SEPARATOR + '*.log']
94
95
  fail "does not contain `.log` files: #{input}" if logs.empty?
96
+
95
97
  @logs += logs
96
98
  @paths << input
97
99
  else
98
100
  fail "not a `.log` file: #{input}" unless File.extname(input) == '.log'
101
+
99
102
  @logs << File.absolute_path(input)
100
103
  @paths << File.dirname(input)
101
104
  end
data/bin/other-transcode CHANGED
@@ -18,7 +18,7 @@ module Transcoding
18
18
  class Command
19
19
  def about
20
20
  <<HERE
21
- other-transcode 0.2.0
21
+ other-transcode 0.3.0
22
22
  Copyright (c) 2019-2020 Don Melton
23
23
  HERE
24
24
  end
@@ -51,6 +51,7 @@ HERE
51
51
  <<HERE
52
52
  Output options:
53
53
  --debug increase diagnostic information
54
+ --scan print media information and exit
54
55
  --preview-crop show commands to preview detected video crop and exit
55
56
  HERE
56
57
  end
@@ -130,6 +131,9 @@ HERE
130
131
 
131
132
  def usage10
132
133
  <<HERE
134
+ --rc-maxrate FACTOR, --rc-bufsize FACTOR
135
+ set ratecontrol maximum rate and/or buffer size
136
+ as multiple of video bitrate target
133
137
  --copy-video disable transcoding and copy original video track
134
138
 
135
139
  Apple Video Toolbox encoder options:
@@ -171,6 +175,7 @@ Video Acceleration API encoder options:
171
175
 
172
176
  x264 software video encoder options:
173
177
  --x264-avbr use average variable bitrate (AVBR) ratecontrol
178
+ --x264-mbtree use macroblock-tree ratecontrol (disables AVBR if in use)
174
179
  --x264-quick increase encoding speed by 70-80%
175
180
  with no easily perceptible loss in video quality
176
181
  (avoids quality problems with some encoder presets)
@@ -222,7 +227,34 @@ HERE
222
227
  set surround audio bitrate (default: 640)
223
228
  --stereo-bitrate BITRATE
224
229
  set stereo audio bitrate (default: 256)
230
+ HERE
231
+ end
232
+
233
+ def usage16
234
+ <<HERE
235
+ --mono-bitrate BITRATE
236
+ set mono audio bitrate (default: 50% of stereo bitrate)
237
+ HERE
238
+ end
239
+
240
+ def usage17
241
+ <<HERE
225
242
  --eac3 use Enhanced AC-3 format for surround audio
243
+ HERE
244
+ end
245
+
246
+ def usage18
247
+ <<HERE
248
+ --all-eac3 " " " " " all audio
249
+ --keep-ac3-stereo
250
+ copy stereo and mono audio in AC-3 format
251
+ even when orginal bitrate is above transcoding bitrate
252
+ --pass-dts enable passthrough of audio in DTS and DTS-ES formats
253
+ HERE
254
+ end
255
+
256
+ def usage19
257
+ <<HERE
226
258
 
227
259
  Subtitle options:
228
260
  --add-subtitle TRACK[=forced]|auto|all|LANGUAGE|STRING
@@ -254,10 +286,10 @@ HERE
254
286
  @position = nil
255
287
  @duration = nil
256
288
  @debug = false
289
+ @scan = false
257
290
  @detect = false
258
291
  @preview = false
259
292
  @format = :mkv
260
- @name = nil
261
293
  @copy_track_names = false
262
294
  @max_muxing_queue_size = nil
263
295
  @dry_run = false
@@ -279,6 +311,8 @@ HERE
279
311
  @rate = nil
280
312
  @detelecine = false
281
313
  @enable_filters = true
314
+ @maxrate = nil
315
+ @bufsize = nil
282
316
  @vt_allow_sw = false
283
317
  @nvenc_spatial_aq = nil
284
318
  @nvenc_temporal_aq = nil
@@ -294,6 +328,7 @@ HERE
294
328
  @amf_bframes = nil
295
329
  @vaapi_compression = nil
296
330
  @x264_avbr = false
331
+ @x264_mbtree = false
297
332
  @x264_quick = false
298
333
  @audio_selections = [{
299
334
  :track => 1,
@@ -303,8 +338,11 @@ HERE
303
338
  }]
304
339
  @surround_bitrate = 640
305
340
  @stereo_bitrate = 256
341
+ @mono_bitrate = nil
306
342
  @surround_encoder = 'ac3'
307
343
  @stereo_encoder = nil
344
+ @keep_ac3_stereo = false
345
+ @pass_dts = false
308
346
  @subtitle_selections = []
309
347
  @auto_add_subtitle = false
310
348
  @burn_subtitle_track = 0
@@ -320,12 +358,15 @@ HERE
320
358
  when 'full'
321
359
  puts usage1 + usage2 + usage3 + usage4 + usage5 + usage6 +
322
360
  usage7 + usage8 + usage9 + usage10 + usage11 + usage12 +
323
- usage13 + usage14 + usage15
361
+ usage13 + usage14 + usage15 + usage16 + usage17 +
362
+ usage18 + usage19
324
363
  when 'more'
325
364
  puts usage1 + usage2 + usage3 + usage4 + usage6 + usage7 +
326
- usage8 + usage9 + usage11 + usage13 + usage15
365
+ usage8 + usage9 + usage11 + usage13 + usage15 + usage16 +
366
+ usage17 + usage18 + usage19
327
367
  else
328
- puts usage1 + usage3 + usage6 + usage8 + usage11 + usage13 + usage15
368
+ puts usage1 + usage3 + usage6 + usage8 + usage11 + usage13 +
369
+ usage15 + usage17 + usage19
329
370
  end
330
371
 
331
372
  exit
@@ -341,6 +382,7 @@ HERE
341
382
  end
342
383
 
343
384
  fail UsageError, 'missing argument' if ARGV.empty?
385
+
344
386
  configure ARGV.first
345
387
  ARGV.each { |arg| process_input arg }
346
388
  exit
@@ -369,6 +411,10 @@ HERE
369
411
  @debug = true
370
412
  end
371
413
 
414
+ opts.on '--scan' do
415
+ @scan = true
416
+ end
417
+
372
418
  opts.on '--preview-crop' do
373
419
  @detect = true
374
420
  @preview = true
@@ -383,13 +429,6 @@ HERE
383
429
  @format = :mp4
384
430
  end
385
431
 
386
- opts.on '--name ARG' do |arg|
387
- @name = arg
388
- Kernel.warn '**********'
389
- Kernel.warn 'Using deprecated option: --name'
390
- Kernel.warn '**********'
391
- end
392
-
393
432
  opts.on '--copy-track-names' do
394
433
  @copy_track_names = true
395
434
  end
@@ -552,6 +591,16 @@ HERE
552
591
  @enable_filters = false
553
592
  end
554
593
 
594
+ opts.on '--rc-maxrate ARG', Float do |arg|
595
+ @maxrate = arg
596
+ @encoder = nil if @encoder == 'copy'
597
+ end
598
+
599
+ opts.on '--rc-bufsize ARG', Float do |arg|
600
+ @bufsize = arg
601
+ @encoder = nil if @encoder == 'copy'
602
+ end
603
+
555
604
  opts.on '--copy-video' do
556
605
  @encoder = 'copy'
557
606
  @hevc = false
@@ -645,6 +694,14 @@ HERE
645
694
  @encoder = 'libx264'
646
695
  @hevc = false
647
696
  @x264_avbr = true
697
+ @x264_mbtree = false
698
+ end
699
+
700
+ opts.on '--x264-mbtree' do
701
+ @encoder = 'libx264'
702
+ @hevc = false
703
+ @x264_mbtree = true
704
+ @x264_avbr = false
648
705
  end
649
706
 
650
707
  opts.on '--x264-quick' do
@@ -699,10 +756,27 @@ HERE
699
756
  @stereo_bitrate = arg
700
757
  end
701
758
 
759
+ opts.on '--mono-bitrate ARG', Integer do |arg|
760
+ @mono_bitrate = arg
761
+ end
762
+
702
763
  opts.on '--eac3' do
703
764
  @surround_encoder = 'eac3'
704
765
  end
705
766
 
767
+ opts.on '--all-eac3' do
768
+ @surround_encoder = 'eac3'
769
+ @stereo_encoder = 'eac3'
770
+ end
771
+
772
+ opts.on '--keep-ac3-stereo' do
773
+ @keep_ac3_stereo = true
774
+ end
775
+
776
+ opts.on '--pass-dts' do
777
+ @pass_dts = true
778
+ end
779
+
706
780
  opts.on '--add-subtitle ARG' do |arg|
707
781
  if arg =~ /^([0-9]+)(?:=(forced))?$|^(auto)$|^([a-z]{3})$|^(.*)$/
708
782
  @subtitle_selections += [{
@@ -754,7 +828,13 @@ HERE
754
828
  @audio_selections.uniq!
755
829
  @subtitle_selections.uniq!
756
830
  @surround_bitrate = [[@surround_bitrate, 256].max, (@surround_encoder == 'ac3' ? 640 : 768)].min
757
- @stereo_bitrate = [[@stereo_bitrate, 128].max, 256].min
831
+ @stereo_bitrate = [[@stereo_bitrate, 128].max, (@stereo_encoder == 'eac3' ? 768 : 320)].min
832
+
833
+ if @mono_bitrate.nil?
834
+ @mono_bitrate = @stereo_bitrate / 2
835
+ else
836
+ @mono_bitrate = [[@mono_bitrate, 64].max, (@stereo_encoder == 'eac3' ? 768 : 256)].min
837
+ end
758
838
 
759
839
  [
760
840
  ['ffprobe', '-loglevel', 'quiet', '-version'],
@@ -764,7 +844,7 @@ HERE
764
844
  verify_tool_availability command
765
845
  end
766
846
 
767
- return if @detect
847
+ return if @scan or @detect
768
848
 
769
849
  encoders = find_encoders
770
850
 
@@ -887,9 +967,8 @@ HERE
887
967
  def process_input(path)
888
968
  seconds = Time.now.tv_sec
889
969
 
890
- unless @detect
891
- output_path = (@name.nil? ? File.basename(path, '.*') : File.basename(@name)) +
892
- '.' + @format.to_s
970
+ unless @scan or @detect
971
+ output_path = File.basename(path, '.*') + '.' + @format.to_s
893
972
  fail "output file already exists: #{output_path}" if File.exist? output_path
894
973
 
895
974
  log_path = output_path + '.log'
@@ -901,6 +980,11 @@ HERE
901
980
 
902
981
  media_info = scan_media(path)
903
982
 
983
+ if @scan
984
+ print_media_info media_info
985
+ return
986
+ end
987
+
904
988
  video, burn_subtitle = get_video_streams(media_info)
905
989
  fail "video track not found: #{path}" if video.nil?
906
990
 
@@ -911,7 +995,7 @@ HERE
911
995
  crop = detect_crop(media_info, video)
912
996
 
913
997
  if @detect
914
- present_crop(crop, path)
998
+ present_crop crop, path
915
999
  return
916
1000
  else
917
1001
  Kernel.warn "crop = #{crop[:width]}:#{crop[:height]}:#{crop[:x]}:#{crop[:y]}"
@@ -944,7 +1028,7 @@ HERE
944
1028
  '-stats'
945
1029
  ] + time_options +
946
1030
  decode_options + [
947
- '-i', "#{path}"
1031
+ '-i', path
948
1032
  ] + (@max_muxing_queue_size.nil? ? [] : ['-max_muxing_queue_size', @max_muxing_queue_size.to_s]) +
949
1033
  encode_options +
950
1034
  get_audio_options(media_info) +
@@ -995,12 +1079,12 @@ HERE
995
1079
  FileUtils.mv tmp_log_path, log_path
996
1080
  end
997
1081
 
998
- assemble_log(log_path, output)
1082
+ assemble_log log_path, output
999
1083
 
1000
1084
  if @format == :mp4
1001
1085
  Kernel.warn 'Done.'
1002
1086
  else
1003
- add_track_statistics_tags(output_path)
1087
+ add_track_statistics_tags output_path
1004
1088
  end
1005
1089
 
1006
1090
  Kernel.warn "\nElapsed time: #{seconds_to_time(Time.now.tv_sec - seconds)}\n\n"
@@ -1040,6 +1124,93 @@ HERE
1040
1124
  media_info
1041
1125
  end
1042
1126
 
1127
+ def print_media_info(media_info)
1128
+ video = nil
1129
+ audio_streams = []
1130
+ subtitles = []
1131
+
1132
+ media_info['streams'].each do |stream|
1133
+ case stream['codec_type']
1134
+ when 'video'
1135
+ video = stream if video.nil?
1136
+ when 'audio'
1137
+ audio_streams += [stream]
1138
+ when 'subtitle'
1139
+ subtitles += [stream]
1140
+ end
1141
+ end
1142
+
1143
+ puts media_info['format']['filename']
1144
+ size = "#{video['width']} x #{video['height']}"
1145
+ print " format = #{video['codec_name']} / #{size} / #{video['avg_frame_rate']} fps"
1146
+ bitrate = get_bitrate(video)
1147
+ puts bitrate.nil? ? '' : " / #{bitrate} Kbps"
1148
+ duration = media_info['format']['duration'].to_f
1149
+ time = seconds_to_time(duration.to_i)
1150
+ milliseconds = duration.to_s.sub(/^[0-9]+(\.[0-9]+)$/, '\1')
1151
+ time += milliseconds unless milliseconds == '.0'
1152
+ puts " duration = #{time}"
1153
+ index = 0
1154
+
1155
+ audio_streams.each do |stream|
1156
+ index += 1
1157
+ puts "\##{index} audio:"
1158
+ codec_name = stream['codec_name']
1159
+ print " format = #{codec_name}"
1160
+
1161
+ if codec_name == 'dts'
1162
+ profile = stream.fetch('profile', 'DTS')
1163
+ print " (#{profile})" unless profile == 'DTS'
1164
+ end
1165
+
1166
+ print ' / '
1167
+ layout = stream.fetch('channel_layout', '')
1168
+
1169
+ if layout.empty?
1170
+ channels = stream['channels'].to_i
1171
+ print "#{channels} " + (channels > 1 ? 'channels' : 'channel')
1172
+ else
1173
+ print "#{layout}"
1174
+ end
1175
+
1176
+ bitrate = get_bitrate(stream)
1177
+ puts bitrate.nil? ? '' : " / #{bitrate} Kbps"
1178
+ puts " language = #{stream.fetch('tags', {}).fetch('language', '')}"
1179
+ title = stream.fetch('tags', {}).fetch('title', '')
1180
+ puts " title = #{title}" unless title.empty?
1181
+ end
1182
+
1183
+ index = 0
1184
+
1185
+ subtitles.each do |stream|
1186
+ index += 1
1187
+ puts "\##{index} subtitle:"
1188
+ print " format = #{stream['codec_name']}"
1189
+ frames = stream.fetch('tags', {}).fetch('NUMBER_OF_FRAMES-eng', '')
1190
+ puts frames.empty? ? '' : " / #{frames} " + (frames == 1 ? 'frame' : 'frames')
1191
+ puts " language = #{stream.fetch('tags', {}).fetch('language', '')}"
1192
+ title = stream.fetch('tags', {}).fetch('title', '')
1193
+ puts " title = #{title}" unless title.empty?
1194
+ default = (stream['disposition']['default'] == 1)
1195
+ forced = (stream['disposition']['forced'] == 1)
1196
+
1197
+ if default or forced
1198
+ puts ' flags = ' +
1199
+ (default ? 'default' : '') +
1200
+ ((default and forced) ? ' / ' : '') +
1201
+ (forced ? 'forced' : '')
1202
+ end
1203
+ end
1204
+ end
1205
+
1206
+ def get_bitrate(stream)
1207
+ bitrate = stream.fetch('bit_rate', '')
1208
+ bitrate = stream.fetch('tags', {}).fetch('BPS-eng', '') if bitrate.empty?
1209
+ return nil if bitrate.empty?
1210
+
1211
+ bitrate.to_i / 1000
1212
+ end
1213
+
1043
1214
  def detect_crop(media_info, video)
1044
1215
  Kernel.warn 'Detecting crop...'
1045
1216
  duration = media_info['format']['duration'].to_f
@@ -1460,15 +1631,19 @@ HERE
1460
1631
  if width > 1920 or height > 1080
1461
1632
  bitrate = @target_2160p
1462
1633
  max_bitrate = 40000
1634
+ max_dpb_mbs = 184320
1463
1635
  elsif width > 1280 or height > 720
1464
1636
  bitrate = @target_1080p
1465
1637
  max_bitrate = 20000
1638
+ max_dpb_mbs = 32768
1466
1639
  elsif width > 720 or height > 576
1467
1640
  bitrate = @target_720p
1468
1641
  max_bitrate = 10000
1642
+ max_dpb_mbs = 18000
1469
1643
  else
1470
1644
  bitrate = @target_480p
1471
1645
  max_bitrate = 5000
1646
+ max_dpb_mbs = 8100
1472
1647
 
1473
1648
  unless hdr
1474
1649
  color_primaries = pal ? 'bt470bg' : 'smpte170m'
@@ -1478,7 +1653,22 @@ HERE
1478
1653
 
1479
1654
  bitrate = @target unless @target.nil?
1480
1655
  bitrate = [bitrate, max_bitrate].min
1481
- maxrate = bitrate * 3
1656
+ maxrate = 0
1657
+ bufsize = 0
1658
+
1659
+ if @encoder =~ /(nvenc|hevc_qsv|libx26[45])$/
1660
+ if @maxrate.nil?
1661
+ maxrate = bitrate * 3
1662
+ else
1663
+ maxrate = [[(bitrate * @maxrate).to_i, (bitrate * 1.5).to_i].max, bitrate * 3].min
1664
+ end
1665
+
1666
+ if @bufsize.nil?
1667
+ bufsize = maxrate if @encoder =~ /^libx26[45]$/
1668
+ else
1669
+ bufsize = [[(bitrate * @bufsize).to_i, bitrate].max, bitrate * 4].min
1670
+ end
1671
+ end
1482
1672
 
1483
1673
  if @preset.nil? or @preset == 'none'
1484
1674
  preset = nil
@@ -1505,6 +1695,7 @@ HERE
1505
1695
  end
1506
1696
 
1507
1697
  fail "invalid preset for encoder: #{@preset}" unless valid
1698
+
1508
1699
  preset = @preset
1509
1700
  end
1510
1701
 
@@ -1524,8 +1715,8 @@ HERE
1524
1715
  encode_options += ['-c:v', @encoder]
1525
1716
  encode_options += ['-pix_fmt:v', (@encoder =~ /(nvenc|qsv)$/ ? 'p010le' : 'yuv420p10le')] if @ten_bit
1526
1717
  encode_options += ['-b:v', "#{bitrate}k"] unless @encoder == 'copy'
1527
- encode_options += ['-maxrate:v', "#{maxrate}k"] if @encoder =~ /(nvenc|hevc_qsv|libx26[45])$/
1528
- encode_options += ['-bufsize:v', "#{maxrate}k"] if @encoder =~ /^libx26[45]$/
1718
+ encode_options += ['-maxrate:v', "#{maxrate}k"] if maxrate > 0
1719
+ encode_options += ['-bufsize:v', "#{bufsize}k"] if bufsize > 0
1529
1720
  encode_options += ['-preset:v', preset] unless preset.nil?
1530
1721
  encode_options += ['-allow_sw:v', '1'] if @encoder =~ /videotoolbox$/ and @vt_allow_sw
1531
1722
 
@@ -1579,14 +1770,31 @@ HERE
1579
1770
 
1580
1771
  if @encoder == 'libx264'
1581
1772
  encode_options += ['-x264opts:v', 'ratetol=inf'] if @x264_avbr
1582
- encode_options += ['-mbtree:v', '0']
1773
+ encode_options += ['-mbtree:v', '0'] unless @x264_mbtree
1583
1774
 
1584
- if @preset.nil? and @x264_quick
1585
- encode_options += [
1586
- '-refs:v', '1',
1587
- '-rc-lookahead:v', '30',
1588
- '-partitions:v', 'none'
1589
- ]
1775
+ if @preset.nil?
1776
+ if @x264_quick
1777
+ encode_options += [
1778
+ '-refs:v', '1',
1779
+ '-rc-lookahead:v', '30',
1780
+ '-partitions:v', 'none'
1781
+ ]
1782
+ end
1783
+ else
1784
+ max_refs = [(max_dpb_mbs / (((width + 15) / 16) * ((height + 15) / 16))), 16].min
1785
+
1786
+ case @preset
1787
+ when 'slow'
1788
+ refs = 5
1789
+ when 'slower'
1790
+ refs = 8
1791
+ when 'veryslow', 'placebo'
1792
+ refs = 16
1793
+ else
1794
+ refs = 0
1795
+ end
1796
+
1797
+ encode_options += ['-refs:v', max_refs.to_s] if refs > max_refs
1590
1798
  end
1591
1799
  end
1592
1800
 
@@ -1652,6 +1860,7 @@ HERE
1652
1860
  end
1653
1861
 
1654
1862
  width = selection[:width]
1863
+
1655
1864
  bitrate = case width
1656
1865
  when :stereo
1657
1866
  @stereo_bitrate
@@ -1733,8 +1942,12 @@ HERE
1733
1942
  if track[:width] == :original
1734
1943
  encoder = 'copy'
1735
1944
  else
1945
+ dts = (codec_name == 'dts' and track[:stream].fetch('profile', 'DTS') =~ /^DTS(?:-ES)?$/)
1946
+
1736
1947
  if track[:width] == :surround
1737
- if codec_name == @surround_encoder or codec_name == 'ac3'
1948
+ if codec_name == @surround_encoder or
1949
+ codec_name == 'ac3' or
1950
+ (@pass_dts and dts)
1738
1951
  encoder = 'copy'
1739
1952
  elsif input_channels > 2
1740
1953
  encoder = @surround_encoder
@@ -1743,9 +1956,10 @@ HERE
1743
1956
  end
1744
1957
 
1745
1958
  if encoder.nil?
1746
- if input_channels <= 2 and (codec_name == 'aac' or
1959
+ if input_channels <= 2 and (codec_name == 'aac' or
1747
1960
  ((codec_name == @surround_encoder or codec_name == 'ac3') and
1748
- (track[:stream]['bit_rate'].to_i / 1000) <= @stereo_bitrate))
1961
+ (@keep_ac3_stereo or (track[:stream]['bit_rate'].to_i / 1000) <= @stereo_bitrate)) or
1962
+ (@pass_dts and dts))
1749
1963
  encoder = 'copy'
1750
1964
  else
1751
1965
  encoder = @stereo_encoder
@@ -1754,7 +1968,7 @@ HERE
1754
1968
  if input_channels > 2
1755
1969
  channels = 2
1756
1970
  elsif input_channels == 1
1757
- bitrate = @stereo_bitrate / 2
1971
+ bitrate = @mono_bitrate
1758
1972
  end
1759
1973
  end
1760
1974
  end
@@ -1856,10 +2070,7 @@ HERE
1856
2070
  end
1857
2071
  end
1858
2072
 
1859
- unless force_subtitle.nil?
1860
- subtitles = [force_subtitle] + subtitles
1861
- end
1862
-
2073
+ subtitles = [force_subtitle] + subtitles unless force_subtitle.nil?
1863
2074
  subtitles.uniq!
1864
2075
  options = []
1865
2076
  index = 0
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'other_video_transcoding'
3
- s.version = '0.2.0'
3
+ s.version = '0.3.0'
4
4
  s.required_ruby_version = '>= 2.0'
5
5
  s.summary = 'Other tools to transcode videos.'
6
6
  s.description = <<-HERE
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: other_video_transcoding
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Don Melton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-13 00:00:00.000000000 Z
11
+ date: 2020-02-28 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: " Other Video Transcoding is a package of tools to transcode videos.\n"
14
14
  email: don@blivet.com
@@ -45,7 +45,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
47
  requirements: []
48
- rubygems_version: 3.0.6
48
+ rubygems_version: 3.1.2
49
49
  signing_key:
50
50
  specification_version: 4
51
51
  summary: Other tools to transcode videos.