ResolutionNormalizer.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System;
  2. using System.Collections.Generic;
  3. using MediaBrowser.Model.Extensions;
  4. namespace MediaBrowser.Model.Dlna
  5. {
  6. public class ResolutionNormalizer
  7. {
  8. private static readonly List<ResolutionConfiguration> Configurations =
  9. new List<ResolutionConfiguration>
  10. {
  11. new ResolutionConfiguration(426, 320000),
  12. new ResolutionConfiguration(640, 400000),
  13. new ResolutionConfiguration(720, 950000),
  14. new ResolutionConfiguration(1280, 2500000)
  15. };
  16. public static ResolutionOptions Normalize(int? inputBitrate,
  17. int outputBitrate,
  18. string inputCodec,
  19. string outputCodec,
  20. int? maxWidth,
  21. int? maxHeight)
  22. {
  23. // If the bitrate isn't changing, then don't downlscale the resolution
  24. if (inputBitrate.HasValue && outputBitrate >= inputBitrate.Value)
  25. {
  26. if (maxWidth.HasValue || maxHeight.HasValue)
  27. {
  28. return new ResolutionOptions
  29. {
  30. MaxWidth = maxWidth,
  31. MaxHeight = maxHeight
  32. };
  33. }
  34. }
  35. foreach (var config in Configurations)
  36. {
  37. if (outputBitrate <= config.MaxBitrate)
  38. {
  39. var originvalValue = maxWidth;
  40. maxWidth = Math.Min(config.MaxWidth, maxWidth ?? config.MaxWidth);
  41. if (!originvalValue.HasValue || originvalValue.Value != maxWidth.Value)
  42. {
  43. maxHeight = null;
  44. }
  45. break;
  46. }
  47. }
  48. return new ResolutionOptions
  49. {
  50. MaxWidth = maxWidth,
  51. MaxHeight = maxHeight
  52. };
  53. }
  54. private static double GetVideoBitrateScaleFactor(string codec)
  55. {
  56. if (StringHelper.EqualsIgnoreCase(codec, "h265") ||
  57. StringHelper.EqualsIgnoreCase(codec, "hevc"))
  58. {
  59. return .5;
  60. }
  61. return 1;
  62. }
  63. public static int ScaleBitrate(int bitrate, string inputVideoCodec, string outputVideoCodec)
  64. {
  65. var inputScaleFactor = GetVideoBitrateScaleFactor(inputVideoCodec);
  66. var outputScaleFactor = GetVideoBitrateScaleFactor(outputVideoCodec);
  67. var scaleFactor = outputScaleFactor/inputScaleFactor;
  68. var newBitrate = scaleFactor*bitrate;
  69. return Convert.ToInt32(newBitrate);
  70. }
  71. }
  72. }