| OLD | NEW |
| (Empty) |
| 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 MEDIA_CAST_VIDEO_SENDER_CODECS_VP8_VP8_ENCODER_H_ | |
| 6 #define MEDIA_CAST_VIDEO_SENDER_CODECS_VP8_VP8_ENCODER_H_ | |
| 7 | |
| 8 #include "base/basictypes.h" | |
| 9 #include "base/memory/scoped_ptr.h" | |
| 10 #include "base/threading/thread_checker.h" | |
| 11 #include "base/time/time.h" | |
| 12 #include "media/cast/cast_config.h" | |
| 13 #include "media/cast/video_sender/software_video_encoder.h" | |
| 14 #include "third_party/libvpx/source/libvpx/vpx/vpx_encoder.h" | |
| 15 | |
| 16 namespace media { | |
| 17 class VideoFrame; | |
| 18 } | |
| 19 | |
| 20 // VPX forward declaration. | |
| 21 typedef struct vpx_codec_ctx vpx_enc_ctx_t; | |
| 22 | |
| 23 namespace media { | |
| 24 namespace cast { | |
| 25 | |
| 26 const int kNumberOfVp8VideoBuffers = 3; | |
| 27 | |
| 28 class Vp8Encoder : public SoftwareVideoEncoder { | |
| 29 public: | |
| 30 Vp8Encoder(const VideoSenderConfig& video_config, int max_unacked_frames); | |
| 31 | |
| 32 virtual ~Vp8Encoder(); | |
| 33 | |
| 34 // Initialize the encoder before Encode() can be called. This method | |
| 35 // must be called on the thread that Encode() is called. | |
| 36 virtual void Initialize() OVERRIDE; | |
| 37 | |
| 38 // Encode a raw image (as a part of a video stream). | |
| 39 virtual bool Encode(const scoped_refptr<media::VideoFrame>& video_frame, | |
| 40 transport::EncodedFrame* encoded_image) OVERRIDE; | |
| 41 | |
| 42 // Update the encoder with a new target bit rate. | |
| 43 virtual void UpdateRates(uint32 new_bitrate) OVERRIDE; | |
| 44 | |
| 45 // Set the next frame to be a key frame. | |
| 46 virtual void GenerateKeyFrame() OVERRIDE; | |
| 47 | |
| 48 virtual void LatestFrameIdToReference(uint32 frame_id) OVERRIDE; | |
| 49 | |
| 50 private: | |
| 51 enum Vp8Buffers { | |
| 52 kAltRefBuffer = 0, | |
| 53 kGoldenBuffer = 1, | |
| 54 kLastBuffer = 2, | |
| 55 kNoBuffer = 3 // Note: must be last. | |
| 56 }; | |
| 57 | |
| 58 void InitEncode(int number_of_cores); | |
| 59 | |
| 60 // Calculate the max target in % for a keyframe. | |
| 61 uint32 MaxIntraTarget(uint32 optimal_buffer_size) const; | |
| 62 | |
| 63 // Calculate which next Vp8 buffers to update with the next frame. | |
| 64 Vp8Buffers GetNextBufferToUpdate(); | |
| 65 | |
| 66 // Calculate which previous frame to reference. | |
| 67 uint32 GetLatestFrameIdToReference(); | |
| 68 | |
| 69 // Get encoder flags for our referenced encoder buffers. | |
| 70 void GetCodecReferenceFlags(vpx_codec_flags_t* flags); | |
| 71 | |
| 72 // Get encoder flags for our encoder buffers to update with next frame. | |
| 73 void GetCodecUpdateFlags(Vp8Buffers buffer_to_update, | |
| 74 vpx_codec_flags_t* flags); | |
| 75 | |
| 76 const VideoSenderConfig cast_config_; | |
| 77 const bool use_multiple_video_buffers_; | |
| 78 const int max_number_of_repeated_buffers_in_a_row_; | |
| 79 | |
| 80 // VP8 internal objects. | |
| 81 scoped_ptr<vpx_codec_enc_cfg_t> config_; | |
| 82 scoped_ptr<vpx_enc_ctx_t> encoder_; | |
| 83 vpx_image_t* raw_image_; | |
| 84 | |
| 85 bool key_frame_requested_; | |
| 86 bool first_frame_received_; | |
| 87 base::TimeDelta first_frame_timestamp_; | |
| 88 uint32 last_encoded_frame_id_; | |
| 89 uint32 used_buffers_frame_id_[kNumberOfVp8VideoBuffers]; | |
| 90 bool acked_frame_buffers_[kNumberOfVp8VideoBuffers]; | |
| 91 Vp8Buffers last_used_vp8_buffer_; | |
| 92 int number_of_repeated_buffers_; | |
| 93 | |
| 94 // This is bound to the thread where Initialize() is called. | |
| 95 base::ThreadChecker thread_checker_; | |
| 96 | |
| 97 DISALLOW_COPY_AND_ASSIGN(Vp8Encoder); | |
| 98 }; | |
| 99 | |
| 100 } // namespace cast | |
| 101 } // namespace media | |
| 102 | |
| 103 #endif // MEDIA_CAST_VIDEO_SENDER_CODECS_VP8_VP8_ENCODER_H_ | |
| OLD | NEW |