18bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Copyright 2013 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) 58bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#ifndef REMOTING_CODEC_VIDEO_ENCODER_VPX_H_ 68bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#define REMOTING_CODEC_VIDEO_ENCODER_VPX_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/callback.h" 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/time/time.h" 108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "remoting/codec/scoped_vpx_codec.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/codec/video_encoder.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "remoting/codec/video_encoder_helper.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct vpx_image vpx_image_t; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace webrtc { 17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class DesktopRegion; 1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class DesktopSize; 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace webrtc 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class VideoEncoderVpx : public VideoEncoder { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Create encoder for the specified protocol. 268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static scoped_ptr<VideoEncoderVpx> CreateForVP8(); 27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch static scoped_ptr<VideoEncoderVpx> CreateForVP9(); 288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual ~VideoEncoderVpx(); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // VideoEncoder interface. 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetLosslessEncode(bool want_lossless) OVERRIDE; 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetLosslessColor(bool want_lossless) OVERRIDE; 34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual scoped_ptr<VideoPacket> Encode( 35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const webrtc::DesktopFrame& frame) OVERRIDE; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) explicit VideoEncoderVpx(bool use_vp9); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Initializes the codec for frames of |size|. Returns true if successful. 418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool Initialize(const webrtc::DesktopSize& size); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Prepares |image_| for encoding. Writes updated rectangles into 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |updated_region|. 45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void PrepareImage(const webrtc::DesktopFrame& frame, 46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webrtc::DesktopRegion* updated_region); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Updates the active map according to |updated_region|. Active map is then 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // given to the encoder to speed up encoding. 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void PrepareActiveMap(const webrtc::DesktopRegion& updated_region); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // True if the encoder should generate VP9, false for VP8. 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool use_vp9_; 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Options controlling VP9 encode quantization and color space. 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // These are always off (false) for VP8. 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool lossless_encode_; 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool lossless_color_; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ScopedVpxCodec codec_; 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks timestamp_base_; 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // VPX image and buffer to hold the actual YUV planes. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<vpx_image_t> image_; 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<uint8[]> image_buffer_; 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Active map used to optimize out processing of un-changed macroblocks. 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<uint8[]> active_map_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_map_width_; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_map_height_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Used to help initialize VideoPackets from DesktopFrames. 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci VideoEncoderHelper helper_; 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VideoEncoderVpx); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // REMOTING_CODEC_VIDEO_ENCODER_VP8_H_ 81