diff options
Diffstat (limited to 'media/video')
3 files changed, 17 insertions, 7 deletions
diff --git a/media/video/capture/linux/video_capture_device_factory_linux.cc b/media/video/capture/linux/video_capture_device_factory_linux.cc index 4cb0800..36d69d8 100644 --- a/media/video/capture/linux/video_capture_device_factory_linux.cc +++ b/media/video/capture/linux/video_capture_device_factory_linux.cc @@ -155,15 +155,14 @@ void VideoCaptureDeviceFactoryLinux::GetDeviceSupportedFormats( frame_interval.pixel_format = pixel_format.pixelformat; frame_interval.width = frame_size.discrete.width; frame_interval.height = frame_size.discrete.height; + std::list<float> frame_rates; while (HANDLE_EINTR(ioctl( fd.get(), VIDIOC_ENUM_FRAMEINTERVALS, &frame_interval)) == 0) { if (frame_interval.type == V4L2_FRMIVAL_TYPE_DISCRETE) { if (frame_interval.discrete.numerator != 0) { - supported_format.frame_rate = + frame_rates.push_back( static_cast<float>(frame_interval.discrete.denominator) / - static_cast<float>(frame_interval.discrete.numerator); - } else { - supported_format.frame_rate = 0; + static_cast<float>(frame_interval.discrete.numerator)); } } else if (frame_interval.type == V4L2_FRMIVAL_TYPE_CONTINUOUS) { // TODO(mcasas): see http://crbug.com/249953, support these devices. @@ -174,9 +173,20 @@ void VideoCaptureDeviceFactoryLinux::GetDeviceSupportedFormats( NOTIMPLEMENTED(); break; } + ++frame_interval.index; + } + + // Some devices, e.g. Kinect, do not enumerate any frame rates. For these + // devices, we do not want to lose all enumeration (pixel format and + // resolution), so we return a frame rate of zero instead. + if (frame_rates.empty()) + frame_rates.push_back(0); + + for (std::list<float>::iterator it = frame_rates.begin(); + it != frame_rates.end(); ++it) { + supported_format.frame_rate = *it; supported_formats->push_back(supported_format); DVLOG(1) << device.name() << " " << supported_format.ToString(); - ++frame_interval.index; } ++frame_size.index; } diff --git a/media/video/capture/linux/video_capture_device_linux.cc b/media/video/capture/linux/video_capture_device_linux.cc index 0192daba..cee6dd0 100644 --- a/media/video/capture/linux/video_capture_device_linux.cc +++ b/media/video/capture/linux/video_capture_device_linux.cc @@ -204,7 +204,7 @@ void VideoCaptureDeviceLinux::SetRotationOnV4L2Thread(int rotation) { void VideoCaptureDeviceLinux::OnAllocateAndStart(int width, int height, - int frame_rate, + float frame_rate, scoped_ptr<Client> client) { DCHECK_EQ(v4l2_thread_.message_loop(), base::MessageLoop::current()); diff --git a/media/video/capture/linux/video_capture_device_linux.h b/media/video/capture/linux/video_capture_device_linux.h index 5415eb7..40017a8 100644 --- a/media/video/capture/linux/video_capture_device_linux.h +++ b/media/video/capture/linux/video_capture_device_linux.h @@ -59,7 +59,7 @@ class VideoCaptureDeviceLinux : public VideoCaptureDevice { // Called on the v4l2_thread_. void OnAllocateAndStart(int width, int height, - int frame_rate, + float frame_rate, scoped_ptr<Client> client); void OnStopAndDeAllocate(); void OnCaptureTask(); |