Files
palemoon27/dom/media/VideoSegment.cpp
T
roytam1 15a91f51ae import changes from `dev' branch of rmottola/Arctic-Fox:
- test for bug 1191648 (f9da67e953)
- Bug 1257333 - Port test_AudioNodeDevtoolsAPI.html to mochitest-plain so that it can be turned on in e10s mode; r=mrbkap (39cee7850b)
- Bug 1079844 - Change various non-js/ files/tests/etc. to refer to detaching of ArrayBuffers rather than neutering. (DOM references to "neutering" of DOM things remain as neutering.) r=bz (3ab68d0a1d)
- Bug 1257337 - Port test_AudioParamDevtoolsAPI.html to mochitest-plain so that it can be turned on in e10s mode; r=mrbkap (7f0bc6b0d3)
- Bug 1265403 - Support chaining AudioParam automation methods. r=smaug (89ac09e1a4)
- Bug 1241096 - Add a better memory reporting system for AudioBuffers. r=erahm (a5058066fa)
- Bug 1255655 - Const-ify kCoefficientRgbY. r=jrmuizel. This allows it to be shared between processes. (7e484b4154)
- Bug 1232904 - Use channel.asyncOpen2 within dom/media/IdpSandbox.jsm (r=mt) (99c75688db)
- Bug 1176941 - Capturing more error info from IdP sandbox, r=jib (fe6e628f16)
- Bug 1176941 - Moving console warning to the current window, r=jib (8ce00202a0)
- Bug 1258299 - Move RTCIdentityProvider to a dictionary, r=jib,khuey (36699071e3)
- Bug 1208371 - Forward declare MediaStreamGraph classes in MediaPipeline.h. r=bwc (2c476da3b1)
- Bug 1248154 - Default to 0x0 frame size before receiving any frames. r=pkerr (00357ddee9)
- Bug 1262278 - Rename PlanarYCbCrImage::SetData and PlanarYCbCrImage::SetDataNoCopy r=nical (d13934623c)
- Bug 1245525: Fix some compiler errors in Moz2D type classes. r=jrmuizel (f3188d1490)
- Bug 1256678 - Fall back to loading GDI fonts from system in DrawTargetRecording - r=bas (a584738020)
- Bug 1247405 - Track peak texture memory usage r=nical (29df6e1566)
- Bug 1251065 - Add prefs for logging the current and peak texture usage r=nical (23c62210cc)
- Bug 1231396 - Add a pref to record and print out the number of pixels painted. r=mstange (6179f56806)
- Bug 1262753: P5. Pass number of frames rather than the number of bytes. r=gerald (f45286d4e9)
- Bug 1242774 - only resolve promise when exist. r=jwwang. (e8de9f5d37)
- Bug 1246108 - Don't restart completed audio streams. r=jwwang (738f1780ef)
- Bug 1262753: P6. Perform downmixing in DecodeAudioDataSink. r=kinetik (513906273a)
- Bug 1262753: P7. Add debugging pref to enable/disable downmixer and resample. r=kinetik (3bdc72fef3)
- Bug 1262753: P8. Remove useless assert. r=gerald (075f86cb75)
- Bug 1241486 - Allow using pixmaps to share WebGL frames with the basic compositor when it makes sense. r=jgilbert (2bdab0b4f4)
- Bug 1245550 - add gfx.use-glx-texture-from-pixmap pref to control whether texture_from_pixmap is used. r=nical (a29c7cf85b)
- Bug 1260944 - Fix ANGLE D3D WARP for WebGL. - r=jrmuizel (8bc04a6c86)
- Bug 1241003 - ignore AudioData with 0 frames to avoid silence. r=kinetik. (d9b498ccfe)
- Bug 1245542 - I suspect AudioData::mAudioData/mFrames are poisoned when sample format doesn't match the metadata. Let's ignore these samples to see if crash volume can be reduced. r=kinetik. (1dcbbbbfc6)
- Bug 1259810 - check that D2D1 device creation succeeds and otherwise fall to software backend. r=bas.schouten (0b1a56e488)
- Bug 1257288 - Move IntersectMaybeRects() to gfx/2d/Rect.h. r=kats (75740a568d)
- Bug 1236043 - Don't inflate empty rects. r=jrmuizel (809dbda3fb)
- Bug 913822 - Shutdown I/O time limit for HTTP cache. r=michal (6f3263184b)
- Bug 848994 - p1. Refactor Decoder Doctor - r=cpearce (8ae3326424)
- Bug 848994 - p2. Detect when WMF is not found - r=cpearce (fb6b98d7bd)
- Bug 848994 - p3. Check MediaKeySystem requests - r=cpearce (bf2ba5ea8d)
- Bug 848994 - p4. Record GMP diagnostics - r=cpearce (21e750ca24)
- Bug 1245789 - Add abstract thread wrapper for the GMP thread. r=gerald (37ee00f86c)
- Bug 1250745 - Share GMP processes when doing unencrypted decoding. r=jwwang (c925f991a8)
- Bug 1245789 - Use frame size not display size in GMPVideoDecoder. r=kinetik (a4d7abdbef)
- Bug 1211812 - Use MozPromise to init mozilla::GMPVideoDecoder. r=jwwang (cc736f1f37)
- Bug 1256065. r=gerald (62cdb35926)
- Bug 1221825: P2. Ensure frame memory allocation succeeded. r=cpearce (b6fb351b6a)
- Bug 1197064 - Don't assume positive audio frame offset in GMPAudioDeceoder. r=jya (6bc23cb4a0)
2024-05-22 15:17:33 +08:00

119 lines
3.2 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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 "VideoSegment.h"
#include "gfx2DGlue.h"
#include "ImageContainer.h"
#include "Layers.h"
#include "mozilla/UniquePtr.h"
namespace mozilla {
using namespace layers;
VideoFrame::VideoFrame(already_AddRefed<Image>& aImage,
const gfx::IntSize& aIntrinsicSize)
: mImage(aImage), mIntrinsicSize(aIntrinsicSize), mForceBlack(false),
mPrincipalHandle(PRINCIPAL_HANDLE_NONE)
{}
VideoFrame::VideoFrame()
: mIntrinsicSize(0, 0), mForceBlack(false), mPrincipalHandle(PRINCIPAL_HANDLE_NONE)
{}
VideoFrame::~VideoFrame()
{}
void
VideoFrame::SetNull() {
mImage = nullptr;
mIntrinsicSize = gfx::IntSize(0, 0);
mPrincipalHandle = PRINCIPAL_HANDLE_NONE;
}
void
VideoFrame::TakeFrom(VideoFrame* aFrame)
{
mImage = aFrame->mImage.forget();
mIntrinsicSize = aFrame->mIntrinsicSize;
mForceBlack = aFrame->GetForceBlack();
mPrincipalHandle = aFrame->mPrincipalHandle;
}
/* static */ already_AddRefed<Image>
VideoFrame::CreateBlackImage(const gfx::IntSize& aSize)
{
RefPtr<ImageContainer> container = LayerManager::CreateImageContainer();
RefPtr<PlanarYCbCrImage> image = container->CreatePlanarYCbCrImage();
if (!image) {
MOZ_ASSERT(false);
return nullptr;
}
int len = ((aSize.width * aSize.height) * 3 / 2);
// Generate a black image.
auto frame = MakeUnique<uint8_t[]>(len);
int y = aSize.width * aSize.height;
// Fill Y plane.
memset(frame.get(), 0x10, y);
// Fill Cb/Cr planes.
memset(frame.get() + y, 0x80, (len - y));
const uint8_t lumaBpp = 8;
const uint8_t chromaBpp = 4;
layers::PlanarYCbCrData data;
data.mYChannel = frame.get();
data.mYSize = gfx::IntSize(aSize.width, aSize.height);
data.mYStride = (int32_t) (aSize.width * lumaBpp / 8.0);
data.mCbCrStride = (int32_t) (aSize.width * chromaBpp / 8.0);
data.mCbChannel = frame.get() + aSize.height * data.mYStride;
data.mCrChannel = data.mCbChannel + aSize.height * data.mCbCrStride / 2;
data.mCbCrSize = gfx::IntSize(aSize.width / 2, aSize.height / 2);
data.mPicX = 0;
data.mPicY = 0;
data.mPicSize = gfx::IntSize(aSize.width, aSize.height);
data.mStereoMode = StereoMode::MONO;
// Copies data, so we can free data.
if (!image->CopyData(data)) {
MOZ_ASSERT(false);
return nullptr;
}
return image.forget();
}
VideoChunk::VideoChunk()
{}
VideoChunk::~VideoChunk()
{}
void
VideoSegment::AppendFrame(already_AddRefed<Image>&& aImage,
StreamTime aDuration,
const IntSize& aIntrinsicSize,
const PrincipalHandle& aPrincipalHandle,
bool aForceBlack)
{
VideoChunk* chunk = AppendChunk(aDuration);
VideoFrame frame(aImage, aIntrinsicSize);
frame.SetForceBlack(aForceBlack);
frame.SetPrincipalHandle(aPrincipalHandle);
chunk->mFrame.TakeFrom(&frame);
}
VideoSegment::VideoSegment()
: MediaSegmentBase<VideoSegment, VideoChunk>(VIDEO)
{}
VideoSegment::~VideoSegment()
{}
} // namespace mozilla