| 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/video_sender/external_video_encoder.h" | 5 #include "media/cast/video_sender/external_video_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/memory/scoped_vector.h" | 9 #include "base/memory/scoped_vector.h" |
| 10 #include "base/memory/shared_memory.h" | 10 #include "base/memory/shared_memory.h" |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 | 66 |
| 67 // Initialize the real HW encoder. | 67 // Initialize the real HW encoder. |
| 68 void Initialize(const VideoSenderConfig& video_config) { | 68 void Initialize(const VideoSenderConfig& video_config) { |
| 69 DCHECK(gpu_factories_); | 69 DCHECK(gpu_factories_); |
| 70 DCHECK(encoder_task_runner_); | 70 DCHECK(encoder_task_runner_); |
| 71 | 71 |
| 72 DCHECK(encoder_task_runner_->RunsTasksOnCurrentThread()); | 72 DCHECK(encoder_task_runner_->RunsTasksOnCurrentThread()); |
| 73 | 73 |
| 74 video_encode_accelerator_ = | 74 video_encode_accelerator_ = |
| 75 gpu_factories_->CreateVideoEncodeAccelerator().Pass(); | 75 gpu_factories_->CreateVideoEncodeAccelerator().Pass(); |
| 76 if (!video_encode_accelerator_) | 76 if (!video_encode_accelerator_) { |
| 77 NotifyError(VideoEncodeAccelerator::kPlatformFailureError); |
| 77 return; | 78 return; |
| 79 } |
| 78 | 80 |
| 79 VideoCodecProfile output_profile = media::VIDEO_CODEC_PROFILE_UNKNOWN; | 81 VideoCodecProfile output_profile = media::VIDEO_CODEC_PROFILE_UNKNOWN; |
| 80 switch (video_config.codec) { | 82 switch (video_config.codec) { |
| 81 case transport::kVp8: | 83 case transport::kVp8: |
| 82 output_profile = media::VP8PROFILE_MAIN; | 84 output_profile = media::VP8PROFILE_MAIN; |
| 83 break; | 85 break; |
| 84 case transport::kH264: | 86 case transport::kH264: |
| 85 output_profile = media::H264PROFILE_MAIN; | 87 output_profile = media::H264PROFILE_MAIN; |
| 86 break; | 88 break; |
| 87 } | 89 } |
| 88 codec_ = video_config.codec; | 90 codec_ = video_config.codec; |
| 89 max_frame_rate_ = video_config.max_frame_rate; | 91 max_frame_rate_ = video_config.max_frame_rate; |
| 90 | 92 |
| 91 // Asynchronous initialization call; NotifyInitializeDone or NotifyError | 93 if (!video_encode_accelerator_->Initialize( |
| 92 // will be called once the HW is initialized. | 94 media::VideoFrame::I420, |
| 93 video_encode_accelerator_->Initialize( | 95 gfx::Size(video_config.width, video_config.height), |
| 94 media::VideoFrame::I420, | 96 output_profile, |
| 95 gfx::Size(video_config.width, video_config.height), | 97 video_config.start_bitrate, |
| 96 output_profile, | 98 this)) { |
| 97 video_config.start_bitrate, | 99 NotifyError(VideoEncodeAccelerator::kInvalidArgumentError); |
| 98 this); | 100 return; |
| 101 } |
| 102 |
| 103 cast_environment_->PostTask( |
| 104 CastEnvironment::MAIN, |
| 105 FROM_HERE, |
| 106 base::Bind(&ExternalVideoEncoder::EncoderInitialized, weak_owner_)); |
| 99 } | 107 } |
| 100 | 108 |
| 101 // Free the HW. | 109 // Free the HW. |
| 102 void Destroy() { | 110 void Destroy() { |
| 103 DCHECK(encoder_task_runner_); | 111 DCHECK(encoder_task_runner_); |
| 104 DCHECK(encoder_task_runner_->RunsTasksOnCurrentThread()); | 112 DCHECK(encoder_task_runner_->RunsTasksOnCurrentThread()); |
| 105 | 113 |
| 106 if (video_encode_accelerator_) { | 114 if (video_encode_accelerator_) { |
| 107 video_encode_accelerator_.release()->Destroy(); | 115 video_encode_accelerator_.release()->Destroy(); |
| 108 } | 116 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 frame.get()); | 177 frame.get()); |
| 170 | 178 |
| 171 encoded_frame_data_storage_.push_back( | 179 encoded_frame_data_storage_.push_back( |
| 172 EncodedFrameReturnData(capture_time, frame_encoded_callback)); | 180 EncodedFrameReturnData(capture_time, frame_encoded_callback)); |
| 173 | 181 |
| 174 // BitstreamBufferReady will be called once the encoder is done. | 182 // BitstreamBufferReady will be called once the encoder is done. |
| 175 video_encode_accelerator_->Encode(frame, key_frame_requested); | 183 video_encode_accelerator_->Encode(frame, key_frame_requested); |
| 176 } | 184 } |
| 177 | 185 |
| 178 protected: | 186 protected: |
| 179 virtual void NotifyInitializeDone() OVERRIDE { | |
| 180 DCHECK(encoder_task_runner_); | |
| 181 DCHECK(encoder_task_runner_->RunsTasksOnCurrentThread()); | |
| 182 | |
| 183 cast_environment_->PostTask( | |
| 184 CastEnvironment::MAIN, | |
| 185 FROM_HERE, | |
| 186 base::Bind(&ExternalVideoEncoder::EncoderInitialized, weak_owner_)); | |
| 187 } | |
| 188 | |
| 189 virtual void NotifyError(VideoEncodeAccelerator::Error error) OVERRIDE { | 187 virtual void NotifyError(VideoEncodeAccelerator::Error error) OVERRIDE { |
| 190 DCHECK(encoder_task_runner_); | 188 DCHECK(encoder_task_runner_); |
| 191 DCHECK(encoder_task_runner_->RunsTasksOnCurrentThread()); | 189 DCHECK(encoder_task_runner_->RunsTasksOnCurrentThread()); |
| 192 VLOG(1) << "ExternalVideoEncoder NotifyError: " << error; | 190 VLOG(1) << "ExternalVideoEncoder NotifyError: " << error; |
| 193 | 191 |
| 194 if (video_encode_accelerator_) { | 192 if (video_encode_accelerator_) { |
| 195 video_encode_accelerator_.release()->Destroy(); | 193 video_encode_accelerator_.release()->Destroy(); |
| 196 } | 194 } |
| 197 cast_environment_->PostTask( | 195 cast_environment_->PostTask( |
| 198 CastEnvironment::MAIN, | 196 CastEnvironment::MAIN, |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 // Do nothing not supported. | 447 // Do nothing not supported. |
| 450 } | 448 } |
| 451 | 449 |
| 452 int ExternalVideoEncoder::NumberOfSkippedFrames() const { | 450 int ExternalVideoEncoder::NumberOfSkippedFrames() const { |
| 453 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 451 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| 454 return skip_count_; | 452 return skip_count_; |
| 455 } | 453 } |
| 456 | 454 |
| 457 } // namespace cast | 455 } // namespace cast |
| 458 } // namespace media | 456 } // namespace media |
| OLD | NEW |