1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 // This sub-API supports the following functionalities: 12 // - Setting send and receive codecs. 13 // - Codec specific settings. 14 // - Key frame signaling. 15 // - Stream management settings. 16 17 #ifndef WEBRTC_VIDEO_ENGINE_INCLUDE_VIE_CODEC_H_ 18 #define WEBRTC_VIDEO_ENGINE_INCLUDE_VIE_CODEC_H_ 19 20 #include "webrtc/common_types.h" 21 22 namespace webrtc { 23 24 class VideoEngine; 25 struct VideoCodec; 26 27 // This class declares an abstract interface for a user defined observer. It is 28 // up to the VideoEngine user to implement a derived class which implements the 29 // observer class. The observer is registered using RegisterEncoderObserver() 30 // and deregistered using DeregisterEncoderObserver(). 31 class WEBRTC_DLLEXPORT ViEEncoderObserver { 32 public: 33 // This method is called once per second with the current encoded frame rate 34 // and bit rate. 35 virtual void OutgoingRate(const int video_channel, 36 const unsigned int framerate, 37 const unsigned int bitrate) = 0; 38 39 // This method is called whenever the state of the SuspendBelowMinBitrate 40 // changes, i.e., when |is_suspended| toggles. 41 virtual void SuspendChange(int video_channel, bool is_suspended) = 0; 42 43 protected: ~ViEEncoderObserver()44 virtual ~ViEEncoderObserver() {} 45 }; 46 47 // This class declares an abstract interface for a user defined observer. It is 48 // up to the VideoEngine user to implement a derived class which implements the 49 // observer class. The observer is registered using RegisterDecoderObserver() 50 // and deregistered using DeregisterDecoderObserver(). 51 class WEBRTC_DLLEXPORT ViEDecoderObserver { 52 public: 53 // This method is called when a new incoming stream is detected, normally 54 // triggered by a new incoming SSRC or payload type. 55 virtual void IncomingCodecChanged(const int video_channel, 56 const VideoCodec& video_codec) = 0; 57 58 // This method is called once per second containing the frame rate and bit 59 // rate for the incoming stream 60 virtual void IncomingRate(const int video_channel, 61 const unsigned int framerate, 62 const unsigned int bitrate) = 0; 63 64 // Called periodically with decoder timing information. All values are 65 // "current" snapshots unless decorated with a min_/max_ prefix. 66 virtual void DecoderTiming(int decode_ms, 67 int max_decode_ms, 68 int current_delay_ms, 69 int target_delay_ms, 70 int jitter_buffer_ms, 71 int min_playout_delay_ms, 72 int render_delay_ms) = 0; 73 74 // This method is called when the decoder needs a new key frame from encoder 75 // on the sender. 76 virtual void RequestNewKeyFrame(const int video_channel) = 0; 77 78 protected: ~ViEDecoderObserver()79 virtual ~ViEDecoderObserver() {} 80 }; 81 82 class WEBRTC_DLLEXPORT ViECodec { 83 public: 84 // Factory for the ViECodec sub‐API and increases an internal reference 85 // counter if successful. Returns NULL if the API is not supported or if 86 // construction fails. 87 static ViECodec* GetInterface(VideoEngine* video_engine); 88 89 // Releases the ViECodec sub-API and decreases an internal reference 90 // counter. 91 // Returns the new reference count. This value should be zero 92 // for all sub-API:s before the VideoEngine object can be safely deleted. 93 virtual int Release() = 0; 94 95 // Gets the number of available codecs for the VideoEngine build. 96 virtual int NumberOfCodecs() const = 0; 97 98 // Gets a VideoCodec struct for a codec containing the default configuration 99 // for that codec type. 100 virtual int GetCodec(const unsigned char list_number, 101 VideoCodec& video_codec) const = 0; 102 103 // Sets the send codec to use for a specified channel. 104 virtual int SetSendCodec(const int video_channel, 105 const VideoCodec& video_codec) = 0; 106 107 // Gets the current send codec settings. 108 virtual int GetSendCodec(const int video_channel, 109 VideoCodec& video_codec) const = 0; 110 111 // Prepares VideoEngine to receive a certain codec type and setting for a 112 // specified payload type. 113 virtual int SetReceiveCodec(const int video_channel, 114 const VideoCodec& video_codec) = 0; 115 116 // Gets the current receive codec. 117 virtual int GetReceiveCodec(const int video_channel, 118 VideoCodec& video_codec) const = 0; 119 120 // This function is used to get codec configuration parameters to be 121 // signaled from the encoder to the decoder in the call setup. 122 virtual int GetCodecConfigParameters( 123 const int video_channel, 124 unsigned char config_parameters[kConfigParameterSize], 125 unsigned char& config_parameters_size) const = 0; 126 127 // Enables advanced scaling of the captured video stream if the stream 128 // differs from the send codec settings. 129 virtual int SetImageScaleStatus(const int video_channel, 130 const bool enable) = 0; 131 132 // Gets the number of sent key frames and number of sent delta frames. 133 virtual int GetSendCodecStastistics(const int video_channel, 134 unsigned int& key_frames, 135 unsigned int& delta_frames) const = 0; 136 137 // Gets the number of decoded key frames and number of decoded delta frames. 138 virtual int GetReceiveCodecStastistics(const int video_channel, 139 unsigned int& key_frames, 140 unsigned int& delta_frames) const = 0; 141 142 // Estimate of the min required buffer time from the expected arrival time 143 // until rendering to get smooth playback. 144 virtual int GetReceiveSideDelay(const int video_channel, 145 int* delay_ms) const = 0; 146 147 // Gets the bitrate targeted by the video codec rate control in kbit/s. 148 virtual int GetCodecTargetBitrate(const int video_channel, 149 unsigned int* bitrate) const = 0; 150 151 // Gets the number of packets discarded by the jitter buffer because they 152 // arrived too late. 153 // TODO(asapersson): Remove default implementation. GetNumDiscardedPackets(int video_channel)154 virtual int GetNumDiscardedPackets(int video_channel) const { return -1; } 155 156 // TODO(asapersson): Remove once the api has been removed from 157 // fakewebrtcvideoengine.h. GetDiscardedPackets(const int video_channel)158 virtual unsigned int GetDiscardedPackets( 159 const int video_channel) const { return 0; } 160 161 // Enables key frame request callback in ViEDecoderObserver. 162 virtual int SetKeyFrameRequestCallbackStatus(const int video_channel, 163 const bool enable) = 0; 164 165 // Enables key frame requests for detected lost packets. 166 virtual int SetSignalKeyPacketLossStatus( 167 const int video_channel, 168 const bool enable, 169 const bool only_key_frames = false) = 0; 170 171 // Registers an instance of a user implementation of the ViEEncoderObserver. 172 virtual int RegisterEncoderObserver(const int video_channel, 173 ViEEncoderObserver& observer) = 0; 174 175 // Removes an already registered instance of ViEEncoderObserver. 176 virtual int DeregisterEncoderObserver(const int video_channel) = 0; 177 178 // Registers an instance of a user implementation of the ViEDecoderObserver. 179 virtual int RegisterDecoderObserver(const int video_channel, 180 ViEDecoderObserver& observer) = 0; 181 182 // Removes an already registered instance of ViEDecoderObserver. 183 virtual int DeregisterDecoderObserver(const int video_channel) = 0; 184 185 // This function forces the next encoded frame to be a key frame. This is 186 // normally used when the remote endpoint only supports out‐band key frame 187 // request. 188 virtual int SendKeyFrame(const int video_channel) = 0; 189 190 // This function makes the decoder wait for a key frame before starting to 191 // decode the incoming video stream. 192 virtual int WaitForFirstKeyFrame(const int video_channel, 193 const bool wait) = 0; 194 195 // Enables recording of debugging information. 196 virtual int StartDebugRecording(int video_channel, 197 const char* file_name_utf8) = 0; 198 // Disables recording of debugging information. 199 virtual int StopDebugRecording(int video_channel) = 0; 200 201 // Lets the sender suspend video when the rate drops below 202 // |threshold_bps|, and turns back on when the rate goes back up above 203 // |threshold_bps| + |window_bps|. 204 // This is under development; not tested. 205 virtual void SuspendBelowMinBitrate(int video_channel) = 0; 206 207 // TODO(holmer): Remove this default implementation when possible. GetSendSideDelay(int video_channel,int * avg_delay_ms,int * max_delay_ms)208 virtual bool GetSendSideDelay(int video_channel, int* avg_delay_ms, 209 int* max_delay_ms) const { return false; } 210 211 protected: ViECodec()212 ViECodec() {} ~ViECodec()213 virtual ~ViECodec() {} 214 }; 215 216 } // namespace webrtc 217 218 #endif // WEBRTC_VIDEO_ENGINE_INCLUDE_VIE_CODEC_H_ 219