| OLD | NEW |
| 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 "content/renderer/media/rtc_video_encoder.h" | 5 #include "content/renderer/media/rtc_video_encoder.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/location.h" | 8 #include "base/location.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/macros.h" |
| 10 #include "base/memory/scoped_vector.h" | 11 #include "base/memory/scoped_vector.h" |
| 11 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
| 12 #include "base/numerics/safe_conversions.h" | 13 #include "base/numerics/safe_conversions.h" |
| 13 #include "base/rand_util.h" | 14 #include "base/rand_util.h" |
| 14 #include "base/single_thread_task_runner.h" | 15 #include "base/single_thread_task_runner.h" |
| 15 #include "base/synchronization/waitable_event.h" | 16 #include "base/synchronization/waitable_event.h" |
| 16 #include "base/thread_task_runner_handle.h" | 17 #include "base/thread_task_runner_handle.h" |
| 17 #include "media/base/bind_to_current_loop.h" | 18 #include "media/base/bind_to_current_loop.h" |
| 18 #include "media/base/bitstream_buffer.h" | 19 #include "media/base/bitstream_buffer.h" |
| 19 #include "media/base/video_frame.h" | 20 #include "media/base/video_frame.h" |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 public: | 103 public: |
| 103 Impl(const base::WeakPtr<RTCVideoEncoder>& weak_encoder, | 104 Impl(const base::WeakPtr<RTCVideoEncoder>& weak_encoder, |
| 104 media::GpuVideoAcceleratorFactories* gpu_factories); | 105 media::GpuVideoAcceleratorFactories* gpu_factories); |
| 105 | 106 |
| 106 // Create the VEA and call Initialize() on it. Called once per instantiation, | 107 // Create the VEA and call Initialize() on it. Called once per instantiation, |
| 107 // and then the instance is bound forevermore to whichever thread made the | 108 // and then the instance is bound forevermore to whichever thread made the |
| 108 // call. | 109 // call. |
| 109 // RTCVideoEncoder expects to be able to call this function synchronously from | 110 // RTCVideoEncoder expects to be able to call this function synchronously from |
| 110 // its own thread, hence the |async_waiter| and |async_retval| arguments. | 111 // its own thread, hence the |async_waiter| and |async_retval| arguments. |
| 111 void CreateAndInitializeVEA(const gfx::Size& input_visible_size, | 112 void CreateAndInitializeVEA(const gfx::Size& input_visible_size, |
| 112 uint32 bitrate, | 113 uint32_t bitrate, |
| 113 media::VideoCodecProfile profile, | 114 media::VideoCodecProfile profile, |
| 114 base::WaitableEvent* async_waiter, | 115 base::WaitableEvent* async_waiter, |
| 115 int32_t* async_retval); | 116 int32_t* async_retval); |
| 116 // Enqueue a frame from WebRTC for encoding. | 117 // Enqueue a frame from WebRTC for encoding. |
| 117 // RTCVideoEncoder expects to be able to call this function synchronously from | 118 // RTCVideoEncoder expects to be able to call this function synchronously from |
| 118 // its own thread, hence the |async_waiter| and |async_retval| arguments. | 119 // its own thread, hence the |async_waiter| and |async_retval| arguments. |
| 119 void Enqueue(const webrtc::VideoFrame* input_frame, | 120 void Enqueue(const webrtc::VideoFrame* input_frame, |
| 120 bool force_keyframe, | 121 bool force_keyframe, |
| 121 base::WaitableEvent* async_waiter, | 122 base::WaitableEvent* async_waiter, |
| 122 int32_t* async_retval); | 123 int32_t* async_retval); |
| 123 | 124 |
| 124 // RTCVideoEncoder is given a buffer to be passed to WebRTC through the | 125 // RTCVideoEncoder is given a buffer to be passed to WebRTC through the |
| 125 // RTCVideoEncoder::ReturnEncodedImage() function. When that is complete, | 126 // RTCVideoEncoder::ReturnEncodedImage() function. When that is complete, |
| 126 // the buffer is returned to Impl by its index using this function. | 127 // the buffer is returned to Impl by its index using this function. |
| 127 void UseOutputBitstreamBufferId(int32 bitstream_buffer_id); | 128 void UseOutputBitstreamBufferId(int32_t bitstream_buffer_id); |
| 128 | 129 |
| 129 // Request encoding parameter change for the underlying encoder. | 130 // Request encoding parameter change for the underlying encoder. |
| 130 void RequestEncodingParametersChange(uint32 bitrate, uint32 framerate); | 131 void RequestEncodingParametersChange(uint32_t bitrate, uint32_t framerate); |
| 131 | 132 |
| 132 // Destroy this Impl's encoder. The destructor is not explicitly called, as | 133 // Destroy this Impl's encoder. The destructor is not explicitly called, as |
| 133 // Impl is a base::RefCountedThreadSafe. | 134 // Impl is a base::RefCountedThreadSafe. |
| 134 void Destroy(); | 135 void Destroy(); |
| 135 | 136 |
| 136 // media::VideoEncodeAccelerator::Client implementation. | 137 // media::VideoEncodeAccelerator::Client implementation. |
| 137 void RequireBitstreamBuffers(unsigned int input_count, | 138 void RequireBitstreamBuffers(unsigned int input_count, |
| 138 const gfx::Size& input_coded_size, | 139 const gfx::Size& input_coded_size, |
| 139 size_t output_buffer_size) override; | 140 size_t output_buffer_size) override; |
| 140 void BitstreamBufferReady(int32 bitstream_buffer_id, | 141 void BitstreamBufferReady(int32_t bitstream_buffer_id, |
| 141 size_t payload_size, | 142 size_t payload_size, |
| 142 bool key_frame) override; | 143 bool key_frame) override; |
| 143 void NotifyError(media::VideoEncodeAccelerator::Error error) override; | 144 void NotifyError(media::VideoEncodeAccelerator::Error error) override; |
| 144 | 145 |
| 145 private: | 146 private: |
| 146 friend class base::RefCountedThreadSafe<Impl>; | 147 friend class base::RefCountedThreadSafe<Impl>; |
| 147 | 148 |
| 148 enum { | 149 enum { |
| 149 kInputBufferExtraCount = 1, // The number of input buffers allocated, more | 150 kInputBufferExtraCount = 1, // The number of input buffers allocated, more |
| 150 // than what is requested by | 151 // than what is requested by |
| (...skipping 13 matching lines...) Expand all Loading... |
| 164 | 165 |
| 165 // Notify that an input frame is finished for encoding. |index| is the index | 166 // Notify that an input frame is finished for encoding. |index| is the index |
| 166 // of the completed frame in |input_buffers_|. | 167 // of the completed frame in |input_buffers_|. |
| 167 void EncodeFrameFinished(int index); | 168 void EncodeFrameFinished(int index); |
| 168 | 169 |
| 169 // Set up/signal |async_waiter_| and |async_retval_|; see declarations below. | 170 // Set up/signal |async_waiter_| and |async_retval_|; see declarations below. |
| 170 void RegisterAsyncWaiter(base::WaitableEvent* waiter, int32_t* retval); | 171 void RegisterAsyncWaiter(base::WaitableEvent* waiter, int32_t* retval); |
| 171 void SignalAsyncWaiter(int32_t retval); | 172 void SignalAsyncWaiter(int32_t retval); |
| 172 | 173 |
| 173 // Checks if the bitrate would overflow when passing from kbps to bps. | 174 // Checks if the bitrate would overflow when passing from kbps to bps. |
| 174 bool IsBitrateTooHigh(uint32 bitrate); | 175 bool IsBitrateTooHigh(uint32_t bitrate); |
| 175 | 176 |
| 176 base::ThreadChecker thread_checker_; | 177 base::ThreadChecker thread_checker_; |
| 177 | 178 |
| 178 // Weak pointer to the parent RTCVideoEncoder, for posting back VEA::Client | 179 // Weak pointer to the parent RTCVideoEncoder, for posting back VEA::Client |
| 179 // notifications. | 180 // notifications. |
| 180 const base::WeakPtr<RTCVideoEncoder> weak_encoder_; | 181 const base::WeakPtr<RTCVideoEncoder> weak_encoder_; |
| 181 | 182 |
| 182 // The message loop on which to post callbacks to |weak_encoder_|. | 183 // The message loop on which to post callbacks to |weak_encoder_|. |
| 183 const scoped_refptr<base::SingleThreadTaskRunner> encoder_task_runner_; | 184 const scoped_refptr<base::SingleThreadTaskRunner> encoder_task_runner_; |
| 184 | 185 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 212 | 213 |
| 213 // Input buffers ready to be filled with input from Encode(). As a LIFO since | 214 // Input buffers ready to be filled with input from Encode(). As a LIFO since |
| 214 // we don't care about ordering. | 215 // we don't care about ordering. |
| 215 std::vector<int> input_buffers_free_; | 216 std::vector<int> input_buffers_free_; |
| 216 | 217 |
| 217 // The number of output buffers ready to be filled with output from the | 218 // The number of output buffers ready to be filled with output from the |
| 218 // encoder. | 219 // encoder. |
| 219 int output_buffers_free_count_; | 220 int output_buffers_free_count_; |
| 220 | 221 |
| 221 // 15 bits running index of the VP8 frames. See VP8 RTP spec for details. | 222 // 15 bits running index of the VP8 frames. See VP8 RTP spec for details. |
| 222 uint16 picture_id_; | 223 uint16_t picture_id_; |
| 223 | 224 |
| 224 DISALLOW_COPY_AND_ASSIGN(Impl); | 225 DISALLOW_COPY_AND_ASSIGN(Impl); |
| 225 }; | 226 }; |
| 226 | 227 |
| 227 RTCVideoEncoder::Impl::Impl(const base::WeakPtr<RTCVideoEncoder>& weak_encoder, | 228 RTCVideoEncoder::Impl::Impl(const base::WeakPtr<RTCVideoEncoder>& weak_encoder, |
| 228 media::GpuVideoAcceleratorFactories* gpu_factories) | 229 media::GpuVideoAcceleratorFactories* gpu_factories) |
| 229 : weak_encoder_(weak_encoder), | 230 : weak_encoder_(weak_encoder), |
| 230 encoder_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 231 encoder_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| 231 gpu_factories_(gpu_factories), | 232 gpu_factories_(gpu_factories), |
| 232 async_waiter_(NULL), | 233 async_waiter_(NULL), |
| 233 async_retval_(NULL), | 234 async_retval_(NULL), |
| 234 input_next_frame_(NULL), | 235 input_next_frame_(NULL), |
| 235 input_next_frame_keyframe_(false), | 236 input_next_frame_keyframe_(false), |
| 236 output_buffers_free_count_(0) { | 237 output_buffers_free_count_(0) { |
| 237 thread_checker_.DetachFromThread(); | 238 thread_checker_.DetachFromThread(); |
| 238 // Picture ID should start on a random number. | 239 // Picture ID should start on a random number. |
| 239 picture_id_ = static_cast<uint16_t>(base::RandInt(0, 0x7FFF)); | 240 picture_id_ = static_cast<uint16_t>(base::RandInt(0, 0x7FFF)); |
| 240 } | 241 } |
| 241 | 242 |
| 242 void RTCVideoEncoder::Impl::CreateAndInitializeVEA( | 243 void RTCVideoEncoder::Impl::CreateAndInitializeVEA( |
| 243 const gfx::Size& input_visible_size, | 244 const gfx::Size& input_visible_size, |
| 244 uint32 bitrate, | 245 uint32_t bitrate, |
| 245 media::VideoCodecProfile profile, | 246 media::VideoCodecProfile profile, |
| 246 base::WaitableEvent* async_waiter, | 247 base::WaitableEvent* async_waiter, |
| 247 int32_t* async_retval) { | 248 int32_t* async_retval) { |
| 248 DVLOG(3) << "Impl::CreateAndInitializeVEA()"; | 249 DVLOG(3) << "Impl::CreateAndInitializeVEA()"; |
| 249 DCHECK(thread_checker_.CalledOnValidThread()); | 250 DCHECK(thread_checker_.CalledOnValidThread()); |
| 250 | 251 |
| 251 RegisterAsyncWaiter(async_waiter, async_retval); | 252 RegisterAsyncWaiter(async_waiter, async_retval); |
| 252 | 253 |
| 253 // Check for overflow converting bitrate (kilobits/sec) to bits/sec. | 254 // Check for overflow converting bitrate (kilobits/sec) to bits/sec. |
| 254 if (IsBitrateTooHigh(bitrate)) | 255 if (IsBitrateTooHigh(bitrate)) |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 return; | 303 return; |
| 303 } | 304 } |
| 304 input_next_frame_ = input_frame; | 305 input_next_frame_ = input_frame; |
| 305 input_next_frame_keyframe_ = force_keyframe; | 306 input_next_frame_keyframe_ = force_keyframe; |
| 306 | 307 |
| 307 if (!input_buffers_free_.empty()) | 308 if (!input_buffers_free_.empty()) |
| 308 EncodeOneFrame(); | 309 EncodeOneFrame(); |
| 309 } | 310 } |
| 310 | 311 |
| 311 void RTCVideoEncoder::Impl::UseOutputBitstreamBufferId( | 312 void RTCVideoEncoder::Impl::UseOutputBitstreamBufferId( |
| 312 int32 bitstream_buffer_id) { | 313 int32_t bitstream_buffer_id) { |
| 313 DVLOG(3) << "Impl::UseOutputBitstreamBufferIndex(): " | 314 DVLOG(3) << "Impl::UseOutputBitstreamBufferIndex(): " |
| 314 "bitstream_buffer_id=" << bitstream_buffer_id; | 315 "bitstream_buffer_id=" << bitstream_buffer_id; |
| 315 DCHECK(thread_checker_.CalledOnValidThread()); | 316 DCHECK(thread_checker_.CalledOnValidThread()); |
| 316 if (video_encoder_) { | 317 if (video_encoder_) { |
| 317 video_encoder_->UseOutputBitstreamBuffer(media::BitstreamBuffer( | 318 video_encoder_->UseOutputBitstreamBuffer(media::BitstreamBuffer( |
| 318 bitstream_buffer_id, | 319 bitstream_buffer_id, |
| 319 output_buffers_[bitstream_buffer_id]->handle(), | 320 output_buffers_[bitstream_buffer_id]->handle(), |
| 320 output_buffers_[bitstream_buffer_id]->mapped_size())); | 321 output_buffers_[bitstream_buffer_id]->mapped_size())); |
| 321 output_buffers_free_count_++; | 322 output_buffers_free_count_++; |
| 322 } | 323 } |
| 323 } | 324 } |
| 324 | 325 |
| 325 void RTCVideoEncoder::Impl::RequestEncodingParametersChange(uint32 bitrate, | 326 void RTCVideoEncoder::Impl::RequestEncodingParametersChange( |
| 326 uint32 framerate) { | 327 uint32_t bitrate, |
| 328 uint32_t framerate) { |
| 327 DVLOG(3) << "Impl::RequestEncodingParametersChange(): bitrate=" << bitrate | 329 DVLOG(3) << "Impl::RequestEncodingParametersChange(): bitrate=" << bitrate |
| 328 << ", framerate=" << framerate; | 330 << ", framerate=" << framerate; |
| 329 DCHECK(thread_checker_.CalledOnValidThread()); | 331 DCHECK(thread_checker_.CalledOnValidThread()); |
| 330 | 332 |
| 331 // Check for overflow converting bitrate (kilobits/sec) to bits/sec. | 333 // Check for overflow converting bitrate (kilobits/sec) to bits/sec. |
| 332 if (IsBitrateTooHigh(bitrate)) | 334 if (IsBitrateTooHigh(bitrate)) |
| 333 return; | 335 return; |
| 334 | 336 |
| 335 if (video_encoder_) | 337 if (video_encoder_) |
| 336 video_encoder_->RequestEncodingParametersChange(bitrate * 1000, framerate); | 338 video_encoder_->RequestEncodingParametersChange(bitrate * 1000, framerate); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 | 384 |
| 383 // Immediately provide all output buffers to the VEA. | 385 // Immediately provide all output buffers to the VEA. |
| 384 for (size_t i = 0; i < output_buffers_.size(); ++i) { | 386 for (size_t i = 0; i < output_buffers_.size(); ++i) { |
| 385 video_encoder_->UseOutputBitstreamBuffer(media::BitstreamBuffer( | 387 video_encoder_->UseOutputBitstreamBuffer(media::BitstreamBuffer( |
| 386 i, output_buffers_[i]->handle(), output_buffers_[i]->mapped_size())); | 388 i, output_buffers_[i]->handle(), output_buffers_[i]->mapped_size())); |
| 387 output_buffers_free_count_++; | 389 output_buffers_free_count_++; |
| 388 } | 390 } |
| 389 SignalAsyncWaiter(WEBRTC_VIDEO_CODEC_OK); | 391 SignalAsyncWaiter(WEBRTC_VIDEO_CODEC_OK); |
| 390 } | 392 } |
| 391 | 393 |
| 392 void RTCVideoEncoder::Impl::BitstreamBufferReady(int32 bitstream_buffer_id, | 394 void RTCVideoEncoder::Impl::BitstreamBufferReady(int32_t bitstream_buffer_id, |
| 393 size_t payload_size, | 395 size_t payload_size, |
| 394 bool key_frame) { | 396 bool key_frame) { |
| 395 DVLOG(3) << "Impl::BitstreamBufferReady(): " | 397 DVLOG(3) << "Impl::BitstreamBufferReady(): " |
| 396 "bitstream_buffer_id=" << bitstream_buffer_id | 398 "bitstream_buffer_id=" << bitstream_buffer_id |
| 397 << ", payload_size=" << payload_size | 399 << ", payload_size=" << payload_size |
| 398 << ", key_frame=" << key_frame; | 400 << ", key_frame=" << key_frame; |
| 399 DCHECK(thread_checker_.CalledOnValidThread()); | 401 DCHECK(thread_checker_.CalledOnValidThread()); |
| 400 | 402 |
| 401 if (bitstream_buffer_id < 0 || | 403 if (bitstream_buffer_id < 0 || |
| 402 bitstream_buffer_id >= static_cast<int>(output_buffers_.size())) { | 404 bitstream_buffer_id >= static_cast<int>(output_buffers_.size())) { |
| 403 LogAndNotifyError(FROM_HERE, "invalid bitstream_buffer_id", | 405 LogAndNotifyError(FROM_HERE, "invalid bitstream_buffer_id", |
| 404 media::VideoEncodeAccelerator::kPlatformFailureError); | 406 media::VideoEncodeAccelerator::kPlatformFailureError); |
| 405 return; | 407 return; |
| 406 } | 408 } |
| 407 base::SharedMemory* output_buffer = output_buffers_[bitstream_buffer_id]; | 409 base::SharedMemory* output_buffer = output_buffers_[bitstream_buffer_id]; |
| 408 if (payload_size > output_buffer->mapped_size()) { | 410 if (payload_size > output_buffer->mapped_size()) { |
| 409 LogAndNotifyError(FROM_HERE, "invalid payload_size", | 411 LogAndNotifyError(FROM_HERE, "invalid payload_size", |
| 410 media::VideoEncodeAccelerator::kPlatformFailureError); | 412 media::VideoEncodeAccelerator::kPlatformFailureError); |
| 411 return; | 413 return; |
| 412 } | 414 } |
| 413 output_buffers_free_count_--; | 415 output_buffers_free_count_--; |
| 414 | 416 |
| 415 // Use webrtc timestamps to ensure correct RTP sender behavior. | 417 // Use webrtc timestamps to ensure correct RTP sender behavior. |
| 416 // TODO(hshi): obtain timestamp from the capturer, see crbug.com/350106. | 418 // TODO(hshi): obtain timestamp from the capturer, see crbug.com/350106. |
| 417 const int64 capture_time_us = webrtc::TickTime::MicrosecondTimestamp(); | 419 const int64_t capture_time_us = webrtc::TickTime::MicrosecondTimestamp(); |
| 418 | 420 |
| 419 // Derive the capture time (in ms) and RTP timestamp (in 90KHz ticks). | 421 // Derive the capture time (in ms) and RTP timestamp (in 90KHz ticks). |
| 420 const int64 capture_time_ms = capture_time_us / 1000; | 422 const int64_t capture_time_ms = capture_time_us / 1000; |
| 421 const uint32_t rtp_timestamp = | 423 const uint32_t rtp_timestamp = |
| 422 static_cast<uint32_t>(capture_time_us * 90 / 1000); | 424 static_cast<uint32_t>(capture_time_us * 90 / 1000); |
| 423 | 425 |
| 424 scoped_ptr<webrtc::EncodedImage> image(new webrtc::EncodedImage( | 426 scoped_ptr<webrtc::EncodedImage> image(new webrtc::EncodedImage( |
| 425 reinterpret_cast<uint8_t*>(output_buffer->memory()), | 427 reinterpret_cast<uint8_t*>(output_buffer->memory()), |
| 426 payload_size, | 428 payload_size, |
| 427 output_buffer->mapped_size())); | 429 output_buffer->mapped_size())); |
| 428 image->_encodedWidth = input_visible_size_.width(); | 430 image->_encodedWidth = input_visible_size_.width(); |
| 429 image->_encodedHeight = input_visible_size_.height(); | 431 image->_encodedHeight = input_visible_size_.height(); |
| 430 image->_timeStamp = rtp_timestamp; | 432 image->_timeStamp = rtp_timestamp; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 | 503 |
| 502 const int index = input_buffers_free_.back(); | 504 const int index = input_buffers_free_.back(); |
| 503 scoped_refptr<media::VideoFrame> frame; | 505 scoped_refptr<media::VideoFrame> frame; |
| 504 if (next_frame->native_handle()) { | 506 if (next_frame->native_handle()) { |
| 505 frame = static_cast<media::VideoFrame*>(next_frame->native_handle()); | 507 frame = static_cast<media::VideoFrame*>(next_frame->native_handle()); |
| 506 } else { | 508 } else { |
| 507 base::SharedMemory* input_buffer = input_buffers_[index]; | 509 base::SharedMemory* input_buffer = input_buffers_[index]; |
| 508 frame = media::VideoFrame::WrapExternalSharedMemory( | 510 frame = media::VideoFrame::WrapExternalSharedMemory( |
| 509 media::PIXEL_FORMAT_I420, input_frame_coded_size_, | 511 media::PIXEL_FORMAT_I420, input_frame_coded_size_, |
| 510 gfx::Rect(input_visible_size_), input_visible_size_, | 512 gfx::Rect(input_visible_size_), input_visible_size_, |
| 511 reinterpret_cast<uint8*>(input_buffer->memory()), | 513 reinterpret_cast<uint8_t*>(input_buffer->memory()), |
| 512 input_buffer->mapped_size(), input_buffer->handle(), 0, | 514 input_buffer->mapped_size(), input_buffer->handle(), 0, |
| 513 base::TimeDelta()); | 515 base::TimeDelta()); |
| 514 if (!frame.get()) { | 516 if (!frame.get()) { |
| 515 LogAndNotifyError(FROM_HERE, "failed to create frame", | 517 LogAndNotifyError(FROM_HERE, "failed to create frame", |
| 516 media::VideoEncodeAccelerator::kPlatformFailureError); | 518 media::VideoEncodeAccelerator::kPlatformFailureError); |
| 517 return; | 519 return; |
| 518 } | 520 } |
| 519 // Do a strided copy of the input frame to match the input requirements for | 521 // Do a strided copy of the input frame to match the input requirements for |
| 520 // the encoder. | 522 // the encoder. |
| 521 // TODO(sheu): support zero-copy from WebRTC. http://crbug.com/269312 | 523 // TODO(sheu): support zero-copy from WebRTC. http://crbug.com/269312 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 564 } | 566 } |
| 565 | 567 |
| 566 void RTCVideoEncoder::Impl::SignalAsyncWaiter(int32_t retval) { | 568 void RTCVideoEncoder::Impl::SignalAsyncWaiter(int32_t retval) { |
| 567 DCHECK(thread_checker_.CalledOnValidThread()); | 569 DCHECK(thread_checker_.CalledOnValidThread()); |
| 568 *async_retval_ = retval; | 570 *async_retval_ = retval; |
| 569 async_waiter_->Signal(); | 571 async_waiter_->Signal(); |
| 570 async_retval_ = NULL; | 572 async_retval_ = NULL; |
| 571 async_waiter_ = NULL; | 573 async_waiter_ = NULL; |
| 572 } | 574 } |
| 573 | 575 |
| 574 bool RTCVideoEncoder::Impl::IsBitrateTooHigh(uint32 bitrate) { | 576 bool RTCVideoEncoder::Impl::IsBitrateTooHigh(uint32_t bitrate) { |
| 575 if (base::IsValueInRangeForNumericType<uint32>(bitrate * UINT64_C(1000))) | 577 if (base::IsValueInRangeForNumericType<uint32_t>(bitrate * UINT64_C(1000))) |
| 576 return false; | 578 return false; |
| 577 LogAndNotifyError(FROM_HERE, "Overflow converting bitrate from kbps to bps", | 579 LogAndNotifyError(FROM_HERE, "Overflow converting bitrate from kbps to bps", |
| 578 media::VideoEncodeAccelerator::kInvalidArgumentError); | 580 media::VideoEncodeAccelerator::kInvalidArgumentError); |
| 579 return true; | 581 return true; |
| 580 } | 582 } |
| 581 | 583 |
| 582 RTCVideoEncoder::RTCVideoEncoder( | 584 RTCVideoEncoder::RTCVideoEncoder( |
| 583 webrtc::VideoCodecType type, | 585 webrtc::VideoCodecType type, |
| 584 media::GpuVideoAcceleratorFactories* gpu_factories) | 586 media::GpuVideoAcceleratorFactories* gpu_factories) |
| 585 : video_codec_type_(type), | 587 : video_codec_type_(type), |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 706 gpu_task_runner_->PostTask( | 708 gpu_task_runner_->PostTask( |
| 707 FROM_HERE, | 709 FROM_HERE, |
| 708 base::Bind(&RTCVideoEncoder::Impl::RequestEncodingParametersChange, | 710 base::Bind(&RTCVideoEncoder::Impl::RequestEncodingParametersChange, |
| 709 impl_, | 711 impl_, |
| 710 new_bit_rate, | 712 new_bit_rate, |
| 711 frame_rate)); | 713 frame_rate)); |
| 712 return WEBRTC_VIDEO_CODEC_OK; | 714 return WEBRTC_VIDEO_CODEC_OK; |
| 713 } | 715 } |
| 714 | 716 |
| 715 void RTCVideoEncoder::ReturnEncodedImage(scoped_ptr<webrtc::EncodedImage> image, | 717 void RTCVideoEncoder::ReturnEncodedImage(scoped_ptr<webrtc::EncodedImage> image, |
| 716 int32 bitstream_buffer_id, | 718 int32_t bitstream_buffer_id, |
| 717 uint16 picture_id) { | 719 uint16_t picture_id) { |
| 718 DCHECK(thread_checker_.CalledOnValidThread()); | 720 DCHECK(thread_checker_.CalledOnValidThread()); |
| 719 DVLOG(3) << "ReturnEncodedImage(): " | 721 DVLOG(3) << "ReturnEncodedImage(): " |
| 720 << "bitstream_buffer_id=" << bitstream_buffer_id | 722 << "bitstream_buffer_id=" << bitstream_buffer_id |
| 721 << ", picture_id=" << picture_id; | 723 << ", picture_id=" << picture_id; |
| 722 | 724 |
| 723 if (!encoded_image_callback_) | 725 if (!encoded_image_callback_) |
| 724 return; | 726 return; |
| 725 | 727 |
| 726 webrtc::RTPFragmentationHeader header; | 728 webrtc::RTPFragmentationHeader header; |
| 727 memset(&header, 0, sizeof(header)); | 729 memset(&header, 0, sizeof(header)); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 786 UMA_HISTOGRAM_BOOLEAN("Media.RTCVideoEncoderInitEncodeSuccess", | 788 UMA_HISTOGRAM_BOOLEAN("Media.RTCVideoEncoderInitEncodeSuccess", |
| 787 init_retval == WEBRTC_VIDEO_CODEC_OK); | 789 init_retval == WEBRTC_VIDEO_CODEC_OK); |
| 788 if (init_retval == WEBRTC_VIDEO_CODEC_OK) { | 790 if (init_retval == WEBRTC_VIDEO_CODEC_OK) { |
| 789 UMA_HISTOGRAM_ENUMERATION("Media.RTCVideoEncoderProfile", | 791 UMA_HISTOGRAM_ENUMERATION("Media.RTCVideoEncoderProfile", |
| 790 profile, | 792 profile, |
| 791 media::VIDEO_CODEC_PROFILE_MAX + 1); | 793 media::VIDEO_CODEC_PROFILE_MAX + 1); |
| 792 } | 794 } |
| 793 } | 795 } |
| 794 | 796 |
| 795 } // namespace content | 797 } // namespace content |
| OLD | NEW |