Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(378)

Unified Diff: remoting/codec/video_encoder_vp8.cc

Issue 13983010: Use webrtc::DesktopCapturer for screen capturer implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/codec/video_encoder_vp8.h ('k') | remoting/codec/video_encoder_vp8_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/codec/video_encoder_vp8.cc
diff --git a/remoting/codec/video_encoder_vp8.cc b/remoting/codec/video_encoder_vp8.cc
index a4e4d1a1132d1f76c88db7bb1020cb19edb98b3f..78240652e9809766c04df092f7b2ffa3b4e47be8 100644
--- a/remoting/codec/video_encoder_vp8.cc
+++ b/remoting/codec/video_encoder_vp8.cc
@@ -8,9 +8,10 @@
#include "base/sys_info.h"
#include "base/time.h"
#include "media/base/yuv_convert.h"
-#include "media/video/capture/screen/screen_capture_data.h"
#include "remoting/base/util.h"
#include "remoting/proto/video.pb.h"
+#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
+#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h"
extern "C" {
#define VPX_CODEC_DISABLE_COMPAT 1
@@ -49,7 +50,7 @@ void VideoEncoderVp8::Destroy() {
}
}
-bool VideoEncoderVp8::Init(const SkISize& size) {
+bool VideoEncoderVp8::Init(const webrtc::DesktopSize& size) {
Destroy();
codec_.reset(new vpx_codec_ctx_t());
image_.reset(new vpx_image_t());
@@ -146,11 +147,9 @@ bool VideoEncoderVp8::Init(const SkISize& size) {
return true;
}
-void VideoEncoderVp8::PrepareImage(
- scoped_refptr<media::ScreenCaptureData> capture_data,
- SkRegion* updated_region) {
- const SkRegion& region = capture_data->dirty_region();
- if (region.isEmpty()) {
+void VideoEncoderVp8::PrepareImage(const webrtc::DesktopFrame* frame,
+ SkRegion* updated_region) {
+ if (frame->updated_region().is_empty()) {
updated_region->setEmpty();
return;
}
@@ -159,8 +158,11 @@ void VideoEncoderVp8::PrepareImage(
// This also ensures that all rectangles have even-aligned top-left, which
// is required for ConvertRGBToYUVWithRect() to work.
std::vector<SkIRect> aligned_rects;
- for (SkRegion::Iterator r(region); !r.done(); r.next()) {
- aligned_rects.push_back(AlignRect(r.rect()));
+ for (webrtc::DesktopRegion::Iterator r(frame->updated_region());
+ !r.IsAtEnd(); r.Advance()) {
+ const webrtc::DesktopRect& rect = r.rect();
+ aligned_rects.push_back(AlignRect(
+ SkIRect::MakeLTRB(rect.left(), rect.top(), rect.right(), rect.bottom())));
}
DCHECK(!aligned_rects.empty());
updated_region->setRects(&aligned_rects[0], aligned_rects.size());
@@ -172,8 +174,8 @@ void VideoEncoderVp8::PrepareImage(
SkRegion::kIntersect_Op);
// Convert the updated region to YUV ready for encoding.
- const uint8* rgb_data = capture_data->data();
- const int rgb_stride = capture_data->stride();
+ const uint8* rgb_data = frame->data();
+ const int rgb_stride = frame->stride();
const int y_stride = image_->stride[0];
DCHECK_EQ(image_->stride[1], image_->stride[2]);
const int uv_stride = image_->stride[1];
@@ -213,17 +215,16 @@ void VideoEncoderVp8::PrepareActiveMap(const SkRegion& updated_region) {
}
void VideoEncoderVp8::Encode(
- scoped_refptr<media::ScreenCaptureData> capture_data,
- bool key_frame,
+ const webrtc::DesktopFrame* frame,
const DataAvailableCallback& data_available_callback) {
- DCHECK_LE(32, capture_data->size().width());
- DCHECK_LE(32, capture_data->size().height());
+ DCHECK_LE(32, frame->size().width());
+ DCHECK_LE(32, frame->size().height());
base::Time encode_start_time = base::Time::Now();
if (!initialized_ ||
- (capture_data->size() != SkISize::Make(image_->w, image_->h))) {
- bool ret = Init(capture_data->size());
+ !frame->size().equals(webrtc::DesktopSize(image_->w, image_->h))) {
+ bool ret = Init(frame->size());
// TODO(hclam): Handle error better.
CHECK(ret) << "Initialization of encoder failed";
initialized_ = ret;
@@ -231,7 +232,7 @@ void VideoEncoderVp8::Encode(
// Convert the updated capture data ready for encode.
SkRegion updated_region;
- PrepareImage(capture_data, &updated_region);
+ PrepareImage(frame, &updated_region);
// Update active map based on updated region.
PrepareActiveMap(updated_region);
@@ -286,17 +287,15 @@ void VideoEncoderVp8::Encode(
packet->mutable_format()->set_encoding(VideoPacketFormat::ENCODING_VP8);
packet->set_flags(VideoPacket::FIRST_PACKET | VideoPacket::LAST_PACKET |
VideoPacket::LAST_PARTITION);
- packet->mutable_format()->set_screen_width(capture_data->size().width());
- packet->mutable_format()->set_screen_height(capture_data->size().height());
- packet->set_capture_time_ms(capture_data->capture_time_ms());
+ packet->mutable_format()->set_screen_width(frame->size().width());
+ packet->mutable_format()->set_screen_height(frame->size().height());
+ packet->set_capture_time_ms(frame->capture_time_ms());
packet->set_encode_time_ms(
(base::Time::Now() - encode_start_time).InMillisecondsRoundedUp());
- packet->set_client_sequence_number(capture_data->client_sequence_number());
- SkIPoint dpi(capture_data->dpi());
- if (dpi.x())
- packet->mutable_format()->set_x_dpi(dpi.x());
- if (dpi.y())
- packet->mutable_format()->set_y_dpi(dpi.y());
+ if (!frame->dpi().is_zero()) {
+ packet->mutable_format()->set_x_dpi(frame->dpi().x());
+ packet->mutable_format()->set_y_dpi(frame->dpi().y());
+ }
for (SkRegion::Iterator r(updated_region); !r.done(); r.next()) {
Rect* rect = packet->add_dirty_rects();
rect->set_x(r.rect().x());
« no previous file with comments | « remoting/codec/video_encoder_vp8.h ('k') | remoting/codec/video_encoder_vp8_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698