1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_VIDEO_ENGINE_VIE_ENCODER_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_VIDEO_ENGINE_VIE_ENCODER_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14b6d9cfc6347e490751e142ba5fb89e4a975ed442mflodman@webrtc.org#include <list>
15b6d9cfc6347e490751e142ba5fb89e4a975ed442mflodman@webrtc.org#include <map>
16b6d9cfc6347e490751e142ba5fb89e4a975ed442mflodman@webrtc.org
17d54aa969545bd9c5ccc0077dd6645e742bf11418pbos@webrtc.org#include "webrtc/base/thread_annotations.h"
18281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/common_types.h"
19281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
20281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
21281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
22281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/modules/video_processing/main/interface/video_processing.h"
23281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
24281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/typedefs.h"
2524e2089750e9e51228b82d6c7ebf4fa064c797bapbos@webrtc.org#include "webrtc/frame_callback.h"
26281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/vie_defines.h"
27281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/vie_frame_provider_base.h"
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
31ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.orgclass Config;
32bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.orgclass CriticalSectionWrapper;
332e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.orgclass EncodedImageCallback;
345e87b5f032780f6941a27c2d5068ab1e89e659a6pwestin@webrtc.orgclass PacedSender;
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ProcessThread;
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass QMVideoSettingsCallback;
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass RtpRtcp;
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEBitrateObserver;
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEEffectFilter;
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEEncoderObserver;
41bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.orgclass VideoCodingModule;
425e87b5f032780f6941a27c2d5068ab1e89e659a6pwestin@webrtc.orgclass ViEPacedSenderCallback;
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEEncoder
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    : public RtcpIntraFrameObserver,
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      public VCMPacketizationCallback,
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      public VCMProtectionCallback,
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      public VCMSendStatisticsCallback,
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      public ViEFrameCallback {
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  friend class ViEBitrateObserver;
525e87b5f032780f6941a27c2d5068ab1e89e659a6pwestin@webrtc.org  friend class ViEPacedSenderCallback;
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
5467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  ViEEncoder(int32_t engine_id,
5567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org             int32_t channel_id,
5667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org             uint32_t number_of_cores,
57ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.org             const Config& config,
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             ProcessThread& module_process_thread,
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             BitrateController* bitrate_controller);
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ~ViEEncoder();
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool Init();
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
64dca71b270896a8501d9f12506e7da48cde9abb20stefan@webrtc.org  void SetNetworkTransmissionState(bool is_transmitting);
65dca71b270896a8501d9f12506e7da48cde9abb20stefan@webrtc.org
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Returns the id of the owning channel.
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int Owner() const;
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Drops incoming packets before they get to the encoder.
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void Pause();
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void Restart();
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Codec settings.
7467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  uint8_t NumberOfCodecs();
7567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetCodec(uint8_t list_index, VideoCodec* video_codec);
7667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t RegisterExternalEncoder(VideoEncoder* encoder,
7767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                  uint8_t pl_type,
7867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                  bool internal_source);
7967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t DeRegisterExternalEncoder(uint8_t pl_type);
8067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetEncoder(const VideoCodec& video_codec);
8167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetEncoder(VideoCodec* video_codec);
8267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org
8367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t GetCodecConfigParameters(
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned char config_parameters[kConfigParameterSize],
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned char& config_parameters_size);
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
875e87b5f032780f6941a27c2d5068ab1e89e659a6pwestin@webrtc.org  PacedSender* GetPacedSender();
885e87b5f032780f6941a27c2d5068ab1e89e659a6pwestin@webrtc.org
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Scale or crop/pad image.
9067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t ScaleInputImage(bool enable);
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // RTP settings.
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  RtpRtcp* SendRtpRtcpModule();
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implementing ViEFrameCallback.
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual void DeliverFrame(int id,
973bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                            I420VideoFrame* video_frame,
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            int num_csrcs = 0,
999cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org                            const uint32_t CSRC[kRtpCsrcSize] = NULL) OVERRIDE;
1009cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org  virtual void DelayChanged(int id, int frame_delay) OVERRIDE;
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int GetPreferedFrameSettings(int* width,
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                       int* height,
1039cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org                                       int* frame_rate) OVERRIDE;
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1059cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org  virtual void ProviderDestroyed(int id) OVERRIDE {
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return;
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
10967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SendKeyFrame();
11067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SendCodecStatistics(uint32_t* num_key_frames,
11167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                              uint32_t* num_delta_frames);
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11355a2a27d1a1aa9bf8401312a0b31250af4e3bd11jiayl@webrtc.org  int PacerQueuingDelayMs() const;
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int CodecTargetBitrate(uint32_t* bitrate) const;
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Loss protection.
1177fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org  int32_t UpdateProtectionMethod(bool enable_nack);
1187fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org  bool nack_enabled() const { return nack_enabled_; }
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1209d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org  // Buffering mode.
1219d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org  void SetSenderBufferingMode(int target_delay_ms);
1220c66de6e75821a8e86fcbd166d725a5a859cab79mikhal@webrtc.org
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements VCMPacketizationCallback.
12467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual int32_t SendData(
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    FrameType frame_type,
12667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org    uint8_t payload_type,
12767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org    uint32_t time_stamp,
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int64_t capture_time_ms,
12967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org    const uint8_t* payload_data,
13067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org    uint32_t payload_size,
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const RTPFragmentationHeader& fragmentation_header,
1329cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org    const RTPVideoHeader* rtp_video_hdr) OVERRIDE;
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements VideoProtectionCallback.
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int ProtectionRequest(
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const FecProtectionParams* delta_fec_params,
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const FecProtectionParams* key_fec_params,
13867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org      uint32_t* sent_video_rate_bps,
13967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org      uint32_t* sent_nack_rate_bps,
1409cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org      uint32_t* sent_fec_rate_bps) OVERRIDE;
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements VideoSendStatisticsCallback.
14367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual int32_t SendStatistics(const uint32_t bit_rate,
1449cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org                                 const uint32_t frame_rate) OVERRIDE;
1459cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org
14667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t RegisterCodecObserver(ViEEncoderObserver* observer);
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements RtcpIntraFrameObserver.
1499cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org  virtual void OnReceivedIntraFrameRequest(uint32_t ssrc) OVERRIDE;
1509cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org  virtual void OnReceivedSLI(uint32_t ssrc, uint8_t picture_id) OVERRIDE;
1519cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org  virtual void OnReceivedRPSI(uint32_t ssrc, uint64_t picture_id) OVERRIDE;
1529cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org  virtual void OnLocalSsrcChanged(uint32_t old_ssrc,
1539cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org                                  uint32_t new_ssrc) OVERRIDE;
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
155b6d9cfc6347e490751e142ba5fb89e4a975ed442mflodman@webrtc.org  // Sets SSRCs for all streams.
156b6d9cfc6347e490751e142ba5fb89e4a975ed442mflodman@webrtc.org  bool SetSsrcs(const std::list<unsigned int>& ssrcs);
157b6d9cfc6347e490751e142ba5fb89e4a975ed442mflodman@webrtc.org
1583f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  void SetMinTransmitBitrate(int min_transmit_bitrate_kbps);
1593f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Effect filter.
16167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t RegisterEffectFilter(ViEEffectFilter* effect_filter);
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Enables recording of debugging information.
1649cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org  int StartDebugRecording(const char* fileNameUTF8);
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Disables recording of debugging information.
1679cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org  int StopDebugRecording();
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1694590177aa3346a742e8f71c8bcc5b81618d21919henrik.lundin@webrtc.org  // Lets the sender suspend video when the rate drops below
17039079d1ee84faab899c8af92bce984c20e60fd29henrik.lundin@webrtc.org  // |threshold_bps|, and turns back on when the rate goes back up above
17139079d1ee84faab899c8af92bce984c20e60fd29henrik.lundin@webrtc.org  // |threshold_bps| + |window_bps|.
1729cd0bbc6e184925752a04ed33ccbdc6e125e318ahenrike@webrtc.org  void SuspendBelowMinBitrate();
17339079d1ee84faab899c8af92bce984c20e60fd29henrik.lundin@webrtc.org
1742e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.org  // New-style callbacks, used by VideoSendStream.
17563301bd03e009d309d1fdca1217f8708be610f32pbos@webrtc.org  void RegisterPreEncodeCallback(I420FrameCallback* pre_encode_callback);
17663301bd03e009d309d1fdca1217f8708be610f32pbos@webrtc.org  void DeRegisterPreEncodeCallback();
1772e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.org  void RegisterPostEncodeImageCallback(
1782e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.org        EncodedImageCallback* post_encode_callback);
1792e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.org  void DeRegisterPostEncodeImageCallback();
18063301bd03e009d309d1fdca1217f8708be610f32pbos@webrtc.org
181ff9854b939dd2dfb7321ca08be5cc33f78f3cbbbmflodman@webrtc.org  int channel_id() const { return channel_id_; }
1822e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.org
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected:
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Called by BitrateObserver.
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void OnNetworkChanged(const uint32_t bitrate_bps,
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        const uint8_t fraction_lost,
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        const uint32_t round_trip_time_ms);
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1895e87b5f032780f6941a27c2d5068ab1e89e659a6pwestin@webrtc.org  // Called by PacedSender.
1900f6f7cb4232fea07a4b2a5a53f8eec6933c08a23hclam@chromium.org  bool TimeToSendPacket(uint32_t ssrc, uint16_t sequence_number,
191b748c9d2022042b2cc04eaf89052945ba7149ba6stefan@webrtc.org                        int64_t capture_time_ms, bool retransmission);
19269f76054f5dc242b313e7e0642c8657a885682bastefan@webrtc.org  int TimeToSendPadding(int bytes);
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private:
194fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  bool EncoderPaused() const EXCLUSIVE_LOCKS_REQUIRED(data_cs_);
195dca71b270896a8501d9f12506e7da48cde9abb20stefan@webrtc.org
19667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t engine_id_;
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const int channel_id_;
19867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  const uint32_t number_of_cores_;
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VideoCodingModule& vcm_;
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VideoProcessingModule& vpm_;
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  scoped_ptr<RtpRtcp> default_rtp_rtcp_;
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  scoped_ptr<CriticalSectionWrapper> callback_cs_;
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  scoped_ptr<CriticalSectionWrapper> data_cs_;
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  scoped_ptr<BitrateObserver> bitrate_observer_;
2065e87b5f032780f6941a27c2d5068ab1e89e659a6pwestin@webrtc.org  scoped_ptr<PacedSender> paced_sender_;
2075e87b5f032780f6941a27c2d5068ab1e89e659a6pwestin@webrtc.org  scoped_ptr<ViEPacedSenderCallback> pacing_callback_;
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  BitrateController* bitrate_controller_;
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
211fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  int64_t time_of_last_incoming_frame_ms_ GUARDED_BY(data_cs_);
212fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  bool send_padding_ GUARDED_BY(data_cs_);
2133f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  int min_transmit_bitrate_kbps_ GUARDED_BY(data_cs_);
214fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  int target_delay_ms_ GUARDED_BY(data_cs_);
215fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  bool network_is_transmitting_ GUARDED_BY(data_cs_);
216fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  bool encoder_paused_ GUARDED_BY(data_cs_);
217fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  bool encoder_paused_and_dropped_frame_ GUARDED_BY(data_cs_);
218fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  std::map<unsigned int, int64_t> time_last_intra_request_ms_
219fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org      GUARDED_BY(data_cs_);
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool fec_enabled_;
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool nack_enabled_;
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2243f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  ViEEncoderObserver* codec_observer_ GUARDED_BY(callback_cs_);
225fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  ViEEffectFilter* effect_filter_ GUARDED_BY(callback_cs_);
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ProcessThread& module_process_thread_;
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
228fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  bool has_received_sli_ GUARDED_BY(data_cs_);
229fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  uint8_t picture_id_sli_ GUARDED_BY(data_cs_);
230fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  bool has_received_rpsi_ GUARDED_BY(data_cs_);
231fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  uint64_t picture_id_rpsi_ GUARDED_BY(data_cs_);
232fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  std::map<unsigned int, int> ssrc_streams_ GUARDED_BY(data_cs_);
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Quality modes callback
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  QMVideoSettingsCallback* qm_callback_;
236fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  bool video_suspended_ GUARDED_BY(data_cs_);
237fedbe8b196306135b3834b34b19fd455c037172astefan@webrtc.org  I420FrameCallback* pre_encode_callback_ GUARDED_BY(callback_cs_);
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // WEBRTC_VIDEO_ENGINE_VIE_ENCODER_H_
243