mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:30:27 +00:00
04083ef9b4
- Bug 1235261 - Part 1: Rename nsAutoTArray to AutoTArray. r=froydnj (0662c2ac56)
- Bug 1235261 - Part 2: Switch some uses of AutoFallibleTArray to AutoTArray. r=froydnj (ab52085f2a)
- Bug 1235261 - Part 3: Switch remaining uses of AutoFallibleTArray to AutoTArray. r=froydnj (3763b16ddd)
- Bug 1235261 - Part 4: Remove AutoFallibleTArray. r=froydnj (5480b0d786)
- Bug 1235261 - Part 5: Merge nsAutoArrayBase into AutoTArray. r=froydnj (6c64e73e3b)
- Bug 1235261 - Part 7: Remove AutoInfallibleTArray. r=froydnj (acf266464e)
- Bug 1222624: Make xpath document() function use nsIPrincipals and nsIURIs rather than strings. r=peterv (5ee694d132)
- Bug 1235261 - Part 6: Rename AutoInfallibleTArray to AutoTArray. r=froydnj (d282f7df6c)
- Bug 1241394 - Hit testing with 3d transforms should use fuzzy when comparing depths. r=thinker (6c3f50670f)
- Bug 1241394 - Follow up to fix windows build bustage. (02ab2600af)
- Bug 1241394 - Check clip for the children of the establisher. r=mattwoodrow (46f151ea55)
- bug 1241453 - allow caching proxies in xpcAccessibleDocuments r=davidb (f5d41ad2ee)
- Bug 1247364 - use AllChildrenIterator::Seek by a11y tree walker, r=davidb (0ec230908e)
- Bug 1248840 - rename TreeWalker::NextChild, r=yzen (c89ecc5a29)
- Bug 1249927 - devirtualize CanHavaAnonymousChildren, r=davdib (89e8088e63)
- Bug 1206598 - Use universal reference to reduce the redundant copy. r=nfroyd (bae4ad6dd1)
- Bug 1247364 - add AllChildrenIterator::Seek, r=bz (215abebf12)
- bug 1241453 - allow storing proxies in xpcAccessibleGeneric::mIntl r=davidb (dd5e6c896b)
- bug 1241453 - allow constructing xpcAccessibles with proxies r=davidb (d0258122be)
- bug 1241453 - fixup xpcAccessible Intl() methods to not assume mIntl is always an Accessible r=davidb (168f71fdf5)
- bug 1241453 - allow xpcAccessibleDocument::mCache to use proxies as keys r=davidb (85b7eec81c)
- bug 1241453 - assert accessibles are only added to non remote xpcAccessibleDocuments r=davidb (7731b21d17)
- bug 1243077 - add ToXPC{,Document} overloads for proxied accessibles r=davidb (7bc085f1b5)
- bug 1243077 - add AccessibleOrProxy xpcAccessible::IntlGeneric() r=davidb (006a635992)
- Bug 1245464 - initialize with 0 mSupportedIfaces in xpcAccessibleGeneric in order to avoid corrupted result after bit-wise operation. r=surkov (ae41bafcef)
- bug 1241453 - allow caching xpc documents for remote documents r=davidb (a357630690)
- bug 1241453 - factor dispatching nsIAccessibleEvents out of HandleAccEvent() r=davidb (091073d981)
- Bug 1249183 - Suppress GC harder, r=terrence (2185ccb4dd)
- Bug 1248420 - Handle JSObject::getGroup OOM in js::ArraySetLength. r=jandem (04b67c8d31)
- Bug 1242270 - Add SPS pseudo frames for the Array.prototype methods; r=shu (f5e5871439)
- Bug 1247701 - Bail from ArrayShiftDenseKernel if the array is used by for-in iteration. r=jandem (41eff38954)
- Bug 1247701 followup - Change ArrayShiftDenseKernel to receive handle. r=bz (b29ce0c555)
176 lines
5.4 KiB
C++
176 lines
5.4 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
|
/* 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 "VideoFrameContainer.h"
|
|
|
|
#include "mozilla/dom/HTMLMediaElement.h"
|
|
#include "nsIFrame.h"
|
|
#include "nsDisplayList.h"
|
|
#include "nsSVGEffects.h"
|
|
|
|
using namespace mozilla::layers;
|
|
|
|
namespace mozilla {
|
|
|
|
VideoFrameContainer::VideoFrameContainer(dom::HTMLMediaElement* aElement,
|
|
already_AddRefed<ImageContainer> aContainer)
|
|
: mElement(aElement),
|
|
mImageContainer(aContainer), mMutex("nsVideoFrameContainer"),
|
|
mFrameID(0),
|
|
mIntrinsicSizeChanged(false), mImageSizeChanged(false)
|
|
{
|
|
NS_ASSERTION(aElement, "aElement must not be null");
|
|
NS_ASSERTION(mImageContainer, "aContainer must not be null");
|
|
}
|
|
|
|
VideoFrameContainer::~VideoFrameContainer()
|
|
{}
|
|
|
|
void VideoFrameContainer::SetCurrentFrame(const gfx::IntSize& aIntrinsicSize,
|
|
Image* aImage,
|
|
const TimeStamp& aTargetTime)
|
|
{
|
|
if (aImage) {
|
|
MutexAutoLock lock(mMutex);
|
|
AutoTArray<ImageContainer::NonOwningImage,1> imageList;
|
|
imageList.AppendElement(
|
|
ImageContainer::NonOwningImage(aImage, aTargetTime, ++mFrameID));
|
|
SetCurrentFramesLocked(aIntrinsicSize, imageList);
|
|
} else {
|
|
ClearCurrentFrame(aIntrinsicSize);
|
|
}
|
|
}
|
|
|
|
void VideoFrameContainer::SetCurrentFrames(const gfx::IntSize& aIntrinsicSize,
|
|
const nsTArray<ImageContainer::NonOwningImage>& aImages)
|
|
{
|
|
MutexAutoLock lock(mMutex);
|
|
SetCurrentFramesLocked(aIntrinsicSize, aImages);
|
|
}
|
|
|
|
void VideoFrameContainer::SetCurrentFramesLocked(const gfx::IntSize& aIntrinsicSize,
|
|
const nsTArray<ImageContainer::NonOwningImage>& aImages)
|
|
{
|
|
mMutex.AssertCurrentThreadOwns();
|
|
|
|
if (aIntrinsicSize != mIntrinsicSize) {
|
|
mIntrinsicSize = aIntrinsicSize;
|
|
mIntrinsicSizeChanged = true;
|
|
}
|
|
|
|
gfx::IntSize oldFrameSize = mImageContainer->GetCurrentSize();
|
|
|
|
// When using the OMX decoder, destruction of the current image can indirectly
|
|
// block on main thread I/O. If we let this happen while holding onto
|
|
// |mImageContainer|'s lock, then when the main thread then tries to
|
|
// composite it can then block on |mImageContainer|'s lock, causing a
|
|
// deadlock. We use this hack to defer the destruction of the current image
|
|
// until it is safe.
|
|
nsTArray<ImageContainer::OwningImage> kungFuDeathGrip;
|
|
mImageContainer->GetCurrentImages(&kungFuDeathGrip);
|
|
|
|
if (aImages.IsEmpty()) {
|
|
mImageContainer->ClearAllImages();
|
|
} else {
|
|
mImageContainer->SetCurrentImages(aImages);
|
|
}
|
|
gfx::IntSize newFrameSize = mImageContainer->GetCurrentSize();
|
|
if (oldFrameSize != newFrameSize) {
|
|
mImageSizeChanged = true;
|
|
}
|
|
}
|
|
|
|
void VideoFrameContainer::ClearCurrentFrame()
|
|
{
|
|
MutexAutoLock lock(mMutex);
|
|
|
|
// See comment in SetCurrentFrame for the reasoning behind
|
|
// using a kungFuDeathGrip here.
|
|
nsTArray<ImageContainer::OwningImage> kungFuDeathGrip;
|
|
mImageContainer->GetCurrentImages(&kungFuDeathGrip);
|
|
|
|
mImageContainer->ClearAllImages();
|
|
}
|
|
|
|
void VideoFrameContainer::ClearFutureFrames()
|
|
{
|
|
MutexAutoLock lock(mMutex);
|
|
|
|
// See comment in SetCurrentFrame for the reasoning behind
|
|
// using a kungFuDeathGrip here.
|
|
nsTArray<ImageContainer::OwningImage> kungFuDeathGrip;
|
|
mImageContainer->GetCurrentImages(&kungFuDeathGrip);
|
|
|
|
if (!kungFuDeathGrip.IsEmpty()) {
|
|
nsTArray<ImageContainer::NonOwningImage> currentFrame;
|
|
const ImageContainer::OwningImage& img = kungFuDeathGrip[0];
|
|
currentFrame.AppendElement(ImageContainer::NonOwningImage(img.mImage,
|
|
img.mTimeStamp, img.mFrameID, img.mProducerID));
|
|
mImageContainer->SetCurrentImages(currentFrame);
|
|
}
|
|
}
|
|
|
|
ImageContainer* VideoFrameContainer::GetImageContainer() {
|
|
return mImageContainer;
|
|
}
|
|
|
|
|
|
double VideoFrameContainer::GetFrameDelay()
|
|
{
|
|
return mImageContainer->GetPaintDelay().ToSeconds();
|
|
}
|
|
|
|
void VideoFrameContainer::InvalidateWithFlags(uint32_t aFlags)
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Must call on main thread");
|
|
|
|
if (!mElement) {
|
|
// Element has been destroyed
|
|
return;
|
|
}
|
|
|
|
nsIFrame* frame = mElement->GetPrimaryFrame();
|
|
bool invalidateFrame = false;
|
|
|
|
{
|
|
MutexAutoLock lock(mMutex);
|
|
|
|
// Get mImageContainerSizeChanged while holding the lock.
|
|
invalidateFrame = mImageSizeChanged;
|
|
mImageSizeChanged = false;
|
|
|
|
if (mIntrinsicSizeChanged) {
|
|
mElement->UpdateMediaSize(mIntrinsicSize);
|
|
mIntrinsicSizeChanged = false;
|
|
|
|
if (frame) {
|
|
nsPresContext* presContext = frame->PresContext();
|
|
nsIPresShell *presShell = presContext->PresShell();
|
|
presShell->FrameNeedsReflow(frame,
|
|
nsIPresShell::eStyleChange,
|
|
NS_FRAME_IS_DIRTY);
|
|
}
|
|
}
|
|
}
|
|
|
|
bool asyncInvalidate = mImageContainer &&
|
|
mImageContainer->IsAsync() &&
|
|
!(aFlags & INVALIDATE_FORCE);
|
|
|
|
if (frame) {
|
|
if (invalidateFrame) {
|
|
frame->InvalidateFrame();
|
|
} else {
|
|
frame->InvalidateLayer(nsDisplayItem::TYPE_VIDEO, nullptr, nullptr,
|
|
asyncInvalidate ? nsIFrame::UPDATE_IS_ASYNC : 0);
|
|
}
|
|
}
|
|
|
|
nsSVGEffects::InvalidateDirectRenderingObservers(mElement);
|
|
}
|
|
|
|
} // namespace mozilla
|