jellyfin/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs

220 lines
7.8 KiB
C#
Raw Normal View History

2014-05-04 14:19:46 +00:00
using MediaBrowser.Model.MediaInfo;
2014-04-24 05:08:10 +00:00
using System.Collections.Generic;
2014-04-23 02:47:46 +00:00
namespace MediaBrowser.Model.Dlna
{
public class ContentFeatureBuilder
{
private readonly DeviceProfile _profile;
public ContentFeatureBuilder(DeviceProfile profile)
{
_profile = profile;
}
2014-04-24 05:08:10 +00:00
public string BuildImageHeader(string container,
int? width,
int? height)
{
string orgOp = ";DLNA.ORG_OP=" + DlnaMaps.GetImageOrgOpValue();
2014-04-24 05:08:10 +00:00
// 0 = native, 1 = transcoded
const string orgCi = ";DLNA.ORG_CI=0";
DlnaFlags flagValue = DlnaFlags.StreamingTransferMode |
2014-04-24 05:08:10 +00:00
DlnaFlags.BackgroundTransferMode |
DlnaFlags.DlnaV15;
string dlnaflags = string.Format(";DLNA.ORG_FLAGS={0}",
2014-05-09 19:43:06 +00:00
DlnaMaps.FlagsToString(flagValue));
2014-04-24 05:08:10 +00:00
ResponseProfile mediaProfile = _profile.GetImageMediaProfile(container,
2014-04-24 05:08:10 +00:00
width,
height);
string orgPn = mediaProfile == null ? null : mediaProfile.OrgPn;
2014-04-24 05:08:10 +00:00
if (string.IsNullOrEmpty(orgPn))
{
orgPn = GetImageOrgPnValue(container, width, height);
}
string contentFeatures = string.IsNullOrEmpty(orgPn) ? string.Empty : "DLNA.ORG_PN=" + orgPn;
2014-04-24 05:08:10 +00:00
return (contentFeatures + orgOp + orgCi + dlnaflags).Trim(';');
}
public string BuildAudioHeader(string container,
2014-04-23 02:47:46 +00:00
string audioCodec,
2014-04-24 05:08:10 +00:00
int? audioBitrate,
int? audioSampleRate,
int? audioChannels,
bool isDirectStream,
long? runtimeTicks,
2014-04-23 02:47:46 +00:00
TranscodeSeekInfo transcodeSeekInfo)
{
// first bit means Time based seek supported, second byte range seek supported (not sure about the order now), so 01 = only byte seek, 10 = time based, 11 = both, 00 = none
string orgOp = ";DLNA.ORG_OP=" + DlnaMaps.GetOrgOpValue(runtimeTicks.HasValue, isDirectStream, transcodeSeekInfo);
2014-04-23 02:47:46 +00:00
// 0 = native, 1 = transcoded
string orgCi = isDirectStream ? ";DLNA.ORG_CI=0" : ";DLNA.ORG_CI=1";
2014-04-23 02:47:46 +00:00
DlnaFlags flagValue = DlnaFlags.StreamingTransferMode |
2014-04-23 02:47:46 +00:00
DlnaFlags.BackgroundTransferMode |
DlnaFlags.DlnaV15;
if (isDirectStream)
{
//flagValue = flagValue | DlnaFlags.DLNA_ORG_FLAG_BYTE_BASED_SEEK;
}
else if (runtimeTicks.HasValue)
{
//flagValue = flagValue | DlnaFlags.DLNA_ORG_FLAG_TIME_BASED_SEEK;
}
string dlnaflags = string.Format(";DLNA.ORG_FLAGS={0}",
2014-05-09 19:43:06 +00:00
DlnaMaps.FlagsToString(flagValue));
2014-04-23 02:47:46 +00:00
ResponseProfile mediaProfile = _profile.GetAudioMediaProfile(container,
2014-04-24 05:08:10 +00:00
audioCodec,
audioChannels,
audioBitrate);
2014-04-23 02:47:46 +00:00
string orgPn = mediaProfile == null ? null : mediaProfile.OrgPn;
2014-04-23 02:47:46 +00:00
if (string.IsNullOrEmpty(orgPn))
{
orgPn = GetAudioOrgPnValue(container, audioBitrate, audioSampleRate, audioChannels);
}
string contentFeatures = string.IsNullOrEmpty(orgPn) ? string.Empty : "DLNA.ORG_PN=" + orgPn;
2014-04-23 02:47:46 +00:00
return (contentFeatures + orgOp + orgCi + dlnaflags).Trim(';');
}
2014-07-31 02:09:23 +00:00
public List<string> BuildVideoHeader(string container,
2014-04-24 05:08:10 +00:00
string videoCodec,
string audioCodec,
int? width,
int? height,
int? bitDepth,
int? videoBitrate,
int? audioChannels,
int? audioBitrate,
TransportStreamTimestamp timestamp,
bool isDirectStream,
long? runtimeTicks,
string videoProfile,
double? videoLevel,
2014-06-23 16:05:19 +00:00
float? videoFramerate,
2014-04-24 05:08:10 +00:00
int? packetLength,
2014-06-22 16:25:47 +00:00
TranscodeSeekInfo transcodeSeekInfo,
bool? isAnamorphic)
2014-04-23 02:47:46 +00:00
{
// first bit means Time based seek supported, second byte range seek supported (not sure about the order now), so 01 = only byte seek, 10 = time based, 11 = both, 00 = none
string orgOp = ";DLNA.ORG_OP=" + DlnaMaps.GetOrgOpValue(runtimeTicks.HasValue, isDirectStream, transcodeSeekInfo);
2014-04-23 02:47:46 +00:00
// 0 = native, 1 = transcoded
string orgCi = isDirectStream ? ";DLNA.ORG_CI=0" : ";DLNA.ORG_CI=1";
2014-04-23 02:47:46 +00:00
DlnaFlags flagValue = DlnaFlags.StreamingTransferMode |
2014-04-23 02:47:46 +00:00
DlnaFlags.BackgroundTransferMode |
DlnaFlags.DlnaV15;
if (isDirectStream)
{
//flagValue = flagValue | DlnaFlags.DLNA_ORG_FLAG_BYTE_BASED_SEEK;
}
else if (runtimeTicks.HasValue)
{
//flagValue = flagValue | DlnaFlags.DLNA_ORG_FLAG_TIME_BASED_SEEK;
}
string dlnaflags = string.Format(";DLNA.ORG_FLAGS={0}",
2014-05-09 19:43:06 +00:00
DlnaMaps.FlagsToString(flagValue));
2014-04-23 02:47:46 +00:00
ResponseProfile mediaProfile = _profile.GetVideoMediaProfile(container,
2014-04-24 05:08:10 +00:00
audioCodec,
videoCodec,
audioBitrate,
audioChannels,
width,
height,
bitDepth,
videoBitrate,
videoProfile,
videoLevel,
videoFramerate,
packetLength,
2014-06-22 16:25:47 +00:00
timestamp,
isAnamorphic);
2014-04-24 05:08:10 +00:00
2014-07-31 02:09:23 +00:00
List<string> orgPnValues = new List<string>();
2014-04-24 05:08:10 +00:00
2014-07-31 02:09:23 +00:00
if (mediaProfile != null && !string.IsNullOrEmpty(mediaProfile.OrgPn))
{
orgPnValues.Add(mediaProfile.OrgPn);
}
else
2014-04-23 02:47:46 +00:00
{
foreach (string s in GetVideoOrgPnValue(container, videoCodec, audioCodec, width, height, timestamp))
{
2014-07-31 02:09:23 +00:00
orgPnValues.Add(s);
break;
}
}
2014-04-24 05:08:10 +00:00
2014-07-31 02:09:23 +00:00
List<string> contentFeatureList = new List<string>();
foreach (string orgPn in orgPnValues)
{
2014-07-31 02:09:23 +00:00
string contentFeatures = string.IsNullOrEmpty(orgPn) ? string.Empty : "DLNA.ORG_PN=" + orgPn;
var value = (contentFeatures + orgOp + orgCi + dlnaflags).Trim(';');
contentFeatureList.Add(value);
2014-04-23 02:47:46 +00:00
}
2014-07-31 02:09:23 +00:00
if (orgPnValues.Count == 0)
{
string contentFeatures = string.Empty;
2014-04-23 02:47:46 +00:00
2014-07-31 02:09:23 +00:00
var value = (contentFeatures + orgOp + orgCi + dlnaflags).Trim(';');
contentFeatureList.Add(value);
}
return contentFeatureList;
2014-04-23 02:47:46 +00:00
}
2014-04-24 05:08:10 +00:00
private string GetImageOrgPnValue(string container, int? width, int? height)
{
MediaFormatProfile? format = new MediaFormatProfileResolver()
2014-04-24 05:08:10 +00:00
.ResolveImageFormat(container,
width,
height);
return format.HasValue ? format.Value.ToString() : null;
}
2014-04-23 02:47:46 +00:00
private string GetAudioOrgPnValue(string container, int? audioBitrate, int? audioSampleRate, int? audioChannels)
{
MediaFormatProfile? format = new MediaFormatProfileResolver()
2014-04-23 02:47:46 +00:00
.ResolveAudioFormat(container,
audioBitrate,
audioSampleRate,
audioChannels);
return format.HasValue ? format.Value.ToString() : null;
}
private List<string> GetVideoOrgPnValue(string container, string videoCodec, string audioCodec, int? width, int? height, TransportStreamTimestamp timestamp)
2014-04-23 02:47:46 +00:00
{
List<string> list = new List<string>();
foreach (MediaFormatProfile i in new MediaFormatProfileResolver().ResolveVideoFormat(container, videoCodec, audioCodec, width, height, timestamp))
list.Add(i.ToString());
return list;
2014-04-23 02:47:46 +00:00
}
}
}