Hi, On 09/29/2009 12:55 AM, Laurent Pinchart wrote: > Hi, > > On Friday 25 September 2009 03:49:53 Bo Liu wrote: >> <[email protected]> >> Content-Type: text/plain; charset="gb2312" >> Content-Transfer-Encoding: 8bit >> MIME-Version: 1.0 > > Please try to fix your mail client. This is really annoying. > >>> On Thursday 24 September 2009 11:14:35 Bo Liu wrote: >>>> Hi, All >>>> >>>> I have a question about VIDIOC_S_FMT? >>>> >>>> Gstreamer will ioctl(VIDIOC_STREAMINGOFF) then ioctl(VIDIOC_S_FMT), >>>> then ioctl(VIDIOC_STREAMINGON) >>>> >>>> The newest's code have these patch: >>>> >>>> diff --git a/drivers/media/video/uvc/uvc_v4l2.c >>>> b/drivers/media/video/uvc/uvc_v4l2.c index 507542d..f8b94d6 100644 >>>> (file) >>>> --- a/drivers/media/video/uvc/uvc_v4l2.c >>>> +++ b/drivers/media/video/uvc/uvc_v4l2.c >>>> @@ -251,7 +251,7 @@ static int uvc_v4l2_set_format(struct >>>> uvc_video_device *video, if (fmt->type != video->streaming->type) >>>> return -EINVAL; >>>> >>>> - if (uvc_queue_streaming(&video->queue)) >>>> + if (uvc_queue_allocated(&video->queue)) >>>> return -EBUSY; >>>> >>>> ret = uvc_v4l2_try_format(video, fmt,&probe,&format,&frame); >>>> >>>> >>>> And, I found after this patch ioctl(VIDIOC_S_FMT) will failed at >>>> uvc_queue_allocated(it won't failed at uvc_queue_streaming). >>>> >>>> So, Now Can Gstreamer set the format(use ioctl(VIDIOC_STREAMINGOFF£©£¬ >>>> then ioctl(VIDIOC_S_FMT), then ioctl(VIDIOC_STREAMINGON)) after open the >>>> device(doesn't close) ? If not, How to implement this? >>> >>> You can't change the format while buffers are allocated. You need to free >>> the buffers before, using VIDIOC_REQBUFS with a buffer count of 0. >> >> Thanks for your reply, uvc_v4l2_try_format() success now. > > I suppose you mean uvc_v4l2_set_format(). > >> But gstreamer still failed while dequeue buffer, I think maybe it doesn't >> realloc buffer and add to queue. Then, How and where to realloc the buffer >> after change the format? I try to use VIDIOC_REQBUFS with a buffer count. >> But it seems no useage. > > That's the right way to do it, and it should work. > > ioctl(VIDIOC_S_FMT) > ioctl(VIDIOC_REQBUFS - n buffers) > mmap() > ioctl(VIDIOC_QBUF) > ioctl(VIDIOC_STREAMON) > ioctl(VIDIOC_DQBUF) > ioctl(VIDIOC_QBUF) > ... > ioctl(VIDIOC_STREAMOFF) > munmap() > ioctl(VIDIOC_REQBUFS - 0 buffers) >
Note that the need for this last call (VIDIOC_REQBUFS - 0 buffers), also known as unrequesting the buffers, is a bit ambiguous. Not all drivers need this, and some even return an EINVAL if the number of requested buffers < 0. I think we need to clarify the V4L2 API specification on this point. libv4l currently does do the unrequest the buffers thingie (when it is managing the buffers itself), but ignores the return value. Regards, Hans _______________________________________________ Linux-uvc-devel mailing list [email protected] https://lists.berlios.de/mailman/listinfo/linux-uvc-devel
