Merge branch 'master' into 0.11
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 16 Aug 2011 16:35:53 +0000 (18:35 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 16 Aug 2011 16:35:53 +0000 (18:35 +0200)
Conflicts:
sys/v4l2/v4l2src_calls.c

1  2 
configure.ac
ext/jack/gstjackaudiosrc.c
gst/audioparsers/gstflacparse.c
gst/isomp4/qtdemux.c
gst/rtsp/gstrtspsrc.c
sys/v4l2/gstv4l2object.c
sys/ximage/gstximagesrc.c

diff --cc configure.ac
Simple merge
Simple merge
@@@ -572,12 -576,12 +572,12 @@@ gst_flac_parse_frame_is_valid (GstFlacP
    guint i, search_start, search_end;
    FrameHeaderCheckReturn header_ret;
    guint16 block_size;
 +  gboolean result = FALSE;
  
    buffer = frame->buffer;
 -  data = GST_BUFFER_DATA (buffer);
 -  size = GST_BUFFER_SIZE (buffer);
 +  data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
  
-   if (size <= flacparse->min_framesize)
+   if (size < flacparse->min_framesize)
      goto need_more;
  
    header_ret =
@@@ -5255,7 -5239,7 +5255,7 @@@ qtdemux_stbl_init (GstQTDemux * qtdemux
    /* sync sample atom */
    stream->stps_present = FALSE;
    if ((stream->stss_present =
--          ! !qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stss,
++          !!qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stss,
                &stream->stss) ? TRUE : FALSE) == TRUE) {
      /* copy atom data into a new buffer for later use */
      stream->stss.data = g_memdup (stream->stss.data, stream->stss.size);
  
      /* partial sync sample atom */
      if ((stream->stps_present =
--            ! !qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stps,
++            !!qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stps,
                  &stream->stps) ? TRUE : FALSE) == TRUE) {
        /* copy atom data into a new buffer for later use */
        stream->stps.data = g_memdup (stream->stps.data, stream->stps.size);
  
    /* composition time-to-sample */
    if ((stream->ctts_present =
--          ! !qtdemux_tree_get_child_by_type_full (stbl, FOURCC_ctts,
++          !!qtdemux_tree_get_child_by_type_full (stbl, FOURCC_ctts,
                &stream->ctts) ? TRUE : FALSE) == TRUE) {
      /* copy atom data into a new buffer for later use */
      stream->ctts.data = g_memdup (stream->ctts.data, stream->ctts.size);
Simple merge
@@@ -2083,87 -2079,23 +2089,94 @@@ gst_v4l2_object_get_nearest_size (GstV4
        GST_WARNING_OBJECT (v4l2object->element,
            "Unsupported field type for %" GST_FOURCC_FORMAT "@%ux%u",
            GST_FOURCC_ARGS (pixelformat), *width, *height);
-       return FALSE;
+       goto error;
    }
  
+   if (prevfmt_valid)
+     v4l2_ioctl (fd, VIDIOC_S_FMT, &prevfmt);
    return TRUE;
+ error:
+   if (prevfmt_valid)
+     v4l2_ioctl (fd, VIDIOC_S_FMT, &prevfmt);
+   return FALSE;
  }
  
 +static gboolean
 +gst_v4l2_object_setup_pool (GstV4l2Object * v4l2object, GstCaps * caps)
 +{
 +  GstV4l2IOMode mode;
 +
 +  GST_DEBUG_OBJECT (v4l2object->element, "initializing the capture system");
 +
 +  GST_V4L2_CHECK_OPEN (v4l2object);
 +  GST_V4L2_CHECK_NOT_ACTIVE (v4l2object);
 +
 +  /* find transport */
 +  mode = v4l2object->req_mode;
 +
 +  if (v4l2object->vcap.capabilities & V4L2_CAP_READWRITE) {
 +    if (v4l2object->req_mode == GST_V4L2_IO_AUTO)
 +      mode = GST_V4L2_IO_RW;
 +  } else if (v4l2object->req_mode == GST_V4L2_IO_RW)
 +    goto method_not_supported;
 +
 +  if (v4l2object->vcap.capabilities & V4L2_CAP_STREAMING) {
 +    if (v4l2object->req_mode == GST_V4L2_IO_AUTO)
 +      mode = GST_V4L2_IO_MMAP;
 +  } else if (v4l2object->req_mode == GST_V4L2_IO_MMAP)
 +    goto method_not_supported;
 +
 +  /* if still no transport selected, error out */
 +  if (mode == GST_V4L2_IO_AUTO)
 +    goto no_supported_capture_method;
 +
 +  GST_INFO_OBJECT (v4l2object->element, "accessing buffers via mode %d", mode);
 +  v4l2object->mode = mode;
 +
 +  /* Map the buffers */
 +  GST_LOG_OBJECT (v4l2object->element, "initiating buffer pool");
 +
 +  if (!(v4l2object->pool = gst_v4l2_buffer_pool_new (v4l2object, caps)))
 +    goto buffer_pool_new_failed;
 +
 +  GST_V4L2_SET_ACTIVE (v4l2object);
 +
 +  return TRUE;
 +
 +  /* ERRORS */
 +buffer_pool_new_failed:
 +  {
 +    GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, READ,
 +        (_("Could not map buffers from device '%s'"),
 +            v4l2object->videodev),
 +        ("Failed to create buffer pool: %s", g_strerror (errno)));
 +    return FALSE;
 +  }
 +method_not_supported:
 +  {
 +    GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, READ,
 +        (_("The driver of device '%s' does not support the IO method %d"),
 +            v4l2object->videodev, mode), (NULL));
 +    return FALSE;
 +  }
 +no_supported_capture_method:
 +  {
 +    GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, READ,
 +        (_("The driver of device '%s' does not support any known IO "
 +                "method."), v4l2object->videodev), (NULL));
 +    return FALSE;
 +  }
 +}
 +
 +
 +/* Note about fraction simplification
 + *  * n1/d1 == n2/d2  is also written as  n1 == ( n2 * d1 ) / d2
 + *   */
 +#define fractions_are_equal(n1,d1,n2,d2) ((n1) == gst_util_uint64_scale_int((n2), (d1), (d2)))
  
  gboolean
 -gst_v4l2_object_set_format (GstV4l2Object * v4l2object, guint32 pixelformat,
 -    guint32 width, guint32 height, gboolean interlaced)
 +gst_v4l2_object_set_format (GstV4l2Object * v4l2object, GstCaps * caps)
  {
    gint fd = v4l2object->video_fd;
    struct v4l2_format format;
@@@ -97,8 -97,9 +97,9 @@@ gst_ximage_src_return_buf (GstXImageSr
      /* In that case we can reuse the image and add it to our image pool. */
      GST_LOG_OBJECT (ximagesrc, "recycling image %p in pool", ximage);
      /* need to increment the refcount again to recycle */
 -    gst_buffer_ref (GST_BUFFER (ximage));
 +    gst_buffer_ref (ximage);
      g_mutex_lock (ximagesrc->pool_lock);
+     GST_BUFFER_FLAGS (GST_BUFFER (ximage)) = 0; /* clear out any flags from the previous use */
      ximagesrc->buffer_pool = g_slist_prepend (ximagesrc->buffer_pool, ximage);
      g_mutex_unlock (ximagesrc->pool_lock);
    }