Chromium Code Reviews| Index: media/capture/video/video_capture_device_client.cc |
| diff --git a/media/capture/video/video_capture_device_client.cc b/media/capture/video/video_capture_device_client.cc |
| index 9d3b70661fa25ba460c9449aa3fe64d166e67ca6..65525a52e3e89a36d100a60c73118302ffe5d00b 100644 |
| --- a/media/capture/video/video_capture_device_client.cc |
| +++ b/media/capture/video/video_capture_device_client.cc |
| @@ -95,6 +95,10 @@ VideoCaptureDeviceClient::~VideoCaptureDeviceClient() { |
| // This should be on the platform auxiliary thread since |
| // |external_jpeg_decoder_| need to be destructed on the same thread as |
| // OnIncomingCapturedData. |
| + |
| + for (int buffer_id : buffer_ids_known_by_receiver_) { |
| + receiver_->OnBufferRetired(buffer_id); |
| + } |
|
mcasas
2017/01/20 22:41:32
No {} for one-line bodies.
chfremer
2017/01/25 23:45:21
Done.
|
| } |
| // static |
| @@ -293,6 +297,7 @@ VideoCaptureDeviceClient::ReserveOutputBuffer( |
| media::VideoPixelFormat pixel_format, |
| media::VideoPixelStorage pixel_storage, |
| int frame_feedback_id) { |
| + DFAKE_SCOPED_RECURSIVE_LOCK(call_from_producer_); |
| DCHECK_GT(frame_size.width(), 0); |
| DCHECK_GT(frame_size.height(), 0); |
| DCHECK(IsFormatSupported(pixel_format)); |
| @@ -301,8 +306,15 @@ VideoCaptureDeviceClient::ReserveOutputBuffer( |
| const int buffer_id = |
| buffer_pool_->ReserveForProducer(frame_size, pixel_format, pixel_storage, |
| frame_feedback_id, &buffer_id_to_drop); |
| - if (buffer_id_to_drop != VideoCaptureBufferPool::kInvalidId) |
| - receiver_->OnBufferDestroyed(buffer_id_to_drop); |
| + if (buffer_id_to_drop != VideoCaptureBufferPool::kInvalidId) { |
| + // Buffer pool has decided to releasea buffer. Notify receiver in case |
|
mcasas
2017/01/20 22:41:32
s/releasea/release a/
s/Buffer pool/|buffer_pool_
chfremer
2017/01/25 23:45:21
Done.
|
| + // the buffer has already been shared with it. |
| + if (buffer_ids_known_by_receiver_.find(buffer_id_to_drop) != |
| + buffer_ids_known_by_receiver_.end()) { |
| + buffer_ids_known_by_receiver_.erase(buffer_id_to_drop); |
| + receiver_->OnBufferRetired(buffer_id_to_drop); |
|
mcasas
2017/01/20 22:41:32
if (base::ContainsValue(buffer_ids_known_by_receiv
chfremer
2017/01/25 23:45:22
Done.
Thanks. That is much nicer indeed.
|
| + } |
| + } |
| if (buffer_id == VideoCaptureBufferPool::kInvalidId) |
| return Buffer(); |
| return MakeBufferStruct(buffer_pool_, buffer_id, frame_feedback_id); |
| @@ -313,6 +325,7 @@ void VideoCaptureDeviceClient::OnIncomingCapturedBuffer( |
| const VideoCaptureFormat& format, |
| base::TimeTicks reference_time, |
| base::TimeDelta timestamp) { |
| + DFAKE_SCOPED_RECURSIVE_LOCK(call_from_producer_); |
| OnIncomingCapturedBufferExt(std::move(buffer), format, reference_time, |
| timestamp, gfx::Rect(format.frame_size), |
| VideoFrameMetadata()); |
| @@ -325,6 +338,13 @@ void VideoCaptureDeviceClient::OnIncomingCapturedBufferExt( |
| base::TimeDelta timestamp, |
| gfx::Rect visible_rect, |
| const VideoFrameMetadata& additional_metadata) { |
| + DFAKE_SCOPED_RECURSIVE_LOCK(call_from_producer_); |
| + |
| + if (buffer_ids_known_by_receiver_.find(buffer.id()) == |
| + buffer_ids_known_by_receiver_.end()) { |
| + buffer_ids_known_by_receiver_.insert(buffer.id()); |
| + } |
|
mcasas
2017/01/20 22:41:32
if (base::ContainsValue(buffer_ids_known_by_receiv
chfremer
2017/01/25 23:45:21
Done.
|
| + |
| auto buffer_access = buffer.handle_provider()->GetHandleForInProcessAccess(); |
| scoped_refptr<media::VideoFrame> frame = |
| media::VideoFrame::WrapExternalSharedMemory( |
| @@ -352,6 +372,7 @@ VideoCaptureDeviceClient::ResurrectLastOutputBuffer( |
| media::VideoPixelFormat format, |
| media::VideoPixelStorage storage, |
| int new_frame_feedback_id) { |
| + DFAKE_SCOPED_RECURSIVE_LOCK(call_from_producer_); |
| const int buffer_id = |
| buffer_pool_->ResurrectLastForProducer(dimensions, format, storage); |
| if (buffer_id == VideoCaptureBufferPool::kInvalidId) |