NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx driver and thus may have bugs that are not present in the original version. Please send bug reports and support requests to <luc@saillard.org>. The decompression routines have been implemented by reverse-engineering the Nemosoft binary pwcx module. Caveat emptor.
/* Ignore errors in the first N frames, to allow for startup delays */ #define FRAME_LOWMARK 5
/* Size and number of buffers for the ISO pipe. */ #define MAX_ISO_BUFS 3 #define ISO_FRAMES_PER_DESC 10 #define ISO_MAX_FRAME_SIZE 960 #define ISO_BUFFER_SIZE (ISO_FRAMES_PER_DESC * ISO_MAX_FRAME_SIZE)
/* Maximum size after decompression is 640x480 YUV data, 1.5 * 640 * 480 */ #define PWC_FRAME_SIZE (460800 + TOUCAM_HEADER_SIZE + TOUCAM_TRAILER_SIZE)
/* Absolute minimum and maximum number of buffers available for mmap() */ #define MIN_FRAMES 2 #define MAX_FRAMES 16
/* Some macros to quickly find the type of a webcam */ #define DEVICE_USE_CODEC1(x) ((x)<675) #define DEVICE_USE_CODEC2(x) ((x)>=675 && (x)<700) #define DEVICE_USE_CODEC3(x) ((x)>=700) #define DEVICE_USE_CODEC23(x) ((x)>=675)
struct pwc_raw_frame {
__le16 type; /* type of the webcam */
__le16 vbandlength; /* Size of 4 lines compressed (used by the
decompressor) */
__u8 cmd[4]; /* the four byte of the command (in case of
nala, only the first 3 bytes is filled) */
__u8 rawframe[]; /* frame_size = H / 4 * vbandlength */
} __packed;
/* intermediate buffers with raw data from the USB cam */ struct pwc_frame_buf
{ /* common v4l buffer stuff -- must be first */ struct vb2_v4l2_buffer vb; struct list_head list; void *data; int filled; /* number of bytes filled */
};
/* videobuf2 queue and queued buffers list */ struct vb2_queue vb_queue; struct list_head queued_bufs;
spinlock_t queued_bufs_lock; /* Protects queued_bufs */
/* If taking both locks vb_queue_lock must always be locked first! */ struct mutex v4l2_lock; /* Protects everything else */ struct mutex vb_queue_lock; /* Protects vb_queue and capt_file */
/* Pointer to our usb_device, will be NULL after unplug */ struct usb_device *udev; /* Both mutexes most be hold when setting! */
/* type of cam (645, 646, 675, 680, 690, 720, 730, 740, 750) */ int type; int release; /* release number */ int features; /* feature bits */
/*** Video data ***/ int vendpoint; /* video isoc endpoint */ int vcinterface; /* video control interface */ int valternate; /* alternate interface needed */ int vframes; /* frames-per-second */ int pixfmt; /* pixelformat: V4L2_PIX_FMT_YUV420 or _PWCX */ int vframe_count; /* received frames */ int vmax_packet_size; /* USB maxpacket size */ int vlast_packet_size; /* for frame synchronisation */ int visoc_errors; /* number of contiguous ISOC errors */ int vbandlength; /* compressed band length; 0 is uncompressed */ char vsync; /* used by isoc handler */ char vmirror; /* for ToUCaM series */ char power_save; /* Do powersaving for this cam */
unsignedchar cmd_buf[13]; unsignedchar *ctrl_buf;
struct urb *urbs[MAX_ISO_BUFS];
/* * Frame currently being filled, this only gets touched by the * isoc urb complete handler, and by stream start / stop since * start / stop touch it before / after starting / killing the urbs * no locking is needed around this
*/ struct pwc_frame_buf *fill_buf;
int frame_header_size, frame_trailer_size; int frame_size; int frame_total_size; /* including header & trailer */ int drop_frames;
union { /* private data for decompression engine */ struct pwc_dec1_private dec1; struct pwc_dec23_private dec23;
};
/* * We have an 'image' and a 'view', where 'image' is the fixed-size img * as delivered by the camera, and 'view' is the size requested by the * program. The camera image is centered in this viewport, laced with * a gray or black border. view_min <= image <= view <= view_max;
*/ int image_mask; /* supported sizes */ int width, height; /* current resolution */
/* controls */ struct v4l2_ctrl_handler ctrl_handler;
u16 saturation_fmt; struct v4l2_ctrl *brightness; struct v4l2_ctrl *contrast; struct v4l2_ctrl *saturation; struct v4l2_ctrl *gamma; struct { /* awb / red-blue balance cluster */ struct v4l2_ctrl *auto_white_balance; struct v4l2_ctrl *red_balance; struct v4l2_ctrl *blue_balance; /* usb ctrl transfers are slow, so we cache things */ int color_bal_valid; unsignedlong last_color_bal_update; /* In jiffies */
s32 last_red_balance;
s32 last_blue_balance;
}; struct { /* autogain / gain cluster */ struct v4l2_ctrl *autogain; struct v4l2_ctrl *gain; int gain_valid; unsignedlong last_gain_update; /* In jiffies */
s32 last_gain;
}; struct { /* exposure_auto / exposure cluster */ struct v4l2_ctrl *exposure_auto; struct v4l2_ctrl *exposure; int exposure_valid; unsignedlong last_exposure_update; /* In jiffies */
s32 last_exposure;
}; struct v4l2_ctrl *colorfx; struct { /* autocontour/contour cluster */ struct v4l2_ctrl *autocontour; struct v4l2_ctrl *contour;
}; struct v4l2_ctrl *backlight; struct v4l2_ctrl *flicker; struct v4l2_ctrl *noise_reduction; struct v4l2_ctrl *save_user; struct v4l2_ctrl *restore_user; struct v4l2_ctrl *restore_factory; struct v4l2_ctrl *awb_speed; struct v4l2_ctrl *awb_delay; struct { /* motor control cluster */ struct v4l2_ctrl *motor_pan; struct v4l2_ctrl *motor_tilt; struct v4l2_ctrl *motor_pan_reset; struct v4l2_ctrl *motor_tilt_reset;
}; /* CODEC3 models have both gain and exposure controlled by autogain */ struct v4l2_ctrl *autogain_expo_cluster[3];
};
/* Global variables */ #ifdef CONFIG_USB_PWC_DEBUG externint pwc_trace; #endif
/** Functions in pwc-misc.c */ /* sizes in pixels */ externconstint pwc_image_sizes[PSZ_MAX][2];
int pwc_get_size(struct pwc_device *pdev, int width, int height); void pwc_construct(struct pwc_device *pdev);
/** Functions in pwc-ctrl.c */ /* Request a certain video mode. Returns < 0 if not possible */ externint pwc_set_video_mode(struct pwc_device *pdev, int width, int height, int pixfmt, int frames, int *compression, int send_to_cam); externunsignedint pwc_get_fps(struct pwc_device *pdev, unsignedint index, unsignedint size); externint pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value); externint pwc_get_cmos_sensor(struct pwc_device *pdev, int *sensor); externint send_control_msg(struct pwc_device *pdev,
u8 request, u16 value, void *buf, int buflen);
/* Control get / set helpers */ int pwc_get_u8_ctrl(struct pwc_device *pdev, u8 request, u16 value, int *data); int pwc_set_u8_ctrl(struct pwc_device *pdev, u8 request, u16 value, u8 data); int pwc_get_s8_ctrl(struct pwc_device *pdev, u8 request, u16 value, int *data); #define pwc_set_s8_ctrl pwc_set_u8_ctrl int pwc_get_u16_ctrl(struct pwc_device *pdev, u8 request, u16 value, int *dat); int pwc_set_u16_ctrl(struct pwc_device *pdev, u8 request, u16 value, u16 data); int pwc_button_ctrl(struct pwc_device *pdev, u16 value); int pwc_init_controls(struct pwc_device *pdev);
/* Power down or up the camera; not supported by all models */ externvoid pwc_camera_power(struct pwc_device *pdev, int power);
externconststruct v4l2_ioctl_ops pwc_ioctl_ops;
/** pwc-uncompress.c */ /* Expand frame to image, possibly including decompression. Uses read_frame and fill_image */ int pwc_decompress(struct pwc_device *pdev, struct pwc_frame_buf *fbuf);
#endif
Messung V0.5
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.