1c978162a05d7695cd05c62d467446958e3bc5055Jie Sun// Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 2c978162a05d7695cd05c62d467446958e3bc5055Jie Sun// Use of this source code is governed by a BSD-style license that can be 3c978162a05d7695cd05c62d467446958e3bc5055Jie Sun// found in the LICENSE file. 4c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 5c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#ifndef MEDIA_V4L2_DEVICE_H_ 6c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#define MEDIA_V4L2_DEVICE_H_ 7c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 8c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <errno.h> 9c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <fcntl.h> 10c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <linux/videodev2.h> 11c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <malloc.h> 12c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <stdint.h> 13c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <stdio.h> 14c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <stdlib.h> 15c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <string.h> 16c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <sys/ioctl.h> 17c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <sys/mman.h> 18c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <unistd.h> 19c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 20c978162a05d7695cd05c62d467446958e3bc5055Jie Sunclass V4L2Device { 21c978162a05d7695cd05c62d467446958e3bc5055Jie Sun public: 22c978162a05d7695cd05c62d467446958e3bc5055Jie Sun enum IOMethod { 23c978162a05d7695cd05c62d467446958e3bc5055Jie Sun IO_METHOD_READ, 24c978162a05d7695cd05c62d467446958e3bc5055Jie Sun IO_METHOD_MMAP, 25c978162a05d7695cd05c62d467446958e3bc5055Jie Sun IO_METHOD_USERPTR, 26c978162a05d7695cd05c62d467446958e3bc5055Jie Sun }; 27c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 28c978162a05d7695cd05c62d467446958e3bc5055Jie Sun struct Buffer { 29c978162a05d7695cd05c62d467446958e3bc5055Jie Sun void* start; 30c978162a05d7695cd05c62d467446958e3bc5055Jie Sun size_t length; 31c978162a05d7695cd05c62d467446958e3bc5055Jie Sun }; 32c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 33c978162a05d7695cd05c62d467446958e3bc5055Jie Sun V4L2Device(const char* dev_name, 34c978162a05d7695cd05c62d467446958e3bc5055Jie Sun IOMethod io, 35c978162a05d7695cd05c62d467446958e3bc5055Jie Sun uint32_t buffers); 36c978162a05d7695cd05c62d467446958e3bc5055Jie Sun virtual ~V4L2Device() {} 37c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 38c978162a05d7695cd05c62d467446958e3bc5055Jie Sun virtual bool OpenDevice(); 39c978162a05d7695cd05c62d467446958e3bc5055Jie Sun virtual void CloseDevice(); 40c978162a05d7695cd05c62d467446958e3bc5055Jie Sun virtual bool InitDevice(uint32_t width, 41c978162a05d7695cd05c62d467446958e3bc5055Jie Sun uint32_t height, 42c978162a05d7695cd05c62d467446958e3bc5055Jie Sun uint32_t pixfmt, 43c978162a05d7695cd05c62d467446958e3bc5055Jie Sun uint32_t fps); 44c978162a05d7695cd05c62d467446958e3bc5055Jie Sun virtual bool UninitDevice(); 45c978162a05d7695cd05c62d467446958e3bc5055Jie Sun virtual bool StartCapture(); 46c978162a05d7695cd05c62d467446958e3bc5055Jie Sun virtual bool StopCapture(); 475132330c9a6ecf21e52a90ed874f5aba70547a97Jie Sun virtual bool Run(uint32_t frames, uint32_t time_in_sec = 0); 48c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 49c978162a05d7695cd05c62d467446958e3bc5055Jie Sun // Helper methods. 50c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool EnumInput(); 51c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool EnumStandard(); 52c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool EnumControl(bool show_menu = true); 53c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool EnumControlMenu(const v4l2_queryctrl& query_ctrl); 54c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool EnumFormat(uint32_t* num_formats, bool show_fmt = true); 55c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool EnumFrameSize(uint32_t pixfmt, bool show_frmsize = true); 56c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 57c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool QueryControl(uint32_t id, v4l2_queryctrl* ctrl); 58c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool SetControl(uint32_t id, int32_t value); 59c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool ProbeCaps(v4l2_capability* cap, bool show_caps = false); 60c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool GetCropCap(v4l2_cropcap* cropcap); 61c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool GetCrop(v4l2_crop* crop); 62c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool SetCrop(v4l2_crop* crop); 63c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool GetParam(v4l2_streamparm* param); 64c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool SetParam(v4l2_streamparm* param); 65c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool SetFrameRate(uint32_t fps); 66c978162a05d7695cd05c62d467446958e3bc5055Jie Sun uint32_t GetPixelFormat(uint32_t index); 67c978162a05d7695cd05c62d467446958e3bc5055Jie Sun uint32_t GetFrameRate(); 68c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool Stop(); 69c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 70c978162a05d7695cd05c62d467446958e3bc5055Jie Sun // Getter. 71c978162a05d7695cd05c62d467446958e3bc5055Jie Sun int32_t GetActualWidth() { 72c978162a05d7695cd05c62d467446958e3bc5055Jie Sun return width_; 73c978162a05d7695cd05c62d467446958e3bc5055Jie Sun } 74c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 75c978162a05d7695cd05c62d467446958e3bc5055Jie Sun int32_t GetActualHeight() { 76c978162a05d7695cd05c62d467446958e3bc5055Jie Sun return height_; 77c978162a05d7695cd05c62d467446958e3bc5055Jie Sun } 78c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 79c978162a05d7695cd05c62d467446958e3bc5055Jie Sun v4l2_format& GetActualPixelFormat() { 80c978162a05d7695cd05c62d467446958e3bc5055Jie Sun return pixfmt_; 81c978162a05d7695cd05c62d467446958e3bc5055Jie Sun } 82c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 83c978162a05d7695cd05c62d467446958e3bc5055Jie Sun static uint32_t MapFourCC(const char* fourcc); 84c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 85c978162a05d7695cd05c62d467446958e3bc5055Jie Sun virtual void ProcessImage(const void* p); 86c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 87c978162a05d7695cd05c62d467446958e3bc5055Jie Sun private: 88c978162a05d7695cd05c62d467446958e3bc5055Jie Sun int32_t DoIoctl(int32_t request, void* arg); 89c978162a05d7695cd05c62d467446958e3bc5055Jie Sun int32_t ReadOneFrame(); 90c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool InitReadIO(uint32_t buffer_size); 91c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool InitMmapIO(); 92c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool InitUserPtrIO(uint32_t buffer_size); 93c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool AllocateBuffer(uint32_t buffer_count); 94c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool FreeBuffer(); 955132330c9a6ecf21e52a90ed874f5aba70547a97Jie Sun uint64_t Now(); 96c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 97c978162a05d7695cd05c62d467446958e3bc5055Jie Sun const char* dev_name_; 98c978162a05d7695cd05c62d467446958e3bc5055Jie Sun IOMethod io_; 99c978162a05d7695cd05c62d467446958e3bc5055Jie Sun int32_t fd_; 100c978162a05d7695cd05c62d467446958e3bc5055Jie Sun Buffer* v4l2_buffers_; 101c978162a05d7695cd05c62d467446958e3bc5055Jie Sun uint32_t num_buffers_; // Actual buffers allocation. 102c978162a05d7695cd05c62d467446958e3bc5055Jie Sun uint32_t min_buffers_; // Minimum buffers requirement. 103c978162a05d7695cd05c62d467446958e3bc5055Jie Sun bool stopped_; 104c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 105c978162a05d7695cd05c62d467446958e3bc5055Jie Sun // Valid only after |InitDevice()|. 106c978162a05d7695cd05c62d467446958e3bc5055Jie Sun uint32_t width_, height_; 107c978162a05d7695cd05c62d467446958e3bc5055Jie Sun v4l2_format pixfmt_; 108c978162a05d7695cd05c62d467446958e3bc5055Jie Sun}; 109c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 110c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#endif // MEDIA_V4L2_DEVICE_H_ 111c978162a05d7695cd05c62d467446958e3bc5055Jie Sun 112