This patch: 1) would provide v4l2 plugins, if only the CVS server wouldn't bork on all commits :-(. This patch will c...

Original commit message from CVS:
This patch:
1) would provide v4l2 plugins, if only the CVS server wouldn't bork on all commits :-(. This patch will come later on in a separate commit when SF fixes her repository.
2) it fixes capsnego for all the video4linux1 plugins
3) it rewrites the debugging of all v4l1 plugins, which now make use of the standard gstreamer debugging features (gst-mask=...). This should make debugging video4linux1/gstreamer problems much easier then it used to be.

VS: ----------------------------------------------------------------------
This commit is contained in:
Ronald S. Bultje 2002-09-09 07:12:29 +00:00
parent d5f82d02f9
commit 9c1e52ad11
11 changed files with 183 additions and 362 deletions

2
common

@ -1 +1 @@
Subproject commit 355c616d5f6779ea194f8b61704229c6fb04ae7b Subproject commit 2f6d9cfdaaa83ab454d263d6eba88046debadc2d

View file

@ -188,6 +188,12 @@ gst_v4lmjpegsink_sinkconnect (GstPad *pad,
if (!GST_CAPS_IS_FIXED (vscapslist) || !GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lmjpegsink))) if (!GST_CAPS_IS_FIXED (vscapslist) || !GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lmjpegsink)))
return GST_PAD_CONNECT_DELAYED; 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) for (caps = vscapslist; caps != NULL; caps = vscapslist = vscapslist->next)
{ {
gst_caps_get_int (caps, "width", &v4lmjpegsink->width); gst_caps_get_int (caps, "width", &v4lmjpegsink->width);
@ -199,6 +205,13 @@ gst_v4lmjpegsink_sinkconnect (GstPad *pad,
GST_V4LELEMENT(v4lmjpegsink)->norm, 0)) /* TODO: interlacing */ GST_V4LELEMENT(v4lmjpegsink)->norm, 0)) /* TODO: interlacing */
continue; 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, g_signal_emit (G_OBJECT (v4lmjpegsink), gst_v4lmjpegsink_signals[SIGNAL_HAVE_SIZE], 0,
v4lmjpegsink->width, v4lmjpegsink->height); v4lmjpegsink->width, v4lmjpegsink->height);
@ -243,7 +256,7 @@ gst_v4lmjpegsink_chain (GstPad *pad,
gst_element_clock_wait(GST_ELEMENT(v4lmjpegsink), v4lmjpegsink->clock, GST_BUFFER_TIMESTAMP(buf), NULL); gst_element_clock_wait(GST_ELEMENT(v4lmjpegsink), v4lmjpegsink->clock, GST_BUFFER_TIMESTAMP(buf), NULL);
} }
/* check size */ /* check size */
if (GST_BUFFER_SIZE(buf) > v4lmjpegsink->breq.size) if (GST_BUFFER_SIZE(buf) > v4lmjpegsink->breq.size)
{ {
@ -342,12 +355,8 @@ gst_v4lmjpegsink_change_state (GstElement *element)
/* set up change state */ /* set up change state */
switch (GST_STATE_TRANSITION(element)) { switch (GST_STATE_TRANSITION(element)) {
case GST_STATE_READY_TO_PAUSED: case GST_STATE_READY_TO_PAUSED:
/* set buffer info */ /* we used to do buffer setup here, but that's now done
if (!gst_v4lmjpegsink_set_buffer(v4lmjpegsink, * right after capsnego */
v4lmjpegsink->numbufs, v4lmjpegsink->bufsize))
return GST_STATE_FAILURE;
if (!gst_v4lmjpegsink_playback_init(v4lmjpegsink))
return GST_STATE_FAILURE;
break; break;
case GST_STATE_PAUSED_TO_PLAYING: case GST_STATE_PAUSED_TO_PLAYING:
/* start */ /* start */

View file

@ -206,8 +206,6 @@ gst_v4lmjpegsrc_init (GstV4lMjpegSrc *v4lmjpegsrc)
v4lmjpegsrc->numbufs = 64; v4lmjpegsrc->numbufs = 64;
v4lmjpegsrc->bufsize = 256; v4lmjpegsrc->bufsize = 256;
v4lmjpegsrc->capslist = capslist;
} }
@ -219,7 +217,55 @@ gst_v4lmjpegsrc_srcconnect (GstPad *pad,
v4lmjpegsrc = GST_V4LMJPEGSRC (gst_pad_get_parent (pad)); 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; return GST_PAD_CONNECT_OK;
} }
@ -248,8 +294,11 @@ gst_v4lmjpegsrc_get (GstPad *pad)
if (!gst_v4lmjpegsrc_grab_frame(v4lmjpegsrc, &num, &(GST_BUFFER_SIZE(buf)))) if (!gst_v4lmjpegsrc_grab_frame(v4lmjpegsrc, &num, &(GST_BUFFER_SIZE(buf))))
return NULL; return NULL;
GST_BUFFER_DATA(buf) = gst_v4lmjpegsrc_get_buffer(v4lmjpegsrc, num); GST_BUFFER_DATA(buf) = gst_v4lmjpegsrc_get_buffer(v4lmjpegsrc, num);
GST_BUFFER_TIMESTAMP (buf) = v4lmjpegsrc->bsync.timestamp.tv_sec * 1000000000 + if (!v4lmjpegsrc->first_timestamp)
v4lmjpegsrc->bsync.timestamp.tv_usec * 1000; 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; return buf;
} }
@ -358,7 +407,6 @@ gst_v4lmjpegsrc_change_state (GstElement *element)
{ {
GstV4lMjpegSrc *v4lmjpegsrc; GstV4lMjpegSrc *v4lmjpegsrc;
GstElementStateReturn parent_value; GstElementStateReturn parent_value;
GstCaps *caps;
g_return_val_if_fail(GST_IS_V4LMJPEGSRC(element), GST_STATE_FAILURE); g_return_val_if_fail(GST_IS_V4LMJPEGSRC(element), GST_STATE_FAILURE);
@ -366,42 +414,9 @@ gst_v4lmjpegsrc_change_state (GstElement *element)
switch (GST_STATE_TRANSITION(element)) { switch (GST_STATE_TRANSITION(element)) {
case GST_STATE_READY_TO_PAUSED: case GST_STATE_READY_TO_PAUSED:
/* set buffer info */ /* actual buffer set-up used to be done here - but I moved
if (!gst_v4lmjpegsrc_set_buffer(v4lmjpegsrc, v4lmjpegsrc->numbufs, v4lmjpegsrc->bufsize)) * it to capsnego itself */
return GST_STATE_FAILURE; v4lmjpegsrc->first_timestamp = 0;
/* 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;
break; break;
case GST_STATE_PAUSED_TO_PLAYING: case GST_STATE_PAUSED_TO_PLAYING:
/* queue all buffer, start streaming capture */ /* queue all buffer, start streaming capture */

View file

@ -55,8 +55,8 @@ struct _GstV4lMjpegSrc {
struct mjpeg_sync bsync; struct mjpeg_sync bsync;
struct mjpeg_requestbuffers breq; struct mjpeg_requestbuffers breq;
/* list of available caps */ /* first timestamp */
GstCaps *capslist; guint64 first_timestamp;
/* caching values */ /* caching values */
gint x_offset; gint x_offset;

View file

@ -172,9 +172,7 @@ gst_v4lsrc_init (GstV4lSrc *v4lsrc)
v4lsrc->palette = 0; /* means 'any' - user can specify a specific palette */ v4lsrc->palette = 0; /* means 'any' - user can specify a specific palette */
v4lsrc->width = 160; v4lsrc->width = 160;
v4lsrc->height = 120; v4lsrc->height = 120;
v4lsrc->buffer_size = v4lsrc->width * v4lsrc->height * 1.5; v4lsrc->buffer_size = 0;
v4lsrc->capslist = capslist;
} }
@ -188,6 +186,12 @@ gst_v4lsrc_srcconnect (GstPad *pad,
v4lsrc = GST_V4LSRC (gst_pad_get_parent (pad)); 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; palette = v4lsrc->palette;
/* TODO: caps = gst_caps_normalize(capslist); */ /* TODO: caps = gst_caps_normalize(capslist); */
@ -348,8 +352,11 @@ gst_v4lsrc_srcconnect (GstPad *pad,
if (!gst_pad_try_set_caps(v4lsrc->srcpad, newcaps)) if (!gst_pad_try_set_caps(v4lsrc->srcpad, newcaps))
continue; 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 */ /* still nothing - no good caps */
@ -382,10 +389,11 @@ gst_v4lsrc_get (GstPad *pad)
GST_BUFFER_DATA(buf) = gst_v4lsrc_get_buffer(v4lsrc, num); GST_BUFFER_DATA(buf) = gst_v4lsrc_get_buffer(v4lsrc, num);
GST_BUFFER_SIZE(buf) = v4lsrc->buffer_size; 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); if (!v4lsrc->first_timestamp)
v4lsrc->first_timestamp = v4lsrc->timestamp_soft_sync[num].tv_sec * 1000000 +
GST_BUFFER_TIMESTAMP (buf) = v4lsrc->timestamp_soft_sync[num].tv_sec * 1000000 + v4lsrc->timestamp_soft_sync[num].tv_usec;
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; return buf;
} }
@ -473,9 +481,6 @@ gst_v4lsrc_change_state (GstElement *element)
{ {
GstV4lSrc *v4lsrc; GstV4lSrc *v4lsrc;
gint transition = GST_STATE_TRANSITION (element); 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); g_return_val_if_fail(GST_IS_V4LSRC(element), GST_STATE_FAILURE);
@ -485,67 +490,9 @@ gst_v4lsrc_change_state (GstElement *element)
case GST_STATE_NULL_TO_READY: case GST_STATE_NULL_TO_READY:
break; break;
case GST_STATE_READY_TO_PAUSED: case GST_STATE_READY_TO_PAUSED:
/* extremely ugly hack for a weird behaviour in the capsnego system - try capsnego again */ v4lsrc->first_timestamp = 0;
switch (v4lsrc->mmap.format) /* buffer setup used to be done here, but I moved it to
{ * capsnego */
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;
break; break;
case GST_STATE_PAUSED_TO_PLAYING: case GST_STATE_PAUSED_TO_PLAYING:
/* queue all buffer, start streaming capture */ /* queue all buffer, start streaming capture */

View file

@ -68,8 +68,8 @@ struct _GstV4lSrc {
pthread_mutex_t mutex_queued_frames; pthread_mutex_t mutex_queued_frames;
pthread_cond_t cond_queued_frames; pthread_cond_t cond_queued_frames;
/* list of available caps */ /* first timestamp */
GstCaps *capslist; guint64 first_timestamp;
/* caching values */ /* caching values */
gint width; gint width;

View file

@ -17,8 +17,6 @@
* Boston, MA 02111-1307, USA. * Boston, MA 02111-1307, USA.
*/ */
/*#define DEBUG */
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
@ -28,6 +26,11 @@
#include <errno.h> #include <errno.h>
#include "v4l_calls.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 }; char *picture_name[] = { "Hue", "Brightness", "Contrast", "Saturation", NULL };
@ -44,10 +47,7 @@ char *norm_name[] = { "PAL", "NTSC", "SECAM", NULL };
static gboolean static gboolean
gst_v4l_get_capabilities (GstV4lElement *v4lelement) gst_v4l_get_capabilities (GstV4lElement *v4lelement)
{ {
#ifdef DEBUG DEBUG("getting capabilities");
fprintf(stderr, "V4L: gst_v4l_get_capabilities()\n");
#endif
GST_V4L_CHECK_OPEN(v4lelement); GST_V4L_CHECK_OPEN(v4lelement);
if (ioctl(v4lelement->video_fd, VIDIOCGCAP, &(v4lelement->vcap)) < 0) if (ioctl(v4lelement->video_fd, VIDIOCGCAP, &(v4lelement->vcap)) < 0)
@ -71,10 +71,7 @@ gst_v4l_get_capabilities (GstV4lElement *v4lelement)
gboolean gboolean
gst_v4l_open (GstV4lElement *v4lelement) gst_v4l_open (GstV4lElement *v4lelement)
{ {
#ifdef DEBUG DEBUG("opening device %s", v4lelement->videodev);
fprintf(stderr, "V4L: gst_v4l_open()\n");
#endif
GST_V4L_CHECK_NOT_OPEN(v4lelement); GST_V4L_CHECK_NOT_OPEN(v4lelement);
GST_V4L_CHECK_NOT_ACTIVE(v4lelement); GST_V4L_CHECK_NOT_ACTIVE(v4lelement);
@ -130,10 +127,7 @@ gst_v4l_open (GstV4lElement *v4lelement)
gboolean gboolean
gst_v4l_close (GstV4lElement *v4lelement) gst_v4l_close (GstV4lElement *v4lelement)
{ {
#ifdef DEBUG DEBUG("closing device");
fprintf(stderr, "V4L: gst_v4l_close()\n");
#endif
GST_V4L_CHECK_OPEN(v4lelement); GST_V4L_CHECK_OPEN(v4lelement);
GST_V4L_CHECK_NOT_ACTIVE(v4lelement); GST_V4L_CHECK_NOT_ACTIVE(v4lelement);
@ -152,10 +146,7 @@ gst_v4l_close (GstV4lElement *v4lelement)
gint gint
gst_v4l_get_num_chans (GstV4lElement *v4lelement) gst_v4l_get_num_chans (GstV4lElement *v4lelement)
{ {
#ifdef DEBUG DEBUG("getting number of channels");
fprintf(stderr, "V4L: gst_v4l_get_num_chans()\n");
#endif
GST_V4L_CHECK_OPEN(v4lelement); GST_V4L_CHECK_OPEN(v4lelement);
return v4lelement->vcap.channels; return v4lelement->vcap.channels;
@ -174,9 +165,7 @@ gst_v4l_get_chan_names (GstV4lElement *v4lelement)
GList *list = NULL; GList *list = NULL;
gint i; gint i;
#ifdef DEBUG DEBUG("getting channel names");
fprintf(stderr, "V4L: gst_v4l_get_chan_names()\n");
#endif
if (!GST_V4L_IS_OPEN(v4lelement)) if (!GST_V4L_IS_OPEN(v4lelement))
return NULL; return NULL;
@ -205,10 +194,7 @@ gst_v4l_get_chan_norm (GstV4lElement *v4lelement,
gint *channel, gint *channel,
gint *norm) gint *norm)
{ {
#ifdef DEBUG DEBUG("getting current channel and norm");
fprintf(stderr, "V4L: gst_v4l_get_chan_norm()\n");
#endif
GST_V4L_CHECK_OPEN(v4lelement); GST_V4L_CHECK_OPEN(v4lelement);
if (channel) if (channel)
@ -232,11 +218,8 @@ gst_v4l_set_chan_norm (GstV4lElement *v4lelement,
gint channel, gint channel,
gint norm) gint norm)
{ {
#ifdef DEBUG DEBUG("setting channel = %d, norm = %d (%s)",
fprintf(stderr, "V4L: gst_v4l_set_chan_norm(), channel = %d, norm = %d (%s)\n",
channel, norm, norm_name[norm]); channel, norm, norm_name[norm]);
#endif
GST_V4L_CHECK_OPEN(v4lelement); GST_V4L_CHECK_OPEN(v4lelement);
GST_V4L_CHECK_NOT_ACTIVE(v4lelement); GST_V4L_CHECK_NOT_ACTIVE(v4lelement);
@ -271,10 +254,7 @@ gst_v4l_set_chan_norm (GstV4lElement *v4lelement,
gboolean gboolean
gst_v4l_has_tuner (GstV4lElement *v4lelement) gst_v4l_has_tuner (GstV4lElement *v4lelement)
{ {
#ifdef DEBUG DEBUG("checking whether device has a tuner");
fprintf(stderr, "V4L: gst_v4l_has_tuner()\n");
#endif
GST_V4L_CHECK_OPEN(v4lelement); GST_V4L_CHECK_OPEN(v4lelement);
return (v4lelement->vcap.type & VID_TYPE_TUNER && return (v4lelement->vcap.type & VID_TYPE_TUNER &&
@ -292,10 +272,7 @@ gboolean
gst_v4l_get_frequency (GstV4lElement *v4lelement, gst_v4l_get_frequency (GstV4lElement *v4lelement,
gulong *frequency) gulong *frequency)
{ {
#ifdef DEBUG DEBUG("getting tuner frequency");
fprintf(stderr, "V4L: gst_v4l_get_frequency()\n");
#endif
GST_V4L_CHECK_OPEN(v4lelement); GST_V4L_CHECK_OPEN(v4lelement);
if (!gst_v4l_has_tuner(v4lelement)) if (!gst_v4l_has_tuner(v4lelement))
@ -323,11 +300,7 @@ gboolean
gst_v4l_set_frequency (GstV4lElement *v4lelement, gst_v4l_set_frequency (GstV4lElement *v4lelement,
gulong frequency) gulong frequency)
{ {
#ifdef DEBUG DEBUG("setting tuner frequency to %lu", frequency);
fprintf(stderr, "gst_v4l_set_frequency(), frequency = %ul\n",
frequency);
#endif
GST_V4L_CHECK_OPEN(v4lelement); GST_V4L_CHECK_OPEN(v4lelement);
GST_V4L_CHECK_NOT_ACTIVE(v4lelement); GST_V4L_CHECK_NOT_ACTIVE(v4lelement);
@ -359,11 +332,8 @@ gst_v4l_get_picture (GstV4lElement *v4lelement,
{ {
struct video_picture vpic; struct video_picture vpic;
#ifdef DEBUG DEBUG("getting picture property type %d (%s)",
fprintf(stderr, "V4L: gst_v4l_get_picture(), type = %d (%s)\n",
type, picture_name[type]); type, picture_name[type]);
#endif
GST_V4L_CHECK_OPEN(v4lelement); GST_V4L_CHECK_OPEN(v4lelement);
if (ioctl(v4lelement->video_fd, VIDIOCGPICT, &vpic) < 0) if (ioctl(v4lelement->video_fd, VIDIOCGPICT, &vpic) < 0)
@ -412,11 +382,8 @@ gst_v4l_set_picture (GstV4lElement *v4lelement,
{ {
struct video_picture vpic; struct video_picture vpic;
#ifdef DEBUG DEBUG("setting picture type %d (%s) to value %d",
fprintf(stderr, "V4L: gst_v4l_set_picture(), type = %d (%s), value = %d\n",
type, picture_name[type], value); type, picture_name[type], value);
#endif
GST_V4L_CHECK_OPEN(v4lelement); GST_V4L_CHECK_OPEN(v4lelement);
if (ioctl(v4lelement->video_fd, VIDIOCGPICT, &vpic) < 0) if (ioctl(v4lelement->video_fd, VIDIOCGPICT, &vpic) < 0)
@ -468,10 +435,7 @@ gst_v4l_set_picture (GstV4lElement *v4lelement,
gboolean gboolean
gst_v4l_has_audio (GstV4lElement *v4lelement) gst_v4l_has_audio (GstV4lElement *v4lelement)
{ {
#ifdef DEBUG DEBUG("checking whether device has audio");
fprintf(stderr, "V4L: gst_v4l_has_audio()\n");
#endif
GST_V4L_CHECK_OPEN(v4lelement); GST_V4L_CHECK_OPEN(v4lelement);
return (v4lelement->vcap.audios > 0 && return (v4lelement->vcap.audios > 0 &&
@ -492,11 +456,8 @@ gst_v4l_get_audio (GstV4lElement *v4lelement,
{ {
struct video_audio vau; struct video_audio vau;
#ifdef DEBUG DEBUG("getting audio parameter type %d (%s)",
fprintf(stderr, "V4L: v4l_gst_get_audio(), type = %d (%s)\n",
type, audio_name[type]); type, audio_name[type]);
#endif
GST_V4L_CHECK_OPEN(v4lelement); GST_V4L_CHECK_OPEN(v4lelement);
if (!gst_v4l_has_audio(v4lelement)) if (!gst_v4l_has_audio(v4lelement))
@ -545,11 +506,8 @@ gst_v4l_set_audio (GstV4lElement *v4lelement,
{ {
struct video_audio vau; struct video_audio vau;
#ifdef DEBUG DEBUG("setting audio parameter type %d (%s) to value %d",
fprintf(stderr, "V4L: v4l_gst_set_audio(), type = %d (%s), value = %d\n",
type, audio_name[type], value); type, audio_name[type], value);
#endif
GST_V4L_CHECK_OPEN(v4lelement); GST_V4L_CHECK_OPEN(v4lelement);
if (!gst_v4l_has_audio(v4lelement)) if (!gst_v4l_has_audio(v4lelement))

View file

@ -61,7 +61,7 @@ extern "C" {
if (!(v4lelement->vcap.type & VID_TYPE_OVERLAY)) \ if (!(v4lelement->vcap.type & VID_TYPE_OVERLAY)) \
{ \ { \
gst_element_error(GST_ELEMENT(v4lelement), \ gst_element_error(GST_ELEMENT(v4lelement), \
"Device doesn';t do overlay"); \ "Device doesn't do overlay"); \
return FALSE; \ return FALSE; \
} }

View file

@ -17,8 +17,6 @@
* Boston, MA 02111-1307, USA. * Boston, MA 02111-1307, USA.
*/ */
/*#define DEBUG */
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -34,6 +32,11 @@
#define MAP_FAILED ( (caddr_t) -1 ) #define MAP_FAILED ( (caddr_t) -1 )
#endif #endif
#define DEBUG(format, args...) \
GST_DEBUG_ELEMENT(GST_CAT_PLUGIN_INFO, \
GST_ELEMENT(v4lmjpegsink), \
"V4LMJPEGSINK: " format "\n", ##args)
/****************************************************** /******************************************************
* gst_v4lmjpegsink_sync_thread() * gst_v4lmjpegsink_sync_thread()
@ -46,9 +49,7 @@ gst_v4lmjpegsink_sync_thread (void *arg)
GstV4lMjpegSink *v4lmjpegsink = GST_V4LMJPEGSINK(arg); GstV4lMjpegSink *v4lmjpegsink = GST_V4LMJPEGSINK(arg);
gint frame = 0; /* frame that we're currently syncing on */ gint frame = 0; /* frame that we're currently syncing on */
#ifdef DEBUG DEBUG("starting sync thread");
fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_sync_thread()\n");
#endif
/* Allow easy shutting down by other processes... */ /* Allow easy shutting down by other processes... */
pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL ); pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL );
@ -69,6 +70,7 @@ gst_v4lmjpegsink_sync_thread (void *arg)
} }
pthread_mutex_unlock(&(v4lmjpegsink->mutex_queued_frames)); pthread_mutex_unlock(&(v4lmjpegsink->mutex_queued_frames));
DEBUG("thread-syncing on next frame");
if (ioctl(GST_V4LELEMENT(v4lmjpegsink)->video_fd, MJPIOC_SYNC, if (ioctl(GST_V4LELEMENT(v4lmjpegsink)->video_fd, MJPIOC_SYNC,
&(v4lmjpegsink->bsync)) < 0) &(v4lmjpegsink->bsync)) < 0)
{ {
@ -100,9 +102,7 @@ gst_v4lmjpegsink_sync_thread (void *arg)
} }
end: end:
#ifdef DEBUG DEBUG("Sync thread got signalled to exit");
fprintf(stderr, "Sync thread got signalled to exit\n");
#endif
pthread_exit(NULL); pthread_exit(NULL);
} }
@ -117,10 +117,7 @@ static gboolean
gst_v4lmjpegsink_queue_frame (GstV4lMjpegSink *v4lmjpegsink, gst_v4lmjpegsink_queue_frame (GstV4lMjpegSink *v4lmjpegsink,
gint num) gint num)
{ {
#ifdef DEBUG DEBUG("queueing frame %d", num);
fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_queue_frame(), num = %d\n",
num);
#endif
/* queue on this frame */ /* queue on this frame */
if (ioctl(GST_V4LELEMENT(v4lmjpegsink)->video_fd, MJPIOC_QBUF_PLAY, &num) < 0) if (ioctl(GST_V4LELEMENT(v4lmjpegsink)->video_fd, MJPIOC_QBUF_PLAY, &num) < 0)
@ -150,10 +147,7 @@ static gboolean
gst_v4lmjpegsink_sync_frame (GstV4lMjpegSink *v4lmjpegsink, gst_v4lmjpegsink_sync_frame (GstV4lMjpegSink *v4lmjpegsink,
gint *num) gint *num)
{ {
#ifdef DEBUG DEBUG("syncing on next frame");
fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_sync_frame(), num = %d\n",
num);
#endif
/* calculate next frame */ /* calculate next frame */
v4lmjpegsink->current_frame = (v4lmjpegsink->current_frame+1)%v4lmjpegsink->breq.count; v4lmjpegsink->current_frame = (v4lmjpegsink->current_frame+1)%v4lmjpegsink->breq.count;
@ -188,11 +182,8 @@ gst_v4lmjpegsink_set_buffer (GstV4lMjpegSink *v4lmjpegsink,
gint numbufs, gint numbufs,
gint bufsize) gint bufsize)
{ {
#ifdef DEBUG DEBUG("setting buffer info to numbufs = %d, bufsize = %d KB",
fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_set_buffer(), numbufs = %d, bufsize = %d KB\n",
numbufs, bufsize); numbufs, bufsize);
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsink));
@ -221,12 +212,8 @@ gst_v4lmjpegsink_set_playback (GstV4lMjpegSink *v4lmjpegsink,
gint mw, mh; gint mw, mh;
struct mjpeg_params bparm; struct mjpeg_params bparm;
#ifdef DEBUG DEBUG("setting size = %dx%d, X/Y-offsets = %d/%d, norm = %d, interlacing = %d\n",
fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_set_playback(), "
"size = %dx%d, X/Y-offsets = %d/%d, norm = %d, interlacing = %d\n",
width, height, x_offset, y_offset, norm, interlacing); width, height, x_offset, y_offset, norm, interlacing);
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
/*GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsink)); */ /*GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsink)); */
@ -348,10 +335,7 @@ gst_v4lmjpegsink_playback_init (GstV4lMjpegSink *v4lmjpegsink)
{ {
gint n; gint n;
#ifdef DEBUG DEBUG("initting playback subsystem");
fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_playback_init()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsink));
@ -370,7 +354,7 @@ gst_v4lmjpegsink_playback_init (GstV4lMjpegSink *v4lmjpegsink)
/* Map the buffers */ /* Map the buffers */
GST_V4LELEMENT(v4lmjpegsink)->buffer = mmap(0, GST_V4LELEMENT(v4lmjpegsink)->buffer = mmap(0,
v4lmjpegsink->breq.count * v4lmjpegsink->breq.size, 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) if (GST_V4LELEMENT(v4lmjpegsink)->buffer == MAP_FAILED)
{ {
gst_element_error(GST_ELEMENT(v4lmjpegsink), gst_element_error(GST_ELEMENT(v4lmjpegsink),
@ -418,10 +402,7 @@ gst_v4lmjpegsink_playback_start (GstV4lMjpegSink *v4lmjpegsink)
{ {
gint n; gint n;
#ifdef DEBUG DEBUG("starting playback");
fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_playback_start()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink));
@ -455,10 +436,7 @@ guint8 *
gst_v4lmjpegsink_get_buffer (GstV4lMjpegSink *v4lmjpegsink, gst_v4lmjpegsink_get_buffer (GstV4lMjpegSink *v4lmjpegsink,
gint num) gint num)
{ {
#ifdef DEBUG DEBUG("gst_v4lmjpegsink_get_buffer(), num = %d", num);
fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_get_buffer(), num = %d\n",
num);
#endif
if (!GST_V4L_IS_ACTIVE(GST_V4LELEMENT(v4lmjpegsink)) || if (!GST_V4L_IS_ACTIVE(GST_V4LELEMENT(v4lmjpegsink)) ||
!GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lmjpegsink))) !GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lmjpegsink)))
@ -481,10 +459,7 @@ gboolean
gst_v4lmjpegsink_play_frame (GstV4lMjpegSink *v4lmjpegsink, gst_v4lmjpegsink_play_frame (GstV4lMjpegSink *v4lmjpegsink,
gint num) gint num)
{ {
#ifdef DEBUG DEBUG("playing frame %d", num);
fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_play_frame()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink));
@ -505,11 +480,7 @@ gboolean
gst_v4lmjpegsink_wait_frame (GstV4lMjpegSink *v4lmjpegsink, gst_v4lmjpegsink_wait_frame (GstV4lMjpegSink *v4lmjpegsink,
gint *num) gint *num)
{ {
#ifdef DEBUG DEBUG("waiting for next frame to be finished playing");
fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_wait_frame(), num = %d\n",
num);
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink));
@ -531,10 +502,7 @@ gst_v4lmjpegsink_playback_stop (GstV4lMjpegSink *v4lmjpegsink)
{ {
gint num; gint num;
#ifdef DEBUG DEBUG("stopping playback");
fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_playback_stop()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink));
@ -561,10 +529,7 @@ gst_v4lmjpegsink_playback_stop (GstV4lMjpegSink *v4lmjpegsink)
gboolean gboolean
gst_v4lmjpegsink_playback_deinit (GstV4lMjpegSink *v4lmjpegsink) gst_v4lmjpegsink_playback_deinit (GstV4lMjpegSink *v4lmjpegsink)
{ {
#ifdef DEBUG DEBUG("quitting playback subsystem");
fprintf(stderr, "V4LMJPEGSINK: gst_v4lmjpegsink_playback_deinit()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsink));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsink));

View file

@ -17,8 +17,6 @@
* Boston, MA 02111-1307, USA. * Boston, MA 02111-1307, USA.
*/ */
/*#define DEBUG */
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
@ -33,6 +31,12 @@
#define MAP_FAILED ( (caddr_t) -1 ) #define MAP_FAILED ( (caddr_t) -1 )
#endif #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" }; char *input_name[] = { "Composite", "S-Video", "TV-Tuner", "Autodetect" };
@ -46,10 +50,7 @@ static gboolean
gst_v4lmjpegsrc_queue_frame (GstV4lMjpegSrc *v4lmjpegsrc, gst_v4lmjpegsrc_queue_frame (GstV4lMjpegSrc *v4lmjpegsrc,
gint num) gint num)
{ {
#ifdef DEBUG DEBUG("queueing frame %d", num);
fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_queue_frame(), num = %d\n",
num);
#endif
if (ioctl(GST_V4LELEMENT(v4lmjpegsrc)->video_fd, MJPIOC_QBUF_CAPT, &num) < 0) if (ioctl(GST_V4LELEMENT(v4lmjpegsrc)->video_fd, MJPIOC_QBUF_CAPT, &num) < 0)
{ {
@ -73,10 +74,7 @@ static gboolean
gst_v4lmjpegsrc_sync_next_frame (GstV4lMjpegSrc *v4lmjpegsrc, gst_v4lmjpegsrc_sync_next_frame (GstV4lMjpegSrc *v4lmjpegsrc,
gint *num) gint *num)
{ {
#ifdef DEBUG DEBUG("syncing on next frame");
fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_sync_frame(), num = %d\n",
num);
#endif
if (ioctl(GST_V4LELEMENT(v4lmjpegsrc)->video_fd, MJPIOC_SYNC, &(v4lmjpegsrc->bsync)) < 0) if (ioctl(GST_V4LELEMENT(v4lmjpegsrc)->video_fd, MJPIOC_SYNC, &(v4lmjpegsrc->bsync)) < 0)
{ {
@ -106,10 +104,8 @@ gst_v4lmjpegsrc_set_input_norm (GstV4lMjpegSrc *v4lmjpegsrc,
{ {
struct mjpeg_status bstat; struct mjpeg_status bstat;
#ifdef DEBUG DEBUG("setting input = %d (%s), norm = %d (%s)",
fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_set_input_norm(), input = %d (%s), norm = %d (%s)\n",
input, input_name[input], norm, norm_name[norm]); input, input_name[input], norm, norm_name[norm]);
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
@ -198,11 +194,8 @@ gst_v4lmjpegsrc_set_buffer (GstV4lMjpegSrc *v4lmjpegsrc,
gint numbufs, gint numbufs,
gint bufsize) gint bufsize)
{ {
#ifdef DEBUG DEBUG("setting buffer info to numbufs = %d, bufsize = %d KB",
fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_set_buffer(), numbufs = %d, bufsize = %d KB\n",
numbufs, bufsize); numbufs, bufsize);
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
@ -227,11 +220,8 @@ gst_v4lmjpegsrc_set_capture (GstV4lMjpegSrc *v4lmjpegsrc,
int norm, input, mw; int norm, input, mw;
struct mjpeg_params bparm; struct mjpeg_params bparm;
#ifdef DEBUG DEBUG("setting decimation = %d, quality = %d",
fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_set_capture(), decimation = %d, quality = %d\n",
decimation, quality); decimation, quality);
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
@ -297,12 +287,9 @@ gboolean gst_v4lmjpegsrc_set_capture_m (GstV4lMjpegSrc *v4lmjpegsrc,
gint maxwidth; gint maxwidth;
struct mjpeg_params bparm; struct mjpeg_params bparm;
#ifdef DEBUG DEBUG("setting x_offset = %d, y_offset = %d, "
fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_set_capture_m(), x_offset = %d, y_offset = %d, "
"width = %d, height = %d, h_decimation = %d, v_decimation = %d, quality = %d\n", "width = %d, height = %d, h_decimation = %d, v_decimation = %d, quality = %d\n",
x_offset, y_offset, width, height, h_decimation, v_decimation, quality); x_offset, y_offset, width, height, h_decimation, v_decimation, quality);
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
@ -419,10 +406,7 @@ gboolean gst_v4lmjpegsrc_set_capture_m (GstV4lMjpegSrc *v4lmjpegsrc,
gboolean gboolean
gst_v4lmjpegsrc_capture_init (GstV4lMjpegSrc *v4lmjpegsrc) gst_v4lmjpegsrc_capture_init (GstV4lMjpegSrc *v4lmjpegsrc)
{ {
#ifdef DEBUG DEBUG("initting capture subsystem");
fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_capture_init()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
@ -441,7 +425,7 @@ gst_v4lmjpegsrc_capture_init (GstV4lMjpegSrc *v4lmjpegsrc)
/* Map the buffers */ /* Map the buffers */
GST_V4LELEMENT(v4lmjpegsrc)->buffer = mmap(0, GST_V4LELEMENT(v4lmjpegsrc)->buffer = mmap(0,
v4lmjpegsrc->breq.count * v4lmjpegsrc->breq.size, 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) if (GST_V4LELEMENT(v4lmjpegsrc)->buffer == MAP_FAILED)
{ {
gst_element_error(GST_ELEMENT(v4lmjpegsrc), gst_element_error(GST_ELEMENT(v4lmjpegsrc),
@ -466,10 +450,7 @@ gst_v4lmjpegsrc_capture_start (GstV4lMjpegSrc *v4lmjpegsrc)
{ {
int n; int n;
#ifdef DEBUG DEBUG("starting capture");
fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_capture_start()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
@ -493,10 +474,7 @@ gst_v4lmjpegsrc_grab_frame (GstV4lMjpegSrc *v4lmjpegsrc,
gint *num, gint *num,
gint *size) gint *size)
{ {
#ifdef DEBUG DEBUG("grabbing frame");
fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_grab_frame()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
@ -520,10 +498,7 @@ guint8 *
gst_v4lmjpegsrc_get_buffer (GstV4lMjpegSrc *v4lmjpegsrc, gst_v4lmjpegsrc_get_buffer (GstV4lMjpegSrc *v4lmjpegsrc,
gint num) gint num)
{ {
#ifdef DEBUG DEBUG("gst_v4lmjpegsrc_get_buffer(), num = %d", num);
fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_get_buffer(), num = %d\n",
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))) !GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lmjpegsrc)))
@ -546,11 +521,7 @@ gboolean
gst_v4lmjpegsrc_requeue_frame (GstV4lMjpegSrc *v4lmjpegsrc, gst_v4lmjpegsrc_requeue_frame (GstV4lMjpegSrc *v4lmjpegsrc,
gint num) gint num)
{ {
#ifdef DEBUG DEBUG("requeueing frame %d", num);
fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_requeue_frame(), num = %d\n",
num);
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
@ -570,10 +541,7 @@ gst_v4lmjpegsrc_requeue_frame (GstV4lMjpegSrc *v4lmjpegsrc,
gboolean gboolean
gst_v4lmjpegsrc_capture_stop (GstV4lMjpegSrc *v4lmjpegsrc) gst_v4lmjpegsrc_capture_stop (GstV4lMjpegSrc *v4lmjpegsrc)
{ {
#ifdef DEBUG DEBUG("stopping capture");
fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_capture_stop()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));
@ -594,10 +562,7 @@ gst_v4lmjpegsrc_capture_stop (GstV4lMjpegSrc *v4lmjpegsrc)
gboolean gboolean
gst_v4lmjpegsrc_capture_deinit (GstV4lMjpegSrc *v4lmjpegsrc) gst_v4lmjpegsrc_capture_deinit (GstV4lMjpegSrc *v4lmjpegsrc)
{ {
#ifdef DEBUG DEBUG("quitting capture subsystem");
fprintf(stderr, "V4LMJPEGSRC: gst_v4lmjpegsrc_capture_deinit()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lmjpegsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc));

View file

@ -17,8 +17,6 @@
* Boston, MA 02111-1307, USA. * Boston, MA 02111-1307, USA.
*/ */
/*#define DEBUG */
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -38,6 +36,10 @@
#define MAP_FAILED ( (caddr_t) -1 ) #define MAP_FAILED ( (caddr_t) -1 )
#endif #endif
#define DEBUG(format, args...) \
GST_DEBUG_ELEMENT(GST_CAT_PLUGIN_INFO, \
GST_ELEMENT(v4lsrc), \
"V4LSRC: " format "\n", ##args)
/* palette names */ /* palette names */
char *palette_name[] = { char *palette_name[] = {
@ -71,10 +73,7 @@ static gboolean
gst_v4lsrc_queue_frame (GstV4lSrc *v4lsrc, gst_v4lsrc_queue_frame (GstV4lSrc *v4lsrc,
gint num) gint num)
{ {
#ifdef DEBUG DEBUG("queueing frame %d", num);
fprintf(stderr, "V4LSRC: gst_v4lsrc_queue_frame(), num = %d\n",
num);
#endif
v4lsrc->mmap.frame = num; v4lsrc->mmap.frame = num;
@ -115,9 +114,7 @@ gst_v4lsrc_soft_sync_thread (void *arg)
GstV4lSrc *v4lsrc = GST_V4LSRC(arg); GstV4lSrc *v4lsrc = GST_V4LSRC(arg);
gint frame = 0; gint frame = 0;
#ifdef DEBUG DEBUG("starting software sync thread");
fprintf(stderr, "gst_v4lsrc_soft_sync_thread()\n");
#endif
/* Allow easy shutting down by other processes... */ /* Allow easy shutting down by other processes... */
pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL ); pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL );
@ -131,10 +128,10 @@ gst_v4lsrc_soft_sync_thread (void *arg)
{ {
if (v4lsrc->frame_queued[frame] < 0) if (v4lsrc->frame_queued[frame] < 0)
break; 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); v4lsrc->num_queued_frames, MIN_BUFFERS_QUEUED);
#endif
pthread_cond_wait(&(v4lsrc->cond_queued_frames), pthread_cond_wait(&(v4lsrc->cond_queued_frames),
&(v4lsrc->mutex_queued_frames)); &(v4lsrc->mutex_queued_frames));
} }
@ -142,16 +139,12 @@ gst_v4lsrc_soft_sync_thread (void *arg)
if (!v4lsrc->num_queued_frames) if (!v4lsrc->num_queued_frames)
{ {
#ifdef DEBUG DEBUG("Got signal to exit...");
fprintf(stderr, "Got signal to exit...\n");
#endif
goto end; goto end;
} }
/* sync on the frame */ /* sync on the frame */
#ifdef DEBUG DEBUG("Sync\'ing on frame %d", frame);
fprintf(stderr, "Sync\'ing on frame %d\n", frame);
#endif
retry: retry:
if (ioctl(GST_V4LELEMENT(v4lsrc)->video_fd, VIDIOCSYNC, &frame) < 0) if (ioctl(GST_V4LELEMENT(v4lsrc)->video_fd, VIDIOCSYNC, &frame) < 0)
{ {
@ -185,9 +178,7 @@ retry:
} }
end: end:
#ifdef DEBUG DEBUG("Software sync thread got signalled to exit");
fprintf(stderr, "Software sync thread got signalled to exit\n");
#endif
pthread_exit(NULL); pthread_exit(NULL);
} }
@ -202,20 +193,15 @@ static gboolean
gst_v4lsrc_sync_next_frame (GstV4lSrc *v4lsrc, gst_v4lsrc_sync_next_frame (GstV4lSrc *v4lsrc,
gint *num) gint *num)
{ {
#ifdef DEBUG
fprintf(stderr, "V4LSRC: gst_v4lsrc_sync_frame()\n");
#endif
*num = v4lsrc->sync_frame = (v4lsrc->sync_frame + 1)%v4lsrc->mbuf.frames; *num = v4lsrc->sync_frame = (v4lsrc->sync_frame + 1)%v4lsrc->mbuf.frames;
DEBUG("syncing on next frame (%d)", *num);
/* "software sync()" on the frame */ /* "software sync()" on the frame */
pthread_mutex_lock(&(v4lsrc->mutex_soft_sync)); pthread_mutex_lock(&(v4lsrc->mutex_soft_sync));
if (v4lsrc->isready_soft_sync[*num] == 0) if (v4lsrc->isready_soft_sync[*num] == 0)
{ {
#ifdef DEBUG DEBUG("Waiting for frame %d to be synced on", *num);
fprintf(stderr, "Waiting for frame %d to be synced on\n",
*num);
#endif
pthread_cond_wait(&(v4lsrc->cond_soft_sync[*num]), pthread_cond_wait(&(v4lsrc->cond_soft_sync[*num]),
&(v4lsrc->mutex_soft_sync)); &(v4lsrc->mutex_soft_sync));
} }
@ -241,13 +227,11 @@ gst_v4lsrc_set_capture (GstV4lSrc *v4lsrc,
gint height, gint height,
gint palette) gint palette)
{ {
#ifdef DBUG DEBUG("capture properties set to width = %d, height = %d, palette = %d",
fprintf(stderr, "V4LSRC: gst_v4lsrc_set_capture(), width = %d, height = %d, palette = %d\n",
width, height, palette); width, height, palette);
#endif
/*GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc));*/ /*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.width = width;
v4lsrc->mmap.height = height; v4lsrc->mmap.height = height;
@ -268,10 +252,7 @@ gst_v4lsrc_capture_init (GstV4lSrc *v4lsrc)
{ {
int n; int n;
#ifdef DEBUG DEBUG("initting capture subsystem");
fprintf(stderr, "V4LSRC: gst_v4lsrc_capture_init()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc));
GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lsrc)); GST_V4L_CHECK_NOT_ACTIVE(GST_V4LELEMENT(v4lsrc));
@ -371,10 +352,7 @@ gst_v4lsrc_capture_start (GstV4lSrc *v4lsrc)
{ {
int n; int n;
#ifdef DEBUG DEBUG("starting capture");
fprintf(stderr, "V4LSRC: gst_v4lsrc_capture_start()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc));
@ -410,10 +388,7 @@ gst_v4lsrc_capture_start (GstV4lSrc *v4lsrc)
gboolean gboolean
gst_v4lsrc_grab_frame (GstV4lSrc *v4lsrc, gint *num) gst_v4lsrc_grab_frame (GstV4lSrc *v4lsrc, gint *num)
{ {
#ifdef DEBUG DEBUG("grabbing frame");
fprintf(stderr, "V4LSRC: gst_v4lsrc_grab_frame()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc));
@ -434,10 +409,7 @@ gst_v4lsrc_grab_frame (GstV4lSrc *v4lsrc, gint *num)
guint8 * guint8 *
gst_v4lsrc_get_buffer (GstV4lSrc *v4lsrc, gint num) gst_v4lsrc_get_buffer (GstV4lSrc *v4lsrc, gint num)
{ {
#ifdef DEBUG DEBUG("gst_v4lsrc_get_buffer(), num = %d", num);
fprintf(stderr, "V4LSRC: gst_v4lsrc_get_buffer(), num = %d\n",
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))) !GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lsrc)))
@ -459,11 +431,7 @@ gst_v4lsrc_get_buffer (GstV4lSrc *v4lsrc, gint num)
gboolean gboolean
gst_v4lsrc_requeue_frame (GstV4lSrc *v4lsrc, gint num) gst_v4lsrc_requeue_frame (GstV4lSrc *v4lsrc, gint num)
{ {
#ifdef DEBUG DEBUG("requeueing frame %d", num);
fprintf(stderr, "V4LSRC: gst_v4lsrc_requeue_buffer(), num = %d\n",
num);
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc));
@ -486,10 +454,7 @@ gst_v4lsrc_capture_stop (GstV4lSrc *v4lsrc)
{ {
int n; int n;
#ifdef DEBUG DEBUG("stopping capture");
fprintf(stderr, "V4LSRC: gst_v4lsrc_capture_stop()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc));
@ -512,10 +477,7 @@ gst_v4lsrc_capture_stop (GstV4lSrc *v4lsrc)
gboolean gboolean
gst_v4lsrc_capture_deinit (GstV4lSrc *v4lsrc) gst_v4lsrc_capture_deinit (GstV4lSrc *v4lsrc)
{ {
#ifdef DEBUG DEBUG("quitting capture subsystem");
fprintf(stderr, "V4LSRC: gst_v4lsrc_capture_deinit()\n");
#endif
GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc)); GST_V4L_CHECK_OPEN(GST_V4LELEMENT(v4lsrc));
GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc)); GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc));