[tor-commits] [tor-browser] 36/73: Bug 1767360 - use correct image size retrieved from the output type to create video frames buffer. r=media-playback-reviewers, jolin a=RyanVM
gitolite role
git at cupani.torproject.org
Wed Sep 21 20:17:29 UTC 2022
This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch geckoview-102.3.0esr-12.0-1
in repository tor-browser.
commit 3f81dec850ee679b4da8067c2b5315a74776fa4a
Author: alwu <alwu at mozilla.com>
AuthorDate: Wed Aug 31 01:34:44 2022 +0000
Bug 1767360 - use correct image size retrieved from the output type to create video frames buffer. r=media-playback-reviewers,jolin a=RyanVM
Differential Revision: https://phabricator.services.mozilla.com/D154310
---
dom/media/platforms/wmf/WMFVideoMFTManager.cpp | 38 ++++++++++++++++----------
dom/media/platforms/wmf/WMFVideoMFTManager.h | 11 +++++++-
2 files changed, 34 insertions(+), 15 deletions(-)
diff --git a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp
index 5ca21d9e906ef..31bc6d5d6aa42 100644
--- a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp
+++ b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp
@@ -130,7 +130,8 @@ WMFVideoMFTManager::WMFVideoMFTManager(
mImageSize(aConfig.mImage),
mStreamType(
WMFDecoderModule::GetStreamTypeFromMimeType(aConfig.mMimeType)),
- mDecodedImageSize(aConfig.mImage),
+ mSoftwareImageSize(aConfig.mImage),
+ mSoftwarePictureSize(aConfig.mImage),
mVideoStride(0),
mColorSpace(aConfig.mColorSpace),
mColorRange(aConfig.mColorRange),
@@ -150,8 +151,8 @@ WMFVideoMFTManager::WMFVideoMFTManager(
// The V and U planes are stored 16-row-aligned, so we need to add padding
// to the row heights to ensure the Y'CbCr planes are referenced properly.
// This value is only used with software decoder.
- if (mDecodedImageSize.height % 16 != 0) {
- mDecodedImageSize.height += 16 - (mDecodedImageSize.height % 16);
+ if (mSoftwareImageSize.height % 16 != 0) {
+ mSoftwareImageSize.height += 16 - (mSoftwareImageSize.height % 16);
}
}
@@ -665,8 +666,8 @@ WMFVideoMFTManager::CreateBasicVideoFrame(IMFSample* aSample,
// https://docs.microsoft.com/en-us/windows/desktop/medfound/10-bit-and-16-bit-yuv-video-formats
VideoData::YCbCrBuffer b;
- uint32_t videoWidth = mImageSize.width;
- uint32_t videoHeight = mImageSize.height;
+ const uint32_t videoWidth = mSoftwareImageSize.width;
+ const uint32_t videoHeight = mSoftwareImageSize.height;
// Y (Y') plane
b.mPlanes[0].mData = data;
@@ -675,13 +676,13 @@ WMFVideoMFTManager::CreateBasicVideoFrame(IMFSample* aSample,
b.mPlanes[0].mWidth = videoWidth;
b.mPlanes[0].mSkip = 0;
- MOZ_DIAGNOSTIC_ASSERT(mDecodedImageSize.height % 16 == 0,
+ MOZ_DIAGNOSTIC_ASSERT(mSoftwareImageSize.height % 16 == 0,
"decoded height must be 16 bytes aligned");
- uint32_t y_size = stride * mDecodedImageSize.height;
- uint32_t v_size = stride * mDecodedImageSize.height / 4;
- uint32_t halfStride = (stride + 1) / 2;
- uint32_t halfHeight = (videoHeight + 1) / 2;
- uint32_t halfWidth = (videoWidth + 1) / 2;
+ const uint32_t y_size = stride * mSoftwareImageSize.height;
+ const uint32_t v_size = stride * mSoftwareImageSize.height / 4;
+ const uint32_t halfStride = (stride + 1) / 2;
+ const uint32_t halfHeight = (videoHeight + 1) / 2;
+ const uint32_t halfWidth = (videoWidth + 1) / 2;
if (subType == MFVideoFormat_YV12) {
// U plane (Cb)
@@ -725,8 +726,8 @@ WMFVideoMFTManager::CreateBasicVideoFrame(IMFSample* aSample,
NS_ENSURE_TRUE(pts.IsValid(), E_FAIL);
TimeUnit duration = GetSampleDurationOrLastKnownDuration(aSample);
NS_ENSURE_TRUE(duration.IsValid(), E_FAIL);
- gfx::IntRect pictureRegion =
- mVideoInfo.ScaledImageRect(videoWidth, videoHeight);
+ gfx::IntRect pictureRegion = mVideoInfo.ScaledImageRect(
+ mSoftwarePictureSize.width, mSoftwarePictureSize.height);
if (colorDepth != gfx::ColorDepth::COLOR_8 || !mKnowsCompositor ||
!mKnowsCompositor->SupportsD3D11() || !mIMFUsable) {
@@ -853,7 +854,16 @@ WMFVideoMFTManager::Output(int64_t aStreamOffset, RefPtr<MediaData>& aOutData) {
NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
NS_ENSURE_TRUE(width <= MAX_VIDEO_WIDTH, E_FAIL);
NS_ENSURE_TRUE(height <= MAX_VIDEO_HEIGHT, E_FAIL);
- mDecodedImageSize = gfx::IntSize(width, height);
+ mSoftwareImageSize = gfx::IntSize(width, height);
+
+ gfx::IntRect picture;
+ hr = GetPictureRegion(outputType, picture);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ MOZ_ASSERT(picture.width != 0 && picture.height != 0);
+ mSoftwarePictureSize = gfx::IntSize(picture.width, picture.height);
+ LOG("Output stream change, image size=[%ux%u], picture=[%u,%u]",
+ mSoftwareImageSize.width, mSoftwareImageSize.height,
+ mSoftwarePictureSize.width, mSoftwarePictureSize.height);
}
// Catch infinite loops, but some decoders perform at least 2 stream
// changes on consecutive calls, so be permissive.
diff --git a/dom/media/platforms/wmf/WMFVideoMFTManager.h b/dom/media/platforms/wmf/WMFVideoMFTManager.h
index e834baeb70bbc..e1c08513c6a58 100644
--- a/dom/media/platforms/wmf/WMFVideoMFTManager.h
+++ b/dom/media/platforms/wmf/WMFVideoMFTManager.h
@@ -81,7 +81,16 @@ class WMFVideoMFTManager : public MFTManager {
const VideoInfo mVideoInfo;
const gfx::IntSize mImageSize;
const WMFStreamType mStreamType;
- gfx::IntSize mDecodedImageSize;
+
+ // The size we update from the IMFMediaType which might include paddings when
+ // the stream format changes. This is only used for software decoding.
+ gfx::IntSize mSoftwareImageSize;
+
+ // The picture size we update from the IMFMediaType when the stream format
+ // changes. We assume it's equal to the image size by default (no cropping).
+ // This is only used for software decoding.
+ gfx::IntSize mSoftwarePictureSize;
+
uint32_t mVideoStride;
Maybe<gfx::YUVColorSpace> mColorSpace;
gfx::ColorRange mColorRange;
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the tor-commits
mailing list