blob: fd48afcc78c8a26464b2259edbf0cef9dbb6f5d9 [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
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000011#ifndef WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_RECEIVER_H_
12#define WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_RECEIVER_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000014#include "webrtc/modules/video_coding/main/source/jitter_buffer.h"
15#include "webrtc/modules/video_coding/main/source/packet.h"
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000016#include "webrtc/modules/video_coding/main/source/timing.h"
pbos@webrtc.orga4407322013-07-16 12:32:05 +000017#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
agalusza@google.coma7e360e2013-08-01 03:15:08 +000018#include "webrtc/modules/video_coding/main/interface/video_coding.h"
19#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000020
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000021namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000022
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +000023class Clock;
niklase@google.com470e71d2011-07-07 08:21:25 +000024class VCMEncodedFrame;
25
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000026enum VCMNackStatus {
27 kNackOk,
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000028 kNackKeyFrameRequest
niklase@google.com470e71d2011-07-07 08:21:25 +000029};
30
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000031enum VCMReceiverState {
32 kReceiving,
33 kPassive,
34 kWaitForPrimaryDecode
niklase@google.com470e71d2011-07-07 08:21:25 +000035};
36
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000037class VCMReceiver {
38 public:
39 VCMReceiver(VCMTiming* timing,
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +000040 Clock* clock,
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +000041 EventFactory* event_factory,
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +000042 bool master);
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();
pkasting@chromium.org16825b12015-01-12 21:51:21 +000046 void UpdateRtt(int64_t rtt);
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000047 int32_t InsertPacket(const VCMPacket& packet,
48 uint16_t frame_width,
49 uint16_t frame_height);
50 VCMEncodedFrame* FrameForDecoding(uint16_t max_wait_time_ms,
51 int64_t& next_render_time_ms,
pbos@webrtc.org4f16c872014-11-24 09:06:48 +000052 bool render_timing = true);
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000053 void ReleaseFrame(VCMEncodedFrame* frame);
54 void ReceiveStatistics(uint32_t* bitrate, uint32_t* framerate);
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000055 uint32_t DiscardedPackets() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000056
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000057 // NACK.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +000058 void SetNackMode(VCMNackMode nackMode,
pkasting@chromium.org16825b12015-01-12 21:51:21 +000059 int64_t low_rtt_nack_threshold_ms,
60 int64_t high_rtt_nack_threshold_ms);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +000061 void SetNackSettings(size_t max_nack_list_size,
stefan@webrtc.orgef144882013-05-07 19:16:33 +000062 int max_packet_age_to_nack,
63 int max_incomplete_time_ms);
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000064 VCMNackMode NackMode() const;
stefan@webrtc.orga64300a2013-03-04 15:24:40 +000065 VCMNackStatus NackList(uint16_t* nackList, uint16_t size,
66 uint16_t* nack_list_length);
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000067 VCMReceiverState State() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000068
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +000069 // Receiver video delay.
70 int SetMinReceiverDelay(int desired_delay_ms);
71
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +000072 // Decoding with errors.
agalusza@google.coma7e360e2013-08-01 03:15:08 +000073 void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode);
74 VCMDecodeErrorMode DecodeErrorMode() const;
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +000075
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000076 // Returns size in time (milliseconds) of complete continuous frames in the
mikhal@webrtc.org759b0412013-05-07 16:36:00 +000077 // jitter buffer. The render time is estimated based on the render delay at
78 // the time this function is called.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000079 int RenderBufferSizeMs();
80
pbos@webrtc.org55707692014-12-19 15:45:03 +000081 void RegisterStatsCallback(VCMReceiveStatisticsCallback* callback);
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +000082
pbos@webrtc.org4dd40d62015-02-17 13:22:43 +000083 void TriggerDecoderShutdown();
84
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000085 private:
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000086 static int32_t GenerateReceiverId();
niklase@google.com470e71d2011-07-07 08:21:25 +000087
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000088 CriticalSectionWrapper* crit_sect_;
pbos@webrtc.org4dd40d62015-02-17 13:22:43 +000089 Clock* const clock_;
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000090 VCMJitterBuffer jitter_buffer_;
91 VCMTiming* timing_;
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000092 rtc::scoped_ptr<EventWrapper> render_wait_event_;
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000093 VCMReceiverState state_;
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +000094 int max_video_delay_ms_;
niklase@google.com470e71d2011-07-07 08:21:25 +000095
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000096 static int32_t receiver_id_counter_;
niklase@google.com470e71d2011-07-07 08:21:25 +000097};
98
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000099} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000100
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +0000101#endif // WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_RECEIVER_H_