other_video_transcoding 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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.