Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(572)

Side by Side Diff: webrtc/video/encoder_state_feedback.cc

Issue 1706803002: Simplify EncoderStateFeedback. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: remove unused headers Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/video/encoder_state_feedback.h ('k') | webrtc/video/encoder_state_feedback_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include "webrtc/video/encoder_state_feedback.h" 11 #include "webrtc/video/encoder_state_feedback.h"
12 12
13 #include <assert.h>
14
15 #include "webrtc/base/checks.h" 13 #include "webrtc/base/checks.h"
16 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
17 #include "webrtc/video/vie_encoder.h" 14 #include "webrtc/video/vie_encoder.h"
18 15
19 namespace webrtc { 16 namespace webrtc {
20 17
21 // Helper class registered at the RTP module relaying callbacks to 18 EncoderStateFeedback::EncoderStateFeedback() : vie_encoder_(nullptr) {}
22 // EncoderStatFeedback.
23 class EncoderStateFeedbackObserver : public RtcpIntraFrameObserver {
24 public:
25 explicit EncoderStateFeedbackObserver(EncoderStateFeedback* owner)
26 : owner_(owner) {}
27 ~EncoderStateFeedbackObserver() {}
28 19
29 // Implements RtcpIntraFrameObserver. 20 void EncoderStateFeedback::Init(const std::vector<uint32_t>& ssrcs,
30 virtual void OnReceivedIntraFrameRequest(uint32_t ssrc) { 21 ViEEncoder* encoder) {
31 owner_->OnReceivedIntraFrameRequest(ssrc); 22 RTC_DCHECK(!ssrcs.empty());
32 } 23 rtc::CritScope lock(&crit_);
33 virtual void OnReceivedSLI(uint32_t ssrc, uint8_t picture_id) { 24 ssrcs_ = ssrcs;
34 owner_->OnReceivedSLI(ssrc, picture_id); 25 vie_encoder_ = encoder;
35 }
36 virtual void OnReceivedRPSI(uint32_t ssrc, uint64_t picture_id) {
37 owner_->OnReceivedRPSI(ssrc, picture_id);
38 }
39
40 virtual void OnLocalSsrcChanged(uint32_t old_ssrc, uint32_t new_ssrc) {
41 owner_->OnLocalSsrcChanged(old_ssrc, new_ssrc);
42 }
43
44 private:
45 EncoderStateFeedback* owner_;
46 };
47
48 EncoderStateFeedback::EncoderStateFeedback()
49 : observer_(new EncoderStateFeedbackObserver(this)) {}
50
51 EncoderStateFeedback::~EncoderStateFeedback() {
52 assert(encoders_.empty());
53 } 26 }
54 27
55 void EncoderStateFeedback::AddEncoder(const std::vector<uint32_t>& ssrcs, 28 void EncoderStateFeedback::TearDown() {
56 ViEEncoder* encoder) {
57 RTC_DCHECK(!ssrcs.empty());
58 rtc::CritScope lock(&crit_); 29 rtc::CritScope lock(&crit_);
59 for (uint32_t ssrc : ssrcs) { 30 RTC_DCHECK(vie_encoder_);
60 RTC_DCHECK(encoders_.find(ssrc) == encoders_.end()); 31 ssrcs_.clear();
61 encoders_[ssrc] = encoder; 32 vie_encoder_ = nullptr;
62 }
63 } 33 }
64 34
65 void EncoderStateFeedback::RemoveEncoder(const ViEEncoder* encoder) { 35 bool EncoderStateFeedback::HasSsrc(uint32_t ssrc) {
66 rtc::CritScope lock(&crit_); 36 for (uint32_t registered_ssrc : ssrcs_) {
67 SsrcEncoderMap::iterator it = encoders_.begin(); 37 if (registered_ssrc == ssrc)
68 while (it != encoders_.end()) { 38 return true;
69 if (it->second == encoder) {
70 encoders_.erase(it++);
71 } else {
72 ++it;
73 }
74 } 39 }
75 } 40 return false;
76
77 RtcpIntraFrameObserver* EncoderStateFeedback::GetRtcpIntraFrameObserver() {
78 return observer_.get();
79 } 41 }
80 42
81 void EncoderStateFeedback::OnReceivedIntraFrameRequest(uint32_t ssrc) { 43 void EncoderStateFeedback::OnReceivedIntraFrameRequest(uint32_t ssrc) {
82 rtc::CritScope lock(&crit_); 44 rtc::CritScope lock(&crit_);
83 SsrcEncoderMap::iterator it = encoders_.find(ssrc); 45 if (!HasSsrc(ssrc))
84 if (it == encoders_.end())
85 return; 46 return;
47 RTC_DCHECK(vie_encoder_);
86 48
87 it->second->OnReceivedIntraFrameRequest(ssrc); 49 vie_encoder_->OnReceivedIntraFrameRequest(ssrc);
88 } 50 }
89 51
90 void EncoderStateFeedback::OnReceivedSLI(uint32_t ssrc, uint8_t picture_id) { 52 void EncoderStateFeedback::OnReceivedSLI(uint32_t ssrc, uint8_t picture_id) {
91 rtc::CritScope lock(&crit_); 53 rtc::CritScope lock(&crit_);
92 SsrcEncoderMap::iterator it = encoders_.find(ssrc); 54 if (!HasSsrc(ssrc))
93 if (it == encoders_.end())
94 return; 55 return;
56 RTC_DCHECK(vie_encoder_);
95 57
96 it->second->OnReceivedSLI(ssrc, picture_id); 58 vie_encoder_->OnReceivedSLI(ssrc, picture_id);
97 } 59 }
98 60
99 void EncoderStateFeedback::OnReceivedRPSI(uint32_t ssrc, uint64_t picture_id) { 61 void EncoderStateFeedback::OnReceivedRPSI(uint32_t ssrc, uint64_t picture_id) {
100 rtc::CritScope lock(&crit_); 62 rtc::CritScope lock(&crit_);
101 SsrcEncoderMap::iterator it = encoders_.find(ssrc); 63 if (!HasSsrc(ssrc))
102 if (it == encoders_.end())
103 return; 64 return;
65 RTC_DCHECK(vie_encoder_);
104 66
105 it->second->OnReceivedRPSI(ssrc, picture_id); 67 vie_encoder_->OnReceivedRPSI(ssrc, picture_id);
106 } 68 }
107 69
70 // Sending SSRCs for this encoder should never change since they are configured
71 // once and not reconfigured.
108 void EncoderStateFeedback::OnLocalSsrcChanged(uint32_t old_ssrc, 72 void EncoderStateFeedback::OnLocalSsrcChanged(uint32_t old_ssrc,
109 uint32_t new_ssrc) { 73 uint32_t new_ssrc) {
74 if (!RTC_DCHECK_IS_ON)
75 return;
110 rtc::CritScope lock(&crit_); 76 rtc::CritScope lock(&crit_);
111 SsrcEncoderMap::iterator it = encoders_.find(old_ssrc); 77 if (ssrcs_.empty()) // Encoder not yet attached (or detached for teardown).
112 if (it == encoders_.end() || encoders_.find(new_ssrc) != encoders_.end()) {
113 return; 78 return;
114 } 79 // SSRC shouldn't change to something we haven't already registered with the
115 80 // encoder.
116 ViEEncoder* encoder = it->second; 81 RTC_DCHECK(HasSsrc(new_ssrc));
117 encoders_.erase(it);
118 encoders_[new_ssrc] = encoder;
119 encoder->OnLocalSsrcChanged(old_ssrc, new_ssrc);
120 } 82 }
121 83
122 } // namespace webrtc 84 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/video/encoder_state_feedback.h ('k') | webrtc/video/encoder_state_feedback_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698