1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef CALL_VIDEO_RECEIVE_STREAM_H_ 12*d9f75844SAndroid Build Coastguard Worker #define CALL_VIDEO_RECEIVE_STREAM_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <limits> 15*d9f75844SAndroid Build Coastguard Worker #include <map> 16*d9f75844SAndroid Build Coastguard Worker #include <set> 17*d9f75844SAndroid Build Coastguard Worker #include <string> 18*d9f75844SAndroid Build Coastguard Worker #include <utility> 19*d9f75844SAndroid Build Coastguard Worker #include <vector> 20*d9f75844SAndroid Build Coastguard Worker 21*d9f75844SAndroid Build Coastguard Worker #include "api/call/transport.h" 22*d9f75844SAndroid Build Coastguard Worker #include "api/crypto/crypto_options.h" 23*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_headers.h" 24*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_parameters.h" 25*d9f75844SAndroid Build Coastguard Worker #include "api/video/recordable_encoded_frame.h" 26*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_content_type.h" 27*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_frame.h" 28*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_sink_interface.h" 29*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_timing.h" 30*d9f75844SAndroid Build Coastguard Worker #include "api/video_codecs/sdp_video_format.h" 31*d9f75844SAndroid Build Coastguard Worker #include "call/receive_stream.h" 32*d9f75844SAndroid Build Coastguard Worker #include "call/rtp_config.h" 33*d9f75844SAndroid Build Coastguard Worker #include "common_video/frame_counts.h" 34*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/include/rtcp_statistics.h" 35*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" 36*d9f75844SAndroid Build Coastguard Worker 37*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 38*d9f75844SAndroid Build Coastguard Worker 39*d9f75844SAndroid Build Coastguard Worker class RtpPacketSinkInterface; 40*d9f75844SAndroid Build Coastguard Worker class VideoDecoderFactory; 41*d9f75844SAndroid Build Coastguard Worker 42*d9f75844SAndroid Build Coastguard Worker class VideoReceiveStreamInterface : public MediaReceiveStreamInterface { 43*d9f75844SAndroid Build Coastguard Worker public: 44*d9f75844SAndroid Build Coastguard Worker // Class for handling moving in/out recording state. 45*d9f75844SAndroid Build Coastguard Worker struct RecordingState { 46*d9f75844SAndroid Build Coastguard Worker RecordingState() = default; RecordingStateRecordingState47*d9f75844SAndroid Build Coastguard Worker explicit RecordingState( 48*d9f75844SAndroid Build Coastguard Worker std::function<void(const RecordableEncodedFrame&)> callback) 49*d9f75844SAndroid Build Coastguard Worker : callback(std::move(callback)) {} 50*d9f75844SAndroid Build Coastguard Worker 51*d9f75844SAndroid Build Coastguard Worker // Callback stored from the VideoReceiveStreamInterface. The 52*d9f75844SAndroid Build Coastguard Worker // VideoReceiveStreamInterface client should not interpret the attribute. 53*d9f75844SAndroid Build Coastguard Worker std::function<void(const RecordableEncodedFrame&)> callback; 54*d9f75844SAndroid Build Coastguard Worker // Memento of when a keyframe request was last sent. The 55*d9f75844SAndroid Build Coastguard Worker // VideoReceiveStreamInterface client should not interpret the attribute. 56*d9f75844SAndroid Build Coastguard Worker absl::optional<int64_t> last_keyframe_request_ms; 57*d9f75844SAndroid Build Coastguard Worker }; 58*d9f75844SAndroid Build Coastguard Worker 59*d9f75844SAndroid Build Coastguard Worker // TODO(mflodman) Move all these settings to VideoDecoder and move the 60*d9f75844SAndroid Build Coastguard Worker // declaration to common_types.h. 61*d9f75844SAndroid Build Coastguard Worker struct Decoder { 62*d9f75844SAndroid Build Coastguard Worker Decoder(SdpVideoFormat video_format, int payload_type); 63*d9f75844SAndroid Build Coastguard Worker Decoder(); 64*d9f75844SAndroid Build Coastguard Worker Decoder(const Decoder&); 65*d9f75844SAndroid Build Coastguard Worker ~Decoder(); 66*d9f75844SAndroid Build Coastguard Worker 67*d9f75844SAndroid Build Coastguard Worker bool operator==(const Decoder& other) const; 68*d9f75844SAndroid Build Coastguard Worker 69*d9f75844SAndroid Build Coastguard Worker std::string ToString() const; 70*d9f75844SAndroid Build Coastguard Worker 71*d9f75844SAndroid Build Coastguard Worker SdpVideoFormat video_format; 72*d9f75844SAndroid Build Coastguard Worker 73*d9f75844SAndroid Build Coastguard Worker // Received RTP packets with this payload type will be sent to this decoder 74*d9f75844SAndroid Build Coastguard Worker // instance. 75*d9f75844SAndroid Build Coastguard Worker int payload_type = 0; 76*d9f75844SAndroid Build Coastguard Worker }; 77*d9f75844SAndroid Build Coastguard Worker 78*d9f75844SAndroid Build Coastguard Worker struct Stats { 79*d9f75844SAndroid Build Coastguard Worker Stats(); 80*d9f75844SAndroid Build Coastguard Worker ~Stats(); 81*d9f75844SAndroid Build Coastguard Worker std::string ToString(int64_t time_ms) const; 82*d9f75844SAndroid Build Coastguard Worker 83*d9f75844SAndroid Build Coastguard Worker int network_frame_rate = 0; 84*d9f75844SAndroid Build Coastguard Worker int decode_frame_rate = 0; 85*d9f75844SAndroid Build Coastguard Worker int render_frame_rate = 0; 86*d9f75844SAndroid Build Coastguard Worker uint32_t frames_rendered = 0; 87*d9f75844SAndroid Build Coastguard Worker 88*d9f75844SAndroid Build Coastguard Worker // Decoder stats. 89*d9f75844SAndroid Build Coastguard Worker std::string decoder_implementation_name = "unknown"; 90*d9f75844SAndroid Build Coastguard Worker absl::optional<bool> power_efficient_decoder; 91*d9f75844SAndroid Build Coastguard Worker FrameCounts frame_counts; 92*d9f75844SAndroid Build Coastguard Worker int decode_ms = 0; 93*d9f75844SAndroid Build Coastguard Worker int max_decode_ms = 0; 94*d9f75844SAndroid Build Coastguard Worker int current_delay_ms = 0; 95*d9f75844SAndroid Build Coastguard Worker int target_delay_ms = 0; 96*d9f75844SAndroid Build Coastguard Worker int jitter_buffer_ms = 0; 97*d9f75844SAndroid Build Coastguard Worker // https://w3c.github.io/webrtc-stats/#dom-rtcvideoreceiverstats-jitterbufferdelay 98*d9f75844SAndroid Build Coastguard Worker double jitter_buffer_delay_seconds = 0; 99*d9f75844SAndroid Build Coastguard Worker // https://w3c.github.io/webrtc-stats/#dom-rtcvideoreceiverstats-jitterbufferemittedcount 100*d9f75844SAndroid Build Coastguard Worker uint64_t jitter_buffer_emitted_count = 0; 101*d9f75844SAndroid Build Coastguard Worker int min_playout_delay_ms = 0; 102*d9f75844SAndroid Build Coastguard Worker int render_delay_ms = 10; 103*d9f75844SAndroid Build Coastguard Worker int64_t interframe_delay_max_ms = -1; 104*d9f75844SAndroid Build Coastguard Worker // Frames dropped due to decoding failures or if the system is too slow. 105*d9f75844SAndroid Build Coastguard Worker // https://www.w3.org/TR/webrtc-stats/#dom-rtcvideoreceiverstats-framesdropped 106*d9f75844SAndroid Build Coastguard Worker uint32_t frames_dropped = 0; 107*d9f75844SAndroid Build Coastguard Worker uint32_t frames_decoded = 0; 108*d9f75844SAndroid Build Coastguard Worker // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-totaldecodetime 109*d9f75844SAndroid Build Coastguard Worker TimeDelta total_decode_time = TimeDelta::Zero(); 110*d9f75844SAndroid Build Coastguard Worker // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-totalprocessingdelay 111*d9f75844SAndroid Build Coastguard Worker TimeDelta total_processing_delay = TimeDelta::Zero(); 112*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/13986): standardize 113*d9f75844SAndroid Build Coastguard Worker TimeDelta total_assembly_time = TimeDelta::Zero(); 114*d9f75844SAndroid Build Coastguard Worker uint32_t frames_assembled_from_multiple_packets = 0; 115*d9f75844SAndroid Build Coastguard Worker // Total inter frame delay in seconds. 116*d9f75844SAndroid Build Coastguard Worker // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-totalinterframedelay 117*d9f75844SAndroid Build Coastguard Worker double total_inter_frame_delay = 0; 118*d9f75844SAndroid Build Coastguard Worker // Total squared inter frame delay in seconds^2. 119*d9f75844SAndroid Build Coastguard Worker // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-totalsqauredinterframedelay 120*d9f75844SAndroid Build Coastguard Worker double total_squared_inter_frame_delay = 0; 121*d9f75844SAndroid Build Coastguard Worker int64_t first_frame_received_to_decoded_ms = -1; 122*d9f75844SAndroid Build Coastguard Worker absl::optional<uint64_t> qp_sum; 123*d9f75844SAndroid Build Coastguard Worker 124*d9f75844SAndroid Build Coastguard Worker int current_payload_type = -1; 125*d9f75844SAndroid Build Coastguard Worker 126*d9f75844SAndroid Build Coastguard Worker int total_bitrate_bps = 0; 127*d9f75844SAndroid Build Coastguard Worker 128*d9f75844SAndroid Build Coastguard Worker int width = 0; 129*d9f75844SAndroid Build Coastguard Worker int height = 0; 130*d9f75844SAndroid Build Coastguard Worker 131*d9f75844SAndroid Build Coastguard Worker uint32_t freeze_count = 0; 132*d9f75844SAndroid Build Coastguard Worker uint32_t pause_count = 0; 133*d9f75844SAndroid Build Coastguard Worker uint32_t total_freezes_duration_ms = 0; 134*d9f75844SAndroid Build Coastguard Worker uint32_t total_pauses_duration_ms = 0; 135*d9f75844SAndroid Build Coastguard Worker uint32_t total_frames_duration_ms = 0; 136*d9f75844SAndroid Build Coastguard Worker double sum_squared_frame_durations = 0.0; 137*d9f75844SAndroid Build Coastguard Worker 138*d9f75844SAndroid Build Coastguard Worker VideoContentType content_type = VideoContentType::UNSPECIFIED; 139*d9f75844SAndroid Build Coastguard Worker 140*d9f75844SAndroid Build Coastguard Worker // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-estimatedplayouttimestamp 141*d9f75844SAndroid Build Coastguard Worker absl::optional<int64_t> estimated_playout_ntp_timestamp_ms; 142*d9f75844SAndroid Build Coastguard Worker int sync_offset_ms = std::numeric_limits<int>::max(); 143*d9f75844SAndroid Build Coastguard Worker 144*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc = 0; 145*d9f75844SAndroid Build Coastguard Worker std::string c_name; 146*d9f75844SAndroid Build Coastguard Worker RtpReceiveStats rtp_stats; 147*d9f75844SAndroid Build Coastguard Worker RtcpPacketTypeCounter rtcp_packet_type_counts; 148*d9f75844SAndroid Build Coastguard Worker 149*d9f75844SAndroid Build Coastguard Worker // Timing frame info: all important timestamps for a full lifetime of a 150*d9f75844SAndroid Build Coastguard Worker // single 'timing frame'. 151*d9f75844SAndroid Build Coastguard Worker absl::optional<webrtc::TimingFrameInfo> timing_frame_info; 152*d9f75844SAndroid Build Coastguard Worker }; 153*d9f75844SAndroid Build Coastguard Worker 154*d9f75844SAndroid Build Coastguard Worker struct Config { 155*d9f75844SAndroid Build Coastguard Worker private: 156*d9f75844SAndroid Build Coastguard Worker // Access to the copy constructor is private to force use of the Copy() 157*d9f75844SAndroid Build Coastguard Worker // method for those exceptional cases where we do use it. 158*d9f75844SAndroid Build Coastguard Worker Config(const Config&); 159*d9f75844SAndroid Build Coastguard Worker 160*d9f75844SAndroid Build Coastguard Worker public: 161*d9f75844SAndroid Build Coastguard Worker Config() = delete; 162*d9f75844SAndroid Build Coastguard Worker Config(Config&&); 163*d9f75844SAndroid Build Coastguard Worker Config(Transport* rtcp_send_transport, 164*d9f75844SAndroid Build Coastguard Worker VideoDecoderFactory* decoder_factory = nullptr); 165*d9f75844SAndroid Build Coastguard Worker Config& operator=(Config&&); 166*d9f75844SAndroid Build Coastguard Worker Config& operator=(const Config&) = delete; 167*d9f75844SAndroid Build Coastguard Worker ~Config(); 168*d9f75844SAndroid Build Coastguard Worker 169*d9f75844SAndroid Build Coastguard Worker // Mostly used by tests. Avoid creating copies if you can. CopyConfig170*d9f75844SAndroid Build Coastguard Worker Config Copy() const { return Config(*this); } 171*d9f75844SAndroid Build Coastguard Worker 172*d9f75844SAndroid Build Coastguard Worker std::string ToString() const; 173*d9f75844SAndroid Build Coastguard Worker 174*d9f75844SAndroid Build Coastguard Worker // Decoders for every payload that we can receive. 175*d9f75844SAndroid Build Coastguard Worker std::vector<Decoder> decoders; 176*d9f75844SAndroid Build Coastguard Worker 177*d9f75844SAndroid Build Coastguard Worker // Ownership stays with WebrtcVideoEngine (delegated from PeerConnection). 178*d9f75844SAndroid Build Coastguard Worker VideoDecoderFactory* decoder_factory = nullptr; 179*d9f75844SAndroid Build Coastguard Worker 180*d9f75844SAndroid Build Coastguard Worker // Receive-stream specific RTP settings. 181*d9f75844SAndroid Build Coastguard Worker struct Rtp : public ReceiveStreamRtpConfig { 182*d9f75844SAndroid Build Coastguard Worker Rtp(); 183*d9f75844SAndroid Build Coastguard Worker Rtp(const Rtp&); 184*d9f75844SAndroid Build Coastguard Worker ~Rtp(); 185*d9f75844SAndroid Build Coastguard Worker std::string ToString() const; 186*d9f75844SAndroid Build Coastguard Worker 187*d9f75844SAndroid Build Coastguard Worker // See NackConfig for description. 188*d9f75844SAndroid Build Coastguard Worker NackConfig nack; 189*d9f75844SAndroid Build Coastguard Worker 190*d9f75844SAndroid Build Coastguard Worker // See RtcpMode for description. 191*d9f75844SAndroid Build Coastguard Worker RtcpMode rtcp_mode = RtcpMode::kCompound; 192*d9f75844SAndroid Build Coastguard Worker 193*d9f75844SAndroid Build Coastguard Worker // Extended RTCP settings. 194*d9f75844SAndroid Build Coastguard Worker struct RtcpXr { 195*d9f75844SAndroid Build Coastguard Worker // True if RTCP Receiver Reference Time Report Block extension 196*d9f75844SAndroid Build Coastguard Worker // (RFC 3611) should be enabled. 197*d9f75844SAndroid Build Coastguard Worker bool receiver_reference_time_report = false; 198*d9f75844SAndroid Build Coastguard Worker } rtcp_xr; 199*d9f75844SAndroid Build Coastguard Worker 200*d9f75844SAndroid Build Coastguard Worker // How to request keyframes from a remote sender. Applies only if lntf is 201*d9f75844SAndroid Build Coastguard Worker // disabled. 202*d9f75844SAndroid Build Coastguard Worker KeyFrameReqMethod keyframe_method = KeyFrameReqMethod::kPliRtcp; 203*d9f75844SAndroid Build Coastguard Worker 204*d9f75844SAndroid Build Coastguard Worker // See LntfConfig for description. 205*d9f75844SAndroid Build Coastguard Worker LntfConfig lntf; 206*d9f75844SAndroid Build Coastguard Worker 207*d9f75844SAndroid Build Coastguard Worker // Payload types for ULPFEC and RED, respectively. 208*d9f75844SAndroid Build Coastguard Worker int ulpfec_payload_type = -1; 209*d9f75844SAndroid Build Coastguard Worker int red_payload_type = -1; 210*d9f75844SAndroid Build Coastguard Worker 211*d9f75844SAndroid Build Coastguard Worker // SSRC for retransmissions. 212*d9f75844SAndroid Build Coastguard Worker uint32_t rtx_ssrc = 0; 213*d9f75844SAndroid Build Coastguard Worker 214*d9f75844SAndroid Build Coastguard Worker // Set if the stream is protected using FlexFEC. 215*d9f75844SAndroid Build Coastguard Worker bool protected_by_flexfec = false; 216*d9f75844SAndroid Build Coastguard Worker 217*d9f75844SAndroid Build Coastguard Worker // Optional callback sink to support additional packet handlers such as 218*d9f75844SAndroid Build Coastguard Worker // FlexFec. 219*d9f75844SAndroid Build Coastguard Worker RtpPacketSinkInterface* packet_sink_ = nullptr; 220*d9f75844SAndroid Build Coastguard Worker 221*d9f75844SAndroid Build Coastguard Worker // Map from rtx payload type -> media payload type. 222*d9f75844SAndroid Build Coastguard Worker // For RTX to be enabled, both an SSRC and this mapping are needed. 223*d9f75844SAndroid Build Coastguard Worker std::map<int, int> rtx_associated_payload_types; 224*d9f75844SAndroid Build Coastguard Worker 225*d9f75844SAndroid Build Coastguard Worker // Payload types that should be depacketized using raw depacketizer 226*d9f75844SAndroid Build Coastguard Worker // (payload header will not be parsed and must not be present, additional 227*d9f75844SAndroid Build Coastguard Worker // meta data is expected to be present in generic frame descriptor 228*d9f75844SAndroid Build Coastguard Worker // RTP header extension). 229*d9f75844SAndroid Build Coastguard Worker std::set<int> raw_payload_types; 230*d9f75844SAndroid Build Coastguard Worker } rtp; 231*d9f75844SAndroid Build Coastguard Worker 232*d9f75844SAndroid Build Coastguard Worker // Transport for outgoing packets (RTCP). 233*d9f75844SAndroid Build Coastguard Worker Transport* rtcp_send_transport = nullptr; 234*d9f75844SAndroid Build Coastguard Worker 235*d9f75844SAndroid Build Coastguard Worker // Must always be set. 236*d9f75844SAndroid Build Coastguard Worker rtc::VideoSinkInterface<VideoFrame>* renderer = nullptr; 237*d9f75844SAndroid Build Coastguard Worker 238*d9f75844SAndroid Build Coastguard Worker // Expected delay needed by the renderer, i.e. the frame will be delivered 239*d9f75844SAndroid Build Coastguard Worker // this many milliseconds, if possible, earlier than the ideal render time. 240*d9f75844SAndroid Build Coastguard Worker int render_delay_ms = 10; 241*d9f75844SAndroid Build Coastguard Worker 242*d9f75844SAndroid Build Coastguard Worker // If false, pass frames on to the renderer as soon as they are 243*d9f75844SAndroid Build Coastguard Worker // available. 244*d9f75844SAndroid Build Coastguard Worker bool enable_prerenderer_smoothing = true; 245*d9f75844SAndroid Build Coastguard Worker 246*d9f75844SAndroid Build Coastguard Worker // Identifier for an A/V synchronization group. Empty string to disable. 247*d9f75844SAndroid Build Coastguard Worker // TODO(pbos): Synchronize streams in a sync group, not just video streams 248*d9f75844SAndroid Build Coastguard Worker // to one of the audio streams. 249*d9f75844SAndroid Build Coastguard Worker std::string sync_group; 250*d9f75844SAndroid Build Coastguard Worker 251*d9f75844SAndroid Build Coastguard Worker // An optional custom frame decryptor that allows the entire frame to be 252*d9f75844SAndroid Build Coastguard Worker // decrypted in whatever way the caller choses. This is not required by 253*d9f75844SAndroid Build Coastguard Worker // default. 254*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor; 255*d9f75844SAndroid Build Coastguard Worker 256*d9f75844SAndroid Build Coastguard Worker // Per PeerConnection cryptography options. 257*d9f75844SAndroid Build Coastguard Worker CryptoOptions crypto_options; 258*d9f75844SAndroid Build Coastguard Worker 259*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer; 260*d9f75844SAndroid Build Coastguard Worker }; 261*d9f75844SAndroid Build Coastguard Worker 262*d9f75844SAndroid Build Coastguard Worker // TODO(pbos): Add info on currently-received codec to Stats. 263*d9f75844SAndroid Build Coastguard Worker virtual Stats GetStats() const = 0; 264*d9f75844SAndroid Build Coastguard Worker 265*d9f75844SAndroid Build Coastguard Worker // Sets a base minimum for the playout delay. Base minimum delay sets lower 266*d9f75844SAndroid Build Coastguard Worker // bound on minimum delay value determining lower bound on playout delay. 267*d9f75844SAndroid Build Coastguard Worker // 268*d9f75844SAndroid Build Coastguard Worker // Returns true if value was successfully set, false overwise. 269*d9f75844SAndroid Build Coastguard Worker virtual bool SetBaseMinimumPlayoutDelayMs(int delay_ms) = 0; 270*d9f75844SAndroid Build Coastguard Worker 271*d9f75844SAndroid Build Coastguard Worker // Returns current value of base minimum delay in milliseconds. 272*d9f75844SAndroid Build Coastguard Worker virtual int GetBaseMinimumPlayoutDelayMs() const = 0; 273*d9f75844SAndroid Build Coastguard Worker 274*d9f75844SAndroid Build Coastguard Worker // Sets and returns recording state. The old state is moved out 275*d9f75844SAndroid Build Coastguard Worker // of the video receive stream and returned to the caller, and `state` 276*d9f75844SAndroid Build Coastguard Worker // is moved in. If the state's callback is set, it will be called with 277*d9f75844SAndroid Build Coastguard Worker // recordable encoded frames as they arrive. 278*d9f75844SAndroid Build Coastguard Worker // If `generate_key_frame` is true, the method will generate a key frame. 279*d9f75844SAndroid Build Coastguard Worker // When the function returns, it's guaranteed that all old callouts 280*d9f75844SAndroid Build Coastguard Worker // to the returned callback has ceased. 281*d9f75844SAndroid Build Coastguard Worker // Note: the client should not interpret the returned state's attributes, but 282*d9f75844SAndroid Build Coastguard Worker // instead treat it as opaque data. 283*d9f75844SAndroid Build Coastguard Worker virtual RecordingState SetAndGetRecordingState(RecordingState state, 284*d9f75844SAndroid Build Coastguard Worker bool generate_key_frame) = 0; 285*d9f75844SAndroid Build Coastguard Worker 286*d9f75844SAndroid Build Coastguard Worker // Cause eventual generation of a key frame from the sender. 287*d9f75844SAndroid Build Coastguard Worker virtual void GenerateKeyFrame() = 0; 288*d9f75844SAndroid Build Coastguard Worker 289*d9f75844SAndroid Build Coastguard Worker virtual void SetRtcpMode(RtcpMode mode) = 0; 290*d9f75844SAndroid Build Coastguard Worker 291*d9f75844SAndroid Build Coastguard Worker // Sets or clears a flexfec RTP sink. This affects `rtp.packet_sink_` and 292*d9f75844SAndroid Build Coastguard Worker // `rtp.protected_by_flexfec` parts of the configuration. Must be called on 293*d9f75844SAndroid Build Coastguard Worker // the packet delivery thread. 294*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/11993): Packet delivery thread today means `worker 295*d9f75844SAndroid Build Coastguard Worker // thread` but will be `network thread`. 296*d9f75844SAndroid Build Coastguard Worker virtual void SetFlexFecProtection(RtpPacketSinkInterface* flexfec_sink) = 0; 297*d9f75844SAndroid Build Coastguard Worker 298*d9f75844SAndroid Build Coastguard Worker // Turns on/off loss notifications. Must be called on the packet delivery 299*d9f75844SAndroid Build Coastguard Worker // thread. 300*d9f75844SAndroid Build Coastguard Worker virtual void SetLossNotificationEnabled(bool enabled) = 0; 301*d9f75844SAndroid Build Coastguard Worker 302*d9f75844SAndroid Build Coastguard Worker // Modify `rtp.nack.rtp_history_ms` post construction. Setting this value 303*d9f75844SAndroid Build Coastguard Worker // to 0 disables nack. 304*d9f75844SAndroid Build Coastguard Worker // Must be called on the packet delivery thread. 305*d9f75844SAndroid Build Coastguard Worker virtual void SetNackHistory(TimeDelta history) = 0; 306*d9f75844SAndroid Build Coastguard Worker 307*d9f75844SAndroid Build Coastguard Worker virtual void SetProtectionPayloadTypes(int red_payload_type, 308*d9f75844SAndroid Build Coastguard Worker int ulpfec_payload_type) = 0; 309*d9f75844SAndroid Build Coastguard Worker 310*d9f75844SAndroid Build Coastguard Worker virtual void SetRtcpXr(Config::Rtp::RtcpXr rtcp_xr) = 0; 311*d9f75844SAndroid Build Coastguard Worker 312*d9f75844SAndroid Build Coastguard Worker virtual void SetAssociatedPayloadTypes( 313*d9f75844SAndroid Build Coastguard Worker std::map<int, int> associated_payload_types) = 0; 314*d9f75844SAndroid Build Coastguard Worker 315*d9f75844SAndroid Build Coastguard Worker protected: ~VideoReceiveStreamInterface()316*d9f75844SAndroid Build Coastguard Worker virtual ~VideoReceiveStreamInterface() {} 317*d9f75844SAndroid Build Coastguard Worker }; 318*d9f75844SAndroid Build Coastguard Worker 319*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 320*d9f75844SAndroid Build Coastguard Worker 321*d9f75844SAndroid Build Coastguard Worker #endif // CALL_VIDEO_RECEIVE_STREAM_H_ 322