diff options
author | kcwu@chromium.org <kcwu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-26 22:01:36 +0000 |
---|---|---|
committer | kcwu@chromium.org <kcwu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-26 22:01:36 +0000 |
commit | 3829575b24b5928cf8742939c3fe241e2b8220c3 (patch) | |
tree | 1ccd8ca3fcd53994702cdb0d294c4f44a81349f1 /media/video | |
parent | ed25b44f44f8aa83011f67b8cec75958c471db11 (diff) | |
download | chromium_src-3829575b24b5928cf8742939c3fe241e2b8220c3.zip chromium_src-3829575b24b5928cf8742939c3fe241e2b8220c3.tar.gz chromium_src-3829575b24b5928cf8742939c3fe241e2b8220c3.tar.bz2 |
Handle camera error during dequeue buffer
Break the busy loop and close device node.
BUG=174756
Review URL: https://chromiumcodereview.appspot.com/12378051
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@190774 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/video')
-rw-r--r-- | media/video/capture/linux/video_capture_device_linux.cc | 24 | ||||
-rw-r--r-- | media/video/capture/linux/video_capture_device_linux.h | 1 |
2 files changed, 23 insertions, 2 deletions
diff --git a/media/video/capture/linux/video_capture_device_linux.cc b/media/video/capture/linux/video_capture_device_linux.cc index d3655db..3350867 100644 --- a/media/video/capture/linux/video_capture_device_linux.cc +++ b/media/video/capture/linux/video_capture_device_linux.cc @@ -41,6 +41,8 @@ namespace media { enum { kMaxVideoBuffers = 2 }; // Timeout in microseconds v4l2_thread_ blocks waiting for a frame from the hw. enum { kCaptureTimeoutUs = 200000 }; +// The number of continuous timeouts tolerated before treated as error. +enum { kContinuousTimeoutLimit = 10 }; // Time to wait in milliseconds before v4l2_thread_ reschedules OnCaptureTask // if an event is triggered (select) but no video frame is read. enum { kCaptureSelectWaitMs = 10 }; @@ -161,7 +163,8 @@ VideoCaptureDeviceLinux::VideoCaptureDeviceLinux(const Name& device_name) device_fd_(-1), v4l2_thread_("V4L2Thread"), buffer_pool_(NULL), - buffer_pool_size_(0) { + buffer_pool_size_(0), + timeout_count_(0) { } VideoCaptureDeviceLinux::~VideoCaptureDeviceLinux() { @@ -404,6 +407,19 @@ void VideoCaptureDeviceLinux::OnCaptureTask() { base::TimeDelta::FromMilliseconds(kCaptureSelectWaitMs)); } + // Check if select timeout. + if (result == 0) { + timeout_count_++; + if (timeout_count_ >= kContinuousTimeoutLimit) { + SetErrorState(base::StringPrintf( + "Continuous timeout %d times", timeout_count_)); + timeout_count_ = 0; + return; + } + } else { + timeout_count_ = 0; + } + // Check if the driver have filled a buffer. if (FD_ISSET(device_fd_, &r_set)) { v4l2_buffer buffer; @@ -421,7 +437,11 @@ void VideoCaptureDeviceLinux::OnCaptureTask() { SetErrorState(base::StringPrintf( "Failed to enqueue capture buffer errno %d", errno)); } - } // Else wait for next event. + } else { + SetErrorState(base::StringPrintf( + "Failed to dequeue capture buffer errno %d", errno)); + return; + } } v4l2_thread_.message_loop()->PostTask( diff --git a/media/video/capture/linux/video_capture_device_linux.h b/media/video/capture/linux/video_capture_device_linux.h index d1d2a19..39b12ed 100644 --- a/media/video/capture/linux/video_capture_device_linux.h +++ b/media/video/capture/linux/video_capture_device_linux.h @@ -70,6 +70,7 @@ class VideoCaptureDeviceLinux : public VideoCaptureDevice { base::Thread v4l2_thread_; // Thread used for reading data from the device. Buffer* buffer_pool_; int buffer_pool_size_; // Number of allocated buffers. + int timeout_count_; DISALLOW_IMPLICIT_CONSTRUCTORS(VideoCaptureDeviceLinux); }; |