summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEdgard Lima <edgard.lima@indt.org.br>2006-08-24 00:40:07 +0000
committerEdgard Lima <edgard.lima@indt.org.br>2006-08-24 00:40:07 +0000
commita411f9e71ac0f023218be100081395c8bbed88fd (patch)
tree3273f49c005b4219fcb45404c590402c264485d2
parent2d7cf5f38549d6e18f124e3171c8687640b3eb35 (diff)
downloadgst-plugins-bad-a411f9e71ac0f023218be100081395c8bbed88fd.tar.gz
gst-plugins-bad-a411f9e71ac0f023218be100081395c8bbed88fd.tar.bz2
gst-plugins-bad-a411f9e71ac0f023218be100081395c8bbed88fd.zip
Fix set_caps to set width and height to the values the driver is really working with.
Original commit message from CVS: Fix set_caps to set width and height to the values the driver is really working with.
-rw-r--r--ChangeLog9
-rw-r--r--sys/v4l2/gstv4l2src.c10
-rw-r--r--sys/v4l2/v4l2src_calls.c44
-rw-r--r--sys/v4l2/v4l2src_calls.h2
4 files changed, 53 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 6787429a..bc5e2c7b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2006-08-23 Edgard Lima <edgard.lima@indt.org.br>
+
+ * sys/v4l2/gstv4l2src.c:
+ * sys/v4l2/v4l2src_calls.c:
+ * sys/v4l2/v4l2src_calls.h:
+ Fix set_caps to set width and height to the values the driver is
+ really working with.
+
+
2006-08-23 Tim-Philipp Müller <tim at centricular dot net>
* ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_push_block):
diff --git a/sys/v4l2/gstv4l2src.c b/sys/v4l2/gstv4l2src.c
index bf8a2dd4..d5cb1940 100644
--- a/sys/v4l2/gstv4l2src.c
+++ b/sys/v4l2/gstv4l2src.c
@@ -807,12 +807,15 @@ gst_v4l2src_set_caps (GstBaseSrc * src, GstCaps * caps)
GST_DEBUG_OBJECT (v4l2src, "trying to set_capture %dx%d, format %s",
w, h, format->description);
/* this only fills in v4l2src->mmap values */
- if (!gst_v4l2src_set_capture (v4l2src, format, w, h)) {
+ if (!gst_v4l2src_set_capture (v4l2src, format, &w, &h)) {
GST_WARNING_OBJECT (v4l2src, "could not set_capture %dx%d, format %s",
w, h, format->description);
return FALSE;
}
+ gst_structure_set (structure, "width", G_TYPE_INT, w, "height", G_TYPE_INT, h,
+ NULL);
+
if (!gst_v4l2src_capture_init (v4l2src))
return FALSE;
@@ -881,8 +884,9 @@ gst_v4l2src_get_read (GstV4l2Src * v4l2src, GstBuffer ** buf)
continue;
} else {
GST_ELEMENT_ERROR (v4l2src, RESOURCE, SYNC, (NULL),
- ("error read()ing a buffer on device %s: %s",
- v4l2src->v4l2object->videodev, g_strerror (errno)));
+ ("error read()ing %d bytes on device %s: %d - %s",
+ buffersize, v4l2src->v4l2object->videodev, errno,
+ g_strerror (errno)));
gst_buffer_unref (*buf);
return GST_FLOW_ERROR;
}
diff --git a/sys/v4l2/v4l2src_calls.c b/sys/v4l2/v4l2src_calls.c
index 2f46facf..801120ff 100644
--- a/sys/v4l2/v4l2src_calls.c
+++ b/sys/v4l2/v4l2src_calls.c
@@ -219,6 +219,7 @@ gst_v4l2src_get_capture (GstV4l2Src * v4l2src)
GST_V4L2_CHECK_OPEN (v4l2src->v4l2object);
+ memset (&v4l2src->format, 0, sizeof (struct v4l2_format));
v4l2src->format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl (v4l2src->v4l2object->video_fd, VIDIOC_G_FMT, &v4l2src->format) < 0) {
GST_ELEMENT_ERROR (v4l2src, RESOURCE, SETTINGS, (NULL),
@@ -239,17 +240,20 @@ gst_v4l2src_get_capture (GstV4l2Src * v4l2src)
gboolean
gst_v4l2src_set_capture (GstV4l2Src * v4l2src,
- struct v4l2_fmtdesc * fmt, gint width, gint height)
+ struct v4l2_fmtdesc * fmt, gint * width, gint * height)
{
DEBUG ("Setting capture format to %dx%d, format %s",
- width, height, fmt->description);
+ *width, *height, fmt->description);
GST_V4L2_CHECK_OPEN (v4l2src->v4l2object);
GST_V4L2_CHECK_NOT_ACTIVE (v4l2src->v4l2object);
- memset (&v4l2src->format, 0, sizeof (struct v4l2_format));
- v4l2src->format.fmt.pix.width = width;
- v4l2src->format.fmt.pix.height = height;
+ if (!gst_v4l2src_get_capture (v4l2src)) {
+ goto fail;
+ }
+
+ v4l2src->format.fmt.pix.width = *width;
+ v4l2src->format.fmt.pix.height = *height;
v4l2src->format.fmt.pix.pixelformat = fmt->pixelformat;
v4l2src->format.fmt.pix.field = V4L2_FIELD_INTERLACED;
v4l2src->format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
@@ -257,13 +261,36 @@ gst_v4l2src_set_capture (GstV4l2Src * v4l2src,
if (ioctl (v4l2src->v4l2object->video_fd, VIDIOC_S_FMT, &v4l2src->format) < 0) {
GST_ELEMENT_ERROR (v4l2src, RESOURCE, SETTINGS, (NULL),
("failed to set pixelformat to %s @ %dx%d for device %s: %s",
- fmt->description, width, height,
+ fmt->description, *width, *height,
v4l2src->v4l2object->videodev, g_strerror (errno)));
- return FALSE;
+ goto fail;
+ }
+
+ if (*width != v4l2src->format.fmt.pix.width ||
+ *height != v4l2src->format.fmt.pix.height) {
+ DEBUG ("Updating size from %dx%d to %dx%d, format %s",
+ *width, *height, v4l2src->format.fmt.pix.width,
+ v4l2src->format.fmt.pix.height, fmt->description);
}
/* update internal info */
- return gst_v4l2src_get_capture (v4l2src);
+ if (!gst_v4l2src_get_capture (v4l2src)) {
+ goto fail;
+ }
+
+ if (fmt->pixelformat != v4l2src->format.fmt.pix.pixelformat) {
+ goto fail;
+ }
+
+ *width = v4l2src->format.fmt.pix.width;
+ *height = v4l2src->format.fmt.pix.height;
+
+ return TRUE;
+
+fail:
+
+ return FALSE;
+
}
@@ -568,6 +595,7 @@ gst_v4l2src_get_size_limits (GstV4l2Src * v4l2src,
struct v4l2_fmtdesc * format,
gint * min_w, gint * max_w, gint * min_h, gint * max_h)
{
+
struct v4l2_format fmt;
GST_LOG_OBJECT (v4l2src,
diff --git a/sys/v4l2/v4l2src_calls.h b/sys/v4l2/v4l2src_calls.h
index 51d871ff..4b5a3871 100644
--- a/sys/v4l2/v4l2src_calls.h
+++ b/sys/v4l2/v4l2src_calls.h
@@ -28,7 +28,7 @@
gboolean gst_v4l2src_get_capture (GstV4l2Src * v4l2src);
gboolean gst_v4l2src_set_capture (GstV4l2Src * v4l2src,
struct v4l2_fmtdesc *fmt,
- gint width, gint height);
+ gint * width, gint * height);
gboolean gst_v4l2src_capture_init (GstV4l2Src * v4l2src);
gboolean gst_v4l2src_capture_start (GstV4l2Src * v4l2src);
gint gst_v4l2src_grab_frame (GstV4l2Src * v4l2src);