diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 827aed4f2d..520c3b9dc7 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1709,102 +1709,6 @@ namespace MediaBrowser.Api.Playback { state.OutputAudioCodec = "copy"; } - - if (string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase) && TranscodingJobType == TranscodingJobType.Hls) - { - var segmentLength = GetSegmentLength(state); - if (segmentLength.HasValue) - { - state.SegmentLength = segmentLength.Value; - } - } - } - - private int? GetSegmentLength(StreamState state) - { - var stream = state.VideoStream; - - if (stream == null) - { - return null; - } - - var frames = stream.KeyFrames; - - if (frames == null || frames.Count < 2) - { - return null; - } - - Logger.Debug("Found keyframes at {0}", string.Join(",", frames.ToArray())); - - var intervals = new List(); - for (var i = 1; i < frames.Count; i++) - { - var start = frames[i - 1]; - var end = frames[i]; - intervals.Add(end - start); - } - - Logger.Debug("Found keyframes intervals {0}", string.Join(",", intervals.ToArray())); - - var results = new List>(); - - for (var i = 1; i <= 10; i++) - { - var idealMs = i*1000; - - if (intervals.Max() < idealMs - 1000) - { - break; - } - - var segments = PredictStreamCopySegments(intervals, idealMs); - var variance = segments.Select(s => Math.Abs(idealMs - s)).Sum(); - - results.Add(new Tuple(i, variance)); - } - - if (results.Count == 0) - { - return null; - } - - return results.OrderBy(i => i.Item2).ThenBy(i => i.Item1).Select(i => i.Item1).First(); - } - - private List PredictStreamCopySegments(List intervals, int idealMs) - { - var segments = new List(); - var currentLength = 0; - - foreach (var interval in intervals) - { - if (currentLength == 0 || (currentLength + interval) <= idealMs) - { - currentLength += interval; - } - - else - { - // The segment will either be above or below the ideal. - // Need to figure out which is preferable - var offset1 = Math.Abs(idealMs - currentLength); - var offset2 = Math.Abs(idealMs - (currentLength + interval)); - - if (offset1 <= offset2) - { - segments.Add(currentLength); - currentLength = interval; - } - else - { - currentLength += interval; - } - } - } - Logger.Debug("Predicted actual segment lengths for length {0}: {1}", idealMs, string.Join(",", segments.ToArray())); - return segments; } private void AttachMediaSourceInfo(StreamState state, diff --git a/MediaBrowser.Model/Entities/MediaStream.cs b/MediaBrowser.Model/Entities/MediaStream.cs index 11eb31c27b..f842a9e3a0 100644 --- a/MediaBrowser.Model/Entities/MediaStream.cs +++ b/MediaBrowser.Model/Entities/MediaStream.cs @@ -58,12 +58,6 @@ namespace MediaBrowser.Model.Entities /// /// The length of the packet. public int? PacketLength { get; set; } - - /// - /// Gets or sets the key frames. - /// - /// The key frames. - public List KeyFrames { get; set; } /// /// Gets or sets the channels. diff --git a/MediaBrowser.Model/Session/ClientCapabilities.cs b/MediaBrowser.Model/Session/ClientCapabilities.cs index 095ad472a2..019eb38417 100644 --- a/MediaBrowser.Model/Session/ClientCapabilities.cs +++ b/MediaBrowser.Model/Session/ClientCapabilities.cs @@ -21,8 +21,8 @@ namespace MediaBrowser.Model.Session public DeviceProfile DeviceProfile { get; set; } public List SupportedLiveMediaTypes { get; set; } - public string AppUrl { get; set; } - public string AppImageUrl { get; set; } + public string Url { get; set; } + public string ImageUrl { get; set; } public ClientCapabilities() { diff --git a/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPostScanTask.cs b/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPostScanTask.cs index 6e57ddb01c..f133f74db4 100644 --- a/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPostScanTask.cs +++ b/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPostScanTask.cs @@ -6,6 +6,7 @@ using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; using MediaBrowser.Providers.Music; +using MediaBrowser.Providers.TV; using System; using System.Collections.Generic; using System.Globalization; @@ -14,7 +15,6 @@ using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Providers.TV; namespace MediaBrowser.Providers.Movies { diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteMediaStreamsRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteMediaStreamsRepository.cs index 76c1274b24..293da3f0f9 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteMediaStreamsRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteMediaStreamsRepository.cs @@ -41,7 +41,7 @@ namespace MediaBrowser.Server.Implementations.Persistence // Add PixelFormat column - createTableCommand += "(ItemId GUID, StreamIndex INT, StreamType TEXT, Codec TEXT, Language TEXT, ChannelLayout TEXT, Profile TEXT, AspectRatio TEXT, Path TEXT, IsInterlaced BIT, BitRate INT NULL, Channels INT NULL, SampleRate INT NULL, IsDefault BIT, IsForced BIT, IsExternal BIT, Height INT NULL, Width INT NULL, AverageFrameRate FLOAT NULL, RealFrameRate FLOAT NULL, Level FLOAT NULL, PixelFormat TEXT, BitDepth INT NULL, IsAnamorphic BIT NULL, RefFrames INT NULL, IsCabac BIT NULL, KeyFrames TEXT NULL, PRIMARY KEY (ItemId, StreamIndex))"; + createTableCommand += "(ItemId GUID, StreamIndex INT, StreamType TEXT, Codec TEXT, Language TEXT, ChannelLayout TEXT, Profile TEXT, AspectRatio TEXT, Path TEXT, IsInterlaced BIT, BitRate INT NULL, Channels INT NULL, SampleRate INT NULL, IsDefault BIT, IsForced BIT, IsExternal BIT, Height INT NULL, Width INT NULL, AverageFrameRate FLOAT NULL, RealFrameRate FLOAT NULL, Level FLOAT NULL, PixelFormat TEXT, BitDepth INT NULL, IsAnamorphic BIT NULL, RefFrames INT NULL, IsCabac BIT NULL, PRIMARY KEY (ItemId, StreamIndex))"; string[] queries = { @@ -62,7 +62,6 @@ namespace MediaBrowser.Server.Implementations.Persistence AddIsAnamorphicColumn(); AddIsCabacColumn(); AddRefFramesCommand(); - AddKeyFramesCommand(); PrepareStatements(); @@ -162,37 +161,6 @@ namespace MediaBrowser.Server.Implementations.Persistence _connection.RunQueries(new[] { builder.ToString() }, _logger); } - private void AddKeyFramesCommand() - { - using (var cmd = _connection.CreateCommand()) - { - cmd.CommandText = "PRAGMA table_info(mediastreams)"; - - using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult)) - { - while (reader.Read()) - { - if (!reader.IsDBNull(1)) - { - var name = reader.GetString(1); - - if (string.Equals(name, "KeyFrames", StringComparison.OrdinalIgnoreCase)) - { - return; - } - } - } - } - } - - var builder = new StringBuilder(); - - builder.AppendLine("alter table mediastreams"); - builder.AppendLine("add column KeyFrames TEXT NULL"); - - _connection.RunQueries(new[] { builder.ToString() }, _logger); - } - private void AddIsCabacColumn() { using (var cmd = _connection.CreateCommand()) @@ -282,7 +250,6 @@ namespace MediaBrowser.Server.Implementations.Persistence "BitDepth", "IsAnamorphic", "RefFrames", - "KeyFrames", "IsCabac" }; @@ -464,12 +431,7 @@ namespace MediaBrowser.Server.Implementations.Persistence if (!reader.IsDBNull(25)) { - item.KeyFrames = reader.GetString(25).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => int.Parse(i, CultureInfo.InvariantCulture)).ToList(); - } - - if (!reader.IsDBNull(26)) - { - item.IsCabac = reader.GetBoolean(26); + item.IsCabac = reader.GetBoolean(25); } return item; @@ -508,44 +470,38 @@ namespace MediaBrowser.Server.Implementations.Persistence { cancellationToken.ThrowIfCancellationRequested(); - _saveStreamCommand.GetParameter(0).Value = id; - _saveStreamCommand.GetParameter(1).Value = stream.Index; - _saveStreamCommand.GetParameter(2).Value = stream.Type.ToString(); - _saveStreamCommand.GetParameter(3).Value = stream.Codec; - _saveStreamCommand.GetParameter(4).Value = stream.Language; - _saveStreamCommand.GetParameter(5).Value = stream.ChannelLayout; - _saveStreamCommand.GetParameter(6).Value = stream.Profile; - _saveStreamCommand.GetParameter(7).Value = stream.AspectRatio; - _saveStreamCommand.GetParameter(8).Value = stream.Path; + var index = 0; - _saveStreamCommand.GetParameter(9).Value = stream.IsInterlaced; + _saveStreamCommand.GetParameter(index++).Value = id; + _saveStreamCommand.GetParameter(index++).Value = stream.Index; + _saveStreamCommand.GetParameter(index++).Value = stream.Type.ToString(); + _saveStreamCommand.GetParameter(index++).Value = stream.Codec; + _saveStreamCommand.GetParameter(index++).Value = stream.Language; + _saveStreamCommand.GetParameter(index++).Value = stream.ChannelLayout; + _saveStreamCommand.GetParameter(index++).Value = stream.Profile; + _saveStreamCommand.GetParameter(index++).Value = stream.AspectRatio; + _saveStreamCommand.GetParameter(index++).Value = stream.Path; - _saveStreamCommand.GetParameter(10).Value = stream.BitRate; - _saveStreamCommand.GetParameter(11).Value = stream.Channels; - _saveStreamCommand.GetParameter(12).Value = stream.SampleRate; + _saveStreamCommand.GetParameter(index++).Value = stream.IsInterlaced; - _saveStreamCommand.GetParameter(13).Value = stream.IsDefault; - _saveStreamCommand.GetParameter(14).Value = stream.IsForced; - _saveStreamCommand.GetParameter(15).Value = stream.IsExternal; + _saveStreamCommand.GetParameter(index++).Value = stream.BitRate; + _saveStreamCommand.GetParameter(index++).Value = stream.Channels; + _saveStreamCommand.GetParameter(index++).Value = stream.SampleRate; - _saveStreamCommand.GetParameter(16).Value = stream.Width; - _saveStreamCommand.GetParameter(17).Value = stream.Height; - _saveStreamCommand.GetParameter(18).Value = stream.AverageFrameRate; - _saveStreamCommand.GetParameter(19).Value = stream.RealFrameRate; - _saveStreamCommand.GetParameter(20).Value = stream.Level; - _saveStreamCommand.GetParameter(21).Value = stream.PixelFormat; - _saveStreamCommand.GetParameter(22).Value = stream.BitDepth; - _saveStreamCommand.GetParameter(23).Value = stream.IsAnamorphic; - _saveStreamCommand.GetParameter(24).Value = stream.RefFrames; - if (stream.KeyFrames != null) - { - _saveStreamCommand.GetParameter(25).Value = string.Join(",", stream.KeyFrames.Select(i => i.ToString(CultureInfo.InvariantCulture)).ToArray()); - } - else - { - _saveStreamCommand.GetParameter(25).Value = null; - } - _saveStreamCommand.GetParameter(26).Value = stream.IsCabac; + _saveStreamCommand.GetParameter(index++).Value = stream.IsDefault; + _saveStreamCommand.GetParameter(index++).Value = stream.IsForced; + _saveStreamCommand.GetParameter(index++).Value = stream.IsExternal; + + _saveStreamCommand.GetParameter(index++).Value = stream.Width; + _saveStreamCommand.GetParameter(index++).Value = stream.Height; + _saveStreamCommand.GetParameter(index++).Value = stream.AverageFrameRate; + _saveStreamCommand.GetParameter(index++).Value = stream.RealFrameRate; + _saveStreamCommand.GetParameter(index++).Value = stream.Level; + _saveStreamCommand.GetParameter(index++).Value = stream.PixelFormat; + _saveStreamCommand.GetParameter(index++).Value = stream.BitDepth; + _saveStreamCommand.GetParameter(index++).Value = stream.IsAnamorphic; + _saveStreamCommand.GetParameter(index++).Value = stream.RefFrames; + _saveStreamCommand.GetParameter(index++).Value = stream.IsCabac; _saveStreamCommand.Transaction = transaction; _saveStreamCommand.ExecuteNonQuery();