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