Перевернутая камера и Gentoo Way
podedge 21 февраля, 2010 - 22:59
Здравствуйте,
купив ноутбук ASUS N61Vn и установив любимую Gentoo столкнулся с проблемой перевернутой камеры. Гугл выдал замечательный howto для фикса UVC - http://ubuntuforums.org/showthread.php?t=838210
собирать из svn и применять патчи конечно здорово, однако интересует вопрос - как это сделать в gentoo way, чтобы можно было нормально обновляться, т.е. куда ложить патч, чтобы media-video/linux-uvc его всегда применял?
»
- Для комментирования войдите или зарегистрируйтесь

Перевернутое изображение -
Перевернутое изображение - как? Вверх ногами или зеркалированное справа налево?
Не грусти, товарищ! Всё хорошо, beautiful good!
обирать из svn и применять
краткий ответ: написать/исправить ебилд, положить в локальный оверлей.
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
Ответ неполный. Сработает
Ответ неполный. Сработает только при пересборке пакета, при обновлении придётся снова ковырять ебилбы. Мну кстати этот вопрос тоже интересует, только не для UVC а для KTorrent.
сделать ебилд для свн и
сделать ебилд для свн и обновлять когда захочешь
Вариант. Только в свн не
Вариант. Только в свн не всегда стабильный код - не все готовы на bleeding edge...
в свн всегда есть стабильные
в свн всегда есть стабильные метки, почитайте о свн, разработчики где должны ставить мастер бранч
Патч для ядра
Ноутбук Asus K50AB схожая проблема. Переписал патч для ядра 2.6.32-gentoo-r7
--- uvc_video.c 2010-06-24 19:49:59.000000000 +0700 +++ uvc_video.c.patched 2010-06-24 20:24:18.000000000 +0700 @@ -453,6 +453,9 @@ static void uvc_video_decode_data(struct uvc_streaming *stream, struct uvc_buffer *buf, const __u8 *data, int len) { + /* Patch variables */ + unsigned int row_size, to_be_copied, shift_right; + struct uvc_video_queue *queue = &stream->queue; unsigned int maxlen, nbytes; void *mem; @@ -461,11 +464,61 @@ return; /* Copy the video data to the buffer. */ + /* How many bytes are needed to complete the buffer? */ maxlen = buf->buf.length - buf->buf.bytesused; + /* Where do pixels stored in "data" have to be copied? */ mem = queue->mem + buf->buf.m.offset + buf->buf.bytesused; + /* How many bytes really can be copied into "mem"? */ nbytes = min((unsigned int)len, maxlen); - memcpy(mem, data, nbytes); - buf->buf.bytesused += nbytes; + + /* "row_size" is the number of bytes required to store a full row of + * the frame. + */ + row_size = stream->cur_frame->wWidth * stream->format->bpp / 8; + /* Each loop "nbytes" is decremented of the number of bytes just copied. + * So are there any other bytes to be copied? + */ + while (nbytes > 0) { + /* As the rows of modified frames have to be fulfilled from + * bottom-left to top-right, each cycle tries to complete a + * single row. + * In this cycle where is it needed to start to store bytes + * within the selected row? From the beginning or shifted + * right? Because other bytes could have been already stored in + * that row without completing it, so it could be needed a right + * shift. + */ + shift_right = buf->buf.bytesused % row_size; + /* In this cycle how many byte can we copy in the selected row? + */ + if (nbytes > row_size - shift_right) + to_be_copied = row_size - shift_right ; + else + to_be_copied = nbytes; + /* "queue->mem + buf->buf.m.offset" is the base-address where to + * start to store the current frame. This address refers to a + * preallocated area (just for a sigle frame) taking part in a + * circular buffer, where to store a fixed number of sequent + * frames. + */ + memcpy(queue->mem + buf->buf.m.offset + /* Go to the end of this frame. */ + + row_size * stream->cur_frame->wHeight + /* Go back for the number of bytes corrisponding to the + * already fully completed rows. + */ + - (buf->buf.bytesused - shift_right) + /* Go back at the starting point of the upper row. */ + - row_size + /* Shift right on this row if it is needed. */ + + shift_right, + data, + to_be_copied ); + /* Update "data", "byteused" and "nbytes" values. */ + data += to_be_copied; + buf->buf.bytesused += to_be_copied ; + nbytes -= to_be_copied; + } /* Complete the current frame if the buffer size was exceeded. */ if (len > maxlen) {Может кому будет полезно. Для меня это решило проблему.
Первоисточник тут
Человек, который занимается
Человек, который занимается драйверами uvc, в свое время просил название модели и вывод lsusb для того, чтобы внести камеру в список камер "вверх-ногами", где-то в драйвере есть случай для них, по которому изображение переворачивается обратно. Письмо валяется где-то в LKML, но сейчас я уже вряд ли найду. В любом случае, можно обратиться либо в LKML или напрямую к мантейнеру.
PS: нашел-таки - https://lists.berlios.de/pipermail/linux-uvc-devel/2009-June/004886.html
Не грусти, товарищ! Всё хорошо, beautiful good!
winterheart
Спасибо, всё перерыл, долго пытался разобраться с перевёрнутой камерой и чтобы без костылей! Не иначе как, происки майкрософт.
Вот этот файл: media-libs/libv4l-.../lib/libv4lconvert/control/libv4lcontrol.c
Чтобы не ждать выхода версии, в которую внесут Вашу камеру, в нём нужно добавить запись по dmidecode и lsusb типа:
{ 0x04f2, 0xb1e5, 0, "ASUSTeK Computer Inc. ", "P52Jc", V4LCONTROL_HFLIPPED | V4LCONTROL_VFLIPPED },Все пробелы в строковых переменных важны, т.е. если dmidecode выдаёт пробелы после P52Jc, то их тоже нужно вписывать.
В ядре должно быть CONFIG_DMIID=y.
После можно послать разработчику libv4l с патчем или выводом dmidecode, lsusb.
Если ничего не было, то как могло что-то появиться? А если все-таки что-то было, то откуда тогда оно взялось? Нашу Вселенную породила Рекурсия!
а можно по подробнее, что то
а можно по подробнее, что то не нахожу такого файла libv4lcontrol.c
в пакете
в пакете v4l-utils:
media-tv/v4l-utils/lib/libv4lconvert/control/libv4lcontrol.c
Если ничего не было, то как могло что-то появиться? А если все-таки что-то было, то откуда тогда оно взялось? Нашу Вселенную породила Рекурсия!
Спасибо, а эта запись она
Спасибо backbone, а эта запись она относится к установленной камере или к самому компьютеру, просто что то не могу определить, что мне все таки брать из вывода dmidecode т.к. в выводе куча устройств а как их соотнести с камерой не понятно.
вывод http://paste.pocoo.org/show/404809/
должно помочь, просто
должно помочь, просто скомпилируйте и запустите: cc flipped_webcam.c && ./a.out
Если ничего не было, то как могло что-то появиться? А если все-таки что-то было, то откуда тогда оно взялось? Нашу Вселенную породила Рекурсия!