blob: e6dee25669a8a2d92235ac8f2533bde0ed318c7a [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_VIDEO_CODING_RECEIVER_H_
12#define 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "modules/video_coding/include/video_coding.h"
18#include "modules/video_coding/include/video_coding_defines.h"
19#include "modules/video_coding/jitter_buffer.h"
20#include "modules/video_coding/packet.h"
21#include "modules/video_coding/timing.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "rtc_base/critical_section.h"
Niels Möllerebad1772018-12-04 13:15:37 +010023#include "system_wrappers/include/event_wrapper.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000024
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000025namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000026
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +000027class Clock;
niklase@google.com470e71d2011-07-07 08:21:25 +000028class VCMEncodedFrame;
29
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000030class VCMReceiver {
31 public:
Niels Möller689983f2018-11-07 16:36:22 +010032 VCMReceiver(VCMTiming* timing, Clock* clock);
Qiang Chend4cec152015-06-19 09:17:00 -070033
Niels Möller689983f2018-11-07 16:36:22 +010034 // Using this constructor, you can specify a different event implemetation for
35 // the jitter buffer. Useful for unit tests when you want to simulate incoming
Qiang Chend4cec152015-06-19 09:17:00 -070036 // packets, in which case the jitter buffer's wait event is different from
37 // that of VCMReceiver itself.
38 VCMReceiver(VCMTiming* timing,
39 Clock* clock,
kwiberg3f55dea2016-02-29 05:51:59 -080040 std::unique_ptr<EventWrapper> receiver_event,
41 std::unique_ptr<EventWrapper> jitter_buffer_event);
Qiang Chend4cec152015-06-19 09:17:00 -070042
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000043 ~VCMReceiver();
niklase@google.com470e71d2011-07-07 08:21:25 +000044
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000045 void Reset();
Johan Ahlers95348f72016-06-28 11:11:28 +020046 int32_t InsertPacket(const VCMPacket& packet);
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000047 VCMEncodedFrame* FrameForDecoding(uint16_t max_wait_time_ms,
perkj796cfaf2015-12-10 09:27:38 -080048 bool prefer_late_decoding);
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000049 void ReleaseFrame(VCMEncodedFrame* frame);
niklase@google.com470e71d2011-07-07 08:21:25 +000050
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000051 // NACK.
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +000052 void SetNackSettings(size_t max_nack_list_size,
stefan@webrtc.orgef144882013-05-07 19:16:33 +000053 int max_packet_age_to_nack,
54 int max_incomplete_time_ms);
Wan-Teh Changb1825a42015-06-03 15:03:35 -070055 std::vector<uint16_t> NackList(bool* request_key_frame);
niklase@google.com470e71d2011-07-07 08:21:25 +000056
pbos@webrtc.org4dd40d62015-02-17 13:22:43 +000057 void TriggerDecoderShutdown();
58
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000059 private:
kthelgasond701dfd2017-03-27 07:24:57 -070060 rtc::CriticalSection crit_sect_;
pbos@webrtc.org4dd40d62015-02-17 13:22:43 +000061 Clock* const clock_;
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000062 VCMJitterBuffer jitter_buffer_;
63 VCMTiming* timing_;
kwiberg3f55dea2016-02-29 05:51:59 -080064 std::unique_ptr<EventWrapper> render_wait_event_;
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +000065 int max_video_delay_ms_;
niklase@google.com470e71d2011-07-07 08:21:25 +000066};
67
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000068} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +000069
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020070#endif // MODULES_VIDEO_CODING_RECEIVER_H_