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