15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef REMOTING_CODEC_VIDEO_ENCODER_VP8_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define REMOTING_CODEC_VIDEO_ENCODER_VP8_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/codec/video_encoder.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkRegion.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct vpx_codec_ctx vpx_codec_ctx_t; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct vpx_image vpx_image_t; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace webrtc { 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class DesktopSize; 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace webrtc 1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class that uses VP8 to perform encoding. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VideoEncoderVp8 : public VideoEncoder { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VideoEncoderVp8(); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~VideoEncoderVp8(); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // VideoEncoder interface. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Encode( 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const webrtc::DesktopFrame* frame, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DataAvailableCallback& data_available_callback) OVERRIDE; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(VideoEncoderVp8Test, AlignAndClipRect); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the encoder. Returns true if successful. 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool Init(const webrtc::DesktopSize& size); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroy the encoder. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Destroy(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prepare |image_| for encoding. Write updated rectangles into 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |updated_region|. 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(sergeyu): Update this code to use webrtc::DesktopRegion. 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void PrepareImage(const webrtc::DesktopFrame* frame, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkRegion* updated_region); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the active map according to |updated_region|. Active map is then 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // given to the encoder to speed up encoding. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrepareActiveMap(const SkRegion& updated_region); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the encoder is initialized. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool initialized_; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<vpx_codec_ctx_t> codec_; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<vpx_image_t> image_; 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<uint8[]> active_map_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_map_width_; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_map_height_; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_timestamp_; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Buffer for storing the yuv image. 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<uint8[]> yuv_image_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VideoEncoderVp8); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // REMOTING_CODEC_VIDEO_ENCODER_VP8_H_ 71