Files
palemoon27/dom/media/mediasource/SourceBufferDecoder.cpp
T
roytam1 fdb63ff9b9 import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1163201 - Part 1: Remove instances of #ifdef PR_LOGGING in dom/. r=froydnj (9979c0e74)
-  Bug 1183972 - No sync-dispatch of new GMPParent - r=cpearce (93339b530)
- Bug 1142935 - reset transports with NuwaAddConstructor(). r=tlee (277406812)
- Bug 1121676 - Use a lock to protect the list of top-level actors (r=bent) (3d0be2f87)
-  Bug 1121676 - Use static mutex to protect top-level protocols (r=bent) (4491dd318)
- Bug 1163201 - Part 2: Wrap expensive calls in PR_LOG_TEST. r=froydnj (7de4b9a97)
- Bug 1163201 - Part 3: Remove mSamples in |MediaEngineWebRTCAudioSource|. r=cpeterson (452442773)
- Bug 1163201 - Part 4: Fix b2g build. r=bustage (a824ea36d)
- Bug 1165518 - Part 1: Add Logging.h. r=froydnj (09d68aaa6)
- Bug 1162850 - Don't stop looking for style sheet load finishes after the FontFaceSet gets a DOMContentLoaded. r=jdaggett (c29fbffa0)
- Bug 1056479 p0 - rename ambiguous GetFontList method in Android fontlist. r=m_kato (76239d7a0)
- Bug 1056479 p1 - add language to FindFamily parameters. r=jfkthame (2271bd7d0)
- Bug 1056479 p1a - use lang as part of pref font fallback. r=karlt (5f5fd66c5)
- cleanup GetTableFromFontData() to match gecko code again (78076fc26)
- Bug 1056479 p2 - implement platform fontlist based on fontconfig. r=karlt (6a7631e44)
- Bug 1056479 p3 - fixup various reftests for Linux. r=jfkthame (b25360708)
- Bug 1056479 p4 - fix accessibility api for font-weight. r=jfkthame (efa8f5080)
- Bug 1056479 p5 - fixup printpreview test. r=jfkthame (3fe2ddc0b)
- Bug 1056479 p6 - handle font updates. r=jfkthame (eb78b2c54)
- Bug 1056479 p7 - fixup assertion for non-italic fallback. r=m_kato (f5e9f539e)
- Bug 1056479 p8 - switch gfxFontConfig to gfxFontconfig. r=karlt (4da146b50)
- Bug 1056479 p9 - fix build bustage. r=birtles (28f246c2b)
- Bug 1056479 p10 - activate bundled fonts. r=m_kato (d7627c3fa)
- Bug 1056479 p10 - activate bundled fonts. r=m_kato (251c02315)
- Bug 1056479 followup: Annotate gfxPlatformGtk::CreatePlatformFontList() as 'override'. rs=ehsan (993e65d6e)
2020-05-30 12:49:03 +08:00

262 lines
6.2 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "MediaSourceUtils.h"
#include "SourceBufferDecoder.h"
#include "prlog.h"
#include "AbstractMediaDecoder.h"
#include "MediaDecoderReader.h"
extern PRLogModuleInfo* GetMediaSourceLog();
/* Polyfill __func__ on MSVC to pass to the log. */
#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif
#define MSE_DEBUG(arg, ...) PR_LOG(GetMediaSourceLog(), PR_LOG_DEBUG, ("SourceBufferDecoder(%p:%s)::%s: " arg, this, mResource->GetContentType().get(), __func__, ##__VA_ARGS__))
namespace mozilla {
class ReentrantMonitor;
namespace layers {
class ImageContainer;
} // namespace layers
NS_IMPL_ISUPPORTS0(SourceBufferDecoder)
SourceBufferDecoder::SourceBufferDecoder(MediaResource* aResource,
AbstractMediaDecoder* aParentDecoder,
int64_t aTimestampOffset)
: mResource(aResource)
, mParentDecoder(aParentDecoder)
, mReader(nullptr)
, mTimestampOffset(aTimestampOffset)
, mRealMediaDuration(0)
, mTrimmedOffset(-1)
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_COUNT_CTOR(SourceBufferDecoder);
}
SourceBufferDecoder::~SourceBufferDecoder()
{
MOZ_COUNT_DTOR(SourceBufferDecoder);
}
bool
SourceBufferDecoder::IsShutdown() const
{
// SourceBufferDecoder cannot be shut down.
MSE_DEBUG("UNIMPLEMENTED");
return false;
}
void
SourceBufferDecoder::NotifyBytesConsumed(int64_t aBytes, int64_t aOffset)
{
MSE_DEBUG("UNIMPLEMENTED");
}
VideoFrameContainer*
SourceBufferDecoder::GetVideoFrameContainer()
{
MSE_DEBUG("UNIMPLEMENTED");
return nullptr;
}
bool
SourceBufferDecoder::IsTransportSeekable()
{
MSE_DEBUG("UNIMPLEMENTED");
return false;
}
bool
SourceBufferDecoder::IsMediaSeekable()
{
MSE_DEBUG("UNIMPLEMENTED");
return false;
}
void
SourceBufferDecoder::MetadataLoaded(nsAutoPtr<MediaInfo> aInfo,
nsAutoPtr<MetadataTags> aTags,
MediaDecoderEventVisibility aEventVisibility)
{
MSE_DEBUG("UNIMPLEMENTED");
}
void
SourceBufferDecoder::FirstFrameLoaded(nsAutoPtr<MediaInfo> aInfo,
MediaDecoderEventVisibility aEventVisibility)
{
MSE_DEBUG("UNIMPLEMENTED");
}
void
SourceBufferDecoder::QueueMetadata(int64_t aTime,
nsAutoPtr<MediaInfo> aInfo,
nsAutoPtr<MetadataTags> aTags)
{
MSE_DEBUG("UNIMPLEMENTED");
}
void
SourceBufferDecoder::RemoveMediaTracks()
{
MSE_DEBUG("UNIMPLEMENTED");
}
bool
SourceBufferDecoder::HasInitializationData()
{
return true;
}
void
SourceBufferDecoder::OnReadMetadataCompleted()
{
MSE_DEBUG("UNIMPLEMENTED");
}
void
SourceBufferDecoder::NotifyWaitingForResourcesStatusChanged()
{
MSE_DEBUG("UNIMPLEMENTED");
}
ReentrantMonitor&
SourceBufferDecoder::GetReentrantMonitor()
{
return mParentDecoder->GetReentrantMonitor();
}
bool
SourceBufferDecoder::OnStateMachineTaskQueue() const
{
return mParentDecoder->OnStateMachineTaskQueue();
}
bool
SourceBufferDecoder::OnDecodeTaskQueue() const
{
// During initialization we run on our TrackBuffer's task queue.
if (mTaskQueue) {
return mTaskQueue->IsCurrentThreadIn();
}
return mParentDecoder->OnDecodeTaskQueue();
}
SourceBufferResource*
SourceBufferDecoder::GetResource() const
{
return static_cast<SourceBufferResource*>(mResource.get());
}
void
SourceBufferDecoder::NotifyDecodedFrames(uint32_t aParsed, uint32_t aDecoded,
uint32_t aDropped)
{
return mParentDecoder->NotifyDecodedFrames(aParsed, aDecoded, aDropped);
}
void
SourceBufferDecoder::SetRealMediaDuration(int64_t aDuration)
{
mRealMediaDuration = aDuration;
}
void
SourceBufferDecoder::Trim(int64_t aDuration)
{
mTrimmedOffset = (double)aDuration / USECS_PER_S;
}
void
SourceBufferDecoder::UpdateEstimatedMediaDuration(int64_t aDuration)
{
MSE_DEBUG("UNIMPLEMENTED");
}
void
SourceBufferDecoder::SetMediaSeekable(bool aMediaSeekable)
{
MSE_DEBUG("UNIMPLEMENTED");
}
layers::ImageContainer*
SourceBufferDecoder::GetImageContainer()
{
return mParentDecoder->GetImageContainer();
}
MediaDecoderOwner*
SourceBufferDecoder::GetOwner()
{
return mParentDecoder->GetOwner();
}
void
SourceBufferDecoder::NotifyDataArrived(const char* aBuffer, uint32_t aLength, int64_t aOffset)
{
mReader->NotifyDataArrived(aBuffer, aLength, aOffset);
// XXX: Params make no sense to parent decoder as it relates to a
// specific SourceBufferDecoder's data stream. Pass bogus values here to
// force parent decoder's state machine to recompute end time for
// infinite length media.
mParentDecoder->NotifyDataArrived(nullptr, 0, 0);
}
media::TimeIntervals
SourceBufferDecoder::GetBuffered()
{
media::TimeIntervals buffered = mReader->GetBuffered();
if (buffered.IsInvalid()) {
return buffered;
}
// Adjust buffered range according to timestamp offset.
buffered.Shift(media::TimeUnit::FromMicroseconds(mTimestampOffset));
if (!WasTrimmed()) {
return buffered;
}
media::TimeInterval filter(media::TimeUnit::FromSeconds(0),
media::TimeUnit::FromSeconds(mTrimmedOffset));
return buffered.Intersection(filter);
}
int64_t
SourceBufferDecoder::ConvertToByteOffset(double aTime)
{
int64_t readerOffset =
mReader->GetEvictionOffset(aTime - double(mTimestampOffset) / USECS_PER_S);
if (readerOffset >= 0) {
return readerOffset;
}
// Uses a conversion based on (aTime/duration) * length. For the
// purposes of eviction this should be adequate since we have the
// byte threshold as well to ensure data actually gets evicted and
// we ensure we don't evict before the current playable point.
if (mRealMediaDuration <= 0) {
return -1;
}
int64_t length = GetResource()->GetLength();
MOZ_ASSERT(length > 0);
int64_t offset =
((aTime - double(mTimestampOffset) / USECS_PER_S) /
(double(mRealMediaDuration) / USECS_PER_S)) * length;
return offset;
}
#undef MSE_DEBUG
} // namespace mozilla