LINUX.ORG.RU

Сообщения imb

 

OrangePi: как делать загрузочную SD-карту?

Форум — Development

Доброго дня!
Надо запустить систему на OrangePi, плата PC v1.2.
Для начало я использовал готовый образ orangepi-plus-debian-server-card-v0.9, плата успешно стартовала, но выявились две проблемы - не работает вывод через hdmi и сеть. Проблемы не критичные, так как я могу контролировать систему через UART, но неприятные.
Теперь я пробую запустить linux собранный из исходников:

Для создания загрузочной SD-карты попробовал следующее:

К сожалению оба метода не работаю, плата не загружается. Вопрос - как правильно создавать загрузочную SD-карту для OrangePi? Спасибо.

 ,

imb ()

V4L2: VIDIOC_QUERYBUF возвращает не готовые буферы

Форум — Development

Доброго дня! Код выполняется на плате Raspberry Pi.
Загруженные модули:

# lsmod
bcm2835_v4l2 37675 0 - Live 0xbf050000
videobuf2_vmalloc 2934 1 bcm2835_v4l2, Live 0xbf04c000
videobuf2_memops 2126 1 videobuf2_vmalloc, Live 0xbf048000
videobuf2_core 30853 1 bcm2835_v4l2, Live 0xbf03b000
v4l2_common 7792 1 bcm2835_v4l2, Live 0xbf035000
videodev 123030 3 bcm2835_v4l2,videobuf2_core,v4l2_common, Live 0xbf009000
media 14530 1 videodev, Live 0xbf000000
Параметры загрузки bcm2835_v4l2
max_video_width=2592 max_video_height=1944 debug=2
После успешного выполнения VIDIOC_REQBUFS я запрашиваю буферы VIDIOC_QUERYBUF, ioctl успешно выполняется, но я не могу работать с буферами, так как они не готовы.
Состояние буфера возвращаемое VIDIOC_QUERYBUF
Buf0: index 0, type 1, byteused 0, flag 0x2000, memory 1, m.offset 0, lenght 7589376
По документации V4L2 состояние буфера возвращаемое VIDIOC_QUERYBUF

In the flags field the V4L2_BUF_FLAG_MAPPED, V4L2_BUF_FLAG_PREPARED, V4L2_BUF_FLAG_QUEUED and V4L2_BUF_FLAG_DONE flags will be valid

Как видно драйвер выставил только флаг V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC и не указал адрес буфера.
V4L2-интерфейс я вынужден использовать, так как необходимо получать несжатые данные с сенсора. На крайний случай подойдёт и JPEG, но производительность платы в кодировании JPEG крайне не высока, в среднем 1 FPS, что не устраивает, код писался на основе raspistill. Вопрос - был ли у кого-либо опыт работы с V4L2 на Raspberry Pi или может быть подскажите пример кода для кодирования JPEG с большей частотой?
Спасибо.

 

imb ()

Обновление JPEG на странице

Форум — Web-development

Доброго дня!
Есть железка, при обращении по некоему URI она отдаёт кадр с сенсора в виде JPEG.
Необходимо автоматизировать получение и отображение этого JPEG на web-страничке, для этого сделано следующее с использованием jQuery:

<div id = "video" style = "width: 1280px; height: 720px; margin-left: auto; margin-right: auto">
    <img src = "jpg"></img>
</div>
while (true) {
	$.ajax({
		type: 'GET',
		url: 'jpg',
		success: function(data) {
			$('#video > img').attr('src', 'jpg?random=' + Math.random())
		}
	});
}
Проблема в том, что страница зависает намертво после получения первого изображения и появляется сообщение, что скрипты не отвечают длительное время.
Как это воможно исправить?
Спасибо.

imb ()

libevent: загрузка файла

Форум — Development

Доброго дня!
Для встраиваемой системы реализован HTTP-сервер на базе libeven-2.0.21.
К сожалению я пока не могу сообразить как в libevent возможно реализовать загрузку файлов, поиск примера в сети результата не дал.
Можете поделиться примером?
Спасибо.

 

imb ()

OpenCV: putText для YUV420

Форум — Development

Доброго дня!
Перед сжатием захваченного буфера (YUV420) мне необходимо добавить в него некоторую текстовую информацию.

try {
    _img[0] = new cv::Mat(encop.picHeight, encop.picWidth, CV_8UC1,
					reinterpret_cast<unsigned >(_src_mem.virt_uaddr));
    _img[1] = new cv::Mat(encop.picHeight / 2, encop.picWidth / 2, CV_8UC1,
					reinterpret_cast<unsigned *>(_src_mem.virt_uaddr +
											_size));
    _img[2] = new cv::Mat(encop.picHeight / 2, encop.picWidth / 2, CV_8UC1,
					reinterpret_cast<unsigned *>(_src_mem.virt_uaddr +
											_size + _size / 4));
} catch (std::bad_alloc &e) {
	daemon_error("Failed allocate memory for OpenCV data!");
}

putText(*_img[0], _osd, cv::Point(20, 20), cv::FONT_HERSHEY_SIMPLEX,
		0.5, cvScalar(6.0, 249.0, 223.0), 0, 16);
putText(*_img[1], _osd, cv::Point(10, 10), cv::FONT_HERSHEY_SIMPLEX,
		0.25, cvScalar(6.0, 249.0, 223.0), 0, 16);
putText(*_img[2], _osd, cv::Point(10, 10), cv::FONT_HERSHEY_SIMPLEX,
		0.25, cvScalar(6.0, 249.0, 223.0), 0, 16);
Код работает, но:

  • выводимый текст имеет другой цвет
  • выводимый текст выглядит не чётким"

Собственно вопросы:

  • как возможно упростить код если OpenCV умеет работать с YUV
  • как возможно решить описанные проблемы если OpenCV не умеет работать с YUV

Спасибо.

 

imb ()

live555: останавливает работу после первого кадра

Форум — Development

Доброго дня!
Для создания RTP потока использую live555 2013.11.29.
main

char is_stop = 0;
try {
    rtp = new RTP(env, cfg, MAX_SHARED_SIZE, frame);
} catch (std::bad_alloc &e) {
    *env << "Failed allocate memory for RTP class: " << e.what() << "\n";
    goto EXIT;
}
env->taskScheduler().doEventLoop(&is_stop);
класс RTP
bool RTP::start(MediaSource &src)
{
	bool r = _sink->startPlaying(src, NULL, NULL);
	if (r)
		*_env << "Starting RTP stream "
                        << sink->rtpPayloadFormatName()
			<< " to " << inet_ntoa(_sock->groupAddress()) << "\n";
	else
		*_env << "Failed starting RTP stream: "
			<< *_env->getResultMsg() << "\n";

	return r;
}
получение данных
void Frame::doGetNextFrame()
{
.........
    FramedSource::afterGetting(this);
}
Функция start вызывается в конструкторе класса если нет никаких ошибок. Судя по выводимому сообщению ошибок нет и поток стартовал. Но есть одно, периодически получение и отправка кадров останавливается после первого кадра, хотя сама программа продолжает работать, переменная is_stop не меняет своего значения. Создаётся впечатление, что функцию doGetNextFrame перестают вызывать.
Собственно вывод отладочной информации Socket::DebugLevel = 3 это подтверждает
00:03:20 Groupsock(3: 224.1.4.6, 5000, 64): created
00:03:20 Groupsock(3: 224.1.4.6, 5000, 64): wrote 1448 bytes, ttl 64
Starting RTP stream JPEG to 224.1.4.6
00:03:20 Groupsock(3: 224.1.4.6, 5000, 64): wrote 1448 bytes, ttl 64
00:03:20 Groupsock(3: 224.1.4.6, 5000, 64): wrote 1448 bytes, ttl 64
.......................
00:03:20 Groupsock(3: 224.1.4.6, 5000, 64): wrote 272 bytes, ttl 64
00:03:20 Groupsock(3: 224.1.4.6, 5000, 64): wrote 272 bytes, ttl 64
^C00:03:24 Groupsock(3: 224.1.4.6, 5000, 64): deleting
Вопрос - что можно проверить/донастроить что бы подобного не происходило?
Спасибо.

 

imb ()

netlink: получение адреса кокретного интерфейса

Форум — Development

Доброго дня и с наступившим Новым Годом!
Разбираюсь с netlink и запнулся на получении адреса конкретного интерфеса.

struct nl_req {
	struct nlmsghdr		nl;
	struct ifaddrmsg	addr;
};

struct msghdr		msg;
struct sockaddr_nl	kern;
struct nl_req		req;
struct iovec		iov;
memset(&msg,	0, sizeof(msg));
memset(&kern,	0, sizeof(kern));
memset(&req,	0, sizeof(req));
memset(&iov,	0, sizeof(iov));

kern.nl_family		= AF_NETLINK;
req.nl.nlmsg_len	= NLMSG_LENGTH(sizeof(struct ifaddrmsg));
req.nl.nlmsg_type	= RTM_GETADDR;
req.nl.nlmsg_flags	= NLM_F_REQUEST;
if (index)
	req.addr.ifa_index = index;
else
	req.nl.nlmsg_flags |= NLM_F_ROOT;
req.addr.ifa_family	= family;
req.nl.nlmsg_seq	= 1;
req.nl.nlmsg_pid	= getpid();
iov.iov_base		= &req;
iov.iov_len		= req.nl.nlmsg_len;
msg.msg_iov		= &iov;
msg.msg_iovlen		= 1;
msg.msg_name		= &kern;
msg.msg_namelen		= sizeof(kern);
Если я корректно расшифровал ответ, то мне приходит сообщение типа NLMSG_ERROR с ошибкой 0.
Аналогичный код нормально отрабатывает при получении информации о конкретном сетевом интерфейсе.
Можете подсказать в чём можем быть проблема?
Спасибо.

imb ()

Понижение прав демона

Форум — Development

Доброго дня!
Исходные данные
система на основе busybox v1.18.4, демон запускается при старте системы и понижает свои права
стартовый скрипт системы

...................
for i in etc/rcS.d/S**; do                                                    
    $i start                                                
done
.................
etc/rcS.d
lrwxrwxrwx    1 1000     1000            22 Oct 28  2011 S10monitor -> ../init.d/monitor.sh
lrwxrwxrwx    1 1000     1000            22 Oct 28  2011 S40httpd -> ../init.d/minihttpd.sh
lrwxrwxrwx    1 1000     1000            19 Oct 28  2011 S45telnet -> ../init.d/telnet.sh
команда запуска демона
PID=/var/run/monitd.pid                                                                     
DAEMON=monitd                                                                                   
CONFIG=/etc/monitor
USER=monitor

start()
{
        start-stop-daemon --quiet --pidfile $PID --background \      
                -S --exec $DAEMON -- --config $CONFIG --user $USER             
}
функция понижения прав
int8_t drop_root(const char *user)
{
	struct passwd *pwd = NULL;

	if (NULL == (pwd = getpwnam(user)))
		return -1;

	if (setgid(pwd->pw_gid) || setuid(pwd->pw_uid))
		return -1;

	return 0;
}

Проблема
демон monitor не стартует при старте системы, порядок запуска не влияет на поведение
если отключить понижение прав - стартует нормально, при запуске руками - стартует нормально с понижением прав
Вопрос
как необходимо организовать понижение прав демона что бы он стартовал вместе с системой?

Спасибо.

imb ()

OpenGL: просмотр JPEG

Форум — Development

Доброго дня! Необходимо с Ip-камеры просматривать изображения в JPEG формате, ранее использовал QPixmap с выводом в Qlabel, но из за утечек памяти решил перейти на OpenGL. Использую Qt 4.7.
Изображение с камеры нормально получается, проверял сохраняя в файл, сейчас проблема с выводом средствами OpenGL.
initializeGL()

glClearColor(0.0, 0.0, 0.0, 0.0);
glGenTextures(1, &texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
resizeGL(int width, int height)
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
image = convert_to_GL(jpg);
if (1 == frame_number)
	glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0,
				 GL_RGBA, GL_UNSIGNED_BYTE, image.bits());
else
	glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
					GL_RGBA, GL_UNSIGNED_BYTE, image.bits());
glDisable(GL_TEXTURE_2D);
glPixelZoom(1, 1);
glViewport(0, 0, width, height);
paintGL()
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 1.0);
glVertex3f(0.0, image.height(), 0.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(image.width(), 0.0, 0.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(image.width(), image.height(), 0.0);
glEnd();
glDisable(GL_TEXTURE_2D);
//glDrawPixels(image.width(), image.height(), GL_RGBA,
	//		 GL_UNSIGNED_BYTE, image.bits());
convert_to_GL(const QByteArray &data)
return QGLWidget::convertToGLFormat(QImage::fromData(data));
Проблемы на данный момент:
- при закомментированном glDrawPixels отображается чёрный квадрат с белым квадратом в верхнем правом углу
- при использовании glDrawPixels изображается статическое изображение Выяснено, что:
if (1 == frame_number)
	glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0,
				 GL_RGBA, GL_UNSIGNED_BYTE, image.bits());
else
	glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
					GL_RGBA, GL_UNSIGNED_BYTE, image.bits());
glTexSubImage2D всегда заканчивается ошибкой invalid value, при использовании только одной из этих функций ошибки нет, но изображение всё равно не появляется.
Можете подсказать в чём проблема?
Спасибо.

imb ()

RSS подписка на новые темы