aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2015-03-16 00:07:46 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2015-03-16 00:07:46 -0400
commitcaa223e1db3614e0aaf2e1a691e1943341d16a03 (patch)
tree13302f85a7c454ed693904c1f3d4ec814d2a4019
parente8161cf8acfb1ec6925cc670808e9d66c279daec (diff)
update mpeg dash
-rw-r--r--MediaBrowser.Api/Playback/Dash/ManifestBuilder.cs4
-rw-r--r--MediaBrowser.Api/Playback/Dash/MpegDashService.cs69
-rw-r--r--MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs9
3 files changed, 29 insertions, 53 deletions
diff --git a/MediaBrowser.Api/Playback/Dash/ManifestBuilder.cs b/MediaBrowser.Api/Playback/Dash/ManifestBuilder.cs
index 20ea7893c..58adacb79 100644
--- a/MediaBrowser.Api/Playback/Dash/ManifestBuilder.cs
+++ b/MediaBrowser.Api/Playback/Dash/ManifestBuilder.cs
@@ -43,7 +43,7 @@ namespace MediaBrowser.Api.Playback.Dash
builder.Append("<AdaptationSet id=\"video\" segmentAlignment=\"true\" bitstreamSwitching=\"true\">");
builder.Append(GetVideoRepresentationOpenElement(state));
- AppendSegmentList(state, builder, "video", playlistUrl);
+ AppendSegmentList(state, builder, "0", playlistUrl);
builder.Append("</Representation>");
builder.Append("</AdaptationSet>");
@@ -60,7 +60,7 @@ namespace MediaBrowser.Api.Playback.Dash
builder.Append("<AudioChannelConfiguration schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\" value=\"6\" />");
- AppendSegmentList(state, builder, "audio", playlistUrl);
+ AppendSegmentList(state, builder, "1", playlistUrl);
builder.Append("</Representation>");
builder.Append("</AdaptationSet>");
diff --git a/MediaBrowser.Api/Playback/Dash/MpegDashService.cs b/MediaBrowser.Api/Playback/Dash/MpegDashService.cs
index 4ba32575c..f24061c3f 100644
--- a/MediaBrowser.Api/Playback/Dash/MpegDashService.cs
+++ b/MediaBrowser.Api/Playback/Dash/MpegDashService.cs
@@ -37,7 +37,7 @@ namespace MediaBrowser.Api.Playback.Dash
}
}
- [Route("/Videos/{Id}/dash/{SegmentType}/{SegmentId}.m4s", "GET")]
+ [Route("/Videos/{Id}/dash/{RepresentationId}/{SegmentId}.m4s", "GET")]
public class GetDashSegment : VideoStreamRequest
{
/// <summary>
@@ -47,10 +47,10 @@ namespace MediaBrowser.Api.Playback.Dash
public string SegmentId { get; set; }
/// <summary>
- /// Gets or sets the type of the segment.
+ /// Gets or sets the representation identifier.
/// </summary>
- /// <value>The type of the segment.</value>
- public string SegmentType { get; set; }
+ /// <value>The representation identifier.</value>
+ public string RepresentationId { get; set; }
}
public class MpegDashService : BaseHlsService
@@ -106,10 +106,10 @@ namespace MediaBrowser.Api.Playback.Dash
public object Get(GetDashSegment request)
{
- return GetDynamicSegment(request, request.SegmentId, request.SegmentType).Result;
+ return GetDynamicSegment(request, request.SegmentId, request.RepresentationId).Result;
}
- private async Task<object> GetDynamicSegment(VideoStreamRequest request, string segmentId, string segmentType)
+ private async Task<object> GetDynamicSegment(VideoStreamRequest request, string segmentId, string representationId)
{
if ((request.StartTimeTicks ?? 0) > 0)
{
@@ -127,7 +127,7 @@ namespace MediaBrowser.Api.Playback.Dash
var segmentExtension = GetSegmentFileExtension(state);
- var segmentPath = GetSegmentPath(playlistPath, segmentType, segmentExtension, index);
+ var segmentPath = GetSegmentPath(playlistPath, representationId, segmentExtension, index);
var segmentLength = state.SegmentLength;
TranscodingJob job = null;
@@ -248,7 +248,7 @@ namespace MediaBrowser.Api.Playback.Dash
CancellationToken cancellationToken)
{
// If all transcoding has completed, just return immediately
- if (!IsTranscoding(playlistPath))
+ if (transcodingJob != null && transcodingJob.HasExited)
{
return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob);
}
@@ -327,13 +327,6 @@ namespace MediaBrowser.Api.Playback.Dash
});
}
- private bool IsTranscoding(string playlistPath)
- {
- var job = ApiEntryPoint.Instance.GetTranscodingJob(playlistPath, TranscodingJobType);
-
- return job != null && !job.HasExited;
- }
-
public int? GetCurrentTranscodingIndex(string playlist, string segmentExtension)
{
var file = GetLastTranscodingFile(playlist, segmentExtension, FileSystem);
@@ -397,25 +390,12 @@ namespace MediaBrowser.Api.Playback.Dash
}
}
- private string GetSegmentPath(string playlist, string segmentType, string segmentExtension, int index)
+ private string GetSegmentPath(string playlist, string representationId, string segmentExtension, int index)
{
var folder = Path.GetDirectoryName(playlist);
- var id = string.Equals(segmentType, "video", StringComparison.OrdinalIgnoreCase)
- ? "0"
- : "1";
-
- string filename;
-
- if (index == 0)
- {
- filename = "init-stream" + id + segmentExtension;
- }
- else
- {
- var number = index.ToString("00000", CultureInfo.InvariantCulture);
- filename = "chunk-stream" + id + "-" + number + segmentExtension;
- }
+ var number = index.ToString("00000", CultureInfo.InvariantCulture);
+ var filename = "chunk-stream" + representationId + "-" + number + segmentExtension;
return Path.Combine(folder, filename);
}
@@ -500,7 +480,7 @@ namespace MediaBrowser.Api.Playback.Dash
var inputModifier = GetInputModifier(state);
- var args = string.Format("{0} {1} -map_metadata -1 -threads {2} {3} {4} -copyts {5} -f dash -use_template 0 -min_seg_duration {6} -y \"{7}\"",
+ var args = string.Format("{0} {1} -map_metadata -1 -threads {2} {3} {4} -copyts {5} -f dash -init_seg_name \"chunk-stream$RepresentationID$-00000.m4s\" -use_template 0 -min_seg_duration {6} -y \"{7}\"",
inputModifier,
GetInputArgument(transcodingJobId, state),
threads,
@@ -514,20 +494,23 @@ namespace MediaBrowser.Api.Playback.Dash
return args;
}
- //private string GetCurrentTranscodingIndex(string outputPath)
- //{
+ protected override int GetStartNumber(StreamState state)
+ {
+ return GetStartNumber(state.VideoRequest);
+ }
- //}
+ private int GetStartNumber(VideoStreamRequest request)
+ {
+ var segmentId = "0";
- //private string GetNextTranscodingIndex(string outputPath)
- //{
-
- //}
+ var segmentRequest = request as GetDashSegment;
+ if (segmentRequest != null)
+ {
+ segmentId = segmentRequest.SegmentId;
+ }
- //private string GetActualPlaylistPath(string outputPath, string transcodingIndex)
- //{
-
- //}
+ return int.Parse(segmentId, NumberStyles.Integer, UsCulture);
+ }
/// <summary>
/// Gets the segment file extension.
diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
index 35ecbd142..9ae9f32fa 100644
--- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
@@ -279,7 +279,7 @@ namespace MediaBrowser.Api.Playback.Hls
CancellationToken cancellationToken)
{
// If all transcoding has completed, just return immediately
- if (!IsTranscoding(playlistPath))
+ if (transcodingJob != null && transcodingJob.HasExited)
{
return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob);
}
@@ -358,13 +358,6 @@ namespace MediaBrowser.Api.Playback.Hls
});
}
- private bool IsTranscoding(string playlistPath)
- {
- var job = ApiEntryPoint.Instance.GetTranscodingJob(playlistPath, TranscodingJobType);
-
- return job != null && !job.HasExited;
- }
-
private async Task<object> GetAsync(GetMasterHlsVideoStream request, string method)
{
var state = await GetState(request, CancellationToken.None).ConfigureAwait(false);