Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/video/capture/linux/video_capture_device_linux.h" | 5 #include "media/video/capture/linux/video_capture_device_linux.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #include <poll.h> | 9 #include <poll.h> |
| 10 #if defined(OS_OPENBSD) | 10 #if defined(OS_OPENBSD) |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 355 : V4L2_CID_POWER_LINE_FREQUENCY_60HZ; | 355 : V4L2_CID_POWER_LINE_FREQUENCY_60HZ; |
| 356 HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_S_CTRL, &control)); | 356 HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_S_CTRL, &control)); |
| 357 } | 357 } |
| 358 | 358 |
| 359 capture_format_.frame_size.SetSize(video_fmt.fmt.pix.width, | 359 capture_format_.frame_size.SetSize(video_fmt.fmt.pix.width, |
| 360 video_fmt.fmt.pix.height); | 360 video_fmt.fmt.pix.height); |
| 361 capture_format_.frame_rate = frame_rate; | 361 capture_format_.frame_rate = frame_rate; |
| 362 capture_format_.pixel_format = | 362 capture_format_.pixel_format = |
| 363 V4l2FourCcToChromiumPixelFormat(video_fmt.fmt.pix.pixelformat); | 363 V4l2FourCcToChromiumPixelFormat(video_fmt.fmt.pix.pixelformat); |
| 364 | 364 |
| 365 if (capture_format_.pixel_format == PIXEL_FORMAT_MJPEG) { | |
| 366 // TODO(kcwu) remove this hacky api | |
| 367 if (!client_->InitializeJpegDecoder()) { | |
|
wuchengli
2015/03/23 06:30:15
How about calling this when |last_captured_pixel_f
kcwu
2015/03/30 18:12:14
Done.
| |
| 368 SetErrorState("InitializeJpegDecoder failed"); | |
| 369 return; | |
| 370 } | |
| 371 } | |
| 372 | |
| 365 if (!AllocateVideoBuffers()) { | 373 if (!AllocateVideoBuffers()) { |
| 366 SetErrorState("Allocate buffer failed (Cannot recover from this error)"); | 374 SetErrorState("Allocate buffer failed (Cannot recover from this error)"); |
| 367 return; | 375 return; |
| 368 } | 376 } |
| 369 | 377 |
| 370 const v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | 378 const v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE; |
| 371 if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_STREAMON, &type)) < 0) { | 379 if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_STREAMON, &type)) < 0) { |
| 372 SetErrorState("VIDIOC_STREAMON failed"); | 380 SetErrorState("VIDIOC_STREAMON failed"); |
| 373 return; | 381 return; |
| 374 } | 382 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 431 } | 439 } |
| 432 } else { | 440 } else { |
| 433 timeout_count_ = 0; | 441 timeout_count_ = 0; |
| 434 } | 442 } |
| 435 | 443 |
| 436 // Check if the driver has filled a buffer. | 444 // Check if the driver has filled a buffer. |
| 437 if (device_pfd.revents & POLLIN) { | 445 if (device_pfd.revents & POLLIN) { |
| 438 v4l2_buffer buffer = {}; | 446 v4l2_buffer buffer = {}; |
| 439 buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | 447 buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; |
| 440 buffer.memory = V4L2_MEMORY_MMAP; | 448 buffer.memory = V4L2_MEMORY_MMAP; |
| 449 LOG(ERROR) << "DQBUF"; | |
| 441 if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_DQBUF, &buffer)) < 0) { | 450 if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_DQBUF, &buffer)) < 0) { |
| 442 SetErrorState("Failed to dequeue capture buffer"); | 451 SetErrorState("Failed to dequeue capture buffer"); |
| 443 return; | 452 return; |
| 444 } | 453 } |
| 445 client_->OnIncomingCapturedData( | 454 client_->OnIncomingCapturedData( |
| 446 static_cast<uint8*>(buffer_pool_[buffer.index].start), | 455 static_cast<uint8*>(buffer_pool_[buffer.index].start), |
| 447 buffer.bytesused, | 456 buffer.bytesused, |
| 448 capture_format_, | 457 capture_format_, |
| 449 rotation_, | 458 rotation_, |
| 450 base::TimeTicks::Now()); | 459 base::TimeTicks::Now()); |
| 451 | 460 |
| 461 LOG(ERROR) << "QBUF"; | |
| 452 if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_QBUF, &buffer)) < 0) | 462 if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_QBUF, &buffer)) < 0) |
| 453 SetErrorState("Failed to enqueue capture buffer"); | 463 SetErrorState("Failed to enqueue capture buffer"); |
| 454 } | 464 } |
| 455 | 465 |
| 456 v4l2_task_runner_->PostTask( | 466 v4l2_task_runner_->PostTask( |
| 457 FROM_HERE, | 467 FROM_HERE, |
| 458 base::Bind(&VideoCaptureDeviceLinux::V4L2CaptureDelegate::DoCapture, | 468 base::Bind(&VideoCaptureDeviceLinux::V4L2CaptureDelegate::DoCapture, |
| 459 this)); | 469 this)); |
| 460 } | 470 } |
| 461 | 471 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 524 } | 534 } |
| 525 | 535 |
| 526 void VideoCaptureDeviceLinux::V4L2CaptureDelegate::SetErrorState( | 536 void VideoCaptureDeviceLinux::V4L2CaptureDelegate::SetErrorState( |
| 527 const std::string& reason) { | 537 const std::string& reason) { |
| 528 DCHECK(v4l2_task_runner_->BelongsToCurrentThread()); | 538 DCHECK(v4l2_task_runner_->BelongsToCurrentThread()); |
| 529 is_capturing_ = false; | 539 is_capturing_ = false; |
| 530 client_->OnError(reason); | 540 client_->OnError(reason); |
| 531 } | 541 } |
| 532 | 542 |
| 533 } // namespace media | 543 } // namespace media |
| OLD | NEW |