| Index: remoting/codec/video_encoder_verbatim.cc
|
| diff --git a/remoting/codec/video_encoder_verbatim.cc b/remoting/codec/video_encoder_verbatim.cc
|
| index 2e7f6d078d18218674e6781d6bfa67740e2f4cd3..4680362a02d20eb75094e2ab7b91ca90d3f6a2a5 100644
|
| --- a/remoting/codec/video_encoder_verbatim.cc
|
| +++ b/remoting/codec/video_encoder_verbatim.cc
|
| @@ -5,17 +5,17 @@
|
| #include "remoting/codec/video_encoder_verbatim.h"
|
|
|
| #include "base/logging.h"
|
| -#include "media/video/capture/screen/screen_capture_data.h"
|
| +#include "base/stl_util.h"
|
| #include "remoting/base/util.h"
|
| #include "remoting/proto/video.pb.h"
|
| +#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
|
|
|
| namespace remoting {
|
|
|
| static const int kPacketSize = 1024 * 1024;
|
|
|
| VideoEncoderVerbatim::VideoEncoderVerbatim()
|
| - : screen_size_(SkISize::Make(0,0)),
|
| - max_packet_size_(kPacketSize) {
|
| + : max_packet_size_(kPacketSize) {
|
| }
|
|
|
| void VideoEncoderVerbatim::SetMaxPacketSize(int size) {
|
| @@ -26,35 +26,33 @@ VideoEncoderVerbatim::~VideoEncoderVerbatim() {
|
| }
|
|
|
| void VideoEncoderVerbatim::Encode(
|
| - scoped_refptr<media::ScreenCaptureData> capture_data,
|
| - bool key_frame,
|
| + const webrtc::DesktopFrame* frame,
|
| const DataAvailableCallback& data_available_callback) {
|
| - capture_data_ = capture_data;
|
| callback_ = data_available_callback;
|
| encode_start_time_ = base::Time::Now();
|
|
|
| - const SkRegion& region = capture_data->dirty_region();
|
| - SkRegion::Iterator iter(region);
|
| - while (!iter.done()) {
|
| - SkIRect rect = iter.rect();
|
| - iter.next();
|
| - EncodeRect(rect, iter.done());
|
| + webrtc::DesktopRegion::Iterator iter(frame->updated_region());
|
| + while (!iter.IsAtEnd()) {
|
| + const webrtc::DesktopRect& rect = iter.rect();
|
| + iter.Advance();
|
| + EncodeRect(frame, rect, iter.IsAtEnd());
|
| }
|
|
|
| - capture_data_ = NULL;
|
| callback_.Reset();
|
| }
|
|
|
| -void VideoEncoderVerbatim::EncodeRect(const SkIRect& rect, bool last) {
|
| - CHECK(capture_data_->data());
|
| - const int stride = capture_data_->stride();
|
| +void VideoEncoderVerbatim::EncodeRect(const webrtc::DesktopFrame* frame,
|
| + const webrtc::DesktopRect& rect,
|
| + bool last) {
|
| + CHECK(frame->data());
|
| + const int stride = frame->stride();
|
| const int bytes_per_pixel = 4;
|
| const int row_size = bytes_per_pixel * rect.width();
|
|
|
| scoped_ptr<VideoPacket> packet(new VideoPacket());
|
| - PrepareUpdateStart(rect, packet.get());
|
| - const uint8* in = capture_data_->data() +
|
| - rect.fTop * stride + rect.fLeft * bytes_per_pixel;
|
| + PrepareUpdateStart(frame, rect, packet.get());
|
| + const uint8* in = frame->data() +
|
| + rect.top() * stride + rect.left() * bytes_per_pixel;
|
| // TODO(hclam): Fill in the sequence number.
|
| uint8* out = GetOutputBuffer(packet.get(), max_packet_size_);
|
| int filled = 0;
|
| @@ -88,16 +86,14 @@ void VideoEncoderVerbatim::EncodeRect(const SkIRect& rect, bool last) {
|
|
|
| packet->mutable_data()->resize(filled);
|
| packet->set_flags(packet->flags() | VideoPacket::LAST_PACKET);
|
| - packet->set_capture_time_ms(capture_data_->capture_time_ms());
|
| +
|
| + 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());
|
| + }
|
| if (last)
|
| packet->set_flags(packet->flags() | VideoPacket::LAST_PARTITION);
|
| }
|
| @@ -110,18 +106,19 @@ void VideoEncoderVerbatim::EncodeRect(const SkIRect& rect, bool last) {
|
| }
|
| }
|
|
|
| -void VideoEncoderVerbatim::PrepareUpdateStart(const SkIRect& rect,
|
| +void VideoEncoderVerbatim::PrepareUpdateStart(const webrtc::DesktopFrame* frame,
|
| + const webrtc::DesktopRect& rect,
|
| VideoPacket* packet) {
|
| packet->set_flags(packet->flags() | VideoPacket::FIRST_PACKET);
|
|
|
| VideoPacketFormat* format = packet->mutable_format();
|
| - format->set_x(rect.fLeft);
|
| - format->set_y(rect.fTop);
|
| + format->set_x(rect.left());
|
| + format->set_y(rect.top());
|
| format->set_width(rect.width());
|
| format->set_height(rect.height());
|
| format->set_encoding(VideoPacketFormat::ENCODING_VERBATIM);
|
| - if (capture_data_->size() != screen_size_) {
|
| - screen_size_ = capture_data_->size();
|
| + if (frame->size().equals(screen_size_)) {
|
| + screen_size_ = frame->size();
|
| format->set_screen_width(screen_size_.width());
|
| format->set_screen_height(screen_size_.height());
|
| }
|
| @@ -129,9 +126,7 @@ void VideoEncoderVerbatim::PrepareUpdateStart(const SkIRect& rect,
|
|
|
| uint8* VideoEncoderVerbatim::GetOutputBuffer(VideoPacket* packet, size_t size) {
|
| packet->mutable_data()->resize(size);
|
| - // TODO(ajwong): Is there a better way to do this at all???
|
| - return const_cast<uint8*>(reinterpret_cast<const uint8*>(
|
| - packet->mutable_data()->data()));
|
| + return reinterpret_cast<uint8*>(string_as_array(packet->mutable_data()));
|
| }
|
|
|
| } // namespace remoting
|
|
|