| /* |
| * v4l2_device.h - v4l2 device |
| * |
| * Copyright (c) 2014-2015 Intel Corporation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * Author: Wind Yuan <[email protected]> |
| */ |
| |
| #ifndef XCAM_V4L2_DEVICE_H |
| #define XCAM_V4L2_DEVICE_H |
| |
| #include <xcam_std.h> |
| #include <linux/videodev2.h> |
| #include <list> |
| #include <vector> |
| |
| extern "C" { |
| struct v4l2_event; |
| struct v4l2_format; |
| struct v4l2_fmtdesc; |
| struct v4l2_frmsizeenum; |
| } |
| |
| namespace XCam { |
| |
| class V4l2Buffer; |
| |
| class V4l2Device { |
| friend class V4l2BufferProxy; |
| typedef std::vector<SmartPtr<V4l2Buffer>> BufferPool; |
| |
| public: |
| V4l2Device (const char *name = NULL); |
| virtual ~V4l2Device (); |
| |
| // before device open |
| bool set_device_name (const char *name); |
| bool set_sensor_id (int id); |
| bool set_capture_mode (uint32_t capture_mode); |
| |
| int get_fd () const { |
| return _fd; |
| } |
| const char *get_device_name () const { |
| return _name; |
| } |
| bool is_opened () const { |
| return (_fd != -1); |
| } |
| bool is_activated () const { |
| return _active; |
| } |
| |
| // set_mem_type must before set_format |
| bool set_mem_type (enum v4l2_memory type); |
| enum v4l2_memory get_mem_type () const { |
| return _memory_type; |
| } |
| enum v4l2_buf_type get_capture_buf_type () const { |
| return _capture_buf_type; |
| } |
| void get_size (uint32_t &width, uint32_t &height) const { |
| width = _format.fmt.pix.width; |
| height = _format.fmt.pix.height; |
| } |
| uint32_t get_pixel_format () const { |
| return _format.fmt.pix.pixelformat; |
| } |
| |
| bool set_buffer_count (uint32_t buf_count); |
| |
| // set_framerate must before set_format |
| bool set_framerate (uint32_t n, uint32_t d); |
| void get_framerate (uint32_t &n, uint32_t &d); |
| |
| XCamReturn open (); |
| XCamReturn close (); |
| // set_format |
| XCamReturn get_format (struct v4l2_format &format); |
| XCamReturn set_format (struct v4l2_format &format); |
| XCamReturn set_format ( |
| uint32_t width, uint32_t height, uint32_t pixelformat, |
| enum v4l2_field field = V4L2_FIELD_NONE, uint32_t bytes_perline = 0); |
| |
| std::list<struct v4l2_fmtdesc> enum_formats (); |
| |
| virtual XCamReturn start (); |
| virtual XCamReturn stop (); |
| |
| int poll_event (int timeout_msec); |
| XCamReturn dequeue_buffer (SmartPtr<V4l2Buffer> &buf); |
| XCamReturn queue_buffer (SmartPtr<V4l2Buffer> &buf); |
| |
| // use as less as possible |
| virtual int io_control (int cmd, void *arg); |
| |
| protected: |
| |
| //virtual functions, handle private actions on set_format |
| virtual XCamReturn pre_set_format (struct v4l2_format &format); |
| virtual XCamReturn post_set_format (struct v4l2_format &format); |
| virtual XCamReturn allocate_buffer ( |
| SmartPtr<V4l2Buffer> &buf, |
| const struct v4l2_format &format, |
| const uint32_t index); |
| |
| private: |
| XCamReturn request_buffer (); |
| XCamReturn init_buffer_pool (); |
| XCamReturn fini_buffer_pool (); |
| |
| XCAM_DEAD_COPY (V4l2Device); |
| |
| protected: |
| char *_name; |
| int _fd; |
| int32_t _sensor_id; |
| uint32_t _capture_mode; |
| enum v4l2_buf_type _capture_buf_type; |
| enum v4l2_memory _memory_type; |
| |
| struct v4l2_format _format; |
| uint32_t _fps_n; |
| uint32_t _fps_d; |
| |
| bool _active; |
| |
| // buffer pool |
| BufferPool _buf_pool; |
| uint32_t _buf_count; |
| |
| XCamReturn buffer_new(); |
| XCamReturn buffer_del(); |
| }; |
| |
| class V4l2SubDevice |
| : public V4l2Device |
| { |
| public: |
| explicit V4l2SubDevice (const char *name = NULL); |
| |
| XCamReturn subscribe_event (int event); |
| XCamReturn unsubscribe_event (int event); |
| XCamReturn dequeue_event (struct v4l2_event &event); |
| |
| virtual XCamReturn start (); |
| virtual XCamReturn stop (); |
| |
| private: |
| XCAM_DEAD_COPY (V4l2SubDevice); |
| }; |
| |
| }; |
| #endif // XCAM_V4L2_DEVICE_H |
| |