Hi,

We are now nearly complete porting our camera driver to align with soc-camera 
framework, however, we encounter a problem when it works with our application 
during switch format from preview to still capture, application's main calling 
sequence is as follow:
1) s_fmt /* preview @ YUV, VGA */
2) request buffer (buffer count = 6)
2) queue buffer
3) stream on
4) q-buf, dq-buf...
5) stream off

6) s_fmt /* still capture @ jpeg, 2592x1944*/
7) request buffer (buffer count = 3)
8) same as 3)->5)...

The point is in soc_camera_s_fmt_vid_cap() {
        if (icd->vb_vidq.bufs[0]) {
                dev_err(&icd->dev, "S_FMT denied: queue initialised\n");
                ret = -EBUSY;
                goto unlock;
        }
}
We didn't find vb_vidq.bufs[0] be free, (it is freed in videobuf_mmap_free(), 
and in __videobuf_mmap_setup, but no one calls videobuf_mmap_free(), and in 
__videobuf_mmap_setup it is freed at first and then allocated sequentially), so 
we always fail at calling s_fmt.
My idea is to implement soc_camera_reqbufs(buffer count = 0), to provide 
application opportunity to free this buffer node, refer to v4l2 spec, 
http://linuxtv.org/downloads/v4l-dvb-apis/vidioc-reqbufs.html
"A count value of zero frees all buffers, after aborting or finishing any DMA 
in progress, an implicit VIDIOC_STREAMOFF."

What do you think?

Any ideas will be appreciated!
Thanks!
Qing Xu

Email: [email protected]
Application Processor Systems Engineering,
Marvell Technology Group Ltd.

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to