Bug 1878510 - When recreating WebM demuxer when encountering a new segment, propagate media time

This commit is contained in:
Moonchild 2024-09-25 22:22:49 +02:00 committed by roytam1
commit 60c31a5473
4 changed files with 51 additions and 5 deletions

View file

@ -17,6 +17,7 @@
#include "gfx2DGlue.h"
#include "mozilla/Atomics.h"
#include "mozilla/EndianUtils.h"
#include "mozilla/Maybe.h"
#include "mozilla/SharedThreadPool.h"
#include "MediaDataDemuxer.h"
#include "nsAutoPtr.h"
@ -158,7 +159,9 @@ WebMDemuxer::WebMDemuxer(MediaResource* aResource)
{
}
WebMDemuxer::WebMDemuxer(MediaResource* aResource, bool aIsMediaSource)
WebMDemuxer::WebMDemuxer(MediaResource* aResource,
bool aIsMediaSource,
Maybe<int64_t> aFrameEndTimeBeforeRecreateDemuxer)
: mVideoContext(this, aResource)
, mAudioContext(this, aResource)
, mBufferedState(nullptr)
@ -174,6 +177,13 @@ WebMDemuxer::WebMDemuxer(MediaResource* aResource, bool aIsMediaSource)
, mLastWebMBlockOffset(-1)
, mIsMediaSource(aIsMediaSource)
{
MOZ_ASSERT_IF(!aIsMediaSource,
aFrameEndTimeBeforeRecreateDemuxer.isNothing());
if (aIsMediaSource && aFrameEndTimeBeforeRecreateDemuxer) {
mVideoFrameEndTimeBeforeReset = aFrameEndTimeBeforeRecreateDemuxer;
WEBM_DEBUG("Set mVideoFrameEndTimeBeforeReset=%" PRId64,
mVideoFrameEndTimeBeforeReset);
}
}
WebMDemuxer::~WebMDemuxer()
@ -592,6 +602,10 @@ WebMDemuxer::GetNextPacket(TrackInfo::TrackType aType, MediaRawDataQueue *aSampl
}
int64_t tstamp = holder->Timestamp();
int64_t duration = holder->Duration();
if (aType == TrackInfo::TrackType::kVideoTrack) {
WEBM_DEBUG("GetNextPacket(video): tstamp=%" PRId64 ", duration=%" PRId64,
tstamp, duration);
}
// The end time of this frame is the start time of the next frame. Fetch
// the timestamp of the next packet for this track. If we've reached the
@ -632,6 +646,10 @@ WebMDemuxer::GetNextPacket(TrackInfo::TrackType aType, MediaRawDataQueue *aSampl
(mIsMediaSource && mLastVideoFrameTime.isSome())) {
next_tstamp = tstamp;
next_tstamp += tstamp - mLastVideoFrameTime.refOr(0);
} else if (mVideoFrameEndTimeBeforeReset) {
WEBM_DEBUG("Setting next timestamp to be %" PRId64 " us",
mVideoFrameEndTimeBeforeReset);
next_tstamp = mVideoFrameEndTimeBeforeReset.ref();
} else {
PushVideoPacket(holder);
}

View file

@ -92,7 +92,9 @@ public:
explicit WebMDemuxer(MediaResource* aResource);
// Indicate if the WebMDemuxer is to be used with MediaSource. In which
// case the demuxer will stop reads to the last known complete block.
WebMDemuxer(MediaResource* aResource, bool aIsMediaSource);
WebMDemuxer(MediaResource* aResource,
bool aIsMediaSource,
Maybe<int64_t> aFrameEndTimeBeforeRecreateDemuxer = Nothing());
RefPtr<InitPromise> Init() override;
@ -227,6 +229,8 @@ private:
Maybe<int64_t> mLastAudioFrameTime;
Maybe<int64_t> mLastVideoFrameTime;
Maybe<int64_t> mVideoFrameEndTimeBeforeReset;
// Codec ID of audio track
int mAudioCodec;
// Codec ID of video track