blob: b478f49d375fb79a7642e5aaa625503280dcecc0 [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/system_wrappers/interface/critical_section_wrapper.h"
15#include "webrtc/modules/video_coding/main/source/jitter_buffer.h"
16#include "webrtc/modules/video_coding/main/source/packet.h"
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000017#include "webrtc/modules/video_coding/main/source/timing.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000018
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000019namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000020
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +000021class Clock;
niklase@google.com470e71d2011-07-07 08:21:25 +000022class VCMEncodedFrame;
23
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000024enum VCMNackStatus {
25 kNackOk,
26 kNackNeedMoreMemory,
27 kNackKeyFrameRequest
niklase@google.com470e71d2011-07-07 08:21:25 +000028};
29
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000030enum VCMReceiverState {
31 kReceiving,
32 kPassive,
33 kWaitForPrimaryDecode
niklase@google.com470e71d2011-07-07 08:21:25 +000034};
35
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000036class VCMReceiver {
37 public:
38 VCMReceiver(VCMTiming* timing,
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +000039 Clock* clock,
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +000040 EventFactory* event_factory,
41 int32_t vcm_id,
42 int32_t receiver_id,
43 bool master);
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000044 ~VCMReceiver();
niklase@google.com470e71d2011-07-07 08:21:25 +000045
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000046 void Reset();
47 int32_t Initialize();
48 void UpdateRtt(uint32_t rtt);
49 int32_t InsertPacket(const VCMPacket& packet,
50 uint16_t frame_width,
51 uint16_t frame_height);
52 VCMEncodedFrame* FrameForDecoding(uint16_t max_wait_time_ms,
53 int64_t& next_render_time_ms,
54 bool render_timing = true,
55 VCMReceiver* dual_receiver = NULL);
56 void ReleaseFrame(VCMEncodedFrame* frame);
57 void ReceiveStatistics(uint32_t* bitrate, uint32_t* framerate);
58 void ReceivedFrameCount(VCMFrameCount* frame_count) const;
59 uint32_t DiscardedPackets() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000060
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000061 // NACK.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +000062 void SetNackMode(VCMNackMode nackMode,
63 int low_rtt_nack_threshold_ms,
64 int high_rtt_nack_threshold_ms);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +000065 void SetNackSettings(size_t max_nack_list_size,
66 int max_packet_age_to_nack);
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000067 VCMNackMode NackMode() const;
stefan@webrtc.orga64300a2013-03-04 15:24:40 +000068 VCMNackStatus NackList(uint16_t* nackList, uint16_t size,
69 uint16_t* nack_list_length);
niklase@google.com470e71d2011-07-07 08:21:25 +000070
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000071 // Dual decoder.
72 bool DualDecoderCaughtUp(VCMEncodedFrame* dual_frame,
73 VCMReceiver& dual_receiver) const;
74 VCMReceiverState State() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000075
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +000076 // Receiver video delay.
77 int SetMinReceiverDelay(int desired_delay_ms);
78
mikhal@webrtc.orgdc3cd212013-04-25 20:27:04 +000079 // Decoding with errors.
80 void SetDecodeWithErrors(bool enable);
81 bool DecodeWithErrors() const;
82
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000083 // Returns size in time (milliseconds) of complete continuous frames in the
mikhal@webrtc.org759b0412013-05-07 16:36:00 +000084 // jitter buffer. The render time is estimated based on the render delay at
85 // the time this function is called.
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000086 int RenderBufferSizeMs();
87
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000088 private:
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000089 void CopyJitterBufferStateFromReceiver(const VCMReceiver& receiver);
90 void UpdateState(VCMReceiverState new_state);
91 void UpdateState(const VCMEncodedFrame& frame);
92 static int32_t GenerateReceiverId();
niklase@google.com470e71d2011-07-07 08:21:25 +000093
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000094 CriticalSectionWrapper* crit_sect_;
95 int32_t vcm_id_;
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +000096 Clock* clock_;
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000097 int32_t receiver_id_;
98 bool master_;
99 VCMJitterBuffer jitter_buffer_;
100 VCMTiming* timing_;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +0000101 scoped_ptr<EventWrapper> render_wait_event_;
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +0000102 VCMReceiverState state_;
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +0000103 int max_video_delay_ms_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000104
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +0000105 static int32_t receiver_id_counter_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000106};
107
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +0000108} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000109
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +0000110#endif // WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_RECEIVER_H_