Add following auto focus controls and documentation:
- V4L2_CID_AUTO_FOCUS_START - one-shot auto focus start
- V4L2_CID_AUTO_FOCUS_STOP - one-shot auto focus stop
- V4L2_CID_AUTO_FOCUS_STATUS - auto focus status
- V4L2_CID_AUTO_FOCUS_DISTANCE - auto focus scan range selection
- V4L2_CID_AUTO_FOCUS_AREA - auto focus area selection
- V4L2_CID_AUTO_FOCUS_FACE_PRIORITY - enable/disable face priority
auto focus
Signed-off-by: Sylwester Nawrocki <[email protected]>
Signed-off-by: Kyungmin Park <[email protected]>
---
Documentation/DocBook/media/v4l/controls.xml | 153 +++++++++++++++++++++++++-
drivers/media/video/v4l2-ctrls.c | 32 +++++-
include/linux/videodev2.h | 24 ++++
3 files changed, 206 insertions(+), 3 deletions(-)
diff --git a/Documentation/DocBook/media/v4l/controls.xml
b/Documentation/DocBook/media/v4l/controls.xml
index ce05a4b..16742c0 100644
--- a/Documentation/DocBook/media/v4l/controls.xml
+++ b/Documentation/DocBook/media/v4l/controls.xml
@@ -2857,13 +2857,162 @@ negative values towards infinity. This is a write-only
control.</entry>
<row>
<entry
spanname="id"><constant>V4L2_CID_FOCUS_AUTO</constant> </entry>
<entry>boolean</entry>
- </row><row><entry spanname="descr">Enables automatic focus
-adjustments. The effect of manual focus adjustments while this feature
+ </row><row><entry spanname="descr">Enables continuous automatic
+focus adjustments. The effect of manual focus adjustments while this feature
is enabled is undefined, drivers should ignore such requests.</entry>
</row>
<row><entry></entry></row>
<row>
+ <entry
spanname="id"><constant>V4L2_CID_AUTO_FOCUS_START</constant> </entry>
+ <entry>button</entry>
+ </row><row><entry spanname="descr">Starts single auto focus process.
+The effect of setting this control when
<constant>V4L2_CID_FOCUS_AUTO</constant>
+is set to <constant>TRUE</constant> (1) is undefined, drivers should ignore
+such requests.</entry>
+ </row>
+ <row><entry></entry></row>
+
+ <row>
+ <entry
spanname="id"><constant>V4L2_CID_AUTO_FOCUS_STOP</constant> </entry>
+ <entry>button</entry>
+ </row><row><entry spanname="descr">Aborts automatic focus process
+started with <constant>V4L2_CID_AUTO_FOCUS_START</constant> control. It is
+effective only when the continuous auto focus is disabled, that is when
+<constant>V4L2_CID_FOCUS_AUTO</constant> control is set to <constant>FALSE
+</constant> (0).</entry>
+ </row>
+ <row><entry></entry></row>
+
+ <row id="v4l2-auto-focus-status">
+ <entry spanname="id">
+ <constant>V4L2_CID_AUTO_FOCUS_STATUS</constant> </entry>
+ <entry>bitmask</entry>
+ </row>
+ <row><entry spanname="descr">The automatic focus status. This is a
read-only
+ control.</entry>
+ </row>
+ <row>
+ <entrytbl spanname="descr" cols="2">
+ <tbody valign="top">
+ <row>
+
<entry><constant>V4L2_AUTO_FOCUS_STATUS_IDLE</constant> </entry>
+ <entry>Automatic focus is inactive.</entry>
+ </row>
+ <row>
+
<entry><constant>V4L2_AUTO_FOCUS_STATUS_BUSY</constant> </entry>
+ <entry>Automatic focusing is in progress and the focus is
changing.</entry>
+ </row>
+ <row>
+
<entry><constant>V4L2_AUTO_FOCUS_STATUS_SUCCESS</constant> </entry>
+ <entry>Automatic focus has completed or is continued
successfully.</entry>
+ </row>
+ <row>
+
<entry><constant>V4L2_AUTO_FOCUS_STATUS_FAIL</constant> </entry>
+ <entry>Automatic focus has failed, a driver will not
transition
+ from this state until another action is performed by an
+ application.</entry>
+ </row>
+ </tbody>
+ </entrytbl>
+ </row>
+ <row><entry></entry></row>
+
+ <row id="v4l2-auto-focus-distance">
+ <entry spanname="id">
+ <constant>V4L2_CID_AUTO_FOCUS_DISTANCE</constant> </entry>
+ <entry>enum v4l2_auto_focus_distance</entry>
+ </row>
+ <row><entry spanname="descr">Determines auto focus distance range
+for which lens may be adjusted. </entry>
+ </row>
+ <row>
+ <entrytbl spanname="descr" cols="2">
+ <tbody valign="top">
+ <row>
+
<entry><constant>V4L2_AUTO_FOCUS_DISTANCE_NORMAL</constant> </entry>
+ <entry>The auto focus normal distance range. It is limited
+for best auto focus algorithm performance.</entry>
+ </row>
+ <row>
+
<entry><constant>V4L2_AUTO_FOCUS_DISTANCE_MACRO</constant> </entry>
+ <entry>Macro (close-up) auto focus. The camera will
+use minimum possible distance that it is capable of for auto focus.</entry>
+ </row>
+ <row>
+
<entry><constant>V4L2_AUTO_FOCUS_DISTANCE_INFINITY</constant> </entry>
+ <entry>The camera is focused permanently at its farthest
+possible distance. This option is only supported by drivers that do not expose
+<constant>V4L2_CID_FOCUS_ABSOLUTE</constant> control.</entry>
+ </row>
+ </tbody>
+ </entrytbl>
+ </row>
+ <row><entry></entry></row>
+
+ <row id="v4l2-auto-focus-area">
+ <entry spanname="id">
+ <constant>V4L2_CID_AUTO_FOCUS_AREA</constant> </entry>
+ <entry>enum v4l2_auto_focus_area</entry>
+ </row>
+ <row><entry spanname="descr">Determines the area of the frame that
+the camera will use for auto focus. It is applicable to one-shot and continuous
+auto focus. The effect of setting this control when <constant>
+V4L2_CID_AUTO_FOCUS_FACE_PRIORITY</constant> is set to
<constant>TRUE</constant>
+(1) is undefined, drivers should ignore such requests.
+<para>
+The <link linkend="selection-api"> selection API</link> can be used to specify
+or query coordinates of the focus spot or rectangle. To change auto focus
region
+of interest applications first select required mode of this control and then
+set the rectangle or spot coordinates by means of the
&VIDIOC-SUBDEV-S-SELECTION;
+or &VIDIOC-S-SELECTION; ioctl. In order to trigger again an auto focus process
+with same coordinates applications should use the
<constant>V4L2_CID_AUTO_FOCUS_START
+</constant> control or invoke &VIDIOC-SUBDEV-S-SELECTION; or
&VIDIOC-S-SELECTION;
+ioctl with same parameters. The new coordinates are applied to hardware only
when
+this controls is set to value different than <constant>V4L2_AUTO_FOCUS_AREA_ALL
+</constant>.</para></entry>
+ </row>
+ <row>
+ <entrytbl spanname="descr" cols="2">
+ <tbody valign="top">
+ <row>
+
<entry><constant>V4L2_AUTO_FOCUS_AREA_ALL</constant> </entry>
+ <entry>Normal auto focus where data from an entire frame is
+used for the auto focus statistics calculation.</entry>
+ </row>
+ <row>
+
<entry><constant>V4L2_AUTO_FOCUS_AREA_SPOT</constant> </entry>
+ <entry>Automatic focus on a spot within a frame at position
+specified by the <constant>V4L2_SEL_TGT_AUTO_FOCUS_ACTUAL</constant> or
+<constant>V4L2_SUBDEV_SEL_TGT_AUTO_FOCUS_ACTUAL</constant> selection. When
those
+selections are not supported by driver the default spot's position is center of
+the frame.</entry>
+ </row>
+ <row>
+
<entry><constant>V4L2_AUTO_FOCUS_AREA_RECTANGLE</constant> </entry>
+ <entry>Auto focus area is determined by <constant>
+V4L2_SEL_TGT_AUTO_FOCUS_ACTUAL</constant> or <constant>
+V4L2_SUBDEV_SEL_TGT_AUTO_FOCUS_ACTUAL</constant> selection rectangle.</entry>
+ </row>
+ </tbody>
+ </entrytbl>
+ </row>
+ <row><entry></entry></row>
+
+ <row>
+ <entry spanname="id"><constant>V4L2_CID_AUTO_FOCUS_FACE_PRIORITY
+ </constant> </entry>
+ <entry>boolean</entry>
+ </row><row><entry spanname="descr">Enable or disable face priority
+auto focus, where the camera focus is driven by face detection engine.
+When this control is set to <constant>TRUE</constant> (1) the <constant>
+V4L2_CID_AUTO_FOCUS_AREA</constant> control, if present, will be reset
+by drivers to <constant>V4L2_AUTO_FOCUS_AREA_NORMAL</constant>.
+</entry>
+ </row>
+ <row><entry></entry></row>
+
+ <row>
<entry
spanname="id"><constant>V4L2_CID_ZOOM_ABSOLUTE</constant> </entry>
<entry>integer</entry>
</row><row><entry spanname="descr">Specify the objective lens
diff --git a/drivers/media/video/v4l2-ctrls.c b/drivers/media/video/v4l2-ctrls.c
index 01c5d3e..65aa63c 100644
--- a/drivers/media/video/v4l2-ctrls.c
+++ b/drivers/media/video/v4l2-ctrls.c
@@ -230,6 +230,19 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
"Aperture Priority Mode",
NULL
};
+ static const char * const camera_auto_focus_area[] = {
+ "All",
+ "Spot",
+ "Rectangle",
+ NULL
+ };
+ static const char * const camera_auto_focus_distance[] = {
+ "Normal",
+ "Macro",
+ "Infinity",
+ NULL
+ };
+
static const char * const colorfx[] = {
"None",
"Black & White",
@@ -410,6 +423,10 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
return camera_power_line_frequency;
case V4L2_CID_EXPOSURE_AUTO:
return camera_exposure_auto;
+ case V4L2_CID_AUTO_FOCUS_AREA:
+ return camera_auto_focus_area;
+ case V4L2_CID_AUTO_FOCUS_DISTANCE:
+ return camera_auto_focus_distance;
case V4L2_CID_COLORFX:
return colorfx;
case V4L2_CID_TUNE_PREEMPHASIS:
@@ -590,13 +607,19 @@ const char *v4l2_ctrl_get_name(u32 id)
case V4L2_CID_TILT_ABSOLUTE: return "Tilt, Absolute";
case V4L2_CID_FOCUS_ABSOLUTE: return "Focus, Absolute";
case V4L2_CID_FOCUS_RELATIVE: return "Focus, Relative";
- case V4L2_CID_FOCUS_AUTO: return "Focus, Automatic";
+ case V4L2_CID_FOCUS_AUTO: return "Focus, Automatic
Continuous";
case V4L2_CID_ZOOM_ABSOLUTE: return "Zoom, Absolute";
case V4L2_CID_ZOOM_RELATIVE: return "Zoom, Relative";
case V4L2_CID_ZOOM_CONTINUOUS: return "Zoom, Continuous";
case V4L2_CID_PRIVACY: return "Privacy";
case V4L2_CID_IRIS_ABSOLUTE: return "Iris, Absolute";
case V4L2_CID_IRIS_RELATIVE: return "Iris, Relative";
+ case V4L2_CID_AUTO_FOCUS_START: return "Auto Focus, Start";
+ case V4L2_CID_AUTO_FOCUS_STOP: return "Auto Focus, Stop";
+ case V4L2_CID_AUTO_FOCUS_STATUS: return "Auto Focus, Status";
+ case V4L2_CID_AUTO_FOCUS_DISTANCE: return "Auto Focus, Distance";
+ case V4L2_CID_AUTO_FOCUS_AREA: return "Auto Focus, Area";
+ case V4L2_CID_AUTO_FOCUS_FACE_PRIORITY: return "Auto Focus, Face
Priority";
/* FM Radio Modulator control */
/* Keep the order of the 'case's the same as in videodev2.h! */
@@ -678,6 +701,7 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum
v4l2_ctrl_type *type,
case V4L2_CID_MPEG_VIDEO_PULLDOWN:
case V4L2_CID_EXPOSURE_AUTO_PRIORITY:
case V4L2_CID_FOCUS_AUTO:
+ case V4L2_CID_AUTO_FOCUS_FACE_PRIORITY:
case V4L2_CID_PRIVACY:
case V4L2_CID_AUDIO_LIMITER_ENABLED:
case V4L2_CID_AUDIO_COMPRESSION_ENABLED:
@@ -702,6 +726,8 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum
v4l2_ctrl_type *type,
case V4L2_CID_TILT_RESET:
case V4L2_CID_FLASH_STROBE:
case V4L2_CID_FLASH_STROBE_STOP:
+ case V4L2_CID_AUTO_FOCUS_START:
+ case V4L2_CID_AUTO_FOCUS_STOP:
*type = V4L2_CTRL_TYPE_BUTTON;
*flags |= V4L2_CTRL_FLAG_WRITE_ONLY;
*min = *max = *step = *def = 0;
@@ -725,6 +751,8 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum
v4l2_ctrl_type *type,
case V4L2_CID_MPEG_STREAM_TYPE:
case V4L2_CID_MPEG_STREAM_VBI_FMT:
case V4L2_CID_EXPOSURE_AUTO:
+ case V4L2_CID_AUTO_FOCUS_AREA:
+ case V4L2_CID_AUTO_FOCUS_DISTANCE:
case V4L2_CID_COLORFX:
case V4L2_CID_TUNE_PREEMPHASIS:
case V4L2_CID_FLASH_LED_MODE:
@@ -766,6 +794,7 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum
v4l2_ctrl_type *type,
break;
case V4L2_CID_FLASH_FAULT:
case V4L2_CID_JPEG_ACTIVE_MARKER:
+ case V4L2_CID_AUTO_FOCUS_STATUS:
*type = V4L2_CTRL_TYPE_BITMASK;
break;
case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
@@ -824,6 +853,7 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum
v4l2_ctrl_type *type,
*flags |= V4L2_CTRL_FLAG_WRITE_ONLY;
break;
case V4L2_CID_FLASH_STROBE_STATUS:
+ case V4L2_CID_AUTO_FOCUS_STATUS:
case V4L2_CID_FLASH_READY:
*flags |= V4L2_CTRL_FLAG_READ_ONLY;
break;
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h
index d48e954..615d939 100644
--- a/include/linux/videodev2.h
+++ b/include/linux/videodev2.h
@@ -1694,6 +1694,30 @@ enum v4l2_exposure_auto_type {
#define V4L2_CID_IRIS_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+17)
#define V4L2_CID_IRIS_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+18)
+#define V4L2_CID_AUTO_FOCUS_START (V4L2_CID_CAMERA_CLASS_BASE+19)
+#define V4L2_CID_AUTO_FOCUS_STOP (V4L2_CID_CAMERA_CLASS_BASE+20)
+#define V4L2_CID_AUTO_FOCUS_STATUS (V4L2_CID_CAMERA_CLASS_BASE+21)
+#define V4L2_AUTO_FOCUS_STATUS_IDLE (0 << 0)
+#define V4L2_AUTO_FOCUS_STATUS_BUSY (1 << 0)
+#define V4L2_AUTO_FOCUS_STATUS_SUCCESS (1 << 1)
+#define V4L2_AUTO_FOCUS_STATUS_FAIL (1 << 2)
+
+#define V4L2_CID_AUTO_FOCUS_DISTANCE (V4L2_CID_CAMERA_CLASS_BASE+22)
+enum v4l2_auto_focus_distance {
+ V4L2_AUTO_FOCUS_DISTANCE_NORMAL = 0,
+ V4L2_AUTO_FOCUS_DISTANCE_MACRO = 1,
+ V4L2_AUTO_FOCUS_DISTANCE_INFINITY = 2,
+};
+
+#define V4L2_CID_AUTO_FOCUS_AREA (V4L2_CID_CAMERA_CLASS_BASE+23)
+enum v4l2_auto_focus_area {
+ V4L2_AUTO_FOCUS_AREA_ALL = 0,
+ V4L2_AUTO_FOCUS_AREA_SPOT = 1,
+ V4L2_AUTO_FOCUS_AREA_RECTANGLE = 2,
+};
+
+#define V4L2_CID_AUTO_FOCUS_FACE_PRIORITY (V4L2_CID_CAMERA_CLASS_BASE+24)
+
/* FM Modulator class control IDs */
#define V4L2_CID_FM_TX_CLASS_BASE (V4L2_CTRL_CLASS_FM_TX | 0x900)
#define V4L2_CID_FM_TX_CLASS (V4L2_CTRL_CLASS_FM_TX | 1)
--
1.7.9.2
--
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