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) |