|
@@ -435,7 +435,7 @@ namespace MediaBrowser.Model.Dlna
|
|
|
|
|
|
if (subtitleStream != null)
|
|
if (subtitleStream != null)
|
|
{
|
|
{
|
|
- SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, directPlay.Value);
|
|
|
|
|
|
+ SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, directPlay.Value, null, null);
|
|
|
|
|
|
playlistItem.SubtitleDeliveryMethod = subtitleProfile.Method;
|
|
playlistItem.SubtitleDeliveryMethod = subtitleProfile.Method;
|
|
playlistItem.SubtitleFormat = subtitleProfile.Format;
|
|
playlistItem.SubtitleFormat = subtitleProfile.Format;
|
|
@@ -465,10 +465,11 @@ namespace MediaBrowser.Model.Dlna
|
|
|
|
|
|
if (subtitleStream != null)
|
|
if (subtitleStream != null)
|
|
{
|
|
{
|
|
- SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, PlayMethod.Transcode);
|
|
|
|
|
|
+ SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, PlayMethod.Transcode, transcodingProfile.Protocol, transcodingProfile.Container);
|
|
|
|
|
|
playlistItem.SubtitleDeliveryMethod = subtitleProfile.Method;
|
|
playlistItem.SubtitleDeliveryMethod = subtitleProfile.Method;
|
|
playlistItem.SubtitleFormat = subtitleProfile.Format;
|
|
playlistItem.SubtitleFormat = subtitleProfile.Format;
|
|
|
|
+ playlistItem.SubtitleCodecs = new[] { subtitleProfile.Format };
|
|
}
|
|
}
|
|
|
|
|
|
playlistItem.PlayMethod = PlayMethod.Transcode;
|
|
playlistItem.PlayMethod = PlayMethod.Transcode;
|
|
@@ -874,7 +875,7 @@ namespace MediaBrowser.Model.Dlna
|
|
{
|
|
{
|
|
if (subtitleStream != null)
|
|
if (subtitleStream != null)
|
|
{
|
|
{
|
|
- SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, playMethod);
|
|
|
|
|
|
+ SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, playMethod, null, null);
|
|
|
|
|
|
if (subtitleProfile.Method != SubtitleDeliveryMethod.External && subtitleProfile.Method != SubtitleDeliveryMethod.Embed)
|
|
if (subtitleProfile.Method != SubtitleDeliveryMethod.External && subtitleProfile.Method != SubtitleDeliveryMethod.Embed)
|
|
{
|
|
{
|
|
@@ -886,11 +887,11 @@ namespace MediaBrowser.Model.Dlna
|
|
return IsAudioEligibleForDirectPlay(item, maxBitrate);
|
|
return IsAudioEligibleForDirectPlay(item, maxBitrate);
|
|
}
|
|
}
|
|
|
|
|
|
- public static SubtitleProfile GetSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod)
|
|
|
|
|
|
+ public static SubtitleProfile GetSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, string transcodingSubProtocol, string transcodingContainer)
|
|
{
|
|
{
|
|
- if (playMethod != PlayMethod.Transcode && !subtitleStream.IsExternal)
|
|
|
|
|
|
+ if (!subtitleStream.IsExternal && (playMethod != PlayMethod.Transcode || !string.Equals(transcodingSubProtocol, "hls", StringComparison.OrdinalIgnoreCase)))
|
|
{
|
|
{
|
|
- // Look for supported embedded subs
|
|
|
|
|
|
+ // Look for supported embedded subs of the same format
|
|
foreach (SubtitleProfile profile in subtitleProfiles)
|
|
foreach (SubtitleProfile profile in subtitleProfiles)
|
|
{
|
|
{
|
|
if (!profile.SupportsLanguage(subtitleStream.Language))
|
|
if (!profile.SupportsLanguage(subtitleStream.Language))
|
|
@@ -903,11 +904,40 @@ namespace MediaBrowser.Model.Dlna
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (playMethod == PlayMethod.Transcode && !IsSubtitleEmbedSupported(subtitleStream, profile, transcodingSubProtocol, transcodingContainer))
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format) && StringHelper.EqualsIgnoreCase(profile.Format, subtitleStream.Codec))
|
|
if (subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format) && StringHelper.EqualsIgnoreCase(profile.Format, subtitleStream.Codec))
|
|
{
|
|
{
|
|
return profile;
|
|
return profile;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // Look for supported embedded subs of a convertible format
|
|
|
|
+ foreach (SubtitleProfile profile in subtitleProfiles)
|
|
|
|
+ {
|
|
|
|
+ if (!profile.SupportsLanguage(subtitleStream.Language))
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (profile.Method != SubtitleDeliveryMethod.Embed)
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (playMethod == PlayMethod.Transcode && !IsSubtitleEmbedSupported(subtitleStream, profile, transcodingSubProtocol, transcodingContainer))
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (subtitleStream.IsTextSubtitleStream && subtitleStream.SupportsSubtitleConversionTo(profile.Format))
|
|
|
|
+ {
|
|
|
|
+ return profile;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
// 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
|
|
@@ -918,6 +948,28 @@ namespace MediaBrowser.Model.Dlna
|
|
};
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private static bool IsSubtitleEmbedSupported(MediaStream subtitleStream, SubtitleProfile subtitleProfile, string transcodingSubProtocol, string transcodingContainer)
|
|
|
|
+ {
|
|
|
|
+ if (string.Equals(transcodingContainer, "ts", StringComparison.OrdinalIgnoreCase))
|
|
|
|
+ {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ if (string.Equals(transcodingContainer, "mpegts", StringComparison.OrdinalIgnoreCase))
|
|
|
|
+ {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ if (string.Equals(transcodingContainer, "mp4", StringComparison.OrdinalIgnoreCase))
|
|
|
|
+ {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ if (string.Equals(transcodingContainer, "mkv", StringComparison.OrdinalIgnoreCase))
|
|
|
|
+ {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
private static SubtitleProfile GetExternalSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, bool allowConversion)
|
|
private static SubtitleProfile GetExternalSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, bool allowConversion)
|
|
{
|
|
{
|
|
foreach (SubtitleProfile profile in subtitleProfiles)
|
|
foreach (SubtitleProfile profile in subtitleProfiles)
|