| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/sender/external_video_encoder.h" | 5 #include "media/cast/sender/external_video_encoder.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <utility> |
| 8 | 9 |
| 9 #include "base/bind.h" | 10 #include "base/bind.h" |
| 10 #include "base/debug/crash_logging.h" | 11 #include "base/debug/crash_logging.h" |
| 11 #include "base/debug/dump_without_crashing.h" | 12 #include "base/debug/dump_without_crashing.h" |
| 12 #include "base/format_macros.h" | 13 #include "base/format_macros.h" |
| 13 #include "base/logging.h" | 14 #include "base/logging.h" |
| 14 #include "base/macros.h" | 15 #include "base/macros.h" |
| 15 #include "base/memory/scoped_vector.h" | 16 #include "base/memory/scoped_vector.h" |
| 16 #include "base/memory/shared_memory.h" | 17 #include "base/memory/shared_memory.h" |
| 17 #include "base/message_loop/message_loop.h" | 18 #include "base/message_loop/message_loop.h" |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 const scoped_refptr<base::SingleThreadTaskRunner>& encoder_task_runner, | 82 const scoped_refptr<base::SingleThreadTaskRunner>& encoder_task_runner, |
| 82 scoped_ptr<media::VideoEncodeAccelerator> vea, | 83 scoped_ptr<media::VideoEncodeAccelerator> vea, |
| 83 int max_frame_rate, | 84 int max_frame_rate, |
| 84 const StatusChangeCallback& status_change_cb, | 85 const StatusChangeCallback& status_change_cb, |
| 85 const CreateVideoEncodeMemoryCallback& create_video_encode_memory_cb) | 86 const CreateVideoEncodeMemoryCallback& create_video_encode_memory_cb) |
| 86 : cast_environment_(cast_environment), | 87 : cast_environment_(cast_environment), |
| 87 task_runner_(encoder_task_runner), | 88 task_runner_(encoder_task_runner), |
| 88 max_frame_rate_(max_frame_rate), | 89 max_frame_rate_(max_frame_rate), |
| 89 status_change_cb_(status_change_cb), | 90 status_change_cb_(status_change_cb), |
| 90 create_video_encode_memory_cb_(create_video_encode_memory_cb), | 91 create_video_encode_memory_cb_(create_video_encode_memory_cb), |
| 91 video_encode_accelerator_(vea.Pass()), | 92 video_encode_accelerator_(std::move(vea)), |
| 92 encoder_active_(false), | 93 encoder_active_(false), |
| 93 next_frame_id_(0u), | 94 next_frame_id_(0u), |
| 94 key_frame_encountered_(false), | 95 key_frame_encountered_(false), |
| 95 codec_profile_(media::VIDEO_CODEC_PROFILE_UNKNOWN), | 96 codec_profile_(media::VIDEO_CODEC_PROFILE_UNKNOWN), |
| 96 key_frame_quantizer_parsable_(false), | 97 key_frame_quantizer_parsable_(false), |
| 97 requested_bit_rate_(-1), | 98 requested_bit_rate_(-1), |
| 98 has_seen_zero_length_encoded_frame_(false) {} | 99 has_seen_zero_length_encoded_frame_(false) {} |
| 99 | 100 |
| 100 base::SingleThreadTaskRunner* task_runner() const { | 101 base::SingleThreadTaskRunner* task_runner() const { |
| 101 return task_runner_.get(); | 102 return task_runner_.get(); |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 void OnCreateSharedMemory(scoped_ptr<base::SharedMemory> memory) { | 362 void OnCreateSharedMemory(scoped_ptr<base::SharedMemory> memory) { |
| 362 task_runner_->PostTask(FROM_HERE, | 363 task_runner_->PostTask(FROM_HERE, |
| 363 base::Bind(&VEAClientImpl::OnReceivedSharedMemory, | 364 base::Bind(&VEAClientImpl::OnReceivedSharedMemory, |
| 364 this, | 365 this, |
| 365 base::Passed(&memory))); | 366 base::Passed(&memory))); |
| 366 } | 367 } |
| 367 | 368 |
| 368 void OnReceivedSharedMemory(scoped_ptr<base::SharedMemory> memory) { | 369 void OnReceivedSharedMemory(scoped_ptr<base::SharedMemory> memory) { |
| 369 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 370 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| 370 | 371 |
| 371 output_buffers_.push_back(memory.Pass()); | 372 output_buffers_.push_back(std::move(memory)); |
| 372 | 373 |
| 373 // Wait until all requested buffers are received. | 374 // Wait until all requested buffers are received. |
| 374 if (output_buffers_.size() < kOutputBufferCount) | 375 if (output_buffers_.size() < kOutputBufferCount) |
| 375 return; | 376 return; |
| 376 | 377 |
| 377 // Immediately provide all output buffers to the VEA. | 378 // Immediately provide all output buffers to the VEA. |
| 378 for (size_t i = 0; i < output_buffers_.size(); ++i) { | 379 for (size_t i = 0; i < output_buffers_.size(); ++i) { |
| 379 video_encode_accelerator_->UseOutputBitstreamBuffer( | 380 video_encode_accelerator_->UseOutputBitstreamBuffer( |
| 380 media::BitstreamBuffer(static_cast<int32_t>(i), | 381 media::BitstreamBuffer(static_cast<int32_t>(i), |
| 381 output_buffers_[i]->handle(), | 382 output_buffers_[i]->handle(), |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 // ...flow through to next case... | 592 // ...flow through to next case... |
| 592 default: | 593 default: |
| 593 cast_environment_->PostTask( | 594 cast_environment_->PostTask( |
| 594 CastEnvironment::MAIN, | 595 CastEnvironment::MAIN, |
| 595 FROM_HERE, | 596 FROM_HERE, |
| 596 base::Bind(status_change_cb, STATUS_UNSUPPORTED_CODEC)); | 597 base::Bind(status_change_cb, STATUS_UNSUPPORTED_CODEC)); |
| 597 return; | 598 return; |
| 598 } | 599 } |
| 599 | 600 |
| 600 DCHECK(!client_); | 601 DCHECK(!client_); |
| 601 client_ = new VEAClientImpl(cast_environment_, | 602 client_ = new VEAClientImpl(cast_environment_, encoder_task_runner, |
| 602 encoder_task_runner, | 603 std::move(vea), video_config.max_frame_rate, |
| 603 vea.Pass(), | 604 status_change_cb, create_video_encode_memory_cb_); |
| 604 video_config.max_frame_rate, | |
| 605 status_change_cb, | |
| 606 create_video_encode_memory_cb_); | |
| 607 client_->task_runner()->PostTask(FROM_HERE, | 605 client_->task_runner()->PostTask(FROM_HERE, |
| 608 base::Bind(&VEAClientImpl::Initialize, | 606 base::Bind(&VEAClientImpl::Initialize, |
| 609 client_, | 607 client_, |
| 610 frame_size_, | 608 frame_size_, |
| 611 codec_profile, | 609 codec_profile, |
| 612 bit_rate_, | 610 bit_rate_, |
| 613 first_frame_id)); | 611 first_frame_id)); |
| 614 } | 612 } |
| 615 | 613 |
| 616 SizeAdaptableExternalVideoEncoder::SizeAdaptableExternalVideoEncoder( | 614 SizeAdaptableExternalVideoEncoder::SizeAdaptableExternalVideoEncoder( |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 787 const double kEntropyAtMaxQuantizer = 7.5; | 785 const double kEntropyAtMaxQuantizer = 7.5; |
| 788 const double slope = | 786 const double slope = |
| 789 (MAX_VP8_QUANTIZER - MIN_VP8_QUANTIZER) / kEntropyAtMaxQuantizer; | 787 (MAX_VP8_QUANTIZER - MIN_VP8_QUANTIZER) / kEntropyAtMaxQuantizer; |
| 790 const double quantizer = std::min<double>( | 788 const double quantizer = std::min<double>( |
| 791 MAX_VP8_QUANTIZER, MIN_VP8_QUANTIZER + slope * shannon_entropy); | 789 MAX_VP8_QUANTIZER, MIN_VP8_QUANTIZER + slope * shannon_entropy); |
| 792 return quantizer; | 790 return quantizer; |
| 793 } | 791 } |
| 794 | 792 |
| 795 } // namespace cast | 793 } // namespace cast |
| 796 } // namespace media | 794 } // namespace media |
| OLD | NEW |