/* * 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 */ #ifndef XCAM_V4L2_DEVICE_H #define XCAM_V4L2_DEVICE_H #include #include #include #include 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> 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 enum_formats (); virtual XCamReturn start (); virtual XCamReturn stop (); int poll_event (int timeout_msec); XCamReturn dequeue_buffer (SmartPtr &buf); XCamReturn queue_buffer (SmartPtr &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 &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