12557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander/* 22557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 32557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander * 42557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander * Use of this source code is governed by a BSD-style license 52557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander * that can be found in the LICENSE file in the root of the source 62557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander * tree. An additional intellectual property rights grant can be found 72557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander * in the file PATENTS. All contributing project authors may 82557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander * be found in the AUTHORS file in the root of the source tree. 92557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander */ 102557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander 112557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#ifndef WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_H_ 122557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#define WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_H_ 132557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander 142557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#if defined(WEBRTC_WIN) 152557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander// This is a workaround on Windows due to the fact that some Windows 162557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander// headers define CreateEvent as a macro to either CreateEventW or CreateEventA. 172557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander// This can cause problems since we use that name as well and could 182557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander// declare them as one thing here whereas in another place a windows header 192557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander// may have been included and then implementing CreateEvent() causes compilation 202557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander// errors. So for consistency, we include the main windows header here. 212557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#include <windows.h> 222557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#endif 232557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander 242557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#include "webrtc/modules/include/module.h" 252557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#include "webrtc/modules/include/module_common_types.h" 262557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#include "webrtc/modules/video_coding/include/video_coding_defines.h" 272557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#include "webrtc/system_wrappers/include/event_wrapper.h" 282557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#include "webrtc/video_frame.h" 292557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander 309d3ab61325c5ed216ea52bc829f1d8c81347459bphilipelnamespace webrtc { 312557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander 322557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellanderclass Clock; 332557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellanderclass EncodedImageCallback; 342557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellanderclass VideoEncoder; 352557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellanderclass VideoDecoder; 362557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellanderstruct CodecSpecificInfo; 372557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander 382557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellanderclass EventFactory { 392557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander public: 402557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander virtual ~EventFactory() {} 412557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander 422557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander virtual EventWrapper* CreateEvent() = 0; 432557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander}; 442557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander 452557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellanderclass EventFactoryImpl : public EventFactory { 462557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander public: 472557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander virtual ~EventFactoryImpl() {} 482557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander 499d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual EventWrapper* CreateEvent() { return EventWrapper::Create(); } 502557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander}; 512557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander 522557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander// Used to indicate which decode with errors mode should be used. 532557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellanderenum VCMDecodeErrorMode { 549d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel kNoErrors, // Never decode with errors. Video will freeze 559d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // if nack is disabled. 569d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel kSelectiveErrors, // Frames that are determined decodable in 579d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // VCMSessionInfo may be decoded with missing 589d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // packets. As not all incomplete frames will be 599d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // decodable, video will freeze if nack is disabled. 609d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel kWithErrors // Release frames as needed. Errors may be 619d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // introduced as some encoded frames may not be 629d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // complete. 632557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander}; 642557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander 659d3ab61325c5ed216ea52bc829f1d8c81347459bphilipelclass VideoCodingModule : public Module { 669d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel public: 679d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel enum SenderNackMode { kNackNone, kNackAll, kNackSelective }; 689d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 699d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel enum ReceiverRobustness { kNone, kHardNack, kSoftNack, kReferenceSelection }; 709d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 719d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel static VideoCodingModule* Create( 729d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel Clock* clock, 739d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel VideoEncoderRateObserver* encoder_rate_observer, 749d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel VCMQMSettingsCallback* qm_settings_callback); 759d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 769d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel static VideoCodingModule* Create(Clock* clock, EventFactory* event_factory); 779d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 789d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel static void Destroy(VideoCodingModule* module); 799d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 809d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Get supported codec settings using codec type 819d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 829d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 839d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - codecType : The codec type to get settings for 849d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - codec : Memory where the codec settings will be stored 859d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 869d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success 879d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // VCM_PARAMETER_ERROR if codec not supported 887776e782d6073b44f90a61da6a49d4b27ef7284aPeter Boström static void Codec(VideoCodecType codecType, VideoCodec* codec); 899d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 909d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel /* 919d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel * Sender 929d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel */ 939d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 949d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Registers a codec to be used for encoding. Calling this 959d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // API multiple times overwrites any previously registered codecs. 969d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 979d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // NOTE: Must be called on the thread that constructed the VCM instance. 989d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 999d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 1009d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - sendCodec : Settings for the codec to be registered. 1019d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - numberOfCores : The number of cores the codec is allowed 1029d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // to use. 1039d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - maxPayloadSize : The maximum size each payload is allowed 1049d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // to have. Usually MTU - overhead. 1059d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 1069d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 1079d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 1089d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t RegisterSendCodec(const VideoCodec* sendCodec, 1099d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel uint32_t numberOfCores, 1109d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel uint32_t maxPayloadSize) = 0; 1119d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 1129d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Register an external encoder object. This can not be used together with 1139d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // external decoder callbacks. 1149d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 1159d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 1169d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - externalEncoder : Encoder object to be used for encoding frames 1179d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // inserted 1189d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // with the AddVideoFrame API. 1199d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - payloadType : The payload type bound which this encoder is bound 1209d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // to. 1219d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 1229d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 1239d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 1249d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // TODO(pbos): Remove return type when unused elsewhere. 1259d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t RegisterExternalEncoder(VideoEncoder* externalEncoder, 1269d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel uint8_t payloadType, 1279d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel bool internalSource = false) = 0; 1289d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 1299d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // API to get currently configured encoder target bitrate in bits/s. 1309d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 1319d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : 0, on success. 1329d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 1339d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int Bitrate(unsigned int* bitrate) const = 0; 1349d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 1359d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // API to get currently configured encoder target frame rate. 1369d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 1379d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : 0, on success. 1389d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 1399d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int FrameRate(unsigned int* framerate) const = 0; 1409d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 1419d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Sets the parameters describing the send channel. These parameters are 1429d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // inputs to the 1439d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Media Optimization inside the VCM and also specifies the target bit rate 1449d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // for the 1459d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // encoder. Bit rate used by NACK should already be compensated for by the 1469d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // user. 1479d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 1489d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 1499d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - target_bitrate : The target bitrate for VCM in bits/s. 1509d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - lossRate : Fractions of lost packets the past second. 1519d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // (loss rate in percent = 100 * packetLoss / 1529d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 255) 1539d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - rtt : Current round-trip time in ms. 1549d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 1559d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 1569d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 1579d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t SetChannelParameters(uint32_t target_bitrate, 1589d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel uint8_t lossRate, 1599d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel int64_t rtt) = 0; 1609d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 1619d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Sets the parameters describing the receive channel. These parameters are 1629d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // inputs to the 1639d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Media Optimization inside the VCM. 1649d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 1659d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 1669d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - rtt : Current round-trip time in ms. 1679d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // with the most amount available bandwidth in 1689d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // a conference 1699d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // scenario 1709d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 1719d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 1729d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 1739d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t SetReceiveChannelParameters(int64_t rtt) = 0; 1749d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 1759d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Register a transport callback which will be called to deliver the encoded 1769d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // data and 1779d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // side information. 1789d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 1799d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 1809d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - transport : The callback object to register. 1819d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 1829d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 1839d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 1849d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t RegisterTransportCallback( 1859d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel VCMPacketizationCallback* transport) = 0; 1869d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 1879d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Register video output information callback which will be called to deliver 1889d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // information 1899d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // about the video stream produced by the encoder, for instance the average 1909d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // frame rate and 1919d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // bit rate. 1929d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 1939d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 1949d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - outputInformation : The callback object to register. 1959d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 1969d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 1979d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 1989d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t RegisterSendStatisticsCallback( 1999d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel VCMSendStatisticsCallback* sendStats) = 0; 2009d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 2019d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Register a video protection callback which will be called to deliver 2029d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // the requested FEC rate and NACK status (on/off). 2039d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 2049d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 2059d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - protection : The callback object to register. 2069d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 2079d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 2089d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 2099d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t RegisterProtectionCallback( 2109d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel VCMProtectionCallback* protection) = 0; 2119d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 2129d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Enable or disable a video protection method. 2139d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 2149d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 2159d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - videoProtection : The method to enable or disable. 2169d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - enable : True if the method should be enabled, false if 2179d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // it should be disabled. 2189d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 2199d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 2209d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 2219d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t SetVideoProtection(VCMVideoProtection videoProtection, 2229d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel bool enable) = 0; 2239d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 2249d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Add one raw video frame to the encoder. This function does all the 2259d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // necessary 2269d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // processing, then decides what frame type to encode, or if the frame should 2279d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // be 2289d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // dropped. If the frame should be encoded it passes the frame to the encoder 2299d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // before it returns. 2309d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 2319d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 2329d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - videoFrame : Video frame to encode. 2339d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - codecSpecificInfo : Extra codec information, e.g., pre-parsed 2349d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // in-band signaling. 2359d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 2369d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 2379d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 2389d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t AddVideoFrame( 2399d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel const VideoFrame& videoFrame, 2409d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel const VideoContentMetrics* contentMetrics = NULL, 2419d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel const CodecSpecificInfo* codecSpecificInfo = NULL) = 0; 2429d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 2439d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Next frame encoded should be an intra frame (keyframe). 2449d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 2459d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 2469d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 2479d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t IntraFrameRequest(int stream_index) = 0; 2489d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 2499d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Frame Dropper enable. Can be used to disable the frame dropping when the 2509d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // encoder 2519d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // over-uses its bit rate. This API is designed to be used when the encoded 2529d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // frames 2539d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // are supposed to be stored to an AVI file, or when the I420 codec is used 2549d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // and the 2559d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // target bit rate shouldn't affect the frame rate. 2569d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 2579d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 2589d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - enable : True to enable the setting, false to disable it. 2599d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 2609d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 2619d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 2629d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t EnableFrameDropper(bool enable) = 0; 2639d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 2649d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel /* 2659d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel * Receiver 2669d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel */ 2679d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 2689d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Register possible receive codecs, can be called multiple times for 2699d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // different codecs. 2709d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // The module will automatically switch between registered codecs depending on 2719d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // the 2729d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // payload type of incoming frames. The actual decoder will be created when 2739d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // needed. 2749d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 2759d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 2769d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - receiveCodec : Settings for the codec to be registered. 2779d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - numberOfCores : Number of CPU cores that the decoder is allowed 2789d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // to use. 2799d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - requireKeyFrame : Set this to true if you don't want any delta 2809d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // frames 2819d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // to be decoded until the first key frame has been 2829d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // decoded. 2839d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 2849d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 2859d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 2869d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t RegisterReceiveCodec(const VideoCodec* receiveCodec, 2879d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel int32_t numberOfCores, 2889d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel bool requireKeyFrame = false) = 0; 2899d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 2909d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Register an externally defined decoder/renderer object. Can be a decoder 2919d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // only or a 2929d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // decoder coupled with a renderer. Note that RegisterReceiveCodec must be 2939d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // called to 2949d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // be used for decoding incoming streams. 2959d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 2969d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 2979d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - externalDecoder : The external decoder/renderer object. 2989d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - payloadType : The payload type which this decoder should 2999d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // be 3009d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // registered to. 3019d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3029d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual void RegisterExternalDecoder(VideoDecoder* externalDecoder, 3039d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel uint8_t payloadType) = 0; 3049d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 3059d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Register a receive callback. Will be called whenever there is a new frame 3069d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // ready 3079d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // for rendering. 3089d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3099d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 3109d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - receiveCallback : The callback object to be used by the 3119d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // module when a 3129d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // frame is ready for rendering. 3139d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // De-register with a NULL pointer. 3149d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3159d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 3169d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 3179d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t RegisterReceiveCallback( 3189d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel VCMReceiveCallback* receiveCallback) = 0; 3199d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 3209d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Register a receive statistics callback which will be called to deliver 3219d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // information 3229d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // about the video stream received by the receiving side of the VCM, for 3239d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // instance the 3249d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // average frame rate and bit rate. 3259d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3269d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 3279d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - receiveStats : The callback object to register. 3289d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3299d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 3309d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 3319d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t RegisterReceiveStatisticsCallback( 3329d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel VCMReceiveStatisticsCallback* receiveStats) = 0; 3339d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 3349d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Register a decoder timing callback which will be called to deliver 3359d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // information about the timing of the decoder in the receiving side of the 3369d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // VCM, for instance the current and maximum frame decode latency. 3379d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3389d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 3399d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - decoderTiming : The callback object to register. 3409d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3419d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 3429d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 3439d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t RegisterDecoderTimingCallback( 3449d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel VCMDecoderTimingCallback* decoderTiming) = 0; 3459d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 3469d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Register a frame type request callback. This callback will be called when 3479d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // the 3489d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // module needs to request specific frame types from the send side. 3499d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3509d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 3519d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - frameTypeCallback : The callback object to be used by the 3529d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // module when 3539d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // requesting a specific type of frame from 3549d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // the send side. 3559d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // De-register with a NULL pointer. 3569d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3579d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 3589d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 3599d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t RegisterFrameTypeCallback( 3609d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel VCMFrameTypeCallback* frameTypeCallback) = 0; 3619d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 3629d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Registers a callback which is called whenever the receive side of the VCM 3639d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // encounters holes in the packet sequence and needs packets to be 3649d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // retransmitted. 3659d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3669d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 3679d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - callback : The callback to be registered in the VCM. 3689d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3699d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 3709d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // <0, on error. 3719d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t RegisterPacketRequestCallback( 3729d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel VCMPacketRequestCallback* callback) = 0; 3739d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 3749d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Waits for the next frame in the jitter buffer to become complete 3759d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // (waits no longer than maxWaitTimeMs), then passes it to the decoder for 3769d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // decoding. 3779d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Should be called as often as possible to get the most out of the decoder. 3789d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3799d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 3809d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 3819d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t Decode(uint16_t maxWaitTimeMs = 200) = 0; 3829d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 3839d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Registers a callback which conveys the size of the render buffer. 3849d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int RegisterRenderBufferSizeCallback( 3859d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel VCMRenderBufferSizeCallback* callback) = 0; 3869d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 3879d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Reset the decoder state to the initial state. 3889d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3899d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 3909d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 3919d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t ResetDecoder() = 0; 3929d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 3939d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // API to get the codec which is currently used for decoding by the module. 3949d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3959d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 3969d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - currentReceiveCodec : Settings for the codec to be registered. 3979d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 3989d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 3999d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 4009d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t ReceiveCodec(VideoCodec* currentReceiveCodec) const = 0; 4019d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 4029d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // API to get the codec type currently used for decoding by the module. 4039d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 4049d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : codecy type, on success. 4059d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // kVideoCodecUnknown, on error or if no receive codec is 4069d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // registered 4079d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual VideoCodecType ReceiveCodec() const = 0; 4089d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 4099d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Insert a parsed packet into the receiver side of the module. Will be placed 4109d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // in the 4119d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // jitter buffer waiting for the frame to become complete. Returns as soon as 4129d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // the packet 4139d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // has been placed in the jitter buffer. 4149d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 4159d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 4169d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - incomingPayload : Payload of the packet. 4179d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - payloadLength : Length of the payload. 4189d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - rtpInfo : The parsed header. 4199d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 4209d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 4219d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 4229d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t IncomingPacket(const uint8_t* incomingPayload, 4239d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel size_t payloadLength, 4249d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel const WebRtcRTPHeader& rtpInfo) = 0; 4259d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 4269d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Minimum playout delay (Used for lip-sync). This is the minimum delay 4279d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // required 4289d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // to sync with audio. Not included in VideoCodingModule::Delay() 4299d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Defaults to 0 ms. 4309d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 4319d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 4329d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - minPlayoutDelayMs : Additional delay in ms. 4339d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 4349d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 4359d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 4369d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t SetMinimumPlayoutDelay(uint32_t minPlayoutDelayMs) = 0; 4379d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 4389d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Set the time required by the renderer to render a frame. 4399d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 4409d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 4419d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - timeMS : The time in ms required by the renderer to render a 4429d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // frame. 4439d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 4449d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success. 4459d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 4469d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t SetRenderDelay(uint32_t timeMS) = 0; 4479d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 4489d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // The total delay desired by the VCM. Can be less than the minimum 4499d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // delay set with SetMinimumPlayoutDelay. 4509d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 4519d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : Total delay in ms, on success. 4529d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 4539d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int32_t Delay() const = 0; 4549d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 4559d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Returns the number of packets discarded by the jitter buffer due to being 4569d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // too late. This can include duplicated packets which arrived after the 4579d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // frame was sent to the decoder. Therefore packets which were prematurely 4589d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // NACKed will be counted. 4599d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual uint32_t DiscardedPackets() const = 0; 4609d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 4619d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Robustness APIs 4629d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 4639d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Set the receiver robustness mode. The mode decides how the receiver 4649d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // responds to losses in the stream. The type of counter-measure (soft or 4659d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // hard NACK, dual decoder, RPS, etc.) is selected through the 4669d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // robustnessMode parameter. The errorMode parameter decides if it is 4679d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // allowed to display frames corrupted by losses. Note that not all 4689d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // combinations of the two parameters are feasible. An error will be 4699d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // returned for invalid combinations. 4709d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Input: 4719d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - robustnessMode : selected robustness mode. 4729d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // - errorMode : selected error mode. 4739d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // 4749d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Return value : VCM_OK, on success; 4759d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // < 0, on error. 4769d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int SetReceiverRobustnessMode(ReceiverRobustness robustnessMode, 4779d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel VCMDecodeErrorMode errorMode) = 0; 4789d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 4799d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Set the decode error mode. The mode decides which errors (if any) are 4809d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // allowed in decodable frames. Note that setting decode_error_mode to 4819d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // anything other than kWithErrors without enabling nack will cause 4829d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // long-term freezes (resulting from frequent key frame requests) if 4839d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // packet loss occurs. 4849d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode) = 0; 4859d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 4869d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Sets the maximum number of sequence numbers that we are allowed to NACK 4879d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // and the oldest sequence number that we will consider to NACK. If a 4889d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // sequence number older than |max_packet_age_to_nack| is missing 4899d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // a key frame will be requested. A key frame will also be requested if the 4909d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // time of incomplete or non-continuous frames in the jitter buffer is above 4919d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // |max_incomplete_time_ms|. 4929d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual void SetNackSettings(size_t max_nack_list_size, 4939d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel int max_packet_age_to_nack, 4949d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel int max_incomplete_time_ms) = 0; 4959d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 4969d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Setting a desired delay to the VCM receiver. Video rendering will be 4979d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // delayed by at least desired_delay_ms. 4989d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual int SetMinReceiverDelay(int desired_delay_ms) = 0; 4999d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 5009d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Lets the sender suspend video when the rate drops below 5019d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // |threshold_bps|, and turns back on when the rate goes back up above 5029d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // |threshold_bps| + |window_bps|. 5039d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual void SuspendBelowMinBitrate() = 0; 5049d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 5059d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Returns true if SuspendBelowMinBitrate is engaged and the video has been 5069d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // suspended due to bandwidth limitations; otherwise false. 5079d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual bool VideoSuspended() const = 0; 5089d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel 5099d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual void RegisterPreDecodeImageCallback( 5109d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel EncodedImageCallback* observer) = 0; 5119d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual void RegisterPostEncodeImageCallback( 5129d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel EncodedImageCallback* post_encode_callback) = 0; 5139d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel // Releases pending decode calls, permitting faster thread shutdown. 5149d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel virtual void TriggerDecoderShutdown() = 0; 5152557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander}; 5162557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander 5172557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander} // namespace webrtc 5182557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander 5199d3ab61325c5ed216ea52bc829f1d8c81347459bphilipel#endif // WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_H_ 520