diff options
Diffstat (limited to 'stream.c')
| -rw-r--r-- | stream.c | 223 | 
1 files changed, 0 insertions, 223 deletions
| diff --git a/stream.c b/stream.c deleted file mode 100644 index 57745aa..0000000 --- a/stream.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - * UVC stream handling - * - * Copyright (C) 2010 Ideas on board SPRL <laurent.pinchart@ideasonboard.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "events.h" -#include "stream.h" -#include "uvc.h" -#include "v4l2.h" -#include "video-buffers.h" -#include "video-source.h" - -/* - * struct uvc_stream - Representation of a UVC stream - * @src: video source - * @uvc: UVC V4L2 output device - * @events: struct events containing event information - */ -struct uvc_stream -{ -	struct video_source *src; -	struct uvc_device *uvc; - -	struct events *events; -}; - -/* --------------------------------------------------------------------------- - * Video streaming - */ - -static void uvc_stream_source_process(void *d, struct video_source *src, -				      struct video_buffer *buffer) -{ -	struct uvc_stream *stream = d; -	struct v4l2_device *sink = uvc_v4l2_device(stream->uvc); - -	v4l2_queue_buffer(sink, buffer); -} - -static void uvc_stream_uvc_process(void *d) -{ -	struct uvc_stream *stream = d; -	struct v4l2_device *sink = uvc_v4l2_device(stream->uvc); -	struct video_buffer buf; -	int ret; - -	ret = v4l2_dequeue_buffer(sink, &buf); -	if (ret < 0) -		return; - -	video_source_queue_buffer(stream->src, &buf); -} - -static int uvc_stream_start(struct uvc_stream *stream) -{ -	struct v4l2_device *sink = uvc_v4l2_device(stream->uvc); -	struct video_buffer_set *buffers = NULL; -	int ret; - -	printf("Starting video stream.\n"); - -	/* Allocate and export the buffers on the source. */ -	ret = video_source_alloc_buffers(stream->src, 4); -	if (ret < 0) { -		printf("Failed to allocate source buffers: %s (%d)\n", -		       strerror(-ret), -ret); -		return ret; -	} - -	ret = video_source_export_buffers(stream->src, &buffers); -	if (ret < 0) { -		printf("Failed to export buffers on source: %s (%d)\n", -		       strerror(-ret), -ret); -		goto error_free_source; -	} - -	/* Allocate and import the buffers on the sink. */ -	ret = v4l2_alloc_buffers(sink, V4L2_MEMORY_DMABUF, buffers->nbufs); -	if (ret < 0) { -		printf("Failed to allocate sink buffers: %s (%d)\n", -		       strerror(-ret), -ret); -		goto error_free_source; -	} - -	ret = v4l2_import_buffers(sink, buffers); -	if (ret < 0) { -		printf("Failed to import buffers on sink: %s (%d)\n", -		       strerror(-ret), -ret); -		goto error_free_sink; -	} - -	/* Start the source and sink. */ -	video_source_stream_on(stream->src); -	v4l2_stream_on(sink); - -	events_watch_fd(stream->events, sink->fd, EVENT_WRITE, -			uvc_stream_uvc_process, stream); - -	return 0; - -error_free_sink: -	v4l2_free_buffers(sink); -error_free_source: -	video_source_free_buffers(stream->src); -	if (buffers) -		video_buffer_set_delete(buffers); -	return ret; -} - -static int uvc_stream_stop(struct uvc_stream *stream) -{ -	struct v4l2_device *sink = uvc_v4l2_device(stream->uvc); - -	printf("Stopping video stream.\n"); - -	events_unwatch_fd(stream->events, sink->fd, EVENT_WRITE); - -	v4l2_stream_off(sink); -	video_source_stream_off(stream->src); - -	v4l2_free_buffers(sink); -	video_source_free_buffers(stream->src); - -	return 0; -} - -void uvc_stream_enable(struct uvc_stream *stream, int enable) -{ -	if (enable) -		uvc_stream_start(stream); -	else -		uvc_stream_stop(stream); -} - -int uvc_stream_set_format(struct uvc_stream *stream, -			  const struct v4l2_pix_format *format) -{ -	struct v4l2_pix_format fmt = *format; -	int ret; - -	printf("Setting format to 0x%08x %ux%u\n", -		format->pixelformat, format->width, format->height); - -	ret = uvc_set_format(stream->uvc, &fmt); -	if (ret < 0) -		return ret; - -	return video_source_set_format(stream->src, &fmt); -} - -/* --------------------------------------------------------------------------- - * Stream handling - */ - -struct uvc_stream *uvc_stream_new(const char *uvc_device) -{ -	struct uvc_stream *stream; - -	stream = malloc(sizeof(*stream)); -	if (stream == NULL) -		return NULL; - -	memset(stream, 0, sizeof(*stream)); - -	stream->uvc = uvc_open(uvc_device, stream); -	if (stream->uvc == NULL) -		goto error; - -	return stream; - -error: -	free(stream); -	return NULL; -} - -void uvc_stream_delete(struct uvc_stream *stream) -{ -	if (stream == NULL) -		return; - -	uvc_close(stream->uvc); - -	free(stream); -} - -void uvc_stream_init_uvc(struct uvc_stream *stream, -			 struct uvc_function_config *fc) -{ -	uvc_set_config(stream->uvc, fc); -	uvc_events_init(stream->uvc, stream->events); -} - -void uvc_stream_set_event_handler(struct uvc_stream *stream, -				  struct events *events) -{ -	stream->events = events; -} - -void uvc_stream_set_video_source(struct uvc_stream *stream, -				 struct video_source *src) -{ -	stream->src = src; - -	video_source_set_buffer_handler(src, uvc_stream_source_process, stream); -} | 
