Commit b134a460 authored by ihf@chromium.org's avatar ihf@chromium.org

Webcam ppapi flash fix.

Return buffers that are in flight during shutdown and make sure to issue 
defered stop.

BUG=106369
Review URL: http://codereview.chromium.org/8819010

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@113467 0039d316-1c4b-4281-b951-d872f2087c98
parent 39daa02e
...@@ -222,6 +222,14 @@ void VideoCaptureController::ReturnBuffer( ...@@ -222,6 +222,14 @@ void VideoCaptureController::ReturnBuffer(
client->event_handler->OnReadyToDelete(client->controller_id); client->event_handler->OnReadyToDelete(client->controller_id);
delete client; delete client;
controller_clients_.remove(client); controller_clients_.remove(client);
if (controller_clients_.empty()) {
// No more clients. Stop device.
video_capture_manager_->Stop(current_params_.session_id,
base::Bind(&VideoCaptureController::OnDeviceStopped, this));
frame_info_available_ = false;
state_ = video_capture::kStopping;
}
} }
{ {
base::AutoLock lock(lock_); base::AutoLock lock(lock_);
......
...@@ -209,24 +209,25 @@ void PPB_VideoCapture_Impl::OnRemoved(media::VideoCapture* capture) { ...@@ -209,24 +209,25 @@ void PPB_VideoCapture_Impl::OnRemoved(media::VideoCapture* capture) {
void PPB_VideoCapture_Impl::OnBufferReady( void PPB_VideoCapture_Impl::OnBufferReady(
media::VideoCapture* capture, media::VideoCapture* capture,
scoped_refptr<media::VideoCapture::VideoFrameBuffer> buffer) { scoped_refptr<media::VideoCapture::VideoFrameBuffer> buffer) {
if (is_dead_) if (!is_dead_) {
return; DCHECK(buffer.get());
for (uint32_t i = 0; i < buffers_.size(); ++i) {
DCHECK(buffer.get()); if (!buffers_[i].in_use) {
for (uint32_t i = 0; i < buffers_.size(); ++i) { // TODO(ihf): Switch to a size calculation based on stride.
if (!buffers_[i].in_use) { // Stride is filled out now but not more meaningful than size
// TODO(piman): it looks like stride isn't actually used/filled. // until wjia unifies VideoFrameBuffer and media::VideoFrame.
DCHECK(buffer->stride == 0); size_t size = std::min(static_cast<size_t>(buffers_[i].buffer->size()),
size_t size = std::min(static_cast<size_t>(buffers_[i].buffer->size()), buffer->buffer_size);
buffer->buffer_size); memcpy(buffers_[i].data, buffer->memory_pointer, size);
memcpy(buffers_[i].data, buffer->memory_pointer, size); buffers_[i].in_use = true;
buffers_[i].in_use = true; platform_video_capture_->FeedBuffer(buffer);
platform_video_capture_->FeedBuffer(buffer); ppp_videocapture_->OnBufferReady(pp_instance(), pp_resource(), i);
ppp_videocapture_->OnBufferReady(pp_instance(), pp_resource(), i); return;
return; }
} }
} }
// TODO(piman): signal dropped buffers ? // Even after we have stopped and are dead we have to return buffers that
// are in flight to us. Otherwise VideoCaptureController will not tear down.
platform_video_capture_->FeedBuffer(buffer); platform_video_capture_->FeedBuffer(buffer);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment