| /* |
| * Broadcom BM2835 V4L2 driver |
| * |
| * Copyright © 2013 Raspberry Pi (Trading) Ltd. |
| * |
| * This file is subject to the terms and conditions of the GNU General Public |
| * License. See the file COPYING in the main directory of this archive |
| * for more details. |
| * |
| * Authors: Vincent Sanders <vincent.sanders@collabora.co.uk> |
| * Dave Stevenson <dsteve@broadcom.com> |
| * Simon Mellor <simellor@broadcom.com> |
| * Luke Diamand <luked@broadcom.com> |
| * |
| * core driver device |
| */ |
| |
| #define V4L2_CTRL_COUNT 29 /* number of v4l controls */ |
| |
| enum { |
| MMAL_COMPONENT_CAMERA = 0, |
| MMAL_COMPONENT_PREVIEW, |
| MMAL_COMPONENT_IMAGE_ENCODE, |
| MMAL_COMPONENT_VIDEO_ENCODE, |
| MMAL_COMPONENT_COUNT |
| }; |
| |
| enum { |
| MMAL_CAMERA_PORT_PREVIEW = 0, |
| MMAL_CAMERA_PORT_VIDEO, |
| MMAL_CAMERA_PORT_CAPTURE, |
| MMAL_CAMERA_PORT_COUNT |
| }; |
| |
| #define PREVIEW_LAYER 2 |
| |
| extern int bcm2835_v4l2_debug; |
| |
| struct bm2835_mmal_dev { |
| /* v4l2 devices */ |
| struct v4l2_device v4l2_dev; |
| struct video_device vdev; |
| struct mutex mutex; |
| |
| /* controls */ |
| struct v4l2_ctrl_handler ctrl_handler; |
| struct v4l2_ctrl *ctrls[V4L2_CTRL_COUNT]; |
| enum v4l2_scene_mode scene_mode; |
| struct mmal_colourfx colourfx; |
| int hflip; |
| int vflip; |
| int red_gain; |
| int blue_gain; |
| enum mmal_parameter_exposuremode exposure_mode_user; |
| enum v4l2_exposure_auto_type exposure_mode_v4l2_user; |
| /* active exposure mode may differ if selected via a scene mode */ |
| enum mmal_parameter_exposuremode exposure_mode_active; |
| enum mmal_parameter_exposuremeteringmode metering_mode; |
| unsigned int manual_shutter_speed; |
| bool exp_auto_priority; |
| bool manual_iso_enabled; |
| u32 iso; |
| |
| /* allocated mmal instance and components */ |
| struct vchiq_mmal_instance *instance; |
| struct vchiq_mmal_component *component[MMAL_COMPONENT_COUNT]; |
| int camera_use_count; |
| |
| struct v4l2_window overlay; |
| |
| struct { |
| unsigned int width; /* width */ |
| unsigned int height; /* height */ |
| unsigned int stride; /* stride */ |
| unsigned int buffersize; /* buffer size with padding */ |
| struct mmal_fmt *fmt; |
| struct v4l2_fract timeperframe; |
| |
| /* H264 encode bitrate */ |
| int encode_bitrate; |
| /* H264 bitrate mode. CBR/VBR */ |
| int encode_bitrate_mode; |
| /* H264 profile */ |
| enum v4l2_mpeg_video_h264_profile enc_profile; |
| /* H264 level */ |
| enum v4l2_mpeg_video_h264_level enc_level; |
| /* JPEG Q-factor */ |
| int q_factor; |
| |
| struct vb2_queue vb_vidq; |
| |
| /* VC start timestamp for streaming */ |
| s64 vc_start_timestamp; |
| /* Kernel start timestamp for streaming */ |
| struct timeval kernel_start_ts; |
| |
| struct vchiq_mmal_port *port; /* port being used for capture */ |
| /* camera port being used for capture */ |
| struct vchiq_mmal_port *camera_port; |
| /* component being used for encode */ |
| struct vchiq_mmal_component *encode_component; |
| /* number of frames remaining which driver should capture */ |
| unsigned int frame_count; |
| /* last frame completion */ |
| struct completion frame_cmplt; |
| |
| } capture; |
| |
| unsigned int camera_num; |
| unsigned int max_width; |
| unsigned int max_height; |
| unsigned int rgb_bgr_swapped; |
| }; |
| |
| int bm2835_mmal_init_controls( |
| struct bm2835_mmal_dev *dev, |
| struct v4l2_ctrl_handler *hdl); |
| |
| int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev); |
| int set_framerate_params(struct bm2835_mmal_dev *dev); |
| |
| /* Debug helpers */ |
| |
| #define v4l2_dump_pix_format(level, debug, dev, pix_fmt, desc) \ |
| { \ |
| v4l2_dbg(level, debug, dev, \ |
| "%s: w %u h %u field %u pfmt 0x%x bpl %u sz_img %u colorspace 0x%x priv %u\n", \ |
| desc, \ |
| (pix_fmt)->width, (pix_fmt)->height, (pix_fmt)->field, \ |
| (pix_fmt)->pixelformat, (pix_fmt)->bytesperline, \ |
| (pix_fmt)->sizeimage, (pix_fmt)->colorspace, (pix_fmt)->priv); \ |
| } |
| #define v4l2_dump_win_format(level, debug, dev, win_fmt, desc) \ |
| { \ |
| v4l2_dbg(level, debug, dev, \ |
| "%s: w %u h %u l %u t %u field %u chromakey %06X clip %p " \ |
| "clipcount %u bitmap %p\n", \ |
| desc, \ |
| (win_fmt)->w.width, (win_fmt)->w.height, \ |
| (win_fmt)->w.left, (win_fmt)->w.top, \ |
| (win_fmt)->field, \ |
| (win_fmt)->chromakey, \ |
| (win_fmt)->clips, (win_fmt)->clipcount, \ |
| (win_fmt)->bitmap); \ |
| } |