[meta-freescale] OV5640 autofocus kernel+gstreamer+Qt implementation

Nikita Yushchenko nyushchenko at dev.rtsoft.ru
Tue Sep 29 13:10:01 PDT 2015

Hi list.

I've recently been working on integrating autofocus functionality of
OV5640 camera into software stack on imx6-based board.

This mail contains patches to kernel, gstreamer-imx and Qt5 that make
things somehow working. In particular, declarative-camera example
focuses ok, custom Qt-based project also does.

Kernel patches are against imx_3.14.28_1.0.0_ga branch.

First patch is generic mxc_v4l2_capture cleanup. Unfortunately driver
was quite racy and did not survive even streaming stop+start from within
Qt. Had to do some cleanup to mitigate that.

Second patch contains actual implementation of focus-related v4l ioctls.

Autofocus firmware embedded into patch was taken from
  branch rockchip-3.10-rk3288
  file drivers/media/video/ov5640_af_firmware.c
and converted to format that existing driver uses. I've tried different
firmwares found over the net, this one shows the best behaviour.

For gstreamer, I had to add GstPhotography implementation stub to
imxv4l2videosrc. Implementation is far incomplete, only focus-related
operations are there.

gstreamer-imx patch is against version 0.11.1

For Qt, need several patches to qtmultimedia.  We use meta-qt5 layer,
frodo branch, which is Qt 5.4 based. We had to backport several patches
from 5.5 for better GStreamer 1.0 support. Also we had to create several
new patches. Attaching a tarball with all these.

With all these changes, single autofocus works ok with unmodified Qt's
declarative-camera example.

Easy way to check continuous autofocus is:

- apply this to declarative-camera.qml

--- a/declarative-camera.qml  2015-09-26 11:29:54.000000000 +0300
+++ b/declarative-camera.qml  2015-09-16 13:12:51.000000000 +0300
@@ -56,6 +56,7 @@
             StateChangeScript {
                 script: {
                     camera.captureMode = Camera.CaptureStillImage
+                    camera.focus.focusMode = Camera.FocusAuto
@@ -68,6 +69,7 @@
             StateChangeScript {
                 script: {
                     camera.captureMode = Camera.CaptureVideo
+                    camera.focus.focusMode = Camera.FocusContinuous

- start it via /usr/bin/qt5/qmlscene /path/to/declarative-camera.qml
[running declarative-camera binary without recompilation won't get these
changes since binary has qml embedded and does not re-read it from files
at execution time]

- from within demo, switch to "video" mode

- take a sheet of paper with printed text and try moving in near camera

- on playback screen, see camera's attempts to keep focused

Known issues/limitations:

*) Legal status of AF firmware is unclear.

*) AF firmware is loaded using byte operations, loading using group
writes is not implemented.

*) AF firmware is loaded unconditionally on device open; better to do it
on first focus-related operation.

*) Reloading AF firmware on suspend-resume is not implemented. With
current implementation, autofocus will stop working after suspend-resume
cycle. To restore, need to close and reopen camera device (which usually
means - restart camera-using program).

Proper fix for the two above should be: make "firmware not loaded" a
state of firmware-control automata and threat firmware loading as
required step for requested state changes; when suspending, just force
"firmware not loaded" state.

*) Driver does not have protection against AF firmware misfunction (such
as - operation not completes in reasonable time). Such misfuction
sometimes does happen. It is not fatal (newly issued operation succeeds)
but still incorrect.

*) Setting camera parameters is not implemented. Camera always captures
at 640x480 with all default settings.

*) Middleware (QT plugin + gstreamer) is incomplete and quite unfriendly
to debug and use. It basically works for trivial scenarios (streaming
video from camera to viewfinder, starting/stopping, capturing images)
but tends to fail on anything else. On failure, it just displays
"CameraBin error" message and stops working. This happens in different
cases, which includes inaccurate Qt application behavior (such as too
long frame processing, failing to release buffer in time, etc).
Extracting details on what happened is possible via GST_DEBUG but is
quite cumbersome and requires understanding of gstreamer internals.

*) 'imx-ipuv3 2400000.ipu: IPU Warning - IPU_INT_STAT_5 = 0x00000001'
message sometimes appears

*) 'ERROR: unrecognized std! 0 (PAL=ff, NTSC=b000)' message sometimes

*) pressing Capture button in Qt C++ camera example
(qt5/examples/multimediawidgets/camera/camera) causes CameraBin error
(tried to investigate this, immediate reason is that after streaming
restart, QPainterVideoSurface receives first two frames ok but does not
become back ready after that and refuses 3rd frame; why this happens is
not clear yet)

Any comments on all this are welcome.

Nikita Yushchenko,
System Software Engineer at Software Development Center, RTsoft
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-mxc_v4l2_capture-rework.patch
Type: text/x-patch
Size: 22165 bytes
Desc: not available
URL: <http://lists.yoctoproject.org/pipermail/meta-freescale/attachments/20150929/1da0de85/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-mxc-ov5640-autofocus-support.patch
Type: text/x-patch
Size: 112525 bytes
Desc: not available
URL: <http://lists.yoctoproject.org/pipermail/meta-freescale/attachments/20150929/1da0de85/attachment-0001.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: qtmultimedia-recipe-append.tar.bz2
Type: application/x-bzip
Size: 74184 bytes
Desc: not available
URL: <http://lists.yoctoproject.org/pipermail/meta-freescale/attachments/20150929/1da0de85/attachment-0002.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: v4l2src-implement-autofocus-control.patch
Type: text/x-patch
Size: 24170 bytes
Desc: not available
URL: <http://lists.yoctoproject.org/pipermail/meta-freescale/attachments/20150929/1da0de85/attachment-0003.bin>

More information about the meta-freescale mailing list