aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Dlna/PlayTo/StreamHelper.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Dlna/PlayTo/StreamHelper.cs')
-rw-r--r--MediaBrowser.Dlna/PlayTo/StreamHelper.cs189
1 files changed, 31 insertions, 158 deletions
diff --git a/MediaBrowser.Dlna/PlayTo/StreamHelper.cs b/MediaBrowser.Dlna/PlayTo/StreamHelper.cs
index cb2b72a038..6cd66c16ae 100644
--- a/MediaBrowser.Dlna/PlayTo/StreamHelper.cs
+++ b/MediaBrowser.Dlna/PlayTo/StreamHelper.cs
@@ -1,6 +1,5 @@
-using MediaBrowser.Model.Dto;
+using MediaBrowser.Controller.Dlna;
using MediaBrowser.Model.Entities;
-using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
@@ -10,90 +9,20 @@ namespace MediaBrowser.Dlna.PlayTo
class StreamHelper
{
/// <summary>
- /// Gets the dlna headers.
- /// </summary>
- /// <param name="item">The item.</param>
- /// <returns></returns>
- internal static string GetDlnaHeaders(PlaylistItem item)
- {
- var orgOp = item.Transcode ? ";DLNA.ORG_OP=00" : ";DLNA.ORG_OP=01";
-
- var orgCi = item.Transcode ? ";DLNA.ORG_CI=0" : ";DLNA.ORG_CI=1";
-
- const string dlnaflags = ";DLNA.ORG_FLAGS=01500000000000000000000000000000";
-
- var contentFeatures = string.Empty;
-
- if (string.Equals(item.Container, "mp3", StringComparison.OrdinalIgnoreCase))
- {
- contentFeatures = "DLNA.ORG_PN=MP3";
- }
- else if (string.Equals(item.Container, "wma", StringComparison.OrdinalIgnoreCase))
- {
- contentFeatures = "DLNA.ORG_PN=WMABASE";
- }
- else if (string.Equals(item.Container, "wmw", StringComparison.OrdinalIgnoreCase))
- {
- contentFeatures = "DLNA.ORG_PN=WMVMED_BASE";
- }
- else if (string.Equals(item.Container, "asf", StringComparison.OrdinalIgnoreCase))
- {
- contentFeatures = "DLNA.ORG_PN=WMVMED_BASE";
- }
- else if (string.Equals(item.Container, "avi", StringComparison.OrdinalIgnoreCase))
- {
- contentFeatures = "DLNA.ORG_PN=AVI";
- }
- else if (string.Equals(item.Container, "mkv", StringComparison.OrdinalIgnoreCase))
- {
- contentFeatures = "DLNA.ORG_PN=MATROSKA";
- }
- else if (string.Equals(item.Container, "mp4", StringComparison.OrdinalIgnoreCase))
- {
- contentFeatures = "DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC";
- }
- else if (string.Equals(item.Container, "mpeg", StringComparison.OrdinalIgnoreCase))
- {
- contentFeatures = "DLNA.ORG_PN=MPEG_PS_PAL";
- }
- else if (string.Equals(item.Container, "ts", StringComparison.OrdinalIgnoreCase))
- {
- contentFeatures = "DLNA.ORG_PN=MPEG_PS_PAL";
- }
- else if (item.MediaType == Controller.Dlna.DlnaProfileType.Video)
- {
- //Default to AVI for video
- contentFeatures = "DLNA.ORG_PN=AVI";
- }
- else
- {
- //Default to MP3 for audio
- contentFeatures = "DLNA.ORG_PN=MP3";
- }
-
- return (contentFeatures + orgOp + orgCi + dlnaflags).Trim(';');
- }
-
- #region Audio
-
- /// <summary>
/// Gets the audio URL.
/// </summary>
+ /// <param name="deviceProperties">The device properties.</param>
/// <param name="item">The item.</param>
+ /// <param name="streams">The streams.</param>
/// <param name="serverAddress">The server address.</param>
/// <returns>System.String.</returns>
- internal static string GetAudioUrl(PlaylistItem item, string serverAddress)
+ internal static string GetAudioUrl(DeviceInfo deviceProperties, PlaylistItem item, List<MediaStream> streams, string serverAddress)
{
- if (!item.Transcode)
- return string.Format("{0}/audio/{1}/stream{2}?Static=True", serverAddress, item.ItemId, item.Container);
+ var dlnaCommand = BuildDlnaUrl(item.DeviceProfileName, item.MediaSourceId, deviceProperties.UUID, !item.Transcode, null, item.AudioCodec, item.AudioStreamIndex, item.SubtitleStreamIndex, null, 128000, item.StartPositionTicks, item.TranscodingSettings);
- return string.Format("{0}/audio/{1}/stream.mp3?AudioCodec=Mp3", serverAddress, item.ItemId);
+ return string.Format("{0}/audio/{1}/stream{2}?{3}", serverAddress, item.ItemId, "." + item.Container.TrimStart('.'), dlnaCommand);
}
- #endregion
-
- #region Video
-
/// <summary>
/// Gets the video URL.
/// </summary>
@@ -104,97 +33,41 @@ namespace MediaBrowser.Dlna.PlayTo
/// <returns>The url to send to the device</returns>
internal static string GetVideoUrl(DeviceInfo deviceProperties, PlaylistItem item, List<MediaStream> streams, string serverAddress)
{
- string dlnaCommand = string.Empty;
- if (!item.Transcode)
- {
- dlnaCommand = BuildDlnaUrl(deviceProperties.UUID, !item.Transcode, null, null, null, null, null, null, null, null, null, null, item.MimeType);
- return string.Format("{0}/Videos/{1}/stream{2}?{3}", serverAddress, item.ItemId, item.Container, dlnaCommand);
- }
- var videostream = streams.Where(m => m.Type == MediaStreamType.Video).OrderBy(m => m.IsDefault).FirstOrDefault();
- var audiostream = streams.Where(m => m.Type == MediaStreamType.Audio).OrderBy(m => m.IsDefault).FirstOrDefault();
-
- var videoCodec = GetVideoCodec(videostream);
- var audioCodec = GetAudioCodec(audiostream);
- int? videoBitrate = null;
- int? audioBitrate = null;
- int? audioChannels = null;
-
- if (videoCodec != VideoCodecs.Copy)
- videoBitrate = 2000000;
+ var dlnaCommand = BuildDlnaUrl(item.DeviceProfileName, item.MediaSourceId, deviceProperties.UUID, !item.Transcode, item.VideoCodec, item.AudioCodec, item.AudioStreamIndex, item.SubtitleStreamIndex, 1500000, 128000, item.StartPositionTicks, item.TranscodingSettings);
- if (audioCodec != AudioCodecs.Copy)
- {
- audioBitrate = 128000;
- audioChannels = 2;
- }
-
- dlnaCommand = BuildDlnaUrl(deviceProperties.UUID, !item.Transcode, videoCodec, audioCodec, null, null, videoBitrate, audioChannels, audioBitrate, item.StartPositionTicks, "baseline", "3", item.MimeType);
return string.Format("{0}/Videos/{1}/stream{2}?{3}", serverAddress, item.ItemId, item.Container, dlnaCommand);
}
/// <summary>
- /// Gets the video codec.
- /// </summary>
- /// <param name="videoStream">The video stream.</param>
- /// <returns></returns>
- private static VideoCodecs GetVideoCodec(MediaStream videoStream)
- {
- switch (videoStream.Codec.ToLower())
- {
- case "h264":
- case "mpeg4":
- return VideoCodecs.Copy;
-
- }
- return VideoCodecs.H264;
- }
-
- /// <summary>
- /// Gets the audio codec.
- /// </summary>
- /// <param name="audioStream">The audio stream.</param>
- /// <returns></returns>
- private static AudioCodecs GetAudioCodec(MediaStream audioStream)
- {
- if (audioStream != null)
- {
- switch (audioStream.Codec.ToLower())
- {
- case "aac":
- case "mp3":
- case "wma":
- return AudioCodecs.Copy;
-
- }
- }
- return AudioCodecs.Aac;
- }
-
- /// <summary>
/// Builds the dlna URL.
/// </summary>
- private static string BuildDlnaUrl(string deviceID, bool isStatic, VideoCodecs? videoCodec, AudioCodecs? audioCodec, int? subtitleIndex, int? audiostreamIndex, int? videoBitrate, int? audiochannels, int? audioBitrate, long? startPositionTicks, string profile, string videoLevel, string mimeType)
+ private static string BuildDlnaUrl(string deviceProfileName, string mediaSourceId, string deviceID, bool isStatic, string videoCodec, string audioCodec, int? audiostreamIndex, int? subtitleIndex, int? videoBitrate, int? audioBitrate, long? startPositionTicks, List<TranscodingSetting> settings)
{
- var usCulture = new CultureInfo("en-US");
+ var profile = settings.Where(i => i.Name == TranscodingSettingType.VideoProfile).Select(i => i.Value).FirstOrDefault();
+ var videoLevel = settings.Where(i => i.Name == TranscodingSettingType.VideoLevel).Select(i => i.Value).FirstOrDefault();
+ var maxAudioChannels = settings.Where(i => i.Name == TranscodingSettingType.MaxAudioChannels).Select(i => i.Value).FirstOrDefault();
- var dlnaparam = string.Format("Params={0};", deviceID);
- dlnaparam += isStatic ? "true;" : "false;";
- dlnaparam += videoCodec.HasValue ? videoCodec.Value + ";" : ";";
- dlnaparam += audioCodec.HasValue ? audioCodec.Value + ";" : ";";
- dlnaparam += audiostreamIndex.HasValue ? audiostreamIndex.Value.ToString(usCulture) + ";" : ";";
- dlnaparam += subtitleIndex.HasValue ? subtitleIndex.Value.ToString(usCulture) + ";" : ";";
- dlnaparam += videoBitrate.HasValue ? videoBitrate.Value.ToString(usCulture) + ";" : ";";
- dlnaparam += audioBitrate.HasValue ? audioBitrate.Value.ToString(usCulture) + ";" : ";";
- dlnaparam += audiochannels.HasValue ? audiochannels.Value.ToString(usCulture) + ";" : ";";
- dlnaparam += startPositionTicks.HasValue ? startPositionTicks.Value.ToString(usCulture) + ";" : ";";
- dlnaparam += profile + ";";
- dlnaparam += videoLevel + ";";
- dlnaparam += mimeType + ";";
+ var usCulture = new CultureInfo("en-US");
- return dlnaparam;
+ var list = new List<string>
+ {
+ deviceProfileName ?? string.Empty,
+ deviceID ?? string.Empty,
+ mediaSourceId ?? string.Empty,
+ isStatic.ToString().ToLower(),
+ videoCodec ?? string.Empty,
+ audioCodec ?? string.Empty,
+ audiostreamIndex.HasValue ? audiostreamIndex.Value.ToString(usCulture) : string.Empty,
+ subtitleIndex.HasValue ? subtitleIndex.Value.ToString(usCulture) : string.Empty,
+ videoBitrate.HasValue ? videoBitrate.Value.ToString(usCulture) : string.Empty,
+ audioBitrate.HasValue ? audioBitrate.Value.ToString(usCulture) : string.Empty,
+ maxAudioChannels ?? string.Empty,
+ startPositionTicks.HasValue ? startPositionTicks.Value.ToString(usCulture) : string.Empty,
+ profile ?? string.Empty,
+ videoLevel ?? string.Empty
+ };
+
+ return string.Format("Params={0}", string.Join(";", list.ToArray()));
}
-
- #endregion
-
}
} \ No newline at end of file