-Subproject commit 355c616d5f6779ea194f8b61704229c6fb04ae7b
+Subproject commit 2f6d9cfdaaa83ab454d263d6eba88046debadc2d
if (!GST_CAPS_IS_FIXED (vscapslist) || !GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lmjpegsink)))
return GST_PAD_CONNECT_DELAYED;
+ /* in case the buffers are active (which means that we already
+ * did capsnego before and didn't clean up), clean up anyways */
+ if (GST_V4L_IS_ACTIVE(GST_V4LELEMENT(v4lmjpegsink)))
+ if (!gst_v4lmjpegsink_playback_deinit(v4lmjpegsink))
+ return GST_PAD_CONNECT_REFUSED;
+
for (caps = vscapslist; caps != NULL; caps = vscapslist = vscapslist->next)
{
gst_caps_get_int (caps, "width", &v4lmjpegsink->width);
GST_V4LELEMENT(v4lmjpegsink)->norm, 0)) /* TODO: interlacing */
continue;
+ /* set buffer info */
+ if (!gst_v4lmjpegsink_set_buffer(v4lmjpegsink,
+ v4lmjpegsink->numbufs, v4lmjpegsink->bufsize))
+ continue;
+ if (!gst_v4lmjpegsink_playback_init(v4lmjpegsink))
+ continue;
+
g_signal_emit (G_OBJECT (v4lmjpegsink), gst_v4lmjpegsink_signals[SIGNAL_HAVE_SIZE], 0,
v4lmjpegsink->width, v4lmjpegsink->height);
gst_element_clock_wait(GST_ELEMENT(v4lmjpegsink), v4lmjpegsink->clock, GST_BUFFER_TIMESTAMP(buf), NULL);
}
-
+
/* check size */
if (GST_BUFFER_SIZE(buf) > v4lmjpegsink->breq.size)
{
/* set up change state */
switch (GST_STATE_TRANSITION(element)) {
case GST_STATE_READY_TO_PAUSED:
- /* set buffer info */
- if (!gst_v4lmjpegsink_set_buffer(v4lmjpegsink,
- v4lmjpegsink->numbufs, v4lmjpegsink->bufsize))
- return GST_STATE_FAILURE;
- if (!gst_v4lmjpegsink_playback_init(v4lmjpegsink))
- return GST_STATE_FAILURE;
+ /* we used to do buffer setup here, but that's now done
+ * right after capsnego */
break;
case GST_STATE_PAUSED_TO_PLAYING:
/* start */
v4lmjpegsrc->numbufs = 64;
v4lmjpegsrc->bufsize = 256;
-
- v4lmjpegsrc->capslist = capslist;
}
v4lmjpegsrc = GST_V4LMJPEGSRC (gst_pad_get_parent (pad));
- /* we will try_set_caps() with the actual size (wxh) when we know it */
+ /* in case the buffers are active (which means that we already
+ * did capsnego before and didn't clean up), clean up anyways */
+ if (GST_V4L_IS_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)))
+ if (!gst_v4lmjpegsrc_capture_deinit(v4lmjpegsrc))
+ return GST_PAD_CONNECT_REFUSED;
+
+ /* Note: basically, we don't give a damn about the opposite caps here.
+ * that might seem odd, but it isn't. we know that the opposite caps is
+ * either NULL or has mime type video/jpeg, and in both cases, we'll set
+ * our own mime type back and it'll work. Other properties are to be set
+ * by the src, not by the opposite caps */
+
+ /* set buffer info */
+ if (!gst_v4lmjpegsrc_set_buffer(v4lmjpegsrc, v4lmjpegsrc->numbufs, v4lmjpegsrc->bufsize))
+ return GST_PAD_CONNECT_REFUSED;
+
+ /* set capture parameters and mmap the buffers */
+ if (!v4lmjpegsrc->frame_width && !v4lmjpegsrc->frame_height &&
+ v4lmjpegsrc->x_offset < 0 && v4lmjpegsrc->y_offset < 0 &&
+ v4lmjpegsrc->horizontal_decimation == v4lmjpegsrc->vertical_decimation)
+ {
+ if (!gst_v4lmjpegsrc_set_capture(v4lmjpegsrc,
+ v4lmjpegsrc->horizontal_decimation, v4lmjpegsrc->quality))
+ return GST_PAD_CONNECT_REFUSED;
+ }
+ else
+ {
+ if (!gst_v4lmjpegsrc_set_capture_m(v4lmjpegsrc,
+ v4lmjpegsrc->x_offset, v4lmjpegsrc->y_offset,
+ v4lmjpegsrc->frame_width, v4lmjpegsrc->frame_height,
+ v4lmjpegsrc->horizontal_decimation, v4lmjpegsrc->vertical_decimation,
+ v4lmjpegsrc->quality))
+ return GST_PAD_CONNECT_REFUSED;
+ }
+ /* we now have an actual width/height - *set it* */
+ caps = gst_caps_new("v4lmjpegsrc_caps",
+ "video/jpeg",
+ gst_props_new(
+ "width", GST_PROPS_INT(v4lmjpegsrc->end_width),
+ "height", GST_PROPS_INT(v4lmjpegsrc->end_height),
+ NULL ) );
+ if (!gst_pad_try_set_caps(v4lmjpegsrc->srcpad, caps))
+ {
+ gst_element_error(GST_ELEMENT(v4lmjpegsrc),
+ "Failed to set new caps");
+ return GST_PAD_CONNECT_REFUSED;
+ }
+ if (!gst_v4lmjpegsrc_capture_init(v4lmjpegsrc))
+ return GST_PAD_CONNECT_REFUSED;
return GST_PAD_CONNECT_OK;
}
if (!gst_v4lmjpegsrc_grab_frame(v4lmjpegsrc, &num, &(GST_BUFFER_SIZE(buf))))
return NULL;
GST_BUFFER_DATA(buf) = gst_v4lmjpegsrc_get_buffer(v4lmjpegsrc, num);
- GST_BUFFER_TIMESTAMP (buf) = v4lmjpegsrc->bsync.timestamp.tv_sec * 1000000000 +
- v4lmjpegsrc->bsync.timestamp.tv_usec * 1000;
+ if (!v4lmjpegsrc->first_timestamp)
+ v4lmjpegsrc->first_timestamp = v4lmjpegsrc->bsync.timestamp.tv_sec * 1000000 +
+ v4lmjpegsrc->bsync.timestamp.tv_usec;
+ GST_BUFFER_TIMESTAMP(buf) = v4lmjpegsrc->bsync.timestamp.tv_sec * 1000000 +
+ v4lmjpegsrc->bsync.timestamp.tv_usec - v4lmjpegsrc->first_timestamp;
return buf;
}
{
GstV4lMjpegSrc *v4lmjpegsrc;
GstElementStateReturn parent_value;
- GstCaps *caps;
g_return_val_if_fail(GST_IS_V4LMJPEGSRC(element), GST_STATE_FAILURE);
switch (GST_STATE_TRANSITION(element)) {
case GST_STATE_READY_TO_PAUSED:
- /* set buffer info */
- if (!gst_v4lmjpegsrc_set_buffer(v4lmjpegsrc, v4lmjpegsrc->numbufs, v4lmjpegsrc->bufsize))
- return GST_STATE_FAILURE;
- /* set capture parameters and mmap the buffers */
- if (!v4lmjpegsrc->frame_width && !v4lmjpegsrc->frame_height &&
- v4lmjpegsrc->x_offset < 0 && v4lmjpegsrc->y_offset < 0 &&
- v4lmjpegsrc->horizontal_decimation == v4lmjpegsrc->vertical_decimation)
- {
- if (!gst_v4lmjpegsrc_set_capture(v4lmjpegsrc,
- v4lmjpegsrc->horizontal_decimation, v4lmjpegsrc->quality))
- return GST_STATE_FAILURE;
- }
- else
- {
- if (!gst_v4lmjpegsrc_set_capture_m(v4lmjpegsrc,
- v4lmjpegsrc->x_offset, v4lmjpegsrc->y_offset,
- v4lmjpegsrc->frame_width, v4lmjpegsrc->frame_height,
- v4lmjpegsrc->horizontal_decimation, v4lmjpegsrc->vertical_decimation,
- v4lmjpegsrc->quality))
- return GST_STATE_FAILURE;
- }
- /* we now have an actual width/height - *set it* */
- caps = gst_caps_new("v4lmjpegsrc_caps",
- "video/jpeg",
- gst_props_new(
- "width", GST_PROPS_INT(v4lmjpegsrc->end_width),
- "height", GST_PROPS_INT(v4lmjpegsrc->end_height),
- NULL ) );
- if (!gst_pad_try_set_caps(v4lmjpegsrc->srcpad, caps))
- {
- gst_element_error(GST_ELEMENT(v4lmjpegsrc),
- "Failed to set new caps");
- return GST_STATE_FAILURE;
- }
- if (!gst_v4lmjpegsrc_capture_init(v4lmjpegsrc))
- return GST_STATE_FAILURE;
+ /* actual buffer set-up used to be done here - but I moved
+ * it to capsnego itself */
+ v4lmjpegsrc->first_timestamp = 0;
break;
case GST_STATE_PAUSED_TO_PLAYING:
/* queue all buffer, start streaming capture */
struct mjpeg_sync bsync;
struct mjpeg_requestbuffers breq;
- /* list of available caps */
- GstCaps *capslist;
+ /* first timestamp */
+ guint64 first_timestamp;
/* caching values */
gint x_offset;
v4lsrc->palette = 0; /* means 'any' - user can specify a specific palette */
v4lsrc->width = 160;
v4lsrc->height = 120;
- v4lsrc->buffer_size = v4lsrc->width * v4lsrc->height * 1.5;
-
- v4lsrc->capslist = capslist;
+ v4lsrc->buffer_size = 0;
}
v4lsrc = GST_V4LSRC (gst_pad_get_parent (pad));
+ /* in case the buffers are active (which means that we already
+ * did capsnego before and didn't clean up), clean up anyways */
+ if (GST_V4L_IS_ACTIVE(GST_V4LELEMENT(v4lsrc)))
+ if (!gst_v4lsrc_capture_deinit(v4lsrc))
+ return GST_PAD_CONNECT_REFUSED;
+
palette = v4lsrc->palette;
/* TODO: caps = gst_caps_normalize(capslist); */
if (!gst_pad_try_set_caps(v4lsrc->srcpad, newcaps))
continue;
- else
- return GST_PAD_CONNECT_OK;
+
+ if (!gst_v4lsrc_capture_init(v4lsrc))
+ return GST_PAD_CONNECT_REFUSED;
+
+ return GST_PAD_CONNECT_OK;
}
/* still nothing - no good caps */
GST_BUFFER_DATA(buf) = gst_v4lsrc_get_buffer(v4lsrc, num);
GST_BUFFER_SIZE(buf) = v4lsrc->buffer_size;
- g_print ("%lu %lu\n", v4lsrc->timestamp_soft_sync[num].tv_sec, v4lsrc->timestamp_soft_sync[num].tv_usec);
-
- GST_BUFFER_TIMESTAMP (buf) = v4lsrc->timestamp_soft_sync[num].tv_sec * 1000000 +
- v4lsrc->timestamp_soft_sync[num].tv_usec;
+ if (!v4lsrc->first_timestamp)
+ v4lsrc->first_timestamp = v4lsrc->timestamp_soft_sync[num].tv_sec * 1000000 +
+ v4lsrc->timestamp_soft_sync[num].tv_usec;
+ GST_BUFFER_TIMESTAMP(buf) = v4lsrc->timestamp_soft_sync[num].tv_sec * 1000000 +
+ v4lsrc->timestamp_soft_sync[num].tv_usec - v4lsrc->first_timestamp;
return buf;
}
{
GstV4lSrc *v4lsrc;
gint transition = GST_STATE_TRANSITION (element);
- guint32 fourcc;
- gint depth=0, bpp=0;
- GstCaps *caps;
g_return_val_if_fail(GST_IS_V4LSRC(element), GST_STATE_FAILURE);
case GST_STATE_NULL_TO_READY:
break;
case GST_STATE_READY_TO_PAUSED:
- /* extremely ugly hack for a weird behaviour in the capsnego system - try capsnego again */
- switch (v4lsrc->mmap.format)
- {
- case VIDEO_PALETTE_RGB555:
- fourcc = GST_MAKE_FOURCC('R','G','B',' ');
- bpp = 16;
- depth = 15;
- break;
- case VIDEO_PALETTE_RGB565:
- fourcc = GST_MAKE_FOURCC('R','G','B',' ');
- bpp = 16;
- depth = 16;
- break;
- case VIDEO_PALETTE_RGB24:
- fourcc = GST_MAKE_FOURCC('R','G','B',' ');
- bpp = 24;
- depth = 24;
- break;
- case VIDEO_PALETTE_RGB32:
- fourcc = GST_MAKE_FOURCC('R','G','B',' ');
- bpp = 32;
- depth = 32;
- break;
- case VIDEO_PALETTE_YUV411:
- fourcc = GST_MAKE_FOURCC('Y','4','1','P');
- break;
- case VIDEO_PALETTE_YUV422:
- fourcc = GST_MAKE_FOURCC('Y','U','Y','2');
- break;
- case VIDEO_PALETTE_YUV420P:
- fourcc = GST_MAKE_FOURCC('I','4','2','0');
- break;
- case VIDEO_PALETTE_UYVY:
- fourcc = GST_MAKE_FOURCC('U','Y','V','Y');
- break;
- default:
- return GST_STATE_FAILURE;
- }
- if (bpp && depth)
- caps = gst_caps_new("v4lsrc_caps",
- "video/raw",
- gst_props_new(
- "format", GST_PROPS_FOURCC(fourcc),
- "width", GST_PROPS_INT(v4lsrc->width),
- "height", GST_PROPS_INT(v4lsrc->height),
- "bpp", GST_PROPS_INT(bpp),
- "depth", GST_PROPS_INT(depth),
- NULL ) );
- else
- caps = gst_caps_new("v4lsrc_caps",
- "video/raw",
- gst_props_new(
- "format", GST_PROPS_FOURCC(fourcc),
- "width", GST_PROPS_INT(v4lsrc->width),
- "height", GST_PROPS_INT(v4lsrc->height),
- NULL ) );
- if (!gst_pad_try_set_caps(v4lsrc->srcpad, caps))
- return GST_STATE_FAILURE;
-
- if (!gst_v4lsrc_capture_init(v4lsrc))
- return GST_STATE_FAILURE;
+ v4lsrc->first_timestamp = 0;
+ /* buffer setup used to be done here, but I moved it to
+ * capsnego */
break;
case GST_STATE_PAUSED_TO_PLAYING:
/* queue all buffer, start streaming capture */
pthread_mutex_t mutex_queued_frames;
pthread_cond_t cond_queued_frames;
- /* list of available caps */
- GstCaps *capslist;
+ /* first timestamp */
+ guint64 first_timestamp;
/* caching values */
gint width;
* Boston, MA 02111-1307, USA.
*/
-/*#define DEBUG */
-
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include "v4l_calls.h"
+#define DEBUG(format, args...) \
+ GST_DEBUG_ELEMENT(GST_CAT_PLUGIN_INFO, \
+ GST_ELEMENT(v4lelement), \
+ "V4L: " format "\n", ##args)
+
char *picture_name[] = { "Hue", "Brightness", "Contrast", "Saturation", NULL };
static gboolean
gst_v4l_get_capabilities (GstV4lElement *v4lelement)
{
-#ifdef DEBUG
- fprintf(stderr, "V4L: gst_v4l_get_capabilities()\n");
-#endif
-
+ DEBUG("getting capabilities");
GST_V4L_CHECK_OPEN(v4lelement);
if (ioctl(v4lelement->video_fd, VIDIOCGCAP, &(v4lelement->vcap)) < 0)
gboolean
gst_v4l_open (GstV4lElement *v4lelement)
{
-#ifdef DEBUG
- fprintf(stderr, "V4L: gst_v4l_open()\n");
-#endif
-
+ DEBUG("opening device %s", v4lelement->videodev);
GST_V4L_CHECK_NOT_OPEN(v4lelement);
GST_V4L_CHECK_NOT_ACTIVE(v4lelement);
gboolean
gst_v4l_close (GstV4lElement *v4lelement)
{
-#ifdef DEBUG
- fprintf(stderr, "V4L: gst_v4l_close()\n");
-#endif
-
+ DEBUG("closing device");
GST_V4L_CHECK_OPEN(v4lelement);
GST_V4L_CHECK_NOT_ACTIVE(v4lelement);
gint
gst_v4l_get_num_chans (GstV4lElement *v4lelement)
{
-#ifdef DEBUG
- fprintf(stderr, "V4L: gst_v4l_get_num_chans()\n");
-#endif
-
+ DEBUG("getting number of channels");
GST_V4L_CHECK_OPEN(v4lelement);
return v4lelement->vcap.channels;
GList *list = NULL;
gint i;
-#ifdef DEBUG
- fprintf(stderr, "V4L: gst_v4l_get_chan_names()\n");
-#endif
+ DEBUG("getting channel names");
if (!GST_V4L_IS_OPEN(v4lelement))
return NULL;
gint *channel,
gint *norm)
{
-#ifdef DEBUG
- fprintf(stderr, "V4L: gst_v4l_get_chan_norm()\n");
-#endif
-
+ DEBUG("getting current channel and norm");
GST_V4L_CHECK_OPEN(v4lelement);
if (channel)
gint channel,
gint norm)
{
-#ifdef DEBUG
- fprintf(stderr, "V4L: gst_v4l_set_chan_norm(), channel = %d, norm = %d (%s)\n",
+ DEBUG("setting channel = %d, norm = %d (%s)",
channel, norm, norm_name[norm]);
-#endif
-
GST_V4L_CHECK_OPEN(v4lelement);
GST_V4L_CHECK_NOT_ACTIVE(v4lelement);
gboolean
gst_v4l_has_tuner (GstV4lElement *v4lelement)
{
-#ifdef DEBUG
- fprintf(stderr, "V4L: gst_v4l_has_tuner()\n");
-#endif
-
+ DEBUG("checking whether device has a tuner");
GST_V4L_CHECK_OPEN(v4lelement);
return (v4lelement->vcap.type & VID_TYPE_TUNER &&
gst_v4l_get_frequency (GstV4lElement *v4lelement,
gulong *frequency)
{
-#ifdef DEBUG
- fprintf(stderr, "V4L: gst_v4l_get_frequency()\n");
-#endif
-
+ DEBUG("getting tuner frequency");
GST_V4L_CHECK_OPEN(v4lelement);
if (!gst_v4l_has_tuner(v4lelement))
gst_v4l_set_frequency (GstV4lElement *v4lelement,
gulong frequency)
{
-#ifdef DEBUG
- fprintf(stderr, "gst_v4l_set_frequency(), frequency = %ul\n",
- frequency);
-#endif
-
+ DEBUG("setting tuner frequency to %lu", frequency);
GST_V4L_CHECK_OPEN(v4lelement);
GST_V4L_CHECK_NOT_ACTIVE(v4lelement);
{
struct video_picture vpic;
-#ifdef DEBUG
- fprintf(stderr, "V4L: gst_v4l_get_picture(), type = %d (%s)\n",
+ DEBUG("getting picture property type %d (%s)",
type, picture_name[type]);
-#endif
-
GST_V4L_CHECK_OPEN(v4lelement);
if (ioctl(v4lelement->video_fd, VIDIOCGPICT, &vpic) < 0)
{
struct video_picture vpic;
-#ifdef DEBUG
- fprintf(stderr, "V4L: gst_v4l_set_picture(), type = %d (%s), value = %d\n",
+ DEBUG("setting picture type %d (%s) to value %d",
type, picture_name[type], value);
-#endif
-
GST_V4L_CHECK_OPEN(v4lelement);
if (ioctl(v4lelement->video_fd, VIDIOCGPICT, &vpic) < 0)
gboolean
gst_v4l_has_audio (GstV4lElement *v4lelement)
{
-#ifdef DEBUG
- fprintf(stderr, "V4L: gst_v4l_has_audio()\n");
-#endif
-
+ DEBUG("checking whether device has audio");
GST_V4L_CHECK_OPEN(v4lelement);
return (v4lelement->vcap.audios > 0 &&
{
struct video_audio vau;
-#ifdef DEBUG
- fprintf(stderr, "V4L: v4l_gst_get_audio(), type = %d (%s)\n",
+ DEBUG("getting audio parameter type %d (%s)",
type, audio_name[type]);
-#endif
-
GST_V4L_CHECK_OPEN(v4lelement);
if (!gst_v4l_has_audio(v4lelement))
{
struct video_audio vau;
-#ifdef DEBUG
- fprintf(stderr, "V4L: v4l_gst_set_audio(), type = %d (%s), value = %d\n",
+ DEBUG("setting audio parameter type %d (%s) to value %d",
type, audio_name[type], value);
-#endif
-
GST_V4L_CHECK_OPEN(v4lelement);
if (!gst_v4l_has_audio(v4lelement))
if (!(v4lelement->vcap.type & VID_TYPE_OVERLAY)) \
{ \
gst_element_error(GST_ELEMENT(v4lelement), \
- "Device doesn';t do overlay"); \
+ "Device doesn't do overlay"); \
return FALSE; \
}
* Boston, MA 02111-1307, USA.
*/
-/*#define DEBUG */
-
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#define MAP_FAILED ( (caddr_t) -1 )
#endif
+#define DEBUG(format, args...) \
+ GST_DEBUG_ELEMENT(GST_CAT_PLUGIN_INFO, \
+ GST_ELEMENT(v4lmjpegsink), \
+ "V4LMJPEGSINK: " format "\n", ##args)
+
/******************************************************
* gst_v4lmjpegsink_sync_thread()
GstV4lMjpegSink *v4lmjpegsink = GST_V4LMJPEGSINK(arg);
gint frame = 0; /* frame that we're currently syncing on */
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_sync_thread()\n");
-#endif
+ DEBUG("starting sync thread");
/* Allow easy shutting down by other processes... */
pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL );
}
pthread_mutex_unlock(&(v4lmjpegsink->mutex_queued_frames));
+ DEBUG("thread-syncing on next frame");
if (ioctl(GST_V4LELEMENT(v4lmjpegsink)->video_fd, MJPIOC_SYNC,
&(v4lmjpegsink->bsync)) < 0)
{
}
end:
-#ifdef DEBUG
- fprintf(stderr, "Sync thread got signalled to exit\n");
-#endif
+ DEBUG("Sync thread got signalled to exit");
pthread_exit(NULL);
}
gst_v4lmjpegsink_queue_frame (GstV4lMjpegSink *v4lmjpegsink,
gint num)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_queue_frame(), num = %d\n",
- num);
-#endif
+ DEBUG("queueing frame %d", num);
/* queue on this frame */
if (ioctl(GST_V4LELEMENT(v4lmjpegsink)->video_fd, MJPIOC_QBUF_PLAY, &num) < 0)
gst_v4lmjpegsink_sync_frame (GstV4lMjpegSink *v4lmjpegsink,
gint *num)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_sync_frame(), num = %d\n",
- num);
-#endif
+ DEBUG("syncing on next frame");
/* calculate next frame */
v4lmjpegsink->current_frame = (v4lmjpegsink->current_frame+1)%v4lmjpegsink->breq.count;
gint numbufs,
gint bufsize)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_set_buffer(), numbufs = %d, bufsize = %d KB\n",
+ DEBUG("setting buffer info to numbufs = %d, bufsize = %d KB",
numbufs, bufsize);
-#endif
-
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsink));
gint mw, mh;
struct mjpeg_params bparm;
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_set_playback(), "
- "size = %dx%d, X/Y-offsets = %d/%d, norm = %d, interlacing = %d\n",
+ DEBUG("setting size = %dx%d, X/Y-offsets = %d/%d, norm = %d, interlacing = %d\n",
width, height, x_offset, y_offset, norm, interlacing);
-#endif
-
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
/*GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsink)); */
{
gint n;
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_playback_init()\n");
-#endif
-
+ DEBUG("initting playback subsystem");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsink));
/* Map the buffers */
GST_V4LELEMENT(v4lmjpegsink)->buffer = mmap(0,
v4lmjpegsink->breq.count * v4lmjpegsink->breq.size,
- PROT_READ, MAP_SHARED, GST_V4LELEMENT(v4lmjpegsink)->video_fd, 0);
+ PROT_READ|PROT_WRITE, MAP_SHARED, GST_V4LELEMENT(v4lmjpegsink)->video_fd, 0);
if (GST_V4LELEMENT(v4lmjpegsink)->buffer == MAP_FAILED)
{
gst_element_error(GST_ELEMENT(v4lmjpegsink),
{
gint n;
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_playback_start()\n");
-#endif
-
+ DEBUG("starting playback");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink));
gst_v4lmjpegsink_get_buffer (GstV4lMjpegSink *v4lmjpegsink,
gint num)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_get_buffer(), num = %d\n",
- num);
-#endif
+ DEBUG("gst_v4lmjpegsink_get_buffer(), num = %d", num);
if (!GST_V4L_IS_ACTIVE(GST_V4LELEMENT(v4lmjpegsink)) ||
!GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lmjpegsink)))
gst_v4lmjpegsink_play_frame (GstV4lMjpegSink *v4lmjpegsink,
gint num)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_play_frame()\n");
-#endif
-
+ DEBUG("playing frame %d", num);
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink));
gst_v4lmjpegsink_wait_frame (GstV4lMjpegSink *v4lmjpegsink,
gint *num)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_wait_frame(), num = %d\n",
- num);
-#endif
-
+ DEBUG("waiting for next frame to be finished playing");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink));
{
gint num;
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_playback_stop()\n");
-#endif
-
+ DEBUG("stopping playback");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink));
gboolean
gst_v4lmjpegsink_playback_deinit (GstV4lMjpegSink *v4lmjpegsink)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_playback_deinit()\n");
-#endif
-
+ DEBUG("quitting playback subsystem");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink));
* Boston, MA 02111-1307, USA.
*/
-/*#define DEBUG */
-
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define MAP_FAILED ( (caddr_t) -1 )
#endif
+#define DEBUG(format, args...) \
+ GST_DEBUG_ELEMENT(GST_CAT_PLUGIN_INFO, \
+ GST_ELEMENT(v4lmjpegsrc), \
+ "V4LMJPEGSRC: " format "\n", ##args)
+
+
char *input_name[] = { "Composite", "S-Video", "TV-Tuner", "Autodetect" };
gst_v4lmjpegsrc_queue_frame (GstV4lMjpegSrc *v4lmjpegsrc,
gint num)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_queue_frame(), num = %d\n",
- num);
-#endif
+ DEBUG("queueing frame %d", num);
if (ioctl(GST_V4LELEMENT(v4lmjpegsrc)->video_fd, MJPIOC_QBUF_CAPT, &num) < 0)
{
gst_v4lmjpegsrc_sync_next_frame (GstV4lMjpegSrc *v4lmjpegsrc,
gint *num)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_sync_frame(), num = %d\n",
- num);
-#endif
+ DEBUG("syncing on next frame");
if (ioctl(GST_V4LELEMENT(v4lmjpegsrc)->video_fd, MJPIOC_SYNC, &(v4lmjpegsrc->bsync)) < 0)
{
{
struct mjpeg_status bstat;
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_set_input_norm(), input = %d (%s), norm = %d (%s)\n",
+ DEBUG("setting input = %d (%s), norm = %d (%s)",
input, input_name[input], norm, norm_name[norm]);
-#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
gint numbufs,
gint bufsize)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_set_buffer(), numbufs = %d, bufsize = %d KB\n",
+ DEBUG("setting buffer info to numbufs = %d, bufsize = %d KB",
numbufs, bufsize);
-#endif
-
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
int norm, input, mw;
struct mjpeg_params bparm;
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_set_capture(), decimation = %d, quality = %d\n",
+ DEBUG("setting decimation = %d, quality = %d",
decimation, quality);
-#endif
-
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
gint maxwidth;
struct mjpeg_params bparm;
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_set_capture_m(), x_offset = %d, y_offset = %d, "
+ DEBUG("setting x_offset = %d, y_offset = %d, "
"width = %d, height = %d, h_decimation = %d, v_decimation = %d, quality = %d\n",
x_offset, y_offset, width, height, h_decimation, v_decimation, quality);
-#endif
-
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
gboolean
gst_v4lmjpegsrc_capture_init (GstV4lMjpegSrc *v4lmjpegsrc)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_capture_init()\n");
-#endif
-
+ DEBUG("initting capture subsystem");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
/* Map the buffers */
GST_V4LELEMENT(v4lmjpegsrc)->buffer = mmap(0,
v4lmjpegsrc->breq.count * v4lmjpegsrc->breq.size,
- PROT_READ, MAP_SHARED, GST_V4LELEMENT(v4lmjpegsrc)->video_fd, 0);
+ PROT_READ|PROT_WRITE, MAP_SHARED, GST_V4LELEMENT(v4lmjpegsrc)->video_fd, 0);
if (GST_V4LELEMENT(v4lmjpegsrc)->buffer == MAP_FAILED)
{
gst_element_error(GST_ELEMENT(v4lmjpegsrc),
{
int n;
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_capture_start()\n");
-#endif
-
+ DEBUG("starting capture");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
gint *num,
gint *size)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_grab_frame()\n");
-#endif
-
+ DEBUG("grabbing frame");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
gst_v4lmjpegsrc_get_buffer (GstV4lMjpegSrc *v4lmjpegsrc,
gint num)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_get_buffer(), num = %d\n",
- num);
-#endif
+ DEBUG("gst_v4lmjpegsrc_get_buffer(), num = %d", num);
if (!GST_V4L_IS_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)) ||
!GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lmjpegsrc)))
gst_v4lmjpegsrc_requeue_frame (GstV4lMjpegSrc *v4lmjpegsrc,
gint num)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_requeue_frame(), num = %d\n",
- num);
-#endif
-
+ DEBUG("requeueing frame %d", num);
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
gboolean
gst_v4lmjpegsrc_capture_stop (GstV4lMjpegSrc *v4lmjpegsrc)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_capture_stop()\n");
-#endif
-
+ DEBUG("stopping capture");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
gboolean
gst_v4lmjpegsrc_capture_deinit (GstV4lMjpegSrc *v4lmjpegsrc)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_capture_deinit()\n");
-#endif
-
+ DEBUG("quitting capture subsystem");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
* Boston, MA 02111-1307, USA.
*/
-/*#define DEBUG */
-
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#define MAP_FAILED ( (caddr_t) -1 )
#endif
+#define DEBUG(format, args...) \
+ GST_DEBUG_ELEMENT(GST_CAT_PLUGIN_INFO, \
+ GST_ELEMENT(v4lsrc), \
+ "V4LSRC: " format "\n", ##args)
/* palette names */
char *palette_name[] = {
gst_v4lsrc_queue_frame (GstV4lSrc *v4lsrc,
gint num)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LSRC: gst_v4lsrc_queue_frame(), num = %d\n",
- num);
-#endif
+ DEBUG("queueing frame %d", num);
v4lsrc->mmap.frame = num;
GstV4lSrc *v4lsrc = GST_V4LSRC(arg);
gint frame = 0;
-#ifdef DEBUG
- fprintf(stderr, "gst_v4lsrc_soft_sync_thread()\n");
-#endif
+ DEBUG("starting software sync thread");
/* Allow easy shutting down by other processes... */
pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL );
{
if (v4lsrc->frame_queued[frame] < 0)
break;
-#ifdef DEBUG
- fprintf(stderr, "Waiting for new frames to be queued (%d < %d)\n",
+
+ DEBUG("Waiting for new frames to be queued (%d < %d)",
v4lsrc->num_queued_frames, MIN_BUFFERS_QUEUED);
-#endif
+
pthread_cond_wait(&(v4lsrc->cond_queued_frames),
&(v4lsrc->mutex_queued_frames));
}
if (!v4lsrc->num_queued_frames)
{
-#ifdef DEBUG
- fprintf(stderr, "Got signal to exit...\n");
-#endif
+ DEBUG("Got signal to exit...");
goto end;
}
/* sync on the frame */
-#ifdef DEBUG
- fprintf(stderr, "Sync\'ing on frame %d\n", frame);
-#endif
+ DEBUG("Sync\'ing on frame %d", frame);
retry:
if (ioctl(GST_V4LELEMENT(v4lsrc)->video_fd, VIDIOCSYNC, &frame) < 0)
{
}
end:
-#ifdef DEBUG
- fprintf(stderr, "Software sync thread got signalled to exit\n");
-#endif
+ DEBUG("Software sync thread got signalled to exit");
pthread_exit(NULL);
}
gst_v4lsrc_sync_next_frame (GstV4lSrc *v4lsrc,
gint *num)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LSRC: gst_v4lsrc_sync_frame()\n");
-#endif
-
*num = v4lsrc->sync_frame = (v4lsrc->sync_frame + 1)%v4lsrc->mbuf.frames;
+ DEBUG("syncing on next frame (%d)", *num);
+
/* "software sync()" on the frame */
pthread_mutex_lock(&(v4lsrc->mutex_soft_sync));
if (v4lsrc->isready_soft_sync[*num] == 0)
{
-#ifdef DEBUG
- fprintf(stderr, "Waiting for frame %d to be synced on\n",
- *num);
-#endif
+ DEBUG("Waiting for frame %d to be synced on", *num);
pthread_cond_wait(&(v4lsrc->cond_soft_sync[*num]),
&(v4lsrc->mutex_soft_sync));
}
gint height,
gint palette)
{
-#ifdef DBUG
- fprintf(stderr, "V4LSRC: gst_v4lsrc_set_capture(), width = %d, height = %d, palette = %d\n",
+ DEBUG("capture properties set to width = %d, height = %d, palette = %d",
width, height, palette);
-#endif
/*GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc));*/
- GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lsrc));
+ /*GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lsrc));*/
v4lsrc->mmap.width = width;
v4lsrc->mmap.height = height;
{
int n;
-#ifdef DEBUG
- fprintf(stderr, "V4LSRC: gst_v4lsrc_capture_init()\n");
-#endif
-
+ DEBUG("initting capture subsystem");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lsrc));
{
int n;
-#ifdef DEBUG
- fprintf(stderr, "V4LSRC: gst_v4lsrc_capture_start()\n");
-#endif
-
+ DEBUG("starting capture");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc));
gboolean
gst_v4lsrc_grab_frame (GstV4lSrc *v4lsrc, gint *num)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LSRC: gst_v4lsrc_grab_frame()\n");
-#endif
-
+ DEBUG("grabbing frame");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc));
guint8 *
gst_v4lsrc_get_buffer (GstV4lSrc *v4lsrc, gint num)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LSRC: gst_v4lsrc_get_buffer(), num = %d\n",
- num);
-#endif
+ DEBUG("gst_v4lsrc_get_buffer(), num = %d", num);
if (!GST_V4L_IS_ACTIVE(GST_V4LELEMENT(v4lsrc)) ||
!GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lsrc)))
gboolean
gst_v4lsrc_requeue_frame (GstV4lSrc *v4lsrc, gint num)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LSRC: gst_v4lsrc_requeue_buffer(), num = %d\n",
- num);
-#endif
-
+ DEBUG("requeueing frame %d", num);
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc));
{
int n;
-#ifdef DEBUG
- fprintf(stderr, "V4LSRC: gst_v4lsrc_capture_stop()\n");
-#endif
-
+ DEBUG("stopping capture");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc));
gboolean
gst_v4lsrc_capture_deinit (GstV4lSrc *v4lsrc)
{
-#ifdef DEBUG
- fprintf(stderr, "V4LSRC: gst_v4lsrc_capture_deinit()\n");
-#endif
-
+ DEBUG("quitting capture subsystem");
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc));