Patch overdumped MPEG-DASH segments.
All checks were successful
🚀 Pack skyscraper8 / make-zip (push) Successful in 3m25s

This commit is contained in:
feyris-tan 2025-11-23 21:23:41 +01:00
parent 30026b2b02
commit 3668cad724
5 changed files with 59 additions and 11 deletions

View File

@ -1,13 +1,14 @@
using System; using log4net;
using MimeKit;
using skyscraper5.Skyscraper.IO;
using skyscraper8.Ietf.FLUTE;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml.Serialization; using System.Xml.Serialization;
using MimeKit;
using skyscraper5.Skyscraper.IO;
using skyscraper8.Ietf.FLUTE;
namespace skyscraper8.DvbNip namespace skyscraper8.DvbNip
{ {
@ -15,6 +16,7 @@ namespace skyscraper8.DvbNip
{ {
private DvbNipUtilities() { } private DvbNipUtilities() { }
private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name);
private static XmlSerializer multicastGatewayConfigurationXmlSerializer; private static XmlSerializer multicastGatewayConfigurationXmlSerializer;
public static bool IsXml(Stream s) public static bool IsXml(Stream s)
@ -225,5 +227,24 @@ namespace skyscraper8.DvbNip
} }
throw new NotImplementedException(); throw new NotImplementedException();
} }
public static FluteListener PatchMpegDashSegment(FluteListener listener)
{
Stream stream = listener.ToStream();
stream.Position = stream.Length - 1;
byte readUInt8 = stream.ReadUInt8();
if (readUInt8 != 0)
return listener;
logger.WarnFormat("MPEG-DASH segment {0} is overdumped. It will be patched to become playable.", listener.FileAssociation.ContentLocation);
stream.Position = stream.Length - 1;
while (stream.ReadUInt8() == 0)
{
stream.Position -= 2;
}
listener.TrimmedLength = stream.Position;
return listener;
}
} }
} }

View File

@ -119,7 +119,7 @@ namespace skyscraper8.Ietf.FLUTE
} }
internal bool IsComplete() internal virtual bool IsComplete()
{ {
if (_disabled) if (_disabled)
return false; return false;
@ -165,6 +165,10 @@ namespace skyscraper8.Ietf.FLUTE
blockPayloads.Sort(new FluteBlockComparer()); blockPayloads.Sort(new FluteBlockComparer());
level1 = new FluteListenerStream(blockPayloads); level1 = new FluteListenerStream(blockPayloads);
} }
if (TrimmedLength.HasValue)
{
level1.SetLength(TrimmedLength.Value);
}
if (FileAssociation != null) if (FileAssociation != null)
{ {
@ -288,5 +292,6 @@ namespace skyscraper8.Ietf.FLUTE
} }
public double LastReportedProgress { get; internal set; } public double LastReportedProgress { get; internal set; }
public long? TrimmedLength { get; set; }
} }
} }

View File

@ -4,9 +4,8 @@ using System.Linq;
using System.Net; using System.Net;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using skyscraper8.Ietf.FLUTE;
namespace skyscraper8.Ietf namespace skyscraper8.Ietf.FLUTE
{ {
internal class FluteListenerMime : FluteListener internal class FluteListenerMime : FluteListener
{ {

View File

@ -118,9 +118,17 @@ namespace skyscraper8.Ietf.FLUTE
return currentPosition; return currentPosition;
} }
private bool _isLengthLimited;
private long _limitedLength;
public override void SetLength(long value) public override void SetLength(long value)
{ {
throw new NotSupportedException("Can't modify the length of a ModuleInfo"); if (value > myModuleLength)
{
throw new ArgumentOutOfRangeException(String.Format("Argument must be between 0 and {0}", myModuleLength));
}
_limitedLength = value;
_isLengthLimited = true;
} }
public override void Write(byte[] buffer, int offset, int count) public override void Write(byte[] buffer, int offset, int count)
@ -131,7 +139,17 @@ namespace skyscraper8.Ietf.FLUTE
public override bool CanRead => true; public override bool CanRead => true;
public override bool CanSeek => true; public override bool CanSeek => true;
public override bool CanWrite => false; public override bool CanWrite => false;
public override long Length => myModuleLength;
public override long Length
{
get
{
if (_isLengthLimited)
return _limitedLength;
else
return myModuleLength;
}
}
public override long Position public override long Position
{ {

View File

@ -86,7 +86,6 @@ using skyscraper8.GS;
using skyscraper8.GSE; using skyscraper8.GSE;
using skyscraper8.GSE.GSE; using skyscraper8.GSE.GSE;
using skyscraper8.Ieee802_1AB; using skyscraper8.Ieee802_1AB;
using skyscraper8.Ietf;
using skyscraper8.InteractionChannel.Model; using skyscraper8.InteractionChannel.Model;
using skyscraper8.InteractionChannel.Model2; using skyscraper8.InteractionChannel.Model2;
using skyscraper8.InteractionChannel.Model2.Descriptors; using skyscraper8.InteractionChannel.Model2.Descriptors;
@ -2778,6 +2777,12 @@ namespace skyscraper5.Skyscraper.Scraper
knownNipSegments[ep] = new List<string>(); knownNipSegments[ep] = new List<string>();
knownNipSegments[ep].Add(listener.FileAssociation.ContentLocation); knownNipSegments[ep].Add(listener.FileAssociation.ContentLocation);
} }
if (extension.Equals(".m4s"))
{
listener = DvbNipUtilities.PatchMpegDashSegment(listener);
}
ObjectStorage.DvbNipFileArrival(carrier, listener); ObjectStorage.DvbNipFileArrival(carrier, listener);
} }