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

Side by Side Diff: trunk/src/media/cast/audio_sender/audio_encoder.cc

Issue 25546003: Revert 226264 "Be able to build cast_unittest and related target..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 7 years, 2 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "media/cast/audio_sender/audio_encoder.h" 5 #include "media/cast/audio_sender/audio_encoder.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "media/cast/cast_defines.h" 10 #include "media/cast/cast_defines.h"
(...skipping 17 matching lines...) Expand all
28 frequency_(frequency), 28 frequency_(frequency),
29 cast_thread_(cast_thread), 29 cast_thread_(cast_thread),
30 last_timestamp_(0) {} 30 last_timestamp_(0) {}
31 31
32 virtual int32 SendData( 32 virtual int32 SendData(
33 webrtc::FrameType /*frame_type*/, 33 webrtc::FrameType /*frame_type*/,
34 uint8 /*payload_type*/, 34 uint8 /*payload_type*/,
35 uint32 timestamp, 35 uint32 timestamp,
36 const uint8* payload_data, 36 const uint8* payload_data,
37 uint16 payload_size, 37 uint16 payload_size,
38 const webrtc::RTPFragmentationHeader* /*fragmentation*/) OVERRIDE { 38 const webrtc::RTPFragmentationHeader* /*fragmentation*/) {
39 scoped_ptr<EncodedAudioFrame> audio_frame(new EncodedAudioFrame()); 39 scoped_ptr<EncodedAudioFrame> audio_frame(new EncodedAudioFrame());
40 audio_frame->codec = codec_; 40 audio_frame->codec = codec_;
41 audio_frame->samples = timestamp - last_timestamp_; 41 audio_frame->samples = timestamp - last_timestamp_;
42 DCHECK(audio_frame->samples <= kMaxNumberOfSamples); 42 DCHECK(audio_frame->samples <= kMaxNumberOfSamples);
43 last_timestamp_ = timestamp; 43 last_timestamp_ = timestamp;
44 audio_frame->data.insert(audio_frame->data.begin(), 44 audio_frame->data.insert(audio_frame->data.begin(),
45 payload_data, 45 payload_data,
46 payload_data + payload_size); 46 payload_data + payload_size);
47 47
48 cast_thread_->PostTask(CastThread::MAIN, FROM_HERE, 48 cast_thread_->PostTask(CastThread::MAIN, FROM_HERE,
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 default: 103 default:
104 DCHECK(false) << "Codec must be specified for audio encoder"; 104 DCHECK(false) << "Codec must be specified for audio encoder";
105 return; 105 return;
106 } 106 }
107 if (audio_encoder_->RegisterSendCodec(send_codec) != 0) { 107 if (audio_encoder_->RegisterSendCodec(send_codec) != 0) {
108 DCHECK(false) << "Invalid webrtc return value; failed to register codec"; 108 DCHECK(false) << "Invalid webrtc return value; failed to register codec";
109 } 109 }
110 } 110 }
111 111
112 AudioEncoder::~AudioEncoder() { 112 AudioEncoder::~AudioEncoder() {
113 webrtc::AudioCodingModule::Destroy(audio_encoder_);
113 } 114 }
114 115
115 // Called from main cast thread. 116 // Called from main cast thread.
116 void AudioEncoder::InsertRawAudioFrame( 117 void AudioEncoder::InsertRawAudioFrame(
117 const PcmAudioFrame* audio_frame, 118 const PcmAudioFrame* audio_frame,
118 const base::TimeTicks& recorded_time, 119 const base::TimeTicks& recorded_time,
119 const FrameEncodedCallback& frame_encoded_callback, 120 const FrameEncodedCallback& frame_encoded_callback,
120 const base::Closure release_callback) { 121 const base::Closure release_callback) {
121 cast_thread_->PostTask(CastThread::AUDIO_ENCODER, FROM_HERE, 122 cast_thread_->PostTask(CastThread::AUDIO_ENCODER, FROM_HERE,
122 base::Bind(&AudioEncoder::EncodeAudioFrameThread, this, audio_frame, 123 base::Bind(&AudioEncoder::EncodeAudioFrameThread, this, audio_frame,
123 recorded_time, frame_encoded_callback, release_callback)); 124 recorded_time, frame_encoded_callback, release_callback));
124 } 125 }
125 126
126 // Called from cast audio encoder thread. 127 // Called from cast audio encoder thread.
127 void AudioEncoder::EncodeAudioFrameThread( 128 void AudioEncoder::EncodeAudioFrameThread(
128 const PcmAudioFrame* audio_frame, 129 const PcmAudioFrame* audio_frame,
129 const base::TimeTicks& recorded_time, 130 const base::TimeTicks& recorded_time,
130 const FrameEncodedCallback& frame_encoded_callback, 131 const FrameEncodedCallback& frame_encoded_callback,
131 const base::Closure release_callback) { 132 const base::Closure release_callback) {
132 DCHECK(cast_thread_->CurrentlyOn(CastThread::AUDIO_ENCODER)); 133 DCHECK(cast_thread_->CurrentlyOn(CastThread::AUDIO_ENCODER));
133 int samples_per_10ms = audio_frame->frequency / 100; 134 int samples_per_10ms = audio_frame->frequency / 100;
134 size_t number_of_10ms_blocks = audio_frame->samples.size() / 135 int number_of_10ms_blocks = audio_frame->samples.size() /
135 (samples_per_10ms * audio_frame->channels); 136 (samples_per_10ms * audio_frame->channels);
136 DCHECK(webrtc::AudioFrame::kMaxDataSizeSamples > samples_per_10ms) 137 DCHECK(webrtc::AudioFrame::kMaxDataSizeSamples > samples_per_10ms)
137 << "webrtc sanity check failed"; 138 << "webrtc sanity check failed";
138 139
139 for (size_t i = 0; i < number_of_10ms_blocks; ++i) { 140 for (int i = 0; i < number_of_10ms_blocks; ++i) {
140 webrtc::AudioFrame webrtc_audio_frame; 141 webrtc::AudioFrame webrtc_audio_frame;
141 webrtc_audio_frame.timestamp_ = timestamp_; 142 webrtc_audio_frame.timestamp_ = timestamp_;
142 143
143 // Due to the webrtc::AudioFrame declaration we need to copy our data into 144 // Due to the webrtc::AudioFrame declaration we need to copy our data into
144 // the webrtc structure. 145 // the webrtc structure.
145 memcpy(&webrtc_audio_frame.data_[0], 146 memcpy(&webrtc_audio_frame.data_[0],
146 &audio_frame->samples[i * samples_per_10ms * audio_frame->channels], 147 &audio_frame->samples[i * samples_per_10ms * audio_frame->channels],
147 samples_per_10ms * audio_frame->channels * sizeof(int16)); 148 samples_per_10ms * audio_frame->channels * sizeof(int16));
148 webrtc_audio_frame.samples_per_channel_ = samples_per_10ms; 149 webrtc_audio_frame.samples_per_channel_ = samples_per_10ms;
149 webrtc_audio_frame.sample_rate_hz_ = audio_frame->frequency; 150 webrtc_audio_frame.sample_rate_hz_ = audio_frame->frequency;
150 webrtc_audio_frame.num_channels_ = audio_frame->channels; 151 webrtc_audio_frame.num_channels_ = audio_frame->channels;
151 152
152 // webrtc::AudioCodingModule is thread safe. 153 // webrtc::AudioCodingModule is thread safe.
153 if (audio_encoder_->Add10MsData(webrtc_audio_frame) != 0) { 154 if (audio_encoder_->Add10MsData(webrtc_audio_frame) != 0) {
154 DCHECK(false) << "Invalid webrtc return value"; 155 DCHECK(false) << "Invalid webrtc return value";
155 } 156 }
156 timestamp_ += samples_per_10ms; 157 timestamp_ += samples_per_10ms;
157 } 158 }
158 // We are done with the audio frame release it. 159 // We are done with the audio frame release it.
159 cast_thread_->PostTask(CastThread::MAIN, FROM_HERE, release_callback); 160 cast_thread_->PostTask(CastThread::MAIN, FROM_HERE, release_callback);
160 161
161 // Note: 162 // Note:
162 // Not all insert of 10 ms will generate a callback with encoded data. 163 // Not all insert of 10 ms will generate a callback with encoded data.
163 webrtc_encoder_callback_->SetEncodedCallbackInfo(recorded_time, 164 webrtc_encoder_callback_->SetEncodedCallbackInfo(recorded_time,
164 &frame_encoded_callback); 165 &frame_encoded_callback);
165 for (size_t i = 0; i < number_of_10ms_blocks; ++i) { 166 for (int i = 0; i < number_of_10ms_blocks; ++i) {
166 audio_encoder_->Process(); 167 audio_encoder_->Process();
167 } 168 }
168 } 169 }
169 170
170 } // namespace media 171 } // namespace media
171 } // namespace cast 172 } // namespace cast
OLDNEW
« no previous file with comments | « trunk/src/media/cast/audio_sender/audio_encoder.h ('k') | trunk/src/media/cast/audio_sender/audio_encoder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698