1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Use of this source code is governed by a BSD-style license 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * that can be found in the LICENSE file in the root of the source 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * tree. An additional intellectual property rights grant can be found 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * in the file PATENTS. All contributing project authors may 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * be found in the AUTHORS file in the root of the source tree. 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef WEBRTC_MODULES_INTERFACE_VIDEO_CODING_H_ 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define WEBRTC_MODULES_INTERFACE_VIDEO_CODING_H_ 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "webrtc/common_video/interface/i420_video_frame.h" 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "webrtc/modules/interface/module.h" 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "webrtc/modules/interface/module_common_types.h" 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h" 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "webrtc/system_wrappers/interface/event_wrapper.h" 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace webrtc 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Clock; 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass EncodedImageCallback; 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass VideoEncoder; 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass VideoDecoder; 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct CodecSpecificInfo; 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass EventFactory { 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov public: 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual ~EventFactory() {} 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual EventWrapper* CreateEvent() = 0; 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass EventFactoryImpl : public EventFactory { 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov public: 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual ~EventFactoryImpl() {} 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual EventWrapper* CreateEvent() { 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return EventWrapper::Create(); 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Used to indicate which decode with errors mode should be used. 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovenum VCMDecodeErrorMode { 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kNoErrors, // Never decode with errors. Video will freeze 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // if nack is disabled. 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kSelectiveErrors, // Frames that are determined decodable in 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // VCMSessionInfo may be decoded with missing 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // packets. As not all incomplete frames will be 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // decodable, video will freeze if nack is disabled. 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kWithErrors // Release frames as needed. Errors may be 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // introduced as some encoded frames may not be 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // complete. 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass VideoCodingModule : public Module 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov enum SenderNackMode { 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kNackNone, 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kNackAll, 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kNackSelective 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov enum ReceiverRobustness { 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kNone, 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kHardNack, 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kSoftNack, 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kDualDecoder, 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kReferenceSelection 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static VideoCodingModule* Create(); 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static VideoCodingModule* Create(Clock* clock, EventFactory* event_factory); 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static void Destroy(VideoCodingModule* module); 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Get number of supported codecs 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : Number of supported codecs 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static uint8_t NumberOfCodecs(); 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Get supported codec settings with using id 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - listId : Id or index of the codec to look up 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - codec : Memory where the codec settings will be stored 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // VCM_PARAMETER_ERROR if codec not supported or id too high 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static int32_t Codec(const uint8_t listId, VideoCodec* codec); 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Get supported codec settings using codec type 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - codecType : The codec type to get settings for 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - codec : Memory where the codec settings will be stored 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // VCM_PARAMETER_ERROR if codec not supported 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static int32_t Codec(VideoCodecType codecType, VideoCodec* codec); 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Sender 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Any encoder-related state of VCM will be initialized to the 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // same state as when the VCM was created. This will not interrupt 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // or effect decoding functionality of VCM. VCM will lose all the 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // encoding-related settings by calling this function. 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // For instance, a send codec has to be registered again. 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t InitializeSender() = 0; 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Registers a codec to be used for encoding. Calling this 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // API multiple times overwrites any previously registered codecs. 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - sendCodec : Settings for the codec to be registered. 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - numberOfCores : The number of cores the codec is allowed 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // to use. 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - maxPayloadSize : The maximum size each payload is allowed 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // to have. Usually MTU - overhead. 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t RegisterSendCodec(const VideoCodec* sendCodec, 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov uint32_t numberOfCores, 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov uint32_t maxPayloadSize) = 0; 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // API to get the current send codec in use. 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - currentSendCodec : Address where the sendCodec will be written. 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t SendCodec(VideoCodec* currentSendCodec) const = 0; 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // API to get the current send codec type 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : Codec type, on success. 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // kVideoCodecUnknown, on error or if no send codec is set 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual VideoCodecType SendCodec() const = 0; 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Register an external encoder object. This can not be used together with 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // external decoder callbacks. 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - externalEncoder : Encoder object to be used for encoding frames inserted 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // with the AddVideoFrame API. 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - payloadType : The payload type bound which this encoder is bound to. 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t RegisterExternalEncoder(VideoEncoder* externalEncoder, 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov uint8_t payloadType, 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bool internalSource = false) = 0; 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // API to get codec config parameters to be sent out-of-band to a receiver. 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - buffer : Memory where the codec config parameters should be written. 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - size : Size of the memory available. 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : Number of bytes written, on success. 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t CodecConfigParameters(uint8_t* buffer, int32_t size) = 0; 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // API to get currently configured encoder target bitrate in bits/s. 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : 0, on success. 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int Bitrate(unsigned int* bitrate) const = 0; 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // API to get currently configured encoder target frame rate. 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : 0, on success. 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int FrameRate(unsigned int* framerate) const = 0; 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Sets the parameters describing the send channel. These parameters are inputs to the 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Media Optimization inside the VCM and also specifies the target bit rate for the 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // encoder. Bit rate used by NACK should already be compensated for by the user. 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - target_bitrate : The target bitrate for VCM in bits/s. 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - lossRate : Fractions of lost packets the past second. 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // (loss rate in percent = 100 * packetLoss / 255) 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - rtt : Current round-trip time in ms. 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t SetChannelParameters(uint32_t target_bitrate, 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov uint8_t lossRate, 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov uint32_t rtt) = 0; 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Sets the parameters describing the receive channel. These parameters are inputs to the 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Media Optimization inside the VCM. 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - rtt : Current round-trip time in ms. 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // with the most amount available bandwidth in a conference 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // scenario 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t SetReceiveChannelParameters(uint32_t rtt) = 0; 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Register a transport callback which will be called to deliver the encoded data and 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // side information. 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - transport : The callback object to register. 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t RegisterTransportCallback(VCMPacketizationCallback* transport) = 0; 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Register video output information callback which will be called to deliver information 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // about the video stream produced by the encoder, for instance the average frame rate and 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // bit rate. 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - outputInformation : The callback object to register. 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t RegisterSendStatisticsCallback( 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov VCMSendStatisticsCallback* sendStats) = 0; 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Register a video quality settings callback which will be called when 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // frame rate/dimensions need to be updated for video quality optimization 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - videoQMSettings : The callback object to register. 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t RegisterVideoQMCallback(VCMQMSettingsCallback* videoQMSettings) = 0; 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Register a video protection callback which will be called to deliver 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // the requested FEC rate and NACK status (on/off). 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - protection : The callback object to register. 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t RegisterProtectionCallback(VCMProtectionCallback* protection) = 0; 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Enable or disable a video protection method. 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - videoProtection : The method to enable or disable. 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - enable : True if the method should be enabled, false if 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // it should be disabled. 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t SetVideoProtection(VCMVideoProtection videoProtection, 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bool enable) = 0; 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Add one raw video frame to the encoder. This function does all the necessary 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // processing, then decides what frame type to encode, or if the frame should be 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // dropped. If the frame should be encoded it passes the frame to the encoder 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // before it returns. 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - videoFrame : Video frame to encode. 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - codecSpecificInfo : Extra codec information, e.g., pre-parsed in-band signaling. 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t AddVideoFrame( 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const I420VideoFrame& videoFrame, 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const VideoContentMetrics* contentMetrics = NULL, 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CodecSpecificInfo* codecSpecificInfo = NULL) = 0; 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Next frame encoded should be an intra frame (keyframe). 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t IntraFrameRequest(int stream_index) = 0; 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Frame Dropper enable. Can be used to disable the frame dropping when the encoder 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // over-uses its bit rate. This API is designed to be used when the encoded frames 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // are supposed to be stored to an AVI file, or when the I420 codec is used and the 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // target bit rate shouldn't affect the frame rate. 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - enable : True to enable the setting, false to disable it. 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t EnableFrameDropper(bool enable) = 0; 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Sent frame counters 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t SentFrameCount(VCMFrameCount& frameCount) const = 0; 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Receiver 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // The receiver state of the VCM will be initialized to the 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // same state as when the VCM was created. This will not interrupt 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // or effect the send side functionality of VCM. VCM will lose all the 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // decoding-related settings by calling this function. All frames 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // inside the jitter buffer are flushed and the delay is reset. 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // For instance, a receive codec has to be registered again. 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t InitializeReceiver() = 0; 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Register possible receive codecs, can be called multiple times for different codecs. 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // The module will automatically switch between registered codecs depending on the 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // payload type of incoming frames. The actual decoder will be created when needed. 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - receiveCodec : Settings for the codec to be registered. 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - numberOfCores : Number of CPU cores that the decoder is allowed to use. 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - requireKeyFrame : Set this to true if you don't want any delta frames 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // to be decoded until the first key frame has been decoded. 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t RegisterReceiveCodec(const VideoCodec* receiveCodec, 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int32_t numberOfCores, 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bool requireKeyFrame = false) = 0; 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Register an externally defined decoder/renderer object. Can be a decoder only or a 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // decoder coupled with a renderer. Note that RegisterReceiveCodec must be called to 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // be used for decoding incoming streams. 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - externalDecoder : The external decoder/renderer object. 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - payloadType : The payload type which this decoder should be 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // registered to. 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - internalRenderTiming : True if the internal renderer (if any) of the decoder 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // object can make sure to render at a given time in ms. 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t RegisterExternalDecoder(VideoDecoder* externalDecoder, 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov uint8_t payloadType, 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bool internalRenderTiming) = 0; 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Register a receive callback. Will be called whenever there is a new frame ready 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // for rendering. 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - receiveCallback : The callback object to be used by the module when a 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // frame is ready for rendering. 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // De-register with a NULL pointer. 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t RegisterReceiveCallback(VCMReceiveCallback* receiveCallback) = 0; 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Register a receive statistics callback which will be called to deliver information 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // about the video stream received by the receiving side of the VCM, for instance the 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // average frame rate and bit rate. 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - receiveStats : The callback object to register. 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t RegisterReceiveStatisticsCallback( 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov VCMReceiveStatisticsCallback* receiveStats) = 0; 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Register a decoder timing callback which will be called to deliver 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // information about the timing of the decoder in the receiving side of the 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // VCM, for instance the current and maximum frame decode latency. 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - decoderTiming : The callback object to register. 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t RegisterDecoderTimingCallback( 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov VCMDecoderTimingCallback* decoderTiming) = 0; 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Register a frame type request callback. This callback will be called when the 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // module needs to request specific frame types from the send side. 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - frameTypeCallback : The callback object to be used by the module when 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // requesting a specific type of frame from the send side. 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // De-register with a NULL pointer. 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t RegisterFrameTypeCallback( 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov VCMFrameTypeCallback* frameTypeCallback) = 0; 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Registers a callback which is called whenever the receive side of the VCM 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // encounters holes in the packet sequence and needs packets to be retransmitted. 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - callback : The callback to be registered in the VCM. 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // <0, on error. 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t RegisterPacketRequestCallback( 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov VCMPacketRequestCallback* callback) = 0; 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Waits for the next frame in the jitter buffer to become complete 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // (waits no longer than maxWaitTimeMs), then passes it to the decoder for decoding. 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Should be called as often as possible to get the most out of the decoder. 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t Decode(uint16_t maxWaitTimeMs = 200) = 0; 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Registers a callback which conveys the size of the render buffer. 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int RegisterRenderBufferSizeCallback( 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov VCMRenderBufferSizeCallback* callback) = 0; 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Waits for the next frame in the dual jitter buffer to become complete 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // (waits no longer than maxWaitTimeMs), then passes it to the dual decoder 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // for decoding. This will never trigger a render callback. Should be 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // called frequently, and as long as it returns 1 it should be called again 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // as soon as possible. 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : 1, if a frame was decoded 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 0, if no frame was decoded 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t DecodeDualFrame(uint16_t maxWaitTimeMs = 200) = 0; 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Reset the decoder state to the initial state. 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t ResetDecoder() = 0; 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // API to get the codec which is currently used for decoding by the module. 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - currentReceiveCodec : Settings for the codec to be registered. 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t ReceiveCodec(VideoCodec* currentReceiveCodec) const = 0; 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // API to get the codec type currently used for decoding by the module. 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : codecy type, on success. 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // kVideoCodecUnknown, on error or if no receive codec is registered 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual VideoCodecType ReceiveCodec() const = 0; 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Insert a parsed packet into the receiver side of the module. Will be placed in the 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // jitter buffer waiting for the frame to become complete. Returns as soon as the packet 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // has been placed in the jitter buffer. 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - incomingPayload : Payload of the packet. 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - payloadLength : Length of the payload. 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - rtpInfo : The parsed header. 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t IncomingPacket(const uint8_t* incomingPayload, 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov uint32_t payloadLength, 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const WebRtcRTPHeader& rtpInfo) = 0; 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Minimum playout delay (Used for lip-sync). This is the minimum delay required 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // to sync with audio. Not included in VideoCodingModule::Delay() 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Defaults to 0 ms. 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - minPlayoutDelayMs : Additional delay in ms. 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t SetMinimumPlayoutDelay(uint32_t minPlayoutDelayMs) = 0; 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Set the time required by the renderer to render a frame. 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - timeMS : The time in ms required by the renderer to render a frame. 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t SetRenderDelay(uint32_t timeMS) = 0; 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // The total delay desired by the VCM. Can be less than the minimum 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // delay set with SetMinimumPlayoutDelay. 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : Total delay in ms, on success. 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t Delay() const = 0; 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Get the received frame counters. Keeps track of the number of each frame type 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // received since the start of the call. 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Output: 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - frameCount : Struct to be filled with the number of frames received. 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success. 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // <0, on error. 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int32_t ReceivedFrameCount(VCMFrameCount& frameCount) const = 0; 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Returns the number of packets discarded by the jitter buffer due to being 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // too late. This can include duplicated packets which arrived after the 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // frame was sent to the decoder. Therefore packets which were prematurely 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // NACKed will be counted. 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual uint32_t DiscardedPackets() const = 0; 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Robustness APIs 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Set the sender RTX/NACK mode. 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - mode : the selected NACK mode. 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success; 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int SetSenderNackMode(SenderNackMode mode) = 0; 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Set the sender reference picture selection (RPS) mode. 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - enable : true or false, for enable and disable, respectively. 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success; 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int SetSenderReferenceSelection(bool enable) = 0; 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Set the sender forward error correction (FEC) mode. 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - enable : true or false, for enable and disable, respectively. 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success; 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int SetSenderFEC(bool enable) = 0; 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Set the key frame period, or disable periodic key frames (I-frames). 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - periodMs : period in ms; <= 0 to disable periodic key frames. 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success; 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int SetSenderKeyFramePeriod(int periodMs) = 0; 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Set the receiver robustness mode. The mode decides how the receiver 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // responds to losses in the stream. The type of counter-measure (soft or 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // hard NACK, dual decoder, RPS, etc.) is selected through the 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // robustnessMode parameter. The errorMode parameter decides if it is 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // allowed to display frames corrupted by losses. Note that not all 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // combinations of the two parameters are feasible. An error will be 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // returned for invalid combinations. 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Input: 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - robustnessMode : selected robustness mode. 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // - errorMode : selected error mode. 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Return value : VCM_OK, on success; 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // < 0, on error. 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int SetReceiverRobustnessMode(ReceiverRobustness robustnessMode, 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov VCMDecodeErrorMode errorMode) = 0; 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Set the decode error mode. The mode decides which errors (if any) are 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // allowed in decodable frames. Note that setting decode_error_mode to 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // anything other than kWithErrors without enabling nack will cause 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // long-term freezes (resulting from frequent key frame requests) if 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // packet loss occurs. 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode) = 0; 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Sets the maximum number of sequence numbers that we are allowed to NACK 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // and the oldest sequence number that we will consider to NACK. If a 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // sequence number older than |max_packet_age_to_nack| is missing 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // a key frame will be requested. A key frame will also be requested if the 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // time of incomplete or non-continuous frames in the jitter buffer is above 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // |max_incomplete_time_ms|. 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual void SetNackSettings(size_t max_nack_list_size, 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int max_packet_age_to_nack, 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int max_incomplete_time_ms) = 0; 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Setting a desired delay to the VCM receiver. Video rendering will be 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // delayed by at least desired_delay_ms. 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int SetMinReceiverDelay(int desired_delay_ms) = 0; 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Enables recording of debugging information. 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int StartDebugRecording(const char* file_name_utf8) = 0; 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Disables recording of debugging information. 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual int StopDebugRecording() = 0; 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Lets the sender suspend video when the rate drops below 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // |threshold_bps|, and turns back on when the rate goes back up above 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // |threshold_bps| + |window_bps|. 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual void SuspendBelowMinBitrate() = 0; 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Returns true if SuspendBelowMinBitrate is engaged and the video has been 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // suspended due to bandwidth limitations; otherwise false. 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual bool VideoSuspended() const = 0; 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual void RegisterPreDecodeImageCallback( 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov EncodedImageCallback* observer) = 0; 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual void RegisterPostEncodeImageCallback( 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov EncodedImageCallback* post_encode_callback) = 0; 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} // namespace webrtc 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif // WEBRTC_MODULES_INTERFACE_VIDEO_CODING_H_ 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov