blob: 0664d6247f570a1edfcbb1c0f559ec3a695fb528 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Henrik Kjellander2557b862015-11-18 22:00:21 +010011#ifndef WEBRTC_MODULES_VIDEO_CODING_RECEIVER_H_
12#define WEBRTC_MODULES_VIDEO_CODING_RECEIVER_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
kwiberg3f55dea2016-02-29 05:51:59 -080014#include <memory>
philipel9d3ab612015-12-21 04:12:39 -080015#include <vector>
16
kthelgasond701dfd2017-03-27 07:24:57 -070017#include "webrtc/base/criticalsection.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010018#include "webrtc/modules/video_coding/jitter_buffer.h"
19#include "webrtc/modules/video_coding/packet.h"
20#include "webrtc/modules/video_coding/timing.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010021#include "webrtc/modules/video_coding/include/video_coding.h"
22#include "webrtc/modules/video_coding/include/video_coding_defines.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000023
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000024namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000025
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +000026class Clock;
niklase@google.com470e71d2011-07-07 08:21:25 +000027class VCMEncodedFrame;
28
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000029class VCMReceiver {
30 public:
philipel83f831a2016-03-12 03:30:23 -080031 // Constructor for current interface, will be removed when the
32 // new jitter buffer is in place.
philipel9d3ab612015-12-21 04:12:39 -080033 VCMReceiver(VCMTiming* timing, Clock* clock, EventFactory* event_factory);
Qiang Chend4cec152015-06-19 09:17:00 -070034
philipel83f831a2016-03-12 03:30:23 -080035 // Create method for the new jitter buffer.
36 VCMReceiver(VCMTiming* timing,
37 Clock* clock,
38 EventFactory* event_factory,
39 NackSender* nack_sender,
40 KeyFrameRequestSender* keyframe_request_sender);
41
Qiang Chend4cec152015-06-19 09:17:00 -070042 // Using this constructor, you can specify a different event factory for the
43 // jitter buffer. Useful for unit tests when you want to simulate incoming
44 // packets, in which case the jitter buffer's wait event is different from
45 // that of VCMReceiver itself.
philipel83f831a2016-03-12 03:30:23 -080046 //
47 // Constructor for current interface, will be removed when the
48 // new jitter buffer is in place.
Qiang Chend4cec152015-06-19 09:17:00 -070049 VCMReceiver(VCMTiming* timing,
50 Clock* clock,
kwiberg3f55dea2016-02-29 05:51:59 -080051 std::unique_ptr<EventWrapper> receiver_event,
52 std::unique_ptr<EventWrapper> jitter_buffer_event);
Qiang Chend4cec152015-06-19 09:17:00 -070053
philipel83f831a2016-03-12 03:30:23 -080054 // Create method for the new jitter buffer.
55 VCMReceiver(VCMTiming* timing,
56 Clock* clock,
57 std::unique_ptr<EventWrapper> receiver_event,
58 std::unique_ptr<EventWrapper> jitter_buffer_event,
59 NackSender* nack_sender,
60 KeyFrameRequestSender* keyframe_request_sender);
61
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000062 ~VCMReceiver();
niklase@google.com470e71d2011-07-07 08:21:25 +000063
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000064 void Reset();
pkasting@chromium.org16825b12015-01-12 21:51:21 +000065 void UpdateRtt(int64_t rtt);
Johan Ahlers95348f72016-06-28 11:11:28 +020066 int32_t InsertPacket(const VCMPacket& packet);
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000067 VCMEncodedFrame* FrameForDecoding(uint16_t max_wait_time_ms,
perkj796cfaf2015-12-10 09:27:38 -080068 bool prefer_late_decoding);
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000069 void ReleaseFrame(VCMEncodedFrame* frame);
70 void ReceiveStatistics(uint32_t* bitrate, uint32_t* framerate);
niklase@google.com470e71d2011-07-07 08:21:25 +000071
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000072 // NACK.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +000073 void SetNackMode(VCMNackMode nackMode,
pkasting@chromium.org16825b12015-01-12 21:51:21 +000074 int64_t low_rtt_nack_threshold_ms,
75 int64_t high_rtt_nack_threshold_ms);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +000076 void SetNackSettings(size_t max_nack_list_size,
stefan@webrtc.orgef144882013-05-07 19:16:33 +000077 int max_packet_age_to_nack,
78 int max_incomplete_time_ms);
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000079 VCMNackMode NackMode() const;
Wan-Teh Changb1825a42015-06-03 15:03:35 -070080 std::vector<uint16_t> NackList(bool* request_key_frame);
niklase@google.com470e71d2011-07-07 08:21:25 +000081
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +000082 // Receiver video delay.
83 int SetMinReceiverDelay(int desired_delay_ms);
84
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +000085 // Decoding with errors.
agalusza@google.coma7e360e2013-08-01 03:15:08 +000086 void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode);
87 VCMDecodeErrorMode DecodeErrorMode() const;
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +000088
pbos@webrtc.org55707692014-12-19 15:45:03 +000089 void RegisterStatsCallback(VCMReceiveStatisticsCallback* callback);
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +000090
pbos@webrtc.org4dd40d62015-02-17 13:22:43 +000091 void TriggerDecoderShutdown();
92
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000093 private:
kthelgasond701dfd2017-03-27 07:24:57 -070094 rtc::CriticalSection crit_sect_;
pbos@webrtc.org4dd40d62015-02-17 13:22:43 +000095 Clock* const clock_;
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000096 VCMJitterBuffer jitter_buffer_;
97 VCMTiming* timing_;
kwiberg3f55dea2016-02-29 05:51:59 -080098 std::unique_ptr<EventWrapper> render_wait_event_;
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +000099 int max_video_delay_ms_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000100};
101
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +0000102} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000103
Henrik Kjellander2557b862015-11-18 22:00:21 +0100104#endif // WEBRTC_MODULES_VIDEO_CODING_RECEIVER_H_