filterdir = $(libdir)/gst
filter_LTLIBRARIES = libv4lelement.la libv4lsrc.la \
- libv4lmjpegsrc.la
-#libv4lmjpegsink.la
+ libv4lmjpegsrc.la libv4lmjpegsink.la
libv4lelement_la_SOURCES = \
gstv4lelement.c \
libv4lmjpegsrc_la_CFLAGS = \
$(GST_CFLAGS)
-#libv4lmjpegsink_la_SOURCED = \
-# gstv4lmjpegsink.c \
-# v4lmjpegsikn_calls.c
-#libv4lmjpegsink_la_LIBADD = \
-# libv4lelement.la
-#libv4lmjpegsink_la_CFLAGS = \
-# $(GST_CFLAGS)
+libv4lmjpegsink_la_SOURCES = \
+ gstv4lmjpegsink.c \
+ v4lmjpegsink_calls.c
+libv4lmjpegsink_la_LIBADD = \
+ libv4lelement.la
+libv4lmjpegsink_la_CFLAGS = \
+ $(GST_CFLAGS)
noinst_HEADERS = gstv4lelement.h v4l_calls.h \
gstv4lsrc.h v4lsrc_calls.h \
- gstv4lmjpegsrc.h v4lmjpegsrc_calls.h
-#gstv4lmjpegsink.h v4lmjpegsink_calls.h
+ gstv4lmjpegsrc.h v4lmjpegsrc_calls.h \
+ gstv4lmjpegsink.h v4lmjpegsink_calls.h
\ v4lmjpegsink_calls.[ch]
I.e., all the files on the right are child classes of
-the v4lelement 'parent' on the left. mjpegsink is still
-todo.
+the v4lelement 'parent' on the left.
* v4lelement handles generic v4l stuff (picture settings,
audio, norm/input setting, open()/close())
=======================
* v4lmjpegsrc: integrate input/norm autodetection
* libgstrec: build (a library for video recording)
-* v4lmjpegsink: build (based on liblavplay (mjpegtools) and MJPEG/V4L API)
-* v4lsrc: threaded sync() (done?)
-* v4lsrc: threaded wait-for-sync()-until-queue() (done?)
TODO list (long term):
======================
v4lmjpegsrc->quality = 50;
v4lmjpegsrc->numbufs = 64;
- v4lmjpegsrc->bufsize = 256 * 1024;
+ v4lmjpegsrc->bufsize = 256;
v4lmjpegsrc->init = TRUE;
}
gint quality;
gint numbufs;
- gint bufsize;
+ gint bufsize; /* in KB */
gboolean init;
};
gint bufsize)
{
#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_set_buffer(), numbufs = %d, bufsize = %d\n",
+ fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_set_buffer(), numbufs = %d, bufsize = %d KB\n",
numbufs, bufsize);
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
- v4lmjpegsrc->breq.size = bufsize;
+ v4lmjpegsrc->breq.size = bufsize * 1024;
v4lmjpegsrc->breq.count = numbufs;
return TRUE;
num);
#endif
- if (!GST_V4L_IS_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)))
+ if (!GST_V4L_IS_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)) ||
+ !GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lmjpegsrc)))
+ return NULL;
+
+ if (num < 0 || num >= v4lmjpegsrc->breq.count)
return NULL;
return GST_V4LELEMENT(v4lmjpegsrc)->buffer+(v4lmjpegsrc->breq.size*num);
/* set input/norm (includes autodetection, norm = VIDEO_MODE_{PAL|NTSC|SECAM|AUTO}) */
-gboolean gst_v4lmjpegsrc_set_input_norm (GstV4lMjpegSrc *v4lmjpegsrc, GstV4lMjpegInputType input, gint norm);
+gboolean gst_v4lmjpegsrc_set_input_norm (GstV4lMjpegSrc *v4lmjpegsrc,
+ GstV4lMjpegInputType input,
+ gint norm);
/* frame grabbing/capture */
-gboolean gst_v4lmjpegsrc_set_buffer (GstV4lMjpegSrc *v4lmjpegsrc, gint numbufs, gint bufsize);
-gboolean gst_v4lmjpegsrc_set_capture (GstV4lMjpegSrc *v4lmjpegsrc, gint decimation, gint quality);
+gboolean gst_v4lmjpegsrc_set_buffer (GstV4lMjpegSrc *v4lmjpegsrc,
+ gint numbufs,
+ gint bufsize);
+gboolean gst_v4lmjpegsrc_set_capture (GstV4lMjpegSrc *v4lmjpegsrc,
+ gint decimation,
+ gint quality);
gboolean gst_v4lmjpegsrc_set_capture_m (GstV4lMjpegSrc *v4lmjpegsrc,
- gint x_offset, gint y_offset, gint width, gint height,
- gint h_decimation, gint v_decimation, gint quality);
+ gint x_offset,
+ gint y_offset,
+ gint width,
+ gint height,
+ gint h_decimation,
+ gint v_decimation,
+ gint quality);
gboolean gst_v4lmjpegsrc_capture_init (GstV4lMjpegSrc *v4lmjpegsrc);
gboolean gst_v4lmjpegsrc_capture_start (GstV4lMjpegSrc *v4lmjpegsrc);
-gboolean gst_v4lmjpegsrc_grab_frame (GstV4lMjpegSrc *v4lmjpegsrc, gint *num, gint *size);
-guint8 * gst_v4lmjpegsrc_get_buffer (GstV4lMjpegSrc *v4lmjpegsrc, gint num);
-gboolean gst_v4lmjpegsrc_requeue_frame (GstV4lMjpegSrc *v4lmjpegsrc, gint num);
+gboolean gst_v4lmjpegsrc_grab_frame (GstV4lMjpegSrc *v4lmjpegsrc,
+ gint *num,
+ gint *size);
+guint8 * gst_v4lmjpegsrc_get_buffer (GstV4lMjpegSrc *v4lmjpegsrc,
+ gint num);
+gboolean gst_v4lmjpegsrc_requeue_frame (GstV4lMjpegSrc *v4lmjpegsrc,
+ gint num);
gboolean gst_v4lmjpegsrc_capture_stop (GstV4lMjpegSrc *v4lmjpegsrc);
gboolean gst_v4lmjpegsrc_capture_deinit (GstV4lMjpegSrc *v4lmjpegsrc);
num);
#endif
- if (!GST_V4L_IS_ACTIVE(GST_V4LELEMENT(v4lsrc)))
+ if (!GST_V4L_IS_ACTIVE(GST_V4LELEMENT(v4lsrc)) ||
+ !GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lsrc)))
+ return NULL;
+
+ if (num < 0 || num >= v4lsrc->mbuf.frames)
return NULL;
return GST_V4LELEMENT(v4lsrc)->buffer+v4lsrc->mbuf.offsets[num];