browser(firefox): autoscale screencast to fit frame (#3720)

This commit is contained in:
Yury Semikhatsky 2020-09-01 17:10:06 -07:00 committed by GitHub
parent 1de4f7fa4c
commit ee1becd897
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 16 deletions

View file

@ -1,2 +1,2 @@
1168
Changed: joel.einbinder@gmail.com Thu 27 Aug 2020 03:42:20 AM PDT
1169
Changed: yurys@chromium.org Tue Sep 1 17:07:52 PDT 2020

View file

@ -122,23 +122,24 @@ public:
}
auto src = m_frameBuffer->GetI420();
const int y_stride = image->stride[0];
MOZ_ASSERT(image->stride[1] == image->stride[2]);
const int y_stride = image->stride[VPX_PLANE_Y];
MOZ_ASSERT(image->stride[VPX_PLANE_U] == image->stride[VPX_PLANE_V]);
const int uv_stride = image->stride[1];
uint8_t* y_data = image->planes[0];
uint8_t* u_data = image->planes[1];
uint8_t* v_data = image->planes[2];
uint8_t* y_data = image->planes[VPX_PLANE_Y];
uint8_t* u_data = image->planes[VPX_PLANE_U];
uint8_t* v_data = image->planes[VPX_PLANE_V];
if (m_scale) {
int src_width = src->width() - m_margin.LeftRight();
double dst_width = src_width * m_scale.value();
double src_width = src->width() - m_margin.LeftRight();
double src_height = src->height() - m_margin.top;
if (m_scale || (src_width > image->w || src_height > image->h)) {
double scale = m_scale ? m_scale.value() : std::min(image->w / src_width, image->h / src_height);
double dst_width = src_width * scale;
if (dst_width > image->w) {
src_width *= image->w / dst_width;
dst_width = image->w;
}
int src_height = src->height() - m_margin.TopBottom();
double dst_height = src_height * m_scale.value();
double dst_height = src_height * scale;
if (dst_height > image->h) {
src_height *= image->h / dst_height;
dst_height = image->h;
@ -153,8 +154,8 @@ public:
dst_width, dst_height,
libyuv::kFilterBilinear);
} else {
int width = std::min<int>(image->w, src->width() - m_margin.LeftRight());
int height = std::min<int>(image->h, src->height() - m_margin.TopBottom());
int width = std::min<int>(image->w, src_width);
int height = std::min<int>(image->h, src_height);
libyuv::I420Copy(src->DataY() + m_margin.top * src->StrideY() + m_margin.left, src->StrideY(),
src->DataU() + (m_margin.top * src->StrideU() + m_margin.left) / 2, src->StrideU(),

View file

@ -148,10 +148,16 @@ nsresult nsScreencastService::StartVideoRecording(nsIDocShell* aDocShell, const
if (scale)
maybeScale = Some(scale);
gfx::IntMargin margin;
// On GTK the bottom of the client rect is below the bounds and
// client size is actually equal to the size of the bounds so
// we don't need an adjustment.
#ifndef MOZ_WIDGET_GTK
auto bounds = widget->GetScreenBounds().ToUnknownRect();
auto clientBounds = widget->GetClientBounds().ToUnknownRect();
// Crop the image to exclude frame (if any).
gfx::IntMargin margin = bounds - clientBounds;
margin = bounds - clientBounds;
#endif
// Crop the image to exclude controls.
margin.top += offsetTop;