11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "remoting/codec/video_encoder_helper.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "remoting/proto/video.pb.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/webrtc/modules/desktop_capture/desktop_region.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace remoting {
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciVideoEncoderHelper::VideoEncoderHelper() {}
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<VideoPacket> VideoEncoderHelper::CreateVideoPacket(
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const webrtc::DesktopFrame& frame) {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return CreateVideoPacketWithUpdatedRegion(frame, frame.updated_region());
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<VideoPacket>
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciVideoEncoderHelper::CreateVideoPacketWithUpdatedRegion(
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const webrtc::DesktopFrame& frame,
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const webrtc::DesktopRegion& updated_region) {
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<VideoPacket> packet(new VideoPacket());
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Set |screen_width| and |screen_height| iff they have changed.
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!frame.size().equals(screen_size_)) {
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    screen_size_ = frame.size();
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    VideoPacketFormat* format = packet->mutable_format();
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    format->set_screen_width(screen_size_.width());
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    format->set_screen_height(screen_size_.height());
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Record the list of changed rectangles.
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (webrtc::DesktopRegion::Iterator iter(updated_region);
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       !iter.IsAtEnd(); iter.Advance()) {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const webrtc::DesktopRect& rect = iter.rect();
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Rect* dirty_rect = packet->add_dirty_rects();
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dirty_rect->set_x(rect.left());
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dirty_rect->set_y(rect.top());
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dirty_rect->set_width(rect.width());
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dirty_rect->set_height(rect.height());
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Record the shape of the frame, if specified.
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (frame.shape()) {
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    packet->set_use_desktop_shape(true);
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (webrtc::DesktopRegion::Iterator r(*frame.shape());
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         !r.IsAtEnd(); r.Advance()) {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Rect* rect = packet->add_desktop_shape_rects();
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      rect->set_x(r.rect().left());
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      rect->set_y(r.rect().top());
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      rect->set_width(r.rect().width());
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      rect->set_height(r.rect().height());
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Store the capture time and frame DPI.
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  packet->set_capture_time_ms(frame.capture_time_ms());
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!frame.dpi().is_zero()) {
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    packet->mutable_format()->set_x_dpi(frame.dpi().x());
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    packet->mutable_format()->set_y_dpi(frame.dpi().y());
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return packet.Pass();
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace remoting
71