Преглед на файлове

add property to indicate support for on the fly subtitle extraction

Luke Pulverenti преди 7 години
родител
ревизия
82ab91f209

+ 1 - 1
Emby.Dlna/Didl/DidlBuilder.cs

@@ -236,7 +236,7 @@ namespace Emby.Dlna.Didl
                 AddVideoResource(writer, video, deviceId, filter, contentFeature, streamInfo);
                 AddVideoResource(writer, video, deviceId, filter, contentFeature, streamInfo);
             }
             }
 
 
-            var subtitleProfiles = streamInfo.GetSubtitleProfiles(false, _serverAddress, _accessToken)
+            var subtitleProfiles = streamInfo.GetSubtitleProfiles(_mediaEncoder, false, _serverAddress, _accessToken)
                 .Where(subtitle => subtitle.DeliveryMethod == SubtitleDeliveryMethod.External)
                 .Where(subtitle => subtitle.DeliveryMethod == SubtitleDeliveryMethod.External)
                 .ToList();
                 .ToList();
 
 

+ 2 - 1
MediaBrowser.Model/Configuration/EncodingOptions.cs

@@ -14,6 +14,7 @@ namespace MediaBrowser.Model.Configuration
         public int H264Crf { get; set; }
         public int H264Crf { get; set; }
         public string H264Preset { get; set; }
         public string H264Preset { get; set; }
         public bool EnableHardwareEncoding { get; set; }
         public bool EnableHardwareEncoding { get; set; }
+        public bool EnableSubtitleExtraction { get; set; }
 
 
         public string[] HardwareDecodingCodecs { get; set; }
         public string[] HardwareDecodingCodecs { get; set; }
 
 
@@ -26,7 +27,7 @@ namespace MediaBrowser.Model.Configuration
             VaapiDevice = "/dev/dri/card0";
             VaapiDevice = "/dev/dri/card0";
             H264Crf = 23;
             H264Crf = 23;
             EnableHardwareEncoding = true;
             EnableHardwareEncoding = true;
-
+            EnableSubtitleExtraction = true;
             HardwareDecodingCodecs = new string[] { "h264", "vc1" };
             HardwareDecodingCodecs = new string[] { "h264", "vc1" };
         }
         }
     }
     }

+ 5 - 0
MediaBrowser.Model/Dlna/ITranscoderSupport.cs

@@ -4,6 +4,7 @@
     {
     {
         bool CanEncodeToAudioCodec(string codec);
         bool CanEncodeToAudioCodec(string codec);
         bool CanEncodeToSubtitleCodec(string codec);
         bool CanEncodeToSubtitleCodec(string codec);
+        bool CanExtractSubtitles(string codec);
     }
     }
 
 
     public class FullTranscoderSupport : ITranscoderSupport
     public class FullTranscoderSupport : ITranscoderSupport
@@ -16,5 +17,9 @@
         {
         {
             return true;
             return true;
         }
         }
+        public bool CanExtractSubtitles(string codec)
+        {
+            return true;
+        }
     }
     }
 }
 }

+ 13 - 6
MediaBrowser.Model/Dlna/StreamBuilder.cs

@@ -686,7 +686,7 @@ namespace MediaBrowser.Model.Dlna
 
 
                     if (subtitleStream != null)
                     if (subtitleStream != null)
                     {
                     {
-                        SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, directPlay.Value, null, null);
+                        SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, directPlay.Value, _transcoderSupport, null, null);
 
 
                         playlistItem.SubtitleDeliveryMethod = subtitleProfile.Method;
                         playlistItem.SubtitleDeliveryMethod = subtitleProfile.Method;
                         playlistItem.SubtitleFormat = subtitleProfile.Format;
                         playlistItem.SubtitleFormat = subtitleProfile.Format;
@@ -728,7 +728,7 @@ namespace MediaBrowser.Model.Dlna
 
 
                 if (subtitleStream != null)
                 if (subtitleStream != null)
                 {
                 {
-                    SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, PlayMethod.Transcode, transcodingProfile.Protocol, transcodingProfile.Container);
+                    SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, PlayMethod.Transcode, _transcoderSupport, transcodingProfile.Protocol, transcodingProfile.Container);
 
 
                     playlistItem.SubtitleDeliveryMethod = subtitleProfile.Method;
                     playlistItem.SubtitleDeliveryMethod = subtitleProfile.Method;
                     playlistItem.SubtitleFormat = subtitleProfile.Format;
                     playlistItem.SubtitleFormat = subtitleProfile.Format;
@@ -1183,7 +1183,7 @@ namespace MediaBrowser.Model.Dlna
         {
         {
             if (subtitleStream != null)
             if (subtitleStream != null)
             {
             {
-                SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, playMethod, null, null);
+                SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, playMethod, _transcoderSupport, null, null);
 
 
                 if (subtitleProfile.Method != SubtitleDeliveryMethod.External && subtitleProfile.Method != SubtitleDeliveryMethod.Embed)
                 if (subtitleProfile.Method != SubtitleDeliveryMethod.External && subtitleProfile.Method != SubtitleDeliveryMethod.Embed)
                 {
                 {
@@ -1202,7 +1202,7 @@ namespace MediaBrowser.Model.Dlna
             return new Tuple<bool, TranscodeReason?>(result, TranscodeReason.ContainerBitrateExceedsLimit);
             return new Tuple<bool, TranscodeReason?>(result, TranscodeReason.ContainerBitrateExceedsLimit);
         }
         }
 
 
-        public static SubtitleProfile GetSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, string transcodingSubProtocol, string transcodingContainer)
+        public static SubtitleProfile GetSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, ITranscoderSupport transcoderSupport, string transcodingSubProtocol, string transcodingContainer)
         {
         {
             if (!subtitleStream.IsExternal && (playMethod != PlayMethod.Transcode || !string.Equals(transcodingSubProtocol, "hls", StringComparison.OrdinalIgnoreCase)))
             if (!subtitleStream.IsExternal && (playMethod != PlayMethod.Transcode || !string.Equals(transcodingSubProtocol, "hls", StringComparison.OrdinalIgnoreCase)))
             {
             {
@@ -1256,7 +1256,9 @@ namespace MediaBrowser.Model.Dlna
             }
             }
 
 
             // Look for an external or hls profile that matches the stream type (text/graphical) and doesn't require conversion
             // Look for an external or hls profile that matches the stream type (text/graphical) and doesn't require conversion
-            return GetExternalSubtitleProfile(subtitleStream, subtitleProfiles, playMethod, false) ?? GetExternalSubtitleProfile(subtitleStream, subtitleProfiles, playMethod, true) ?? new SubtitleProfile
+            return GetExternalSubtitleProfile(subtitleStream, subtitleProfiles, playMethod, transcoderSupport, false) ?? 
+                GetExternalSubtitleProfile(subtitleStream, subtitleProfiles, playMethod, transcoderSupport, true) ?? 
+                new SubtitleProfile
             {
             {
                 Method = SubtitleDeliveryMethod.Encode,
                 Method = SubtitleDeliveryMethod.Encode,
                 Format = subtitleStream.Codec
                 Format = subtitleStream.Codec
@@ -1291,7 +1293,7 @@ namespace MediaBrowser.Model.Dlna
             return false;
             return false;
         }
         }
 
 
-        private static SubtitleProfile GetExternalSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, bool allowConversion)
+        private static SubtitleProfile GetExternalSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, ITranscoderSupport transcoderSupport, bool allowConversion)
         {
         {
             foreach (SubtitleProfile profile in subtitleProfiles)
             foreach (SubtitleProfile profile in subtitleProfiles)
             {
             {
@@ -1310,6 +1312,11 @@ namespace MediaBrowser.Model.Dlna
                     continue;
                     continue;
                 }
                 }
 
 
+                if (!subtitleStream.IsExternal && !transcoderSupport.CanExtractSubtitles(subtitleStream.Codec))
+                {
+                    continue;
+                }
+
                 if ((profile.Method == SubtitleDeliveryMethod.External && subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format)) ||
                 if ((profile.Method == SubtitleDeliveryMethod.External && subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format)) ||
                     (profile.Method == SubtitleDeliveryMethod.Hls && subtitleStream.IsTextSubtitleStream))
                     (profile.Method == SubtitleDeliveryMethod.Hls && subtitleStream.IsTextSubtitleStream))
                 {
                 {

+ 14 - 14
MediaBrowser.Model/Dlna/StreamInfo.cs

@@ -309,14 +309,14 @@ namespace MediaBrowser.Model.Dlna
             return list;
             return list;
         }
         }
 
 
-        public List<SubtitleStreamInfo> GetExternalSubtitles(bool includeSelectedTrackOnly, string baseUrl, string accessToken)
+        public List<SubtitleStreamInfo> GetExternalSubtitles(ITranscoderSupport transcoderSupport, bool includeSelectedTrackOnly, string baseUrl, string accessToken)
         {
         {
-            return GetExternalSubtitles(includeSelectedTrackOnly, false, baseUrl, accessToken);
+            return GetExternalSubtitles(transcoderSupport, includeSelectedTrackOnly, false, baseUrl, accessToken);
         }
         }
 
 
-        public List<SubtitleStreamInfo> GetExternalSubtitles(bool includeSelectedTrackOnly, bool enableAllProfiles, string baseUrl, string accessToken)
+        public List<SubtitleStreamInfo> GetExternalSubtitles(ITranscoderSupport transcoderSupport, bool includeSelectedTrackOnly, bool enableAllProfiles, string baseUrl, string accessToken)
         {
         {
-            List<SubtitleStreamInfo> list = GetSubtitleProfiles(includeSelectedTrackOnly, enableAllProfiles, baseUrl, accessToken);
+            List<SubtitleStreamInfo> list = GetSubtitleProfiles(transcoderSupport, includeSelectedTrackOnly, enableAllProfiles, baseUrl, accessToken);
             List<SubtitleStreamInfo> newList = new List<SubtitleStreamInfo>();
             List<SubtitleStreamInfo> newList = new List<SubtitleStreamInfo>();
 
 
             // First add the selected track
             // First add the selected track
@@ -331,12 +331,12 @@ namespace MediaBrowser.Model.Dlna
             return newList;
             return newList;
         }
         }
 
 
-        public List<SubtitleStreamInfo> GetSubtitleProfiles(bool includeSelectedTrackOnly, string baseUrl, string accessToken)
+        public List<SubtitleStreamInfo> GetSubtitleProfiles(ITranscoderSupport transcoderSupport, bool includeSelectedTrackOnly, string baseUrl, string accessToken)
         {
         {
-            return GetSubtitleProfiles(includeSelectedTrackOnly, false, baseUrl, accessToken);
+            return GetSubtitleProfiles(transcoderSupport, includeSelectedTrackOnly, false, baseUrl, accessToken);
         }
         }
 
 
-        public List<SubtitleStreamInfo> GetSubtitleProfiles(bool includeSelectedTrackOnly, bool enableAllProfiles, string baseUrl, string accessToken)
+        public List<SubtitleStreamInfo> GetSubtitleProfiles(ITranscoderSupport transcoderSupport, bool includeSelectedTrackOnly, bool enableAllProfiles, string baseUrl, string accessToken)
         {
         {
             List<SubtitleStreamInfo> list = new List<SubtitleStreamInfo>();
             List<SubtitleStreamInfo> list = new List<SubtitleStreamInfo>();
 
 
@@ -352,7 +352,7 @@ namespace MediaBrowser.Model.Dlna
                 {
                 {
                     if (stream.Type == MediaStreamType.Subtitle && stream.Index == SubtitleStreamIndex.Value)
                     if (stream.Type == MediaStreamType.Subtitle && stream.Index == SubtitleStreamIndex.Value)
                     {
                     {
-                        AddSubtitleProfiles(list, stream, enableAllProfiles, baseUrl, accessToken, startPositionTicks);
+                        AddSubtitleProfiles(list, stream, transcoderSupport, enableAllProfiles, baseUrl, accessToken, startPositionTicks);
                     }
                     }
                 }
                 }
             }
             }
@@ -363,7 +363,7 @@ namespace MediaBrowser.Model.Dlna
                 {
                 {
                     if (stream.Type == MediaStreamType.Subtitle && (!SubtitleStreamIndex.HasValue || stream.Index != SubtitleStreamIndex.Value))
                     if (stream.Type == MediaStreamType.Subtitle && (!SubtitleStreamIndex.HasValue || stream.Index != SubtitleStreamIndex.Value))
                     {
                     {
-                        AddSubtitleProfiles(list, stream, enableAllProfiles, baseUrl, accessToken, startPositionTicks);
+                        AddSubtitleProfiles(list, stream, transcoderSupport, enableAllProfiles, baseUrl, accessToken, startPositionTicks);
                     }
                     }
                 }
                 }
             }
             }
@@ -371,28 +371,28 @@ namespace MediaBrowser.Model.Dlna
             return list;
             return list;
         }
         }
 
 
-        private void AddSubtitleProfiles(List<SubtitleStreamInfo> list, MediaStream stream, bool enableAllProfiles, string baseUrl, string accessToken, long startPositionTicks)
+        private void AddSubtitleProfiles(List<SubtitleStreamInfo> list, MediaStream stream, ITranscoderSupport transcoderSupport, bool enableAllProfiles, string baseUrl, string accessToken, long startPositionTicks)
         {
         {
             if (enableAllProfiles)
             if (enableAllProfiles)
             {
             {
                 foreach (SubtitleProfile profile in DeviceProfile.SubtitleProfiles)
                 foreach (SubtitleProfile profile in DeviceProfile.SubtitleProfiles)
                 {
                 {
-                    SubtitleStreamInfo info = GetSubtitleStreamInfo(stream, baseUrl, accessToken, startPositionTicks, new[] { profile });
+                    SubtitleStreamInfo info = GetSubtitleStreamInfo(stream, baseUrl, accessToken, startPositionTicks, new[] { profile }, transcoderSupport);
 
 
                     list.Add(info);
                     list.Add(info);
                 }
                 }
             }
             }
             else
             else
             {
             {
-                SubtitleStreamInfo info = GetSubtitleStreamInfo(stream, baseUrl, accessToken, startPositionTicks, DeviceProfile.SubtitleProfiles);
+                SubtitleStreamInfo info = GetSubtitleStreamInfo(stream, baseUrl, accessToken, startPositionTicks, DeviceProfile.SubtitleProfiles, transcoderSupport);
 
 
                 list.Add(info);
                 list.Add(info);
             }
             }
         }
         }
 
 
-        private SubtitleStreamInfo GetSubtitleStreamInfo(MediaStream stream, string baseUrl, string accessToken, long startPositionTicks, SubtitleProfile[] subtitleProfiles)
+        private SubtitleStreamInfo GetSubtitleStreamInfo(MediaStream stream, string baseUrl, string accessToken, long startPositionTicks, SubtitleProfile[] subtitleProfiles, ITranscoderSupport transcoderSupport)
         {
         {
-            SubtitleProfile subtitleProfile = StreamBuilder.GetSubtitleProfile(stream, subtitleProfiles, PlayMethod, SubProtocol, Container);
+            SubtitleProfile subtitleProfile = StreamBuilder.GetSubtitleProfile(stream, subtitleProfiles, PlayMethod, transcoderSupport, SubProtocol, Container);
             SubtitleStreamInfo info = new SubtitleStreamInfo
             SubtitleStreamInfo info = new SubtitleStreamInfo
             {
             {
                 IsForced = stream.IsForced,
                 IsForced = stream.IsForced,

+ 1 - 1
Nuget/MediaBrowser.Common.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
     <metadata>
         <id>MediaBrowser.Common</id>
         <id>MediaBrowser.Common</id>
-        <version>3.0.737</version>
+        <version>3.0.740</version>
         <title>Emby.Common</title>
         <title>Emby.Common</title>
         <authors>Emby Team</authors>
         <authors>Emby Team</authors>
         <owners>ebr,Luke,scottisafool</owners>
         <owners>ebr,Luke,scottisafool</owners>

+ 2 - 2
Nuget/MediaBrowser.Server.Core.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
 <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
     <metadata>
     <metadata>
         <id>MediaBrowser.Server.Core</id>
         <id>MediaBrowser.Server.Core</id>
-        <version>3.0.737</version>
+        <version>3.0.740</version>
         <title>Emby.Server.Core</title>
         <title>Emby.Server.Core</title>
         <authors>Emby Team</authors>
         <authors>Emby Team</authors>
         <owners>ebr,Luke,scottisafool</owners>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains core components required to build plugins for Emby Server.</description>
         <description>Contains core components required to build plugins for Emby Server.</description>
         <copyright>Copyright © Emby 2013</copyright>
         <copyright>Copyright © Emby 2013</copyright>
         <dependencies>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.737" />
+            <dependency id="MediaBrowser.Common" version="3.0.740" />
         </dependencies>
         </dependencies>
     </metadata>
     </metadata>
     <files>
     <files>