Skip to content

Commit

Permalink
Fixing an issue with streams that have start_time != 0
Browse files Browse the repository at this point in the history
Former-commit-id: cfa7858
  • Loading branch information
SuRGeoNix committed Mar 5, 2021
1 parent 974fbcc commit 953348e
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 13 deletions.
8 changes: 4 additions & 4 deletions Flyleaf/MediaFramework/Decoder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -428,17 +428,17 @@ public void Decode()
continue;
}

//Log(Utils.TicksToTime((long)(mFrame.pts * demuxer.streams[st->index].timebase)) + " | pts -> " + mFrame.pts);
//Log(Utils.TicksToTime((long)(mFrame.pts * demuxer.streams[st->index].Timebase)) + " | pts -> " + mFrame.pts);

if (type == Type.Video)
{
mFrame.timestamp = ((long)(mFrame.pts * info.Timebase)) + opt.audio.LatencyTicks;
mFrame.timestamp = ((long)(mFrame.pts * info.Timebase) - demuxer.streams[st->index].StartTime) + opt.audio.LatencyTicks;
if (MediaFrame.ProcessVideoFrame(this, mFrame, frame) != 0) mFrame = null;

}
else // Audio
{
mFrame.timestamp = ((long)(mFrame.pts * info.Timebase)) + opt.audio.DelayTicks;
mFrame.timestamp = ((long)(mFrame.pts * info.Timebase) - demuxer.streams[st->index].StartTime) + opt.audio.DelayTicks;
if (MediaFrame.ProcessAudioFrame(this, mFrame, frame) < 0) mFrame = null;
}

Expand Down Expand Up @@ -466,7 +466,7 @@ public void Decode()
if (ret != AVERROR(EAGAIN)) { Log($"[ERROR-3] {Utils.ErrorCodeToMsg(ret)} ({ret})"); break; }
}

Log($"Done {(allowedErrors == 200 ? "" : "[Errors: {200 - allowedErrors}]")}");
Log($"Done {(allowedErrors == 200 ? "" : $"[Errors: {200 - allowedErrors}]")}");
}
}

Expand Down
6 changes: 3 additions & 3 deletions Flyleaf/MediaFramework/Demuxer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ public int Seek(long ms, bool foreward = false)
}
public long CalcSeekTimestamp(long ms)
{
long ticks = (ms * 10000) - decCtx.opt.audio.LatencyTicks;
long ticks = ((ms * 10000) + streams[decoder.st->index].StartTime) - decCtx.opt.audio.LatencyTicks;

switch (type)
{
Expand Down Expand Up @@ -416,7 +416,7 @@ public void Demux()
case AVMEDIA_TYPE_AUDIO:
decCtx.aDecoder.packets.Enqueue((IntPtr)pkt);
pkt = av_packet_alloc();
//Log("[Audio] " + Utils.TicksToTime((long)(pkt->pts * streams[decCtx.audio.st->index].timebase)) + " | pts -> " + pkt->pts);
//Log("[Audio] " + Utils.TicksToTime((long)(pkt->pts * streams[decCtx.aDecoder.st->index].Timebase)) + " | pts -> " + pkt->pts);
//af++;
break;

Expand All @@ -431,7 +431,7 @@ public void Demux()
case AVMEDIA_TYPE_SUBTITLE:
decCtx.sDecoder.packets.Enqueue((IntPtr)pkt);
pkt = av_packet_alloc();
//Log("[ Subs] " + Utils.TicksToTime((long)(pkt->pts * streams[decCtx.subs.st->index].timebase)) + " | pts -> " + pkt->pts);
//Log("[ Subs] " + Utils.TicksToTime((long)(pkt->pts * streams[decCtx.sDecoder.st->index].Timebase)) + " | pts -> " + pkt->pts);
//sf++;
break;

Expand Down
19 changes: 13 additions & 6 deletions Flyleaf/MediaRouter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,11 @@ public long SubsExternalDelay
public int PrevSubId { get; private set; } = -1;
public List<Language> Languages { get; set; } = new List<Language>();
public List<SubAvailable> AvailableSubs { get; set; }
#if DEBUG
public DownloadSubsMode DownloadSubs { get; set; } = DownloadSubsMode.Never;
#else
public DownloadSubsMode DownloadSubs { get; set; } = DownloadSubsMode.FilesAndTorrents;
#endif
public class SubAvailable
{
public Language lang;
Expand Down Expand Up @@ -420,8 +424,9 @@ private void InitializeEnv()
status = Status.OPENED;
isReady = true;

//decoder.Seek(0);
//ShowOneFrame();

renderer.NewMessage(OSDMessage.Type.Open, $"Opened");
renderer.NewMessage(OSDMessage.Type.HardwareAcceleration);
OpenFinishedClbk?.BeginInvoke(true, UrlName, null, null);
Expand Down Expand Up @@ -449,7 +454,7 @@ private bool MediaBuffer()
torrentStreamer.bitSwarmOpt.EnableBuffering = true;

// At least 2 video frames & MinQueueSize video packets demuxed
while ((decoder.vDecoder.frames.Count < 2 || decoder.vDecoder.packets.Count < decoder.opt.demuxer.MinQueueSize) && !decoder.Finished && isPlaying)
while ((decoder.vDecoder.frames.Count < 2 || (decoder.vDecoder.packets.Count < decoder.opt.demuxer.MinQueueSize && decoder.demuxer.status == MediaFramework.Status.PLAY)) && !decoder.Finished && isPlaying)
Thread.Sleep(15);

torrentStreamer.bitSwarmOpt.EnableBuffering = false;
Expand Down Expand Up @@ -501,7 +506,8 @@ private void Screamer()
if (sleepMs < 0) sleepMs = 0;
if (sleepMs > 2)
{
if (sleepMs > 1000)
// It will not allowed uncommon formats with slow frame rates to play (maybe check if fps = 1? means dynamic fps?)
if (sleepMs > 1000)
{
Log("[SCREAMER] Restarting ... (HLS?)");
MediaBuffer();
Expand Down Expand Up @@ -749,9 +755,10 @@ public void Seek(int ms, bool priority = false, bool foreward = false)
SeekData seekData;
int seeksCount;
bool shouldPlay = false;
int cancelOffsetMs = 500;

//Thread.Sleep(150); // Decide time?
if (!seeks.TryPop(out seekData) || (seekData.ms - 1000 <= lastSeekMs && seekData.ms + 1000 >= lastSeekMs)) { Log("Seek Thread Cancel!"); return; }
if (!seeks.TryPop(out seekData) || (seekData.ms - cancelOffsetMs <= lastSeekMs && seekData.ms + cancelOffsetMs >= lastSeekMs)) { Log("Seek Thread Cancel!"); return; }
seeksCount = seeks.Count;

while (true)
Expand Down Expand Up @@ -802,7 +809,7 @@ public void Seek(int ms, bool priority = false, bool foreward = false)
{
if (seekWatch.ElapsedMilliseconds > 250 && seeksCount != seeks.Count && seeks.TryPeek(out SeekData tmpSeekData))
{
if (tmpSeekData.ms - 1000 <= lastSeekMs && tmpSeekData.ms + 1000 >= lastSeekMs)
if (tmpSeekData.ms - cancelOffsetMs <= lastSeekMs && tmpSeekData.ms + cancelOffsetMs >= lastSeekMs)
{
Log("No abort - Next Seek Canceled " + Utils.TicksToTime(tmpSeekData.ms * (long)10000));
seeks.TryPop(out tmpSeekData);
Expand Down Expand Up @@ -848,7 +855,7 @@ public void Seek(int ms, bool priority = false, bool foreward = false)
//if (seeks.IsEmpty) Thread.Sleep(1000); // Decide time?
if (seeksCount == seeks.Count) { Log("Seek Empty"); break; }

if (!seeks.TryPop(out seekData) || (seekData.ms - 1000 <= lastSeekMs && seekData.ms + 1000 >= lastSeekMs))
if (!seeks.TryPop(out seekData) || (seekData.ms - cancelOffsetMs <= lastSeekMs && seekData.ms + cancelOffsetMs >= lastSeekMs))
{
if (shouldPlay) Play();
Log("Seek Cancel");
Expand Down

0 comments on commit 953348e

Please sign in to comment.