summaryrefslogtreecommitdiffstats
path: root/media/video
diff options
context:
space:
mode:
authorkcwu@chromium.org <kcwu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-26 22:01:36 +0000
committerkcwu@chromium.org <kcwu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-26 22:01:36 +0000
commit3829575b24b5928cf8742939c3fe241e2b8220c3 (patch)
tree1ccd8ca3fcd53994702cdb0d294c4f44a81349f1 /media/video
parented25b44f44f8aa83011f67b8cec75958c471db11 (diff)
downloadchromium_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.cc24
-rw-r--r--media/video/capture/linux/video_capture_device_linux.h1
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);
};