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

Side by Side Diff: remoting/host/audio_pump.cc

Issue 914133003: Fix AudioPump to pause the stream when the network is congested. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@audio_pump
Patch Set: Created 5 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 | « remoting/host/audio_pump.h ('k') | remoting/host/audio_pump_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 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/host/audio_pump.h" 5 #include "remoting/host/audio_pump.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/single_thread_task_runner.h" 10 #include "base/single_thread_task_runner.h"
11 #include "base/thread_task_runner_handle.h" 11 #include "base/thread_task_runner_handle.h"
12 #include "remoting/codec/audio_encoder.h" 12 #include "remoting/codec/audio_encoder.h"
13 #include "remoting/host/audio_capturer.h" 13 #include "remoting/host/audio_capturer.h"
14 #include "remoting/proto/audio.pb.h" 14 #include "remoting/proto/audio.pb.h"
15 #include "remoting/protocol/audio_stub.h" 15 #include "remoting/protocol/audio_stub.h"
16 16
17 namespace remoting { 17 namespace remoting {
18 18
19 // Maximum number of bytes that can be stored in the send buffer before we start
20 // dropping packets. 5kB is about 0.25s in a stream with 160kb/s bitrate.
Wez 2015/02/12 02:29:47 Do we run our stream at a fixed bit-rate? If not t
Sergey Ulanov 2015/02/13 21:21:56 Our opus encoder uses this bitrate. See https://co
21 const int kMaxBufferedBytes = 5000;
22
19 class AudioPump::Core : public base::NonThreadSafe { 23 class AudioPump::Core : public base::NonThreadSafe {
20 public: 24 public:
21 Core(base::WeakPtr<AudioPump> pump, 25 Core(base::WeakPtr<AudioPump> pump,
22 scoped_ptr<AudioCapturer> audio_capturer, 26 scoped_ptr<AudioCapturer> audio_capturer,
23 scoped_ptr<AudioEncoder> audio_encoder); 27 scoped_ptr<AudioEncoder> audio_encoder);
24 ~Core(); 28 ~Core();
25 29
26 void Start(); 30 void Start();
27 void Pause(bool pause); 31 void Pause(bool pause);
28 32
33 void OnPacketSent(int size);
34
29 private: 35 private:
30 void EncodeAudioPacket(scoped_ptr<AudioPacket> packet); 36 void EncodeAudioPacket(scoped_ptr<AudioPacket> packet);
31 37
32 base::WeakPtr<AudioPump> pump_; 38 base::WeakPtr<AudioPump> pump_;
33
34 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_; 39 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_;
35
36 scoped_ptr<AudioCapturer> audio_capturer_; 40 scoped_ptr<AudioCapturer> audio_capturer_;
37
38 scoped_ptr<AudioEncoder> audio_encoder_; 41 scoped_ptr<AudioEncoder> audio_encoder_;
39 42
40 bool enabled_; 43 bool enabled_;
41 44
45 // Number of bytes in the queue that have been encoded but haven't been sent
46 // yet.
47 int bytes_pending_;
48
42 DISALLOW_COPY_AND_ASSIGN(Core); 49 DISALLOW_COPY_AND_ASSIGN(Core);
43 }; 50 };
44 51
45 AudioPump::Core::Core( 52 AudioPump::Core::Core(base::WeakPtr<AudioPump> pump,
46 base::WeakPtr<AudioPump> pump, 53 scoped_ptr<AudioCapturer> audio_capturer,
47 scoped_ptr<AudioCapturer> audio_capturer, 54 scoped_ptr<AudioEncoder> audio_encoder)
48 scoped_ptr<AudioEncoder> audio_encoder)
49 : pump_(pump), 55 : pump_(pump),
50 caller_task_runner_(base::ThreadTaskRunnerHandle::Get()), 56 caller_task_runner_(base::ThreadTaskRunnerHandle::Get()),
51 audio_capturer_(audio_capturer.Pass()), 57 audio_capturer_(audio_capturer.Pass()),
52 audio_encoder_(audio_encoder.Pass()), 58 audio_encoder_(audio_encoder.Pass()),
53 enabled_(true) { 59 enabled_(true),
60 bytes_pending_(0) {
54 DetachFromThread(); 61 DetachFromThread();
55 } 62 }
56 63
57 AudioPump::Core::~Core() { 64 AudioPump::Core::~Core() {
58 DCHECK(CalledOnValidThread()); 65 DCHECK(CalledOnValidThread());
59 } 66 }
60 67
61 void AudioPump::Core::Start() { 68 void AudioPump::Core::Start() {
62 DCHECK(CalledOnValidThread()); 69 DCHECK(CalledOnValidThread());
63 70
64 audio_capturer_->Start( 71 audio_capturer_->Start(
65 base::Bind(&Core::EncodeAudioPacket, base::Unretained(this))); 72 base::Bind(&Core::EncodeAudioPacket, base::Unretained(this)));
66 } 73 }
67 74
68 void AudioPump::Core::Pause(bool pause) { 75 void AudioPump::Core::Pause(bool pause) {
69 DCHECK(CalledOnValidThread()); 76 DCHECK(CalledOnValidThread());
70 77
71 enabled_ = !pause; 78 enabled_ = !pause;
72 } 79 }
73 80
81 void AudioPump::Core::OnPacketSent(int size) {
82 DCHECK(CalledOnValidThread());
83
84 bytes_pending_-= size;
85 DCHECK_GE(bytes_pending_, 0);
86 }
87
74 void AudioPump::Core::EncodeAudioPacket(scoped_ptr<AudioPacket> packet) { 88 void AudioPump::Core::EncodeAudioPacket(scoped_ptr<AudioPacket> packet) {
75 DCHECK(CalledOnValidThread()); 89 DCHECK(CalledOnValidThread());
76 DCHECK(packet); 90 DCHECK(packet);
77 91
78 if (!enabled_) 92 if (!enabled_ || bytes_pending_ > kMaxBufferedBytes)
79 return; 93 return;
80 94
95
81 scoped_ptr<AudioPacket> encoded_packet = 96 scoped_ptr<AudioPacket> encoded_packet =
82 audio_encoder_->Encode(packet.Pass()); 97 audio_encoder_->Encode(packet.Pass());
83 98
84 // The audio encoder returns a null audio packet if there's no audio to send. 99 // The audio encoder returns a null audio packet if there's no audio to send.
85 if (!encoded_packet) 100 if (!encoded_packet)
86 return; 101 return;
87 102
88 caller_task_runner_->PostTask(FROM_HERE, 103 int packet_size = encoded_packet->ByteSize();
89 base::Bind(&AudioPump::SendAudioPacket, pump_, 104 bytes_pending_ += packet_size;
90 base::Passed(&encoded_packet))); 105
106 caller_task_runner_->PostTask(
107 FROM_HERE, base::Bind(&AudioPump::SendAudioPacket, pump_,
108 base::Passed(&encoded_packet), packet_size));
91 } 109 }
92 110
93 AudioPump::AudioPump( 111 AudioPump::AudioPump(
94 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner, 112 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner,
95 scoped_ptr<AudioCapturer> audio_capturer, 113 scoped_ptr<AudioCapturer> audio_capturer,
96 scoped_ptr<AudioEncoder> audio_encoder, 114 scoped_ptr<AudioEncoder> audio_encoder,
97 protocol::AudioStub* audio_stub) 115 protocol::AudioStub* audio_stub)
98 : audio_task_runner_(audio_task_runner), 116 : audio_task_runner_(audio_task_runner),
99 audio_stub_(audio_stub), 117 audio_stub_(audio_stub),
100 weak_factory_(this) { 118 weak_factory_(this) {
(...skipping 13 matching lines...) Expand all
114 } 132 }
115 133
116 void AudioPump::Pause(bool pause) { 134 void AudioPump::Pause(bool pause) {
117 DCHECK(CalledOnValidThread()); 135 DCHECK(CalledOnValidThread());
118 136
119 audio_task_runner_->PostTask( 137 audio_task_runner_->PostTask(
120 FROM_HERE, 138 FROM_HERE,
121 base::Bind(&Core::Pause, base::Unretained(core_.get()), pause)); 139 base::Bind(&Core::Pause, base::Unretained(core_.get()), pause));
122 } 140 }
123 141
124 void AudioPump::SendAudioPacket(scoped_ptr<AudioPacket> packet) { 142 void AudioPump::SendAudioPacket(scoped_ptr<AudioPacket> packet, int size) {
125 DCHECK(CalledOnValidThread()); 143 DCHECK(CalledOnValidThread());
126 DCHECK(packet); 144 DCHECK(packet);
127 145
128 audio_stub_->ProcessAudioPacket(packet.Pass(), base::Closure()); 146 audio_stub_->ProcessAudioPacket(
147 packet.Pass(),
148 base::Bind(&AudioPump::OnPacketSent, weak_factory_.GetWeakPtr(), size));
149 }
150
151 void AudioPump::OnPacketSent(int size) {
152 audio_task_runner_->PostTask(
153 FROM_HERE,
154 base::Bind(&Core::OnPacketSent, base::Unretained(core_.get()), size));
129 } 155 }
130 156
131 } // namespace remoting 157 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/host/audio_pump.h ('k') | remoting/host/audio_pump_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698