| 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 "content/common/gpu/media/vaapi_video_encode_accelerator.h" | 5 #include "content/common/gpu/media/vaapi_video_encode_accelerator.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/message_loop/message_loop_proxy.h" | 10 #include "base/message_loop/message_loop_proxy.h" |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 | 106 |
| 107 std::vector<media::VideoEncodeAccelerator::SupportedProfile> | 107 std::vector<media::VideoEncodeAccelerator::SupportedProfile> |
| 108 VaapiVideoEncodeAccelerator::GetSupportedProfiles() { | 108 VaapiVideoEncodeAccelerator::GetSupportedProfiles() { |
| 109 std::vector<SupportedProfile> profiles; | 109 std::vector<SupportedProfile> profiles; |
| 110 | 110 |
| 111 const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); | 111 const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); |
| 112 if (cmd_line->HasSwitch(switches::kDisableVaapiAcceleratedVideoEncode)) | 112 if (cmd_line->HasSwitch(switches::kDisableVaapiAcceleratedVideoEncode)) |
| 113 return profiles; | 113 return profiles; |
| 114 | 114 |
| 115 std::vector<media::VideoCodecProfile> hw_profiles = | 115 std::vector<media::VideoCodecProfile> hw_profiles = |
| 116 VaapiWrapper::GetSupportedEncodeProfiles( | 116 VaapiWrapper::GetSupportedEncodeProfiles(base::Bind(&base::DoNothing)); |
| 117 x_display_, base::Bind(&base::DoNothing)); | |
| 118 | 117 |
| 119 media::VideoEncodeAccelerator::SupportedProfile profile; | 118 media::VideoEncodeAccelerator::SupportedProfile profile; |
| 120 profile.max_resolution.SetSize(1920, 1088); | 119 profile.max_resolution.SetSize(1920, 1088); |
| 121 profile.max_framerate_numerator = kDefaultFramerate; | 120 profile.max_framerate_numerator = kDefaultFramerate; |
| 122 profile.max_framerate_denominator = 1; | 121 profile.max_framerate_denominator = 1; |
| 123 for (size_t i = 0; i < hw_profiles.size(); i++) { | 122 for (size_t i = 0; i < hw_profiles.size(); i++) { |
| 124 profile.profile = hw_profiles[i]; | 123 profile.profile = hw_profiles[i]; |
| 125 profiles.push_back(profile); | 124 profiles.push_back(profile); |
| 126 } | 125 } |
| 127 return profiles; | 126 return profiles; |
| 128 } | 127 } |
| 129 | 128 |
| 130 static unsigned int Log2OfPowerOf2(unsigned int x) { | 129 static unsigned int Log2OfPowerOf2(unsigned int x) { |
| 131 CHECK_GT(x, 0u); | 130 CHECK_GT(x, 0u); |
| 132 DCHECK_EQ(x & (x - 1), 0u); | 131 DCHECK_EQ(x & (x - 1), 0u); |
| 133 | 132 |
| 134 int log = 0; | 133 int log = 0; |
| 135 while (x) { | 134 while (x) { |
| 136 x >>= 1; | 135 x >>= 1; |
| 137 ++log; | 136 ++log; |
| 138 } | 137 } |
| 139 return log; | 138 return log; |
| 140 } | 139 } |
| 141 | 140 |
| 142 VaapiVideoEncodeAccelerator::VaapiVideoEncodeAccelerator(Display* x_display) | 141 VaapiVideoEncodeAccelerator::VaapiVideoEncodeAccelerator() |
| 143 : profile_(media::VIDEO_CODEC_PROFILE_UNKNOWN), | 142 : profile_(media::VIDEO_CODEC_PROFILE_UNKNOWN), |
| 144 mb_width_(0), | 143 mb_width_(0), |
| 145 mb_height_(0), | 144 mb_height_(0), |
| 146 output_buffer_byte_size_(0), | 145 output_buffer_byte_size_(0), |
| 147 x_display_(x_display), | |
| 148 state_(kUninitialized), | 146 state_(kUninitialized), |
| 149 frame_num_(0), | 147 frame_num_(0), |
| 150 last_idr_frame_num_(0), | 148 last_idr_frame_num_(0), |
| 151 bitrate_(0), | 149 bitrate_(0), |
| 152 framerate_(0), | 150 framerate_(0), |
| 153 cpb_size_(0), | 151 cpb_size_(0), |
| 154 encoding_parameters_changed_(false), | 152 encoding_parameters_changed_(false), |
| 155 encoder_thread_("VAVEAEncoderThread"), | 153 encoder_thread_("VAVEAEncoderThread"), |
| 156 child_message_loop_proxy_(base::MessageLoopProxy::current()), | 154 child_message_loop_proxy_(base::MessageLoopProxy::current()), |
| 157 weak_this_ptr_factory_(this) { | 155 weak_this_ptr_factory_(this) { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 coded_size_ = gfx::Size(RoundUpToPowerOf2(visible_size_.width(), 16), | 208 coded_size_ = gfx::Size(RoundUpToPowerOf2(visible_size_.width(), 16), |
| 211 RoundUpToPowerOf2(visible_size_.height(), 16)); | 209 RoundUpToPowerOf2(visible_size_.height(), 16)); |
| 212 mb_width_ = coded_size_.width() / 16; | 210 mb_width_ = coded_size_.width() / 16; |
| 213 mb_height_ = coded_size_.height() / 16; | 211 mb_height_ = coded_size_.height() / 16; |
| 214 output_buffer_byte_size_ = coded_size_.GetArea(); | 212 output_buffer_byte_size_ = coded_size_.GetArea(); |
| 215 | 213 |
| 216 UpdateRates(initial_bitrate, kDefaultFramerate); | 214 UpdateRates(initial_bitrate, kDefaultFramerate); |
| 217 | 215 |
| 218 vaapi_wrapper_ = VaapiWrapper::Create(VaapiWrapper::kEncode, | 216 vaapi_wrapper_ = VaapiWrapper::Create(VaapiWrapper::kEncode, |
| 219 output_profile, | 217 output_profile, |
| 220 x_display_, | |
| 221 base::Bind(&ReportToUMA, VAAPI_ERROR)); | 218 base::Bind(&ReportToUMA, VAAPI_ERROR)); |
| 222 if (!vaapi_wrapper_) { | 219 if (!vaapi_wrapper_.get()) { |
| 223 LOG(ERROR) << "Failed initializing VAAPI"; | 220 LOG(ERROR) << "Failed initializing VAAPI"; |
| 224 return false; | 221 return false; |
| 225 } | 222 } |
| 226 | 223 |
| 227 if (!encoder_thread_.Start()) { | 224 if (!encoder_thread_.Start()) { |
| 228 LOG(ERROR) << "Failed to start encoder thread"; | 225 LOG(ERROR) << "Failed to start encoder thread"; |
| 229 return false; | 226 return false; |
| 230 } | 227 } |
| 231 encoder_thread_proxy_ = encoder_thread_.message_loop_proxy(); | 228 encoder_thread_proxy_ = encoder_thread_.message_loop_proxy(); |
| 232 | 229 |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 | 594 |
| 598 DCHECK(!current_encode_job_); | 595 DCHECK(!current_encode_job_); |
| 599 current_encode_job_.reset(new EncodeJob()); | 596 current_encode_job_.reset(new EncodeJob()); |
| 600 | 597 |
| 601 if (!vaapi_wrapper_->CreateCodedBuffer(output_buffer_byte_size_, | 598 if (!vaapi_wrapper_->CreateCodedBuffer(output_buffer_byte_size_, |
| 602 ¤t_encode_job_->coded_buffer)) { | 599 ¤t_encode_job_->coded_buffer)) { |
| 603 NOTIFY_ERROR(kPlatformFailureError, "Failed creating coded buffer"); | 600 NOTIFY_ERROR(kPlatformFailureError, "Failed creating coded buffer"); |
| 604 return false; | 601 return false; |
| 605 } | 602 } |
| 606 | 603 |
| 607 current_encode_job_->input_surface = | 604 current_encode_job_->input_surface = new VASurface( |
| 608 new VASurface(available_va_surface_ids_.back(), va_surface_release_cb_); | 605 available_va_surface_ids_.back(), coded_size_, va_surface_release_cb_); |
| 609 available_va_surface_ids_.pop_back(); | 606 available_va_surface_ids_.pop_back(); |
| 610 | 607 |
| 611 current_encode_job_->recon_surface = | 608 current_encode_job_->recon_surface = new VASurface( |
| 612 new VASurface(available_va_surface_ids_.back(), va_surface_release_cb_); | 609 available_va_surface_ids_.back(), coded_size_, va_surface_release_cb_); |
| 613 available_va_surface_ids_.pop_back(); | 610 available_va_surface_ids_.pop_back(); |
| 614 | 611 |
| 615 // Reference surfaces are needed until the job is done, but they get | 612 // Reference surfaces are needed until the job is done, but they get |
| 616 // removed from ref_pic_list0_ when it's full at the end of job submission. | 613 // removed from ref_pic_list0_ when it's full at the end of job submission. |
| 617 // Keep refs to them along with the job and only release after sync. | 614 // Keep refs to them along with the job and only release after sync. |
| 618 current_encode_job_->reference_surfaces = ref_pic_list0_; | 615 current_encode_job_->reference_surfaces = ref_pic_list0_; |
| 619 | 616 |
| 620 return true; | 617 return true; |
| 621 } | 618 } |
| 622 | 619 |
| (...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1058 } | 1055 } |
| 1059 | 1056 |
| 1060 VaapiVideoEncodeAccelerator::EncodeJob::EncodeJob() | 1057 VaapiVideoEncodeAccelerator::EncodeJob::EncodeJob() |
| 1061 : coded_buffer(VA_INVALID_ID), keyframe(false) { | 1058 : coded_buffer(VA_INVALID_ID), keyframe(false) { |
| 1062 } | 1059 } |
| 1063 | 1060 |
| 1064 VaapiVideoEncodeAccelerator::EncodeJob::~EncodeJob() { | 1061 VaapiVideoEncodeAccelerator::EncodeJob::~EncodeJob() { |
| 1065 } | 1062 } |
| 1066 | 1063 |
| 1067 } // namespace content | 1064 } // namespace content |
| OLD | NEW |