Date: Thu, 8 Sep 2011 09:43:51 +0200 From: Hans Petter Selasky <hselasky@c2i.net> To: freebsd-multimedia@freebsd.org Cc: Hans de Goede <hdegoede@redhat.com> Subject: Re: Web camera stream is flipped upsidedown Message-ID: <201109080943.51981.hselasky@c2i.net>
next in thread | raw e-mail | index | archive | help
--Boundary-00=_3IHaOvaFwI5ByeL Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit On Wednesday 07 September 2011 23:08:14 Eugene Dzhurinsky wrote: > Hello! > > I have some problem with my web camera on Asus K40IN laptop. > > FreeBSD localhost 8.2-STABLE FreeBSD 8.2-STABLE > Hi Eugene, LibV4L is responsible for the flipping. Try to patch LibV4L using the attached patch after "make extract patch", and also the installed videodev2.h. --HPS > usbconfig -u 1 -a 2 dump_device_desc > ugen1.2: <CNF7129 Chicony Electronics Co., Ltd.> at usbus1, cfg=0 md=HOST > spd=HIGH (480Mbps) pwr=ON > > bLength = 0x0012 > bDescriptorType = 0x0001 > bcdUSB = 0x0200 > bDeviceClass = 0x00ef > bDeviceSubClass = 0x0002 > bDeviceProtocol = 0x0001 > bMaxPacketSize0 = 0x0040 > idVendor = 0x04f2 > idProduct = 0xb071 > bcdDevice = 0x1515 > iManufacturer = 0x0002 <Chicony Electronics Co., Ltd.> > iProduct = 0x0001 <CNF7129> > iSerialNumber = 0x0003 <SN0001> > bNumConfigurations = 0x0001 > > I installed and started webcamd, and now I have the problem - pwcview shows > video flipped upsidedown, same happens in Skype. > > Is it possible to fix this with some settings for webcamd? > > Thanks in advance! --Boundary-00=_3IHaOvaFwI5ByeL Content-Type: text/x-patch; charset="iso-8859-1"; name="libv4l.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="libv4l.patch" commit 593e3a9167b4a194f2483cdf7fec4fe25606e8b8 Author: Hans Petter Selasky <hselasky@c2i.net> Date: Wed Jul 20 14:14:51 2011 +0200 Provide direct way of getting USB device information. Signed-off-by: Hans Petter Selasky <hselasky@c2i.net> diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 8b1224c..1ce7b78 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h @@ -1916,6 +1916,25 @@ struct v4l2_dbg_chip_ident { __u32 revision; /* chip revision, chip specific */ } __attribute__ ((packed)); +/** + * struct v4l2_usb_info - retrieve USB specific information + * @vid: device vendor ID + * @pid: device product ID + * @bcd: device revision + * @bus: device bus number + * @addr: device address number + * @speed: link speed in kilo bits per second + */ +/* VIDIOC_QUERYUSBINFO */ +struct v4l2_usb_info { + __u32 speed; /* USB link speed in kbit/s */ + __u16 vid; /* USB vendor information */ + __u16 pid; /* USB product information */ + __u16 bcd; /* USB device revision */ + __u8 bus; /* USB number */ + __u8 addr; /* USB address */ +} __attribute__((packed,aligned(64))); + /* * I O C T L C O D E S F O R V I D E O D E V I C E S * @@ -2005,6 +2024,7 @@ struct v4l2_dbg_chip_ident { #define VIDIOC_DQEVENT _IOR('V', 89, struct v4l2_event) #define VIDIOC_SUBSCRIBE_EVENT _IOW('V', 90, struct v4l2_event_subscription) #define VIDIOC_UNSUBSCRIBE_EVENT _IOW('V', 91, struct v4l2_event_subscription) +#define VIDIOC_QUERYUSBINFO _IOR('V', 92, struct v4l2_usb_info) /* Reminder: when adding new ioctls please add support for them to drivers/media/video/v4l2-compat-ioctl32.c as well! */ diff --git a/lib/libv4lconvert/control/libv4lcontrol.c b/lib/libv4lconvert/control/libv4lcontrol.c index b11d96c..098c7bd 100644 --- a/lib/libv4lconvert/control/libv4lcontrol.c +++ b/lib/libv4lconvert/control/libv4lcontrol.c @@ -637,6 +637,13 @@ static const struct v4lcontrol_flags_info v4lcontrol_flags[] = { static const struct v4l2_queryctrl fake_controls[]; +#ifdef __FreeBSD__ +static void v4lcontrol_get_dmi_string(const char *string, char *buf, int size) +{ + /* TODO */ + memset(buf, 0, size); +} +#else static void v4lcontrol_get_dmi_string(const char *string, char *buf, int size) { FILE *f; @@ -663,7 +670,24 @@ static void v4lcontrol_get_dmi_string(const char *string, char *buf, int size) s[strlen(s) - 1] = 0; fclose(f); } +#endif +#ifdef __FreeBSD__ +static int +v4lcontrol_get_usb_info(struct v4lcontrol_data *data, unsigned short *vendor_id, + unsigned short *product_id, int *speed) +{ + struct v4l2_usb_info usb_info; + + if (SYS_IOCTL(data->fd, VIDIOC_QUERYUSBINFO, &usb_info) == 0) { + *vendor_id = usb_info.vid; + *product_id = usb_info.pid; + *speed = usb_info.speed; + return (1); + } + return (0); +} +#else static int v4lcontrol_get_usb_info(struct v4lcontrol_data *data, unsigned short *vendor_id, unsigned short *product_id, int *speed) @@ -758,6 +782,7 @@ static int v4lcontrol_get_usb_info(struct v4lcontrol_data *data, return 1; } +#endif static void v4lcontrol_get_flags_from_db(struct v4lcontrol_data *data, unsigned short vendor_id, unsigned short product_id) --Boundary-00=_3IHaOvaFwI5ByeL Content-Type: text/x-patch; charset="iso-8859-1"; name="videodev2.h.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="videodev2.h.patch" diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 8b1224c..1ce7b78 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h @@ -1916,6 +1916,25 @@ struct v4l2_dbg_chip_ident { __u32 revision; /* chip revision, chip specific */ } __attribute__ ((packed)); +/** + * struct v4l2_usb_info - retrieve USB specific information + * @vid: device vendor ID + * @pid: device product ID + * @bcd: device revision + * @bus: device bus number + * @addr: device address number + * @speed: link speed in kilo bits per second + */ +/* VIDIOC_QUERYUSBINFO */ +struct v4l2_usb_info { + __u32 speed; /* USB link speed in kbit/s */ + __u16 vid; /* USB vendor information */ + __u16 pid; /* USB product information */ + __u16 bcd; /* USB device revision */ + __u8 bus; /* USB number */ + __u8 addr; /* USB address */ +} __attribute__((packed,aligned(64))); + /* * I O C T L C O D E S F O R V I D E O D E V I C E S * @@ -2005,6 +2024,7 @@ struct v4l2_dbg_chip_ident { #define VIDIOC_DQEVENT _IOR('V', 89, struct v4l2_event) #define VIDIOC_SUBSCRIBE_EVENT _IOW('V', 90, struct v4l2_event_subscription) #define VIDIOC_UNSUBSCRIBE_EVENT _IOW('V', 91, struct v4l2_event_subscription) +#define VIDIOC_QUERYUSBINFO _IOR('V', 92, struct v4l2_usb_info) /* Reminder: when adding new ioctls please add support for them to drivers/media/video/v4l2-compat-ioctl32.c as well! */ --Boundary-00=_3IHaOvaFwI5ByeL--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201109080943.51981.hselasky>