diff options
| -rw-r--r-- | lib/jpg-source.c | 48 | 
1 files changed, 43 insertions, 5 deletions
| diff --git a/lib/jpg-source.c b/lib/jpg-source.c index 0bbe26f..c95d76c 100644 --- a/lib/jpg-source.c +++ b/lib/jpg-source.c @@ -20,6 +20,7 @@  #include <linux/videodev2.h>  #include "events.h" +#include "timer.h"  #include "tools.h"  #include "v4l2.h"  #include "jpg-source.h" @@ -30,6 +31,9 @@ struct jpg_source {  	unsigned int imgsize;  	void *imgdata; + +	struct timer *timer; +	bool streaming;  };  #define to_jpg_source(s) container_of(s, struct jpg_source, src) @@ -41,6 +45,8 @@ static void jpg_source_destroy(struct video_source *s)  	if (src->imgdata)  		free(src->imgdata); +	timer_destroy(src->timer); +  	free(src);  } @@ -55,9 +61,12 @@ static int jpg_source_set_format(struct video_source *s __attribute__((unused)),  	return 0;  } -static int jpg_source_set_frame_rate(struct video_source *s __attribute__((unused)), -				     unsigned int fps __attribute__((unused))) +static int jpg_source_set_frame_rate(struct video_source *s, unsigned int fps)  { +	struct jpg_source *src = to_jpg_source(s); + +	timer_set_fps(src->timer, fps); +  	return 0;  } @@ -66,14 +75,32 @@ static int jpg_source_free_buffers(struct video_source *s __attribute__((unused)  	return 0;  } -static int jpg_source_stream_on(struct video_source *s __attribute__((unused))) +static int jpg_source_stream_on(struct video_source *s)  { +	struct jpg_source *src = to_jpg_source(s); +	int ret; + +	ret = timer_arm(src->timer); +	if (ret) +		return ret; + +	src->streaming = true;  	return 0;  } -static int jpg_source_stream_off(struct video_source *s __attribute__((unused))) +static int jpg_source_stream_off(struct video_source *s)  { -	return 0; +	struct jpg_source *src = to_jpg_source(s); +	int ret; + +	/* +	 * No error check here, because we want to flag that streaming is over +	 * even if the timer is still running due to the failure. +	 */ +	ret = timer_disarm(src->timer); +	src->streaming = false; + +	return ret;  }  static void jpg_source_fill_buffer(struct video_source *s, @@ -83,6 +110,13 @@ static void jpg_source_fill_buffer(struct video_source *s,  	memcpy(buf->mem, src->imgdata, src->imgsize);  	buf->bytesused = src->imgsize; + +	/* +	 * Wait for the timer to elapse to ensure that our configured frame rate +	 * is adhered to. +	 */ +	if (src->streaming) +		timer_wait(src->timer);  }  static const struct video_source_ops jpg_source_ops = { @@ -136,6 +170,10 @@ struct video_source *jpg_video_source_create(const char *img_path)  		goto err_free_imgdata;  	} +	src->timer = timer_new(); +	if (!src->timer) +		goto err_free_imgdata; +  	close(fd);  	return &src->src; | 
