Index: remoting/base/decoder_vp8.cc |
diff --git a/remoting/base/decoder_vp8.cc b/remoting/base/decoder_vp8.cc |
deleted file mode 100644 |
index 74fd8a8e2a1925f6fe6ad6ef48cb6233aa6fa750..0000000000000000000000000000000000000000 |
--- a/remoting/base/decoder_vp8.cc |
+++ /dev/null |
@@ -1,211 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "remoting/base/decoder_vp8.h" |
- |
-#include <math.h> |
- |
-#include "base/logging.h" |
-#include "media/base/media.h" |
-#include "media/base/yuv_convert.h" |
-#include "remoting/base/util.h" |
- |
-extern "C" { |
-#define VPX_CODEC_DISABLE_COMPAT 1 |
-#include "third_party/libvpx/libvpx.h" |
-} |
- |
-namespace remoting { |
- |
-DecoderVp8::DecoderVp8() |
- : state_(kUninitialized), |
- codec_(NULL), |
- last_image_(NULL), |
- screen_size_(SkISize::Make(0, 0)) { |
-} |
- |
-DecoderVp8::~DecoderVp8() { |
- if (codec_) { |
- vpx_codec_err_t ret = vpx_codec_destroy(codec_); |
- CHECK(ret == VPX_CODEC_OK) << "Failed to destroy codec"; |
- } |
- delete codec_; |
-} |
- |
-void DecoderVp8::Initialize(const SkISize& screen_size) { |
- DCHECK(!screen_size.isEmpty()); |
- |
- screen_size_ = screen_size; |
- state_ = kReady; |
-} |
- |
-Decoder::DecodeResult DecoderVp8::DecodePacket(const VideoPacket* packet) { |
- DCHECK_EQ(kReady, state_); |
- |
- // Initialize the codec as needed. |
- if (!codec_) { |
- codec_ = new vpx_codec_ctx_t(); |
- |
- // TODO(hclam): Scale the number of threads with number of cores of the |
- // machine. |
- vpx_codec_dec_cfg config; |
- config.w = 0; |
- config.h = 0; |
- config.threads = 2; |
- vpx_codec_err_t ret = |
- vpx_codec_dec_init( |
- codec_, vpx_codec_vp8_dx(), &config, 0); |
- if (ret != VPX_CODEC_OK) { |
- LOG(INFO) << "Cannot initialize codec."; |
- delete codec_; |
- codec_ = NULL; |
- state_ = kError; |
- return DECODE_ERROR; |
- } |
- } |
- |
- // Do the actual decoding. |
- vpx_codec_err_t ret = vpx_codec_decode( |
- codec_, reinterpret_cast<const uint8*>(packet->data().data()), |
- packet->data().size(), NULL, 0); |
- if (ret != VPX_CODEC_OK) { |
- LOG(INFO) << "Decoding failed:" << vpx_codec_err_to_string(ret) << "\n" |
- << "Details: " << vpx_codec_error(codec_) << "\n" |
- << vpx_codec_error_detail(codec_); |
- return DECODE_ERROR; |
- } |
- |
- // Gets the decoded data. |
- vpx_codec_iter_t iter = NULL; |
- vpx_image_t* image = vpx_codec_get_frame(codec_, &iter); |
- if (!image) { |
- LOG(INFO) << "No video frame decoded"; |
- return DECODE_ERROR; |
- } |
- last_image_ = image; |
- |
- SkRegion 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); |
- } |
- |
- updated_region_.op(region, SkRegion::kUnion_Op); |
- return DECODE_DONE; |
-} |
- |
-bool DecoderVp8::IsReadyForData() { |
- return state_ == kReady; |
-} |
- |
-VideoPacketFormat::Encoding DecoderVp8::Encoding() { |
- return VideoPacketFormat::ENCODING_VP8; |
-} |
- |
-void DecoderVp8::Invalidate(const SkISize& view_size, |
- const SkRegion& region) { |
- DCHECK_EQ(kReady, state_); |
- DCHECK(!view_size.isEmpty()); |
- |
- 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); |
- } |
-} |
- |
-void DecoderVp8::RenderFrame(const SkISize& view_size, |
- const SkIRect& clip_area, |
- uint8* image_buffer, |
- int image_stride, |
- SkRegion* output_region) { |
- DCHECK_EQ(kReady, state_); |
- DCHECK(!view_size.isEmpty()); |
- |
- // 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); |
- |
- // 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() && |
- (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()); |
- |
- // If there were no changes within the clip source area then don't render. |
- if (!updated_region_.intersects(source_rect)) |
- return; |
- |
- // Scale & convert the entire clip area. |
- int y_offset = CalculateYOffset(source_rect.x(), |
- source_rect.y(), |
- last_image_->stride[0]); |
- int uv_offset = CalculateUVOffset(source_rect.x(), |
- source_rect.y(), |
- last_image_->stride[1]); |
- ScaleYUVToRGB32(last_image_->planes[0] + y_offset, |
- last_image_->planes[1] + uv_offset, |
- last_image_->planes[2] + uv_offset, |
- image_buffer, |
- source_rect.width(), |
- source_rect.height(), |
- clip_area.width(), |
- clip_area.height(), |
- last_image_->stride[0], |
- last_image_->stride[1], |
- image_stride, |
- media::YV12, |
- media::ROTATE_0, |
- media::FILTER_BILINEAR); |
- |
- output_region->op(clip_area, SkRegion::kUnion_Op); |
- updated_region_.op(source_rect, SkRegion::kDifference_Op); |
- return; |
- } |
- |
- for (SkRegion::Iterator i(updated_region_); !i.done(); i.next()) { |
- // Determine the scaled area affected by this rectangle changing. |
- SkIRect rect = i.rect(); |
- if (!rect.intersect(source_clip)) |
- continue; |
- rect = ScaleRect(rect, screen_size_, view_size); |
- if (!rect.intersect(clip_area)) |
- continue; |
- |
- ConvertAndScaleYUVToRGB32Rect(last_image_->planes[0], |
- last_image_->planes[1], |
- last_image_->planes[2], |
- last_image_->stride[0], |
- last_image_->stride[1], |
- screen_size_, |
- source_clip, |
- image_buffer, |
- image_stride, |
- view_size, |
- clip_area, |
- rect); |
- |
- output_region->op(rect, SkRegion::kUnion_Op); |
- } |
- |
- updated_region_.op(ScaleRect(clip_area, view_size, screen_size_), |
- SkRegion::kDifference_Op); |
-} |
- |
-} // namespace remoting |