Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / remoting / codec / video_encoder_vpx.h
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef REMOTING_CODEC_VIDEO_ENCODER_VPX_H_
6 #define REMOTING_CODEC_VIDEO_ENCODER_VPX_H_
7
8 #include "base/callback.h"
9 #include "base/time/time.h"
10 #include "remoting/codec/scoped_vpx_codec.h"
11 #include "remoting/codec/video_encoder.h"
12
13 typedef struct vpx_image vpx_image_t;
14
15 namespace webrtc {
16 class DesktopRegion;
17 class DesktopSize;
18 }  // namespace webrtc
19
20 namespace remoting {
21
22 class VideoEncoderVpx : public VideoEncoder {
23  public:
24   // Create encoder for the specified protocol.
25   static scoped_ptr<VideoEncoderVpx> CreateForVP8();
26   static scoped_ptr<VideoEncoderVpx> CreateForVP9();
27
28   virtual ~VideoEncoderVpx();
29
30   // VideoEncoder interface.
31   virtual scoped_ptr<VideoPacket> Encode(
32       const webrtc::DesktopFrame& frame) OVERRIDE;
33
34  private:
35   typedef base::Callback<ScopedVpxCodec(const webrtc::DesktopSize&)>
36       InitializeCodecCallback;
37
38   VideoEncoderVpx(const InitializeCodecCallback& init_codec);
39
40   // Initializes the codec for frames of |size|. Returns true if successful.
41   bool Initialize(const webrtc::DesktopSize& size);
42
43   // Prepares |image_| for encoding. Writes updated rectangles into
44   // |updated_region|.
45   void PrepareImage(const webrtc::DesktopFrame& frame,
46                     webrtc::DesktopRegion* updated_region);
47
48   // Updates the active map according to |updated_region|. Active map is then
49   // given to the encoder to speed up encoding.
50   void PrepareActiveMap(const webrtc::DesktopRegion& updated_region);
51
52   InitializeCodecCallback init_codec_;
53
54   ScopedVpxCodec codec_;
55   scoped_ptr<vpx_image_t> image_;
56   scoped_ptr<uint8[]> active_map_;
57   int active_map_width_;
58   int active_map_height_;
59   base::TimeTicks timestamp_base_;
60
61   // Buffer for storing the yuv image.
62   scoped_ptr<uint8[]> yuv_image_;
63
64   DISALLOW_COPY_AND_ASSIGN(VideoEncoderVpx);
65 };
66
67 }  // namespace remoting
68
69 #endif  // REMOTING_CODEC_VIDEO_ENCODER_VP8_H_