blob: 9d18e247b48f716f01f5ae0cac596a693646d2fd [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.org1ea4b502013-01-07 08:49:41 +000040 int32_t vcm_id = -1,
41 int32_t receiver_id = -1,
42 bool master = true);
43 ~VCMReceiver();
niklase@google.com470e71d2011-07-07 08:21:25 +000044
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000045 void Reset();
46 int32_t Initialize();
47 void UpdateRtt(uint32_t rtt);
48 int32_t InsertPacket(const VCMPacket& packet,
49 uint16_t frame_width,
50 uint16_t frame_height);
51 VCMEncodedFrame* FrameForDecoding(uint16_t max_wait_time_ms,
52 int64_t& next_render_time_ms,
53 bool render_timing = true,
54 VCMReceiver* dual_receiver = NULL);
55 void ReleaseFrame(VCMEncodedFrame* frame);
56 void ReceiveStatistics(uint32_t* bitrate, uint32_t* framerate);
57 void ReceivedFrameCount(VCMFrameCount* frame_count) const;
58 uint32_t DiscardedPackets() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000059
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000060 // NACK.
61 void SetNackMode(VCMNackMode nackMode);
62 VCMNackMode NackMode() const;
63 VCMNackStatus NackList(uint16_t* nackList, uint16_t* size);
niklase@google.com470e71d2011-07-07 08:21:25 +000064
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000065 // Dual decoder.
66 bool DualDecoderCaughtUp(VCMEncodedFrame* dual_frame,
67 VCMReceiver& dual_receiver) const;
68 VCMReceiverState State() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000069
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000070 private:
71 VCMEncodedFrame* FrameForDecoding(uint16_t max_wait_time_ms,
72 int64_t nextrender_time_ms,
73 VCMReceiver* dual_receiver);
74 VCMEncodedFrame* FrameForRendering(uint16_t max_wait_time_ms,
75 int64_t nextrender_time_ms,
76 VCMReceiver* dual_receiver);
77 void CopyJitterBufferStateFromReceiver(const VCMReceiver& receiver);
78 void UpdateState(VCMReceiverState new_state);
79 void UpdateState(const VCMEncodedFrame& frame);
80 static int32_t GenerateReceiverId();
niklase@google.com470e71d2011-07-07 08:21:25 +000081
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000082 CriticalSectionWrapper* crit_sect_;
83 int32_t vcm_id_;
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +000084 Clock* clock_;
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000085 int32_t receiver_id_;
86 bool master_;
87 VCMJitterBuffer jitter_buffer_;
88 VCMTiming* timing_;
89 VCMEvent render_wait_event_;
90 VCMReceiverState state_;
niklase@google.com470e71d2011-07-07 08:21:25 +000091
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000092 static int32_t receiver_id_counter_;
niklase@google.com470e71d2011-07-07 08:21:25 +000093};
94
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000095} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +000096
stefan@webrtc.org1ea4b502013-01-07 08:49:41 +000097#endif // WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_RECEIVER_H_