| Index: remoting/codec/video_decoder_vp8.cc
|
| diff --git a/remoting/codec/video_decoder_vp8.cc b/remoting/codec/video_decoder_vp8.cc
|
| index 48bf5347fac1a8f92707c56bafc9d0a9e1c24fe4..0d43f15f9cda553dea3b7c3db86c006976431596 100644
|
| --- a/remoting/codec/video_decoder_vp8.cc
|
| +++ b/remoting/codec/video_decoder_vp8.cc
|
| @@ -26,8 +26,7 @@ const uint32 kTransparent = 0;
|
| VideoDecoderVp8::VideoDecoderVp8()
|
| : state_(kUninitialized),
|
| codec_(NULL),
|
| - last_image_(NULL),
|
| - screen_size_(SkISize::Make(0, 0)) {
|
| + last_image_(NULL) {
|
| }
|
|
|
| VideoDecoderVp8::~VideoDecoderVp8() {
|
| @@ -38,13 +37,13 @@ VideoDecoderVp8::~VideoDecoderVp8() {
|
| delete codec_;
|
| }
|
|
|
| -void VideoDecoderVp8::Initialize(const SkISize& screen_size) {
|
| - DCHECK(!screen_size.isEmpty());
|
| +void VideoDecoderVp8::Initialize(const webrtc::DesktopSize& screen_size) {
|
| + DCHECK(!screen_size.is_empty());
|
|
|
| screen_size_ = screen_size;
|
| state_ = kReady;
|
|
|
| - transparent_region_.setRect(SkIRect::MakeSize(screen_size_));
|
| + transparent_region_.SetRect(webrtc::DesktopRect::MakeSize(screen_size_));
|
| }
|
|
|
| bool VideoDecoderVp8::DecodePacket(const VideoPacket& packet) {
|
| @@ -61,8 +60,7 @@ bool VideoDecoderVp8::DecodePacket(const VideoPacket& packet) {
|
| config.h = 0;
|
| config.threads = 2;
|
| vpx_codec_err_t ret =
|
| - vpx_codec_dec_init(
|
| - codec_, vpx_codec_vp8_dx(), &config, 0);
|
| + vpx_codec_dec_init(codec_, vpx_codec_vp8_dx(), &config, 0);
|
| if (ret != VPX_CODEC_OK) {
|
| LOG(INFO) << "Cannot initialize codec.";
|
| delete codec_;
|
| @@ -92,33 +90,30 @@ bool VideoDecoderVp8::DecodePacket(const VideoPacket& packet) {
|
| }
|
| last_image_ = image;
|
|
|
| - SkRegion region;
|
| + webrtc::DesktopRegion region;
|
| for (int i = 0; i < packet.dirty_rects_size(); ++i) {
|
| Rect remoting_rect = packet.dirty_rects(i);
|
| - SkIRect rect = SkIRect::MakeXYWH(remoting_rect.x(),
|
| - remoting_rect.y(),
|
| - remoting_rect.width(),
|
| - remoting_rect.height());
|
| - region.op(rect, SkRegion::kUnion_Op);
|
| + region.AddRect(webrtc::DesktopRect::MakeXYWH(
|
| + remoting_rect.x(), remoting_rect.y(),
|
| + remoting_rect.width(), remoting_rect.height()));
|
| }
|
|
|
| - updated_region_.op(region, SkRegion::kUnion_Op);
|
| + updated_region_.AddRegion(region);
|
|
|
| // Update the desktop shape region.
|
| - SkRegion desktop_shape_region;
|
| + webrtc::DesktopRegion desktop_shape_region;
|
| if (packet.has_use_desktop_shape()) {
|
| for (int i = 0; i < packet.desktop_shape_rects_size(); ++i) {
|
| Rect remoting_rect = packet.desktop_shape_rects(i);
|
| - SkIRect rect = SkIRect::MakeXYWH(remoting_rect.x(),
|
| - remoting_rect.y(),
|
| - remoting_rect.width(),
|
| - remoting_rect.height());
|
| - desktop_shape_region.op(rect, SkRegion::kUnion_Op);
|
| + desktop_shape_region.AddRect(webrtc::DesktopRect::MakeXYWH(
|
| + remoting_rect.x(), remoting_rect.y(),
|
| + remoting_rect.width(), remoting_rect.height()));
|
| }
|
| } else {
|
| // Fallback for the case when the host didn't include the desktop shape
|
| // region.
|
| - desktop_shape_region = SkRegion(SkIRect::MakeSize(screen_size_));
|
| + desktop_shape_region =
|
| + webrtc::DesktopRegion(webrtc::DesktopRect::MakeSize(screen_size_));
|
| }
|
|
|
| UpdateImageShapeRegion(&desktop_shape_region);
|
| @@ -126,64 +121,65 @@ bool VideoDecoderVp8::DecodePacket(const VideoPacket& packet) {
|
| return true;
|
| }
|
|
|
| -void VideoDecoderVp8::Invalidate(const SkISize& view_size,
|
| - const SkRegion& region) {
|
| +void VideoDecoderVp8::Invalidate(const webrtc::DesktopSize& view_size,
|
| + const webrtc::DesktopRegion& region) {
|
| DCHECK_EQ(kReady, state_);
|
| - DCHECK(!view_size.isEmpty());
|
| + DCHECK(!view_size.is_empty());
|
|
|
| - for (SkRegion::Iterator i(region); !i.done(); i.next()) {
|
| - SkIRect rect = i.rect();
|
| - rect = ScaleRect(rect, view_size, screen_size_);
|
| - updated_region_.op(rect, SkRegion::kUnion_Op);
|
| + for (webrtc::DesktopRegion::Iterator i(region); !i.IsAtEnd(); i.Advance()) {
|
| + updated_region_.AddRect(ScaleRect(i.rect(), view_size, screen_size_));
|
| }
|
|
|
| // Updated areas outside of the new desktop shape region should be made
|
| // transparent, not repainted.
|
| - SkRegion difference = updated_region_;
|
| - difference.op(desktop_shape_, SkRegion::kDifference_Op);
|
| - updated_region_.op(difference, SkRegion::kDifference_Op);
|
| - transparent_region_.op(difference, SkRegion::kUnion_Op);
|
| + webrtc::DesktopRegion difference = updated_region_;
|
| + difference.Subtract(desktop_shape_);
|
| + updated_region_.Subtract(difference);
|
| + transparent_region_.AddRegion(difference);
|
| }
|
|
|
| -void VideoDecoderVp8::RenderFrame(const SkISize& view_size,
|
| - const SkIRect& clip_area,
|
| +void VideoDecoderVp8::RenderFrame(const webrtc::DesktopSize& view_size,
|
| + const webrtc::DesktopRect& clip_area,
|
| uint8* image_buffer,
|
| int image_stride,
|
| - SkRegion* output_region) {
|
| + webrtc::DesktopRegion* output_region) {
|
| DCHECK_EQ(kReady, state_);
|
| - DCHECK(!view_size.isEmpty());
|
| + DCHECK(!view_size.is_empty());
|
|
|
| // Early-return and do nothing if we haven't yet decoded any frames.
|
| if (!last_image_)
|
| return;
|
|
|
| - SkIRect source_clip = SkIRect::MakeWH(last_image_->d_w, last_image_->d_h);
|
| + webrtc::DesktopRect source_clip =
|
| + webrtc::DesktopRect::MakeWH(last_image_->d_w, last_image_->d_h);
|
|
|
| // ScaleYUVToRGB32WithRect does not currently support up-scaling. We won't
|
| // be asked to up-scale except during resizes or if page zoom is >100%, so
|
| // we work-around the limitation by using the slower ScaleYUVToRGB32.
|
| // TODO(wez): Remove this hack if/when ScaleYUVToRGB32WithRect can up-scale.
|
| - if (!updated_region_.isEmpty() &&
|
| + if (!updated_region_.is_empty() &&
|
| (source_clip.width() < view_size.width() ||
|
| source_clip.height() < view_size.height())) {
|
| // We're scaling only |clip_area| into the |image_buffer|, so we need to
|
| // work out which source rectangle that corresponds to.
|
| - SkIRect source_rect = ScaleRect(clip_area, view_size, screen_size_);
|
| - source_rect = SkIRect::MakeLTRB(RoundToTwosMultiple(source_rect.left()),
|
| - RoundToTwosMultiple(source_rect.top()),
|
| - source_rect.right(),
|
| - source_rect.bottom());
|
| + webrtc::DesktopRect source_rect =
|
| + ScaleRect(clip_area, view_size, screen_size_);
|
| + source_rect = webrtc::DesktopRect::MakeLTRB(
|
| + RoundToTwosMultiple(source_rect.left()),
|
| + RoundToTwosMultiple(source_rect.top()),
|
| + source_rect.right(),
|
| + source_rect.bottom());
|
|
|
| // If there were no changes within the clip source area then don't render.
|
| - if (!updated_region_.intersects(source_rect))
|
| + webrtc::DesktopRegion intersection(source_rect);
|
| + intersection.IntersectWith(updated_region_);
|
| + if (intersection.is_empty())
|
| return;
|
|
|
| // Scale & convert the entire clip area.
|
| - int y_offset = CalculateYOffset(source_rect.x(),
|
| - source_rect.y(),
|
| + int y_offset = CalculateYOffset(source_rect.left(), source_rect.top(),
|
| last_image_->stride[0]);
|
| - int uv_offset = CalculateUVOffset(source_rect.x(),
|
| - source_rect.y(),
|
| + int uv_offset = CalculateUVOffset(source_rect.left(), source_rect.top(),
|
| last_image_->stride[1]);
|
| ScaleYUVToRGB32(last_image_->planes[0] + y_offset,
|
| last_image_->planes[1] + uv_offset,
|
| @@ -200,18 +196,21 @@ void VideoDecoderVp8::RenderFrame(const SkISize& view_size,
|
| media::ROTATE_0,
|
| media::FILTER_BILINEAR);
|
|
|
| - output_region->op(clip_area, SkRegion::kUnion_Op);
|
| - updated_region_.op(source_rect, SkRegion::kDifference_Op);
|
| + output_region->AddRect(clip_area);
|
| + updated_region_.Subtract(source_rect);
|
| return;
|
| }
|
|
|
| - for (SkRegion::Iterator i(updated_region_); !i.done(); i.next()) {
|
| + for (webrtc::DesktopRegion::Iterator i(updated_region_);
|
| + !i.IsAtEnd(); i.Advance()) {
|
| // Determine the scaled area affected by this rectangle changing.
|
| - SkIRect rect = i.rect();
|
| - if (!rect.intersect(source_clip))
|
| + webrtc::DesktopRect rect = i.rect();
|
| + rect.IntersectWith(source_clip);
|
| + if (rect.is_empty())
|
| continue;
|
| rect = ScaleRect(rect, screen_size_, view_size);
|
| - if (!rect.intersect(clip_area))
|
| + rect.IntersectWith(clip_area);
|
| + if (rect.is_empty())
|
| continue;
|
|
|
| ConvertAndScaleYUVToRGB32Rect(last_image_->planes[0],
|
| @@ -227,38 +226,41 @@ void VideoDecoderVp8::RenderFrame(const SkISize& view_size,
|
| clip_area,
|
| rect);
|
|
|
| - output_region->op(rect, SkRegion::kUnion_Op);
|
| + output_region->AddRect(rect);
|
| }
|
|
|
| - updated_region_.op(ScaleRect(clip_area, view_size, screen_size_),
|
| - SkRegion::kDifference_Op);
|
| + updated_region_.Subtract(ScaleRect(clip_area, view_size, screen_size_));
|
|
|
| - for (SkRegion::Iterator i(transparent_region_); !i.done(); i.next()) {
|
| + for (webrtc::DesktopRegion::Iterator i(transparent_region_);
|
| + !i.IsAtEnd(); i.Advance()) {
|
| // Determine the scaled area affected by this rectangle changing.
|
| - SkIRect rect = i.rect();
|
| - if (!rect.intersect(source_clip))
|
| + webrtc::DesktopRect rect = i.rect();
|
| + rect.IntersectWith(source_clip);
|
| + if (rect.is_empty())
|
| continue;
|
| rect = ScaleRect(rect, screen_size_, view_size);
|
| - if (!rect.intersect(clip_area))
|
| + rect.IntersectWith(clip_area);
|
| + if (rect.is_empty())
|
| continue;
|
|
|
| // Fill the rectange with transparent pixels.
|
| FillRect(image_buffer, image_stride, rect, kTransparent);
|
| - output_region->op(rect, SkRegion::kUnion_Op);
|
| + output_region->AddRect(rect);
|
| }
|
|
|
| - SkIRect scaled_clip_area = ScaleRect(clip_area, view_size, screen_size_);
|
| - updated_region_.op(scaled_clip_area, SkRegion::kDifference_Op);
|
| - transparent_region_.op(scaled_clip_area, SkRegion::kDifference_Op);
|
| + webrtc::DesktopRect scaled_clip_area =
|
| + ScaleRect(clip_area, view_size, screen_size_);
|
| + updated_region_.Subtract(scaled_clip_area);
|
| + transparent_region_.Subtract(scaled_clip_area);
|
| }
|
|
|
| -const SkRegion* VideoDecoderVp8::GetImageShape() {
|
| +const webrtc::DesktopRegion* VideoDecoderVp8::GetImageShape() {
|
| return &desktop_shape_;
|
| }
|
|
|
| void VideoDecoderVp8::FillRect(uint8* buffer,
|
| int stride,
|
| - const SkIRect& rect,
|
| + const webrtc::DesktopRect& rect,
|
| uint32 color) {
|
| uint32* ptr = reinterpret_cast<uint32*>(buffer + (rect.top() * stride) +
|
| (rect.left() * kBytesPerPixel));
|
| @@ -269,22 +271,23 @@ void VideoDecoderVp8::FillRect(uint8* buffer,
|
| }
|
| }
|
|
|
| -void VideoDecoderVp8::UpdateImageShapeRegion(SkRegion* new_desktop_shape) {
|
| +void VideoDecoderVp8::UpdateImageShapeRegion(
|
| + webrtc::DesktopRegion* new_desktop_shape) {
|
| // Add all areas that have been updated or become transparent to the
|
| // transparent region. Exclude anything within the new desktop shape.
|
| - transparent_region_.op(desktop_shape_, SkRegion::kUnion_Op);
|
| - transparent_region_.op(updated_region_, SkRegion::kUnion_Op);
|
| - transparent_region_.op(*new_desktop_shape, SkRegion::kDifference_Op);
|
| + transparent_region_.AddRegion(desktop_shape_);
|
| + transparent_region_.AddRegion(updated_region_);
|
| + transparent_region_.Subtract(*new_desktop_shape);
|
|
|
| // Add newly exposed areas to the update region and limit updates to the new
|
| // desktop shape.
|
| - SkRegion difference = *new_desktop_shape;
|
| - difference.op(desktop_shape_, SkRegion::kDifference_Op);
|
| - updated_region_.op(difference, SkRegion::kUnion_Op);
|
| - updated_region_.op(*new_desktop_shape, SkRegion::kIntersect_Op);
|
| + webrtc::DesktopRegion difference = *new_desktop_shape;
|
| + difference.Subtract(desktop_shape_);
|
| + updated_region_.AddRegion(difference);
|
| + updated_region_.IntersectWith(*new_desktop_shape);
|
|
|
| // Set the new desktop shape region.
|
| - desktop_shape_.swap(*new_desktop_shape);
|
| + desktop_shape_.Swap(new_desktop_shape);
|
| }
|
|
|
| } // namespace remoting
|
|
|