OLD | NEW |
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 "content/renderer/pepper/pepper_audio_encoder_host.h" | 5 #include "content/renderer/pepper/pepper_audio_encoder_host.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 | 65 |
66 // Used on the media thread. | 66 // Used on the media thread. |
67 void Encode(uint8_t* input_data, | 67 void Encode(uint8_t* input_data, |
68 size_t input_size, | 68 size_t input_size, |
69 uint8_t* output_data, | 69 uint8_t* output_data, |
70 size_t output_size, | 70 size_t output_size, |
71 BitstreamBufferReadyCB callback); | 71 BitstreamBufferReadyCB callback); |
72 void RequestBitrateChange(uint32_t bitrate); | 72 void RequestBitrateChange(uint32_t bitrate); |
73 | 73 |
74 private: | 74 private: |
75 scoped_ptr<uint8_t[]> encoder_memory_; | 75 std::unique_ptr<uint8_t[]> encoder_memory_; |
76 OpusEncoder* opus_encoder_; | 76 OpusEncoder* opus_encoder_; |
77 | 77 |
78 // Initialization parameters, only valid if |encoder_memory_| is not | 78 // Initialization parameters, only valid if |encoder_memory_| is not |
79 // nullptr. | 79 // nullptr. |
80 ppapi::proxy::PPB_AudioEncodeParameters parameters_; | 80 ppapi::proxy::PPB_AudioEncodeParameters parameters_; |
81 | 81 |
82 DISALLOW_COPY_AND_ASSIGN(AudioEncoderImpl); | 82 DISALLOW_COPY_AND_ASSIGN(AudioEncoderImpl); |
83 }; | 83 }; |
84 | 84 |
85 PepperAudioEncoderHost::AudioEncoderImpl::AudioEncoderImpl() | 85 PepperAudioEncoderHost::AudioEncoderImpl::AudioEncoderImpl() |
(...skipping 23 matching lines...) Expand all Loading... |
109 const ppapi::proxy::PPB_AudioEncodeParameters& parameters) { | 109 const ppapi::proxy::PPB_AudioEncodeParameters& parameters) { |
110 if (parameters.output_profile != PP_AUDIOPROFILE_OPUS) | 110 if (parameters.output_profile != PP_AUDIOPROFILE_OPUS) |
111 return false; | 111 return false; |
112 | 112 |
113 DCHECK(!encoder_memory_); | 113 DCHECK(!encoder_memory_); |
114 | 114 |
115 int32_t encoder_size = opus_encoder_get_size(parameters.channels); | 115 int32_t encoder_size = opus_encoder_get_size(parameters.channels); |
116 if (encoder_size < 1) | 116 if (encoder_size < 1) |
117 return false; | 117 return false; |
118 | 118 |
119 scoped_ptr<uint8_t[]> encoder_memory(new uint8_t[encoder_size]); | 119 std::unique_ptr<uint8_t[]> encoder_memory(new uint8_t[encoder_size]); |
120 opus_encoder_ = reinterpret_cast<OpusEncoder*>(encoder_memory.get()); | 120 opus_encoder_ = reinterpret_cast<OpusEncoder*>(encoder_memory.get()); |
121 | 121 |
122 if (opus_encoder_init(opus_encoder_, parameters.input_sample_rate, | 122 if (opus_encoder_init(opus_encoder_, parameters.input_sample_rate, |
123 parameters.channels, OPUS_APPLICATION_AUDIO) != OPUS_OK) | 123 parameters.channels, OPUS_APPLICATION_AUDIO) != OPUS_OK) |
124 return false; | 124 return false; |
125 | 125 |
126 if (opus_encoder_ctl(opus_encoder_, | 126 if (opus_encoder_ctl(opus_encoder_, |
127 OPUS_SET_BITRATE(parameters.initial_bitrate <= 0 | 127 OPUS_SET_BITRATE(parameters.initial_bitrate <= 0 |
128 ? OPUS_AUTO | 128 ? OPUS_AUTO |
129 : parameters.initial_bitrate)) != | 129 : parameters.initial_bitrate)) != |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 | 215 |
216 int32_t PepperAudioEncoderHost::OnHostMsgInitialize( | 216 int32_t PepperAudioEncoderHost::OnHostMsgInitialize( |
217 ppapi::host::HostMessageContext* context, | 217 ppapi::host::HostMessageContext* context, |
218 const ppapi::proxy::PPB_AudioEncodeParameters& parameters) { | 218 const ppapi::proxy::PPB_AudioEncodeParameters& parameters) { |
219 if (initialized_) | 219 if (initialized_) |
220 return PP_ERROR_FAILED; | 220 return PP_ERROR_FAILED; |
221 | 221 |
222 if (!IsInitializationValid(parameters)) | 222 if (!IsInitializationValid(parameters)) |
223 return PP_ERROR_NOTSUPPORTED; | 223 return PP_ERROR_NOTSUPPORTED; |
224 | 224 |
225 scoped_ptr<AudioEncoderImpl> encoder(new AudioEncoderImpl); | 225 std::unique_ptr<AudioEncoderImpl> encoder(new AudioEncoderImpl); |
226 if (!encoder->Initialize(parameters)) | 226 if (!encoder->Initialize(parameters)) |
227 return PP_ERROR_FAILED; | 227 return PP_ERROR_FAILED; |
228 if (!AllocateBuffers(parameters, encoder->GetNumberOfSamplesPerFrame())) | 228 if (!AllocateBuffers(parameters, encoder->GetNumberOfSamplesPerFrame())) |
229 return PP_ERROR_NOMEMORY; | 229 return PP_ERROR_NOMEMORY; |
230 | 230 |
231 initialized_ = true; | 231 initialized_ = true; |
232 encoder_last_error_ = PP_OK; | 232 encoder_last_error_ = PP_OK; |
233 encoder_.swap(encoder); | 233 encoder_.swap(encoder); |
234 | 234 |
235 ppapi::host::ReplyMessageContext reply_context = | 235 ppapi::host::ReplyMessageContext reply_context = |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 bitstream_buffer_size *= 2; | 357 bitstream_buffer_size *= 2; |
358 bitstream_buffer_size += sizeof(ppapi::MediaStreamBuffer::Bitstream); | 358 bitstream_buffer_size += sizeof(ppapi::MediaStreamBuffer::Bitstream); |
359 base::CheckedNumeric<size_t> total_bitstream_memory_size = | 359 base::CheckedNumeric<size_t> total_bitstream_memory_size = |
360 bitstream_buffer_size; | 360 bitstream_buffer_size; |
361 total_bitstream_memory_size *= kDefaultNumberOfAudioBuffers; | 361 total_bitstream_memory_size *= kDefaultNumberOfAudioBuffers; |
362 | 362 |
363 if (!total_audio_memory_size.IsValid() || | 363 if (!total_audio_memory_size.IsValid() || |
364 !total_bitstream_memory_size.IsValid()) | 364 !total_bitstream_memory_size.IsValid()) |
365 return false; | 365 return false; |
366 | 366 |
367 scoped_ptr<base::SharedMemory> audio_memory( | 367 std::unique_ptr<base::SharedMemory> audio_memory( |
368 RenderThreadImpl::current()->HostAllocateSharedMemoryBuffer( | 368 RenderThreadImpl::current()->HostAllocateSharedMemoryBuffer( |
369 total_audio_memory_size.ValueOrDie())); | 369 total_audio_memory_size.ValueOrDie())); |
370 if (!audio_memory) | 370 if (!audio_memory) |
371 return false; | 371 return false; |
372 scoped_ptr<ppapi::MediaStreamBufferManager> audio_buffer_manager( | 372 std::unique_ptr<ppapi::MediaStreamBufferManager> audio_buffer_manager( |
373 new ppapi::MediaStreamBufferManager(this)); | 373 new ppapi::MediaStreamBufferManager(this)); |
374 if (!audio_buffer_manager->SetBuffers(kDefaultNumberOfAudioBuffers, | 374 if (!audio_buffer_manager->SetBuffers(kDefaultNumberOfAudioBuffers, |
375 total_audio_buffer_size.ValueOrDie(), | 375 total_audio_buffer_size.ValueOrDie(), |
376 std::move(audio_memory), false)) | 376 std::move(audio_memory), false)) |
377 return false; | 377 return false; |
378 | 378 |
379 for (int32_t i = 0; i < audio_buffer_manager->number_of_buffers(); ++i) { | 379 for (int32_t i = 0; i < audio_buffer_manager->number_of_buffers(); ++i) { |
380 ppapi::MediaStreamBuffer::Audio* buffer = | 380 ppapi::MediaStreamBuffer::Audio* buffer = |
381 &(audio_buffer_manager->GetBufferPointer(i)->audio); | 381 &(audio_buffer_manager->GetBufferPointer(i)->audio); |
382 buffer->header.size = total_audio_buffer_size.ValueOrDie(); | 382 buffer->header.size = total_audio_buffer_size.ValueOrDie(); |
383 buffer->header.type = ppapi::MediaStreamBuffer::TYPE_AUDIO; | 383 buffer->header.type = ppapi::MediaStreamBuffer::TYPE_AUDIO; |
384 buffer->sample_rate = | 384 buffer->sample_rate = |
385 static_cast<PP_AudioBuffer_SampleRate>(parameters.input_sample_rate); | 385 static_cast<PP_AudioBuffer_SampleRate>(parameters.input_sample_rate); |
386 buffer->number_of_channels = parameters.channels; | 386 buffer->number_of_channels = parameters.channels; |
387 buffer->number_of_samples = samples_per_frame; | 387 buffer->number_of_samples = samples_per_frame; |
388 buffer->data_size = audio_buffer_size.ValueOrDie(); | 388 buffer->data_size = audio_buffer_size.ValueOrDie(); |
389 } | 389 } |
390 | 390 |
391 scoped_ptr<base::SharedMemory> bitstream_memory( | 391 std::unique_ptr<base::SharedMemory> bitstream_memory( |
392 RenderThreadImpl::current()->HostAllocateSharedMemoryBuffer( | 392 RenderThreadImpl::current()->HostAllocateSharedMemoryBuffer( |
393 total_bitstream_memory_size.ValueOrDie())); | 393 total_bitstream_memory_size.ValueOrDie())); |
394 if (!bitstream_memory) | 394 if (!bitstream_memory) |
395 return false; | 395 return false; |
396 scoped_ptr<ppapi::MediaStreamBufferManager> bitstream_buffer_manager( | 396 std::unique_ptr<ppapi::MediaStreamBufferManager> bitstream_buffer_manager( |
397 new ppapi::MediaStreamBufferManager(this)); | 397 new ppapi::MediaStreamBufferManager(this)); |
398 if (!bitstream_buffer_manager->SetBuffers(kDefaultNumberOfAudioBuffers, | 398 if (!bitstream_buffer_manager->SetBuffers(kDefaultNumberOfAudioBuffers, |
399 bitstream_buffer_size.ValueOrDie(), | 399 bitstream_buffer_size.ValueOrDie(), |
400 std::move(bitstream_memory), true)) | 400 std::move(bitstream_memory), true)) |
401 return false; | 401 return false; |
402 | 402 |
403 for (int32_t i = 0; i < bitstream_buffer_manager->number_of_buffers(); ++i) { | 403 for (int32_t i = 0; i < bitstream_buffer_manager->number_of_buffers(); ++i) { |
404 ppapi::MediaStreamBuffer::Bitstream* buffer = | 404 ppapi::MediaStreamBuffer::Bitstream* buffer = |
405 &(bitstream_buffer_manager->GetBufferPointer(i)->bitstream); | 405 &(bitstream_buffer_manager->GetBufferPointer(i)->bitstream); |
406 buffer->header.size = bitstream_buffer_size.ValueOrDie(); | 406 buffer->header.size = bitstream_buffer_size.ValueOrDie(); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 // to avoid freeing memory the encoder might still be working on. | 487 // to avoid freeing memory the encoder might still be working on. |
488 media_task_runner_->PostTask( | 488 media_task_runner_->PostTask( |
489 FROM_HERE, | 489 FROM_HERE, |
490 base::Bind(&StopAudioEncoder, base::Passed(std::move(encoder_)), | 490 base::Bind(&StopAudioEncoder, base::Passed(std::move(encoder_)), |
491 base::Passed(std::move(audio_buffer_manager_)), | 491 base::Passed(std::move(audio_buffer_manager_)), |
492 base::Passed(std::move(bitstream_buffer_manager_)))); | 492 base::Passed(std::move(bitstream_buffer_manager_)))); |
493 } | 493 } |
494 | 494 |
495 // static | 495 // static |
496 void PepperAudioEncoderHost::StopAudioEncoder( | 496 void PepperAudioEncoderHost::StopAudioEncoder( |
497 scoped_ptr<AudioEncoderImpl> encoder, | 497 std::unique_ptr<AudioEncoderImpl> encoder, |
498 scoped_ptr<ppapi::MediaStreamBufferManager> audio_buffer_manager, | 498 std::unique_ptr<ppapi::MediaStreamBufferManager> audio_buffer_manager, |
499 scoped_ptr<ppapi::MediaStreamBufferManager> bitstream_buffer_manager) {} | 499 std::unique_ptr<ppapi::MediaStreamBufferManager> bitstream_buffer_manager) { |
| 500 } |
500 | 501 |
501 } // namespace content | 502 } // namespace content |
OLD | NEW |