android_驱动_qcom_【高通SDM660平台】(6) --- Camera getParameters 及 setParameters 流程


【高通SDM660平台】(1) — Camera 驱动 Bringup Guide
【高通SDM660平台】(2) — Camera Kernel 驱动层代码逻辑分析
【高通SDM660平台】(3) — Camera V4L2 驱动层分析
【高通SDM660平台】(4) — Camera Init 初始化流程
【高通SDM660平台】(5) — Camera Open 流程
【高通SDM660平台】(6) — Camera getParameters 及 setParameters 流程
【高通SDM660平台】(7) — Camera onPreview 代码流程
【高通SDM660平台】(8) — Camera MetaData介绍
【高通SDM660平台 Android 10.0】(9) — Qcom Camera Daemon 代码分析
【高通SDM660平台 Android 10.0】(10) — Camera Sensor lib 与 Kernel Camera Probe 代码分析
《【高通SDM660平台】Camera Capture 流程》
《【高通SDM660平台】Camera mm-qcamera-app 代码分析》



前面分析了 open camera 流程,在preview 前,我们要做 getParameters 及 setParameters 操作,因此,我们先来看下 getParameters 及 setParameters 的调用流程。

网上从大神那看到一张图,画的挺好,先贴上来:
在这里插入图片描述

一、 getParameters 及 setParameters 总结


二、 getParameters 及 setParameters 流程代码分析

2.1 [Java] 层 Camera.java 相关参数

在分析代码前,我们先来看下Camera.java 的代码注释:
To make camera parameters take effect, applications have to call {@link Camera#setParameters(Camera.Parameters)}.

Camera APP 需要调用setParameters() 方法来让参数设置生效。

For example, after {@link Camera.Parameters#setWhiteBalance} is called, white balance is not actually changed until {@link Camera#setParameters(Camera.Parameters)} is called with the changed parameters object.

例如,当调用setWhiteBalance() 方法后,白平衡实际上并没有生效,需要在调用 setParameters() 后才会实际生效。

Different devices may have different camera capabilities, such as picture size or flash modes.

不同的Camera 硬件设备的支持的功能及能力也不同,比如 图片尺寸、闪光灯模式等。

For example, the application should call {@link Camera.Parameters#getSupportedColorEffects()} before calling {@link Camera.Parameters#setColorEffect(String)}.

例如,app 应该先调用 getSupportedColorEffects() ,然后再调用 setColorEffect(string) 方法。

If the camera does not support color effects, {@link Camera.Parameters#getSupportedColorEffects()} will return null.

如果Camera 硬件不支持 color effects,调和 getSupportedColorEffects() 函数时会返回 NULL。

Camera 有特别多参数,主要包括如下:

  1. Preview 尺寸、格式、帧率、支持的fps范围
  2. Picture 尺寸、格式
  3. Jpeg 缩略图的 尺寸、宽高、质量, Jpeg的能力
  4. 旋转角度
  5. GPS 经纬度、时间戳等信息
  6. 白平衡、效果、场景模式、闪光灯模式、对焦模式、对焦范围、对焦长度
  7. 水平视角、垂直视角、曝光补偿、自动曝光、自动白平衡
  8. 放大缩放功能,焦距
  9. video size、视频预览大小、最大人脸检测数量
  10. 自动白平衡、白炽光、荧光灯、暖荧光灯、日光、阴天、晚上、阴影效果
  11. 颜色效果
  12. 闪光灯模式,关闭,自动,常开,手电筒模式、消除红眼
  13. 场景模式: 移动、消像、风景、夜晚、夜晚肖像、海滩、雪天、日落,抖动消除、烟火、运动,晚会、烛光、条形码、高清等
  14. 像素格式:yuv、rgb、jpeg、bayer-rggb、raw、yv12、nv12
@ frameworks/base/core/java/android/hardware/Camera.java
public class Camera {
    private static final String TAG = "Camera";
	/* Camera service settings.
     * @deprecated We recommend using the new {@link android.hardware.camera2} API for new applications.
     */
    @Deprecated
    public class Parameters {
        // Parameter keys to communicate with the camera driver.
        // 1. Preview 尺寸、格式、帧率、支持的fps范围
        private static final String KEY_PREVIEW_SIZE = "preview-size";
        private static final String KEY_PREVIEW_FORMAT = "preview-format";
        private static final String KEY_PREVIEW_FRAME_RATE = "preview-frame-rate";
        private static final String KEY_PREVIEW_FPS_RANGE = "preview-fps-range";
        // 2. Picture 尺寸、格式
        private static final String KEY_PICTURE_SIZE = "picture-size";
        private static final String KEY_PICTURE_FORMAT = "picture-format";
        // 3. Jpeg 缩略图的 尺寸、宽高、质量, Jpeg的能力
        private static final String KEY_JPEG_THUMBNAIL_SIZE = "jpeg-thumbnail-size";
        private static final String KEY_JPEG_THUMBNAIL_WIDTH = "jpeg-thumbnail-width";
        private static final String KEY_JPEG_THUMBNAIL_HEIGHT = "jpeg-thumbnail-height";
        private static final String KEY_JPEG_THUMBNAIL_QUALITY = "jpeg-thumbnail-quality";
        private static final String KEY_JPEG_QUALITY = "jpeg-quality";
        // 4. 旋转角度
        private static final String KEY_ROTATION = "rotation";
        // 5. GPS 经纬度、时间戳等信息
        private static final String KEY_GPS_LATITUDE = "gps-latitude";
        private static final String KEY_GPS_LONGITUDE = "gps-longitude";
        private static final String KEY_GPS_ALTITUDE = "gps-altitude";
        private static final String KEY_GPS_TIMESTAMP = "gps-timestamp";
        private static final String KEY_GPS_PROCESSING_METHOD = "gps-processing-method";
        // 6. 白平衡、效果、场景模式、闪光灯模式、对焦模式、对焦范围、对焦长度
        private static final String KEY_WHITE_BALANCE = "whitebalance";
        private static final String KEY_EFFECT = "effect";
        private static final String KEY_ANTIBANDING = "antibanding";
        private static final String KEY_SCENE_MODE = "scene-mode";
        private static final String KEY_FLASH_MODE = "flash-mode";
        private static final String KEY_FOCUS_MODE = "focus-mode";
        private static final String KEY_FOCUS_AREAS = "focus-areas";
        private static final String KEY_MAX_NUM_FOCUS_AREAS = "max-num-focus-areas";
        private static final String KEY_FOCAL_LENGTH = "focal-length";
        // 7. 水平视角、垂直视角、曝光补偿、自动曝光、自动白平衡
        private static final String KEY_HORIZONTAL_VIEW_ANGLE = "horizontal-view-angle";
        private static final String KEY_VERTICAL_VIEW_ANGLE = "vertical-view-angle";
        private static final String KEY_EXPOSURE_COMPENSATION = "exposure-compensation";
        private static final String KEY_MAX_EXPOSURE_COMPENSATION = "max-exposure-compensation";
        private static final String KEY_MIN_EXPOSURE_COMPENSATION = "min-exposure-compensation";
        private static final String KEY_EXPOSURE_COMPENSATION_STEP = "exposure-compensation-step";
        private static final String KEY_AUTO_EXPOSURE_LOCK = "auto-exposure-lock";
        private static final String KEY_AUTO_EXPOSURE_LOCK_SUPPORTED = "auto-exposure-lock-supported";
        private static final String KEY_AUTO_WHITEBALANCE_LOCK = "auto-whitebalance-lock";
        private static final String KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED = "auto-whitebalance-lock-supported";
        // 8. 放大缩放功能,焦距
        private static final String KEY_METERING_AREAS = "metering-areas";
        private static final String KEY_MAX_NUM_METERING_AREAS = "max-num-metering-areas";
        private static final String KEY_ZOOM = "zoom";
        private static final String KEY_MAX_ZOOM = "max-zoom";
        private static final String KEY_ZOOM_RATIOS = "zoom-ratios";
        private static final String KEY_ZOOM_SUPPORTED = "zoom-supported";
        private static final String KEY_SMOOTH_ZOOM_SUPPORTED = "smooth-zoom-supported";
        private static final String KEY_FOCUS_DISTANCES = "focus-distances";
        // 9. video size、视频预览大小、最大人脸检测数量、VIDEO 质量
        private static final String KEY_VIDEO_SIZE = "video-size";
        private static final String KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO = "preferred-preview-size-for-video";
        private static final String KEY_MAX_NUM_DETECTED_FACES_HW = "max-num-detected-faces-hw";
        private static final String KEY_MAX_NUM_DETECTED_FACES_SW = "max-num-detected-faces-sw";
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String KEY_RECORDING_HINT <span class="token operator">=</span> <span class="token string">"recording-hint"</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String KEY_VIDEO_SNAPSHOT_SUPPORTED <span class="token operator">=</span> <span class="token string">"video-snapshot-supported"</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String KEY_VIDEO_STABILIZATION <span class="token operator">=</span> <span class="token string">"video-stabilization"</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String KEY_VIDEO_STABILIZATION_SUPPORTED <span class="token operator">=</span> <span class="token string">"video-stabilization-supported"</span><span class="token punctuation">;</span>

    <span class="token comment">// Parameter key suffix for supported values.</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SUPPORTED_VALUES_SUFFIX <span class="token operator">=</span> <span class="token string">"-values"</span><span class="token punctuation">;</span>

    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String TRUE <span class="token operator">=</span> <span class="token string">"true"</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FALSE <span class="token operator">=</span> <span class="token string">"false"</span><span class="token punctuation">;</span>

	<span class="token comment">// 10. 自动白平衡、白炽光、荧光灯、暖荧光灯、日光、阴天、晚上、阴影效果</span>
    <span class="token comment">// Values for white balance settings.</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String WHITE_BALANCE_AUTO <span class="token operator">=</span> <span class="token string">"auto"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String WHITE_BALANCE_INCANDESCENT <span class="token operator">=</span> <span class="token string">"incandescent"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String WHITE_BALANCE_FLUORESCENT <span class="token operator">=</span> <span class="token string">"fluorescent"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String WHITE_BALANCE_WARM_FLUORESCENT <span class="token operator">=</span> <span class="token string">"warm-fluorescent"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String WHITE_BALANCE_DAYLIGHT <span class="token operator">=</span> <span class="token string">"daylight"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String WHITE_BALANCE_CLOUDY_DAYLIGHT <span class="token operator">=</span> <span class="token string">"cloudy-daylight"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String WHITE_BALANCE_TWILIGHT <span class="token operator">=</span> <span class="token string">"twilight"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String WHITE_BALANCE_SHADE <span class="token operator">=</span> <span class="token string">"shade"</span><span class="token punctuation">;</span>
    <span class="token comment">/** @hide
     * wb manual cct mode.
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String WHITE_BALANCE_MANUAL_CCT <span class="token operator">=</span> <span class="token string">"manual-cct"</span><span class="token punctuation">;</span>

	<span class="token comment">// 11. 颜色效果</span>
    <span class="token comment">// Values for color effect settings.</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String EFFECT_NONE <span class="token operator">=</span> <span class="token string">"none"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String EFFECT_MONO <span class="token operator">=</span> <span class="token string">"mono"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String EFFECT_NEGATIVE <span class="token operator">=</span> <span class="token string">"negative"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String EFFECT_SOLARIZE <span class="token operator">=</span> <span class="token string">"solarize"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String EFFECT_SEPIA <span class="token operator">=</span> <span class="token string">"sepia"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String EFFECT_POSTERIZE <span class="token operator">=</span> <span class="token string">"posterize"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String EFFECT_WHITEBOARD <span class="token operator">=</span> <span class="token string">"whiteboard"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String EFFECT_BLACKBOARD <span class="token operator">=</span> <span class="token string">"blackboard"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String EFFECT_AQUA <span class="token operator">=</span> <span class="token string">"aqua"</span><span class="token punctuation">;</span>

    <span class="token comment">// Values for antibanding settings.</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String ANTIBANDING_AUTO <span class="token operator">=</span> <span class="token string">"auto"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String ANTIBANDING_50HZ <span class="token operator">=</span> <span class="token string">"50hz"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String ANTIBANDING_60HZ <span class="token operator">=</span> <span class="token string">"60hz"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String ANTIBANDING_OFF <span class="token operator">=</span> <span class="token string">"off"</span><span class="token punctuation">;</span>

	<span class="token comment">// 12、闪光灯模式,关闭,自动,常开,手电筒模式、消除红眼</span>
    <span class="token comment">// Values for flash mode settings.</span>
    <span class="token comment">/** Flash will not be fired. */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FLASH_MODE_OFF <span class="token operator">=</span> <span class="token string">"off"</span><span class="token punctuation">;</span>
    <span class="token comment">/** * Flash will be fired automatically when required. The flash may be fired
     * during preview, auto-focus, or snapshot depending on the driver. */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FLASH_MODE_AUTO <span class="token operator">=</span> <span class="token string">"auto"</span><span class="token punctuation">;</span>
    <span class="token comment">/** * Flash will always be fired during snapshot. The flash may also be
     * fired during preview or auto-focus depending on the driver. */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FLASH_MODE_ON <span class="token operator">=</span> <span class="token string">"on"</span><span class="token punctuation">;</span>
    <span class="token comment">/** Flash will be fired in red-eye reduction mode.  */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FLASH_MODE_RED_EYE <span class="token operator">=</span> <span class="token string">"red-eye"</span><span class="token punctuation">;</span>
    <span class="token comment">/** Constant emission of light during preview, auto-focus and snapshot.
     * This can also be used for video recording.*/</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FLASH_MODE_TORCH <span class="token operator">=</span> <span class="token string">"torch"</span><span class="token punctuation">;</span>

	<span class="token comment">// 13、场景模式: 移动、消像、风景、夜晚、夜晚肖像、海滩、雪天、日落,抖动消除、烟火、运动,晚会、烛光、条形码、高清等 </span>
    <span class="token comment">/** @hide * Scene mode is off.*/</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_ASD <span class="token operator">=</span> <span class="token string">"asd"</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_AUTO <span class="token operator">=</span> <span class="token string">"auto"</span><span class="token punctuation">;</span>
    <span class="token comment">/** * Take photos of fast moving objects. Same as {@link #SCENE_MODE_SPORTS}.*/</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_ACTION <span class="token operator">=</span> <span class="token string">"action"</span><span class="token punctuation">;</span>
    <span class="token comment">/*** Take people pictures. */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_PORTRAIT <span class="token operator">=</span> <span class="token string">"portrait"</span><span class="token punctuation">;</span>
    <span class="token comment">/*** Take pictures on distant objects. */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_LANDSCAPE <span class="token operator">=</span> <span class="token string">"landscape"</span><span class="token punctuation">;</span>
    <span class="token comment">/** * Take photos at night. */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_NIGHT <span class="token operator">=</span> <span class="token string">"night"</span><span class="token punctuation">;</span>
    <span class="token comment">/*** Take people pictures at night.*/</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_NIGHT_PORTRAIT <span class="token operator">=</span> <span class="token string">"night-portrait"</span><span class="token punctuation">;</span>
    <span class="token comment">/*** Take photos in a theater. Flash light is off.*/</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_THEATRE <span class="token operator">=</span> <span class="token string">"theatre"</span><span class="token punctuation">;</span>
    <span class="token comment">/*** Take pictures on the beach.*/</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_BEACH <span class="token operator">=</span> <span class="token string">"beach"</span><span class="token punctuation">;</span>
    <span class="token comment">/*** Take pictures on the snow. */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_SNOW <span class="token operator">=</span> <span class="token string">"snow"</span><span class="token punctuation">;</span>
    <span class="token comment">/*** Take sunset photos.*/</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_SUNSET <span class="token operator">=</span> <span class="token string">"sunset"</span><span class="token punctuation">;</span>
    <span class="token comment">/** * Avoid blurry pictures (for example, due to hand shake).*/</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_STEADYPHOTO <span class="token operator">=</span> <span class="token string">"steadyphoto"</span><span class="token punctuation">;</span>
    <span class="token comment">/** * For shooting firework displays.*/</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_FIREWORKS <span class="token operator">=</span> <span class="token string">"fireworks"</span><span class="token punctuation">;</span>
    <span class="token comment">/*** Take photos of fast moving objects. Same as {@link #SCENE_MODE_ACTION}.*/</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_SPORTS <span class="token operator">=</span> <span class="token string">"sports"</span><span class="token punctuation">;</span>
    <span class="token comment">/*** Take indoor low-light shot. */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_PARTY <span class="token operator">=</span> <span class="token string">"party"</span><span class="token punctuation">;</span>
    <span class="token comment">/*** Capture the naturally warm color of scenes lit by candles.*/</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_CANDLELIGHT <span class="token operator">=</span> <span class="token string">"candlelight"</span><span class="token punctuation">;</span>
    <span class="token comment">/** @hide* SCENE_MODE_BACKLIGHT**/</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_BACKLIGHT <span class="token operator">=</span> <span class="token string">"backlight"</span><span class="token punctuation">;</span>
    <span class="token comment">/** @hide* SCENE_MODE_FLOWERS**/</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_FLOWERS <span class="token operator">=</span> <span class="token string">"flowers"</span><span class="token punctuation">;</span>
    <span class="token comment">/**
     * Applications are looking for a barcode. Camera driver will be
     * optimized for barcode reading.
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_BARCODE <span class="token operator">=</span> <span class="token string">"barcode"</span><span class="token punctuation">;</span>
    <span class="token comment">/**
     * Capture a scene using high dynamic range imaging techniques. The
     * camera will return an image that has an extended dynamic range
     * compared to a regular capture. Capturing such an image may take
     * longer than a regular capture.
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String SCENE_MODE_HDR <span class="token operator">=</span> <span class="token string">"hdr"</span><span class="token punctuation">;</span>
    <span class="token comment">/**
     * Auto-focus mode. Applications should call {@link
     * #autoFocus(AutoFocusCallback)} to start the focus in this mode.
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FOCUS_MODE_AUTO <span class="token operator">=</span> <span class="token string">"auto"</span><span class="token punctuation">;</span>
    <span class="token comment">/**
     * Focus is set at infinity. Applications should not call
     * {@link #autoFocus(AutoFocusCallback)} in this mode.
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FOCUS_MODE_INFINITY <span class="token operator">=</span> <span class="token string">"infinity"</span><span class="token punctuation">;</span>
    <span class="token comment">/**
     * Macro (close-up) focus mode. Applications should call
     * {@link #autoFocus(AutoFocusCallback)} to start the focus in this
     * mode.
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FOCUS_MODE_MACRO <span class="token operator">=</span> <span class="token string">"macro"</span><span class="token punctuation">;</span>
    <span class="token comment">/**
     * Focus is fixed. The camera is always in this mode if the focus is not
     * adjustable. If the camera has auto-focus, this mode can fix the
     * focus, which is usually at hyperfocal distance. Applications should
     * not call {@link #autoFocus(AutoFocusCallback)} in this mode.
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FOCUS_MODE_FIXED <span class="token operator">=</span> <span class="token string">"fixed"</span><span class="token punctuation">;</span>
    <span class="token comment">/** @hide
     * Normal focus mode. Applications should call
     * {@link #autoFocus(AutoFocusCallback)} to start the focus in this
     * mode.
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FOCUS_MODE_NORMAL <span class="token operator">=</span> <span class="token string">"normal"</span><span class="token punctuation">;</span>
    <span class="token comment">/**
     * Extended depth of field (EDOF). Focusing is done digitally and
     * continuously. Applications should not call {@link
     * #autoFocus(AutoFocusCallback)} in this mode.
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FOCUS_MODE_EDOF <span class="token operator">=</span> <span class="token string">"edof"</span><span class="token punctuation">;</span>
    <span class="token comment">/**
     * Continuous auto focus mode intended for video recording. The camera
     * continuously tries to focus. This is the best choice for video
     * recording because the focus changes smoothly . Applications still can
     * call {@link #takePicture(Camera.ShutterCallback,
     * Camera.PictureCallback, Camera.PictureCallback)} in this mode but the
     * subject may not be in focus. Auto focus starts when the parameter is
     * set.
     *
     * &lt;p&gt;Since API level 14, applications can call {@link
     * #autoFocus(AutoFocusCallback)} in this mode. The focus callback will
     * immediately return with a boolean that indicates whether the focus is
     * sharp or not. The focus position is locked after autoFocus call. If
     * applications want to resume the continuous focus, cancelAutoFocus
     * must be called. Restarting the preview will not resume the continuous
     * autofocus. To stop continuous focus, applications should change the
     * focus mode to other modes.
     *
     * @see #FOCUS_MODE_CONTINUOUS_PICTURE
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FOCUS_MODE_CONTINUOUS_VIDEO <span class="token operator">=</span> <span class="token string">"continuous-video"</span><span class="token punctuation">;</span>
    <span class="token comment">/**
     * Continuous auto focus mode intended for taking pictures. The camera
     * continuously tries to focus. The speed of focus change is more
     * aggressive than {@link #FOCUS_MODE_CONTINUOUS_VIDEO}. Auto focus
     * starts when the parameter is set.
     *
     * &lt;p&gt;Applications can call {@link #autoFocus(AutoFocusCallback)} in
     * this mode. If the autofocus is in the middle of scanning, the focus
     * callback will return when it completes. If the autofocus is not
     * scanning, the focus callback will immediately return with a boolean
     * that indicates whether the focus is sharp or not. The apps can then
     * decide if they want to take a picture immediately or to change the
     * focus mode to auto, and run a full autofocus cycle. The focus
     * position is locked after autoFocus call. If applications want to
     * resume the continuous focus, cancelAutoFocus must be called.
     * Restarting the preview will not resume the continuous autofocus. To
     * stop continuous focus, applications should change the focus mode to
     * other modes.
     *
     * @see #FOCUS_MODE_CONTINUOUS_VIDEO
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FOCUS_MODE_CONTINUOUS_PICTURE <span class="token operator">=</span> <span class="token string">"continuous-picture"</span><span class="token punctuation">;</span>
    <span class="token comment">/** @hide
     *  manual focus mode
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String FOCUS_MODE_MANUAL_POSITION <span class="token operator">=</span> <span class="token string">"manual"</span><span class="token punctuation">;</span>
    <span class="token comment">// Indices for focus distance array.</span>
    <span class="token comment">/**
     * The array index of near focus distance for use with
     * {@link #getFocusDistances(float[])}.
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> FOCUS_DISTANCE_NEAR_INDEX <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token comment">/**
     * The array index of optimal focus distance for use with
     * {@link #getFocusDistances(float[])}.
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> FOCUS_DISTANCE_OPTIMAL_INDEX <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
    <span class="token comment">/**
     * The array index of far focus distance for use with
     * {@link #getFocusDistances(float[])}.
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> FOCUS_DISTANCE_FAR_INDEX <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
    <span class="token comment">/**
     * The array index of minimum preview fps for use with {@link
     * #getPreviewFpsRange(int[])} or {@link
     * #getSupportedPreviewFpsRange()}.
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> PREVIEW_FPS_MIN_INDEX <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token comment">/**
     * The array index of maximum preview fps for use with {@link
     * #getPreviewFpsRange(int[])} or {@link
     * #getSupportedPreviewFpsRange()}.
     */</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> PREVIEW_FPS_MAX_INDEX <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>

	<span class="token comment">// 14、像素格式:yuv、rgb、jpeg、bayer-rggb、raw、yv12、nv12</span>
    <span class="token comment">// Formats for setPreviewFormat and setPictureFormat.</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String PIXEL_FORMAT_YUV422SP <span class="token operator">=</span> <span class="token string">"yuv422sp"</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String PIXEL_FORMAT_YUV420SP <span class="token operator">=</span> <span class="token string">"yuv420sp"</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String PIXEL_FORMAT_YUV420SP_ADRENO <span class="token operator">=</span> <span class="token string">"yuv420sp-adreno"</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String PIXEL_FORMAT_YUV422I <span class="token operator">=</span> <span class="token string">"yuv422i-yuyv"</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String PIXEL_FORMAT_YUV420P <span class="token operator">=</span> <span class="token string">"yuv420p"</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String PIXEL_FORMAT_RGB565 <span class="token operator">=</span> <span class="token string">"rgb565"</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String PIXEL_FORMAT_JPEG <span class="token operator">=</span> <span class="token string">"jpeg"</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String PIXEL_FORMAT_BAYER_RGGB <span class="token operator">=</span> <span class="token string">"bayer-rggb"</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String PIXEL_FORMAT_RAW <span class="token operator">=</span> <span class="token string">"raw"</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String PIXEL_FORMAT_YV12 <span class="token operator">=</span> <span class="token string">"yv12"</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String PIXEL_FORMAT_NV12 <span class="token operator">=</span> <span class="token string">"nv12"</span><span class="token punctuation">;</span>

 <span class="token keyword">private</span> <span class="token keyword">final</span> LinkedHashMap<span class="token generics function"><span class="token punctuation">&lt;</span>String<span class="token punctuation">,</span> String<span class="token punctuation">&gt;</span></span> mMap<span class="token punctuation">;</span>
	<span class="token comment">// 1.初始化 camera 参数的hash map</span>
    <span class="token keyword">private</span> <span class="token function">Parameters</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        mMap <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">LinkedHashMap</span><span class="token generics function"><span class="token punctuation">&lt;</span>String<span class="token punctuation">,</span> String<span class="token punctuation">&gt;</span></span><span class="token punctuation">(</span><span class="token comment">/*initialCapacity*/</span><span class="token number">64</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
	<span class="token comment">// 2. 将所所参数 dump到 log中</span>
	<span class="token annotation punctuation">@Deprecated</span>
    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">dump</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        Log<span class="token punctuation">.</span><span class="token function">e</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> <span class="token string">"dump: size="</span> <span class="token operator">+</span> mMap<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">for</span> <span class="token punctuation">(</span>String k <span class="token operator">:</span> mMap<span class="token punctuation">.</span><span class="token function">keySet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            Log<span class="token punctuation">.</span><span class="token function">e</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> <span class="token string">"dump: "</span> <span class="token operator">+</span> k <span class="token operator">+</span> <span class="token string">"="</span> <span class="token operator">+</span> mMap<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>k<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
	<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">set</span><span class="token punctuation">(</span>String key<span class="token punctuation">,</span> String value<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>key<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">'='</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token operator">||</span> key<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">';'</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token operator">||</span> key<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            Log<span class="token punctuation">.</span><span class="token function">e</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> <span class="token string">"Key \""</span> <span class="token operator">+</span> key <span class="token operator">+</span> <span class="token string">"\" contains invalid character (= or ; or \\0)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">return</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>value<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">'='</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token operator">||</span> value<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">';'</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token operator">||</span> value<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            Log<span class="token punctuation">.</span><span class="token function">e</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> <span class="token string">"Value \""</span> <span class="token operator">+</span> value <span class="token operator">+</span> <span class="token string">"\" contains invalid character (= or ; or \\0)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">return</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token function">put</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// 3. 设置 preview size</span>
	<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setPreviewSize</span><span class="token punctuation">(</span><span class="token keyword">int</span> width<span class="token punctuation">,</span> <span class="token keyword">int</span> height<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        String v <span class="token operator">=</span> Integer<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span>width<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"x"</span> <span class="token operator">+</span> Integer<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span>height<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">set</span><span class="token punctuation">(</span>KEY_PREVIEW_SIZE<span class="token punctuation">,</span> v<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// 4. 获取 preview size</span>
    <span class="token keyword">public</span> Size <span class="token function">getPreviewSize</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        String pair <span class="token operator">=</span> <span class="token function">get</span><span class="token punctuation">(</span>KEY_PREVIEW_SIZE<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> <span class="token function">strToSize</span><span class="token punctuation">(</span>pair<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// 5. 设置缩略图大小</span>
    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setJpegThumbnailSize</span><span class="token punctuation">(</span><span class="token keyword">int</span> width<span class="token punctuation">,</span> <span class="token keyword">int</span> height<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token function">set</span><span class="token punctuation">(</span>KEY_JPEG_THUMBNAIL_WIDTH<span class="token punctuation">,</span> width<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">set</span><span class="token punctuation">(</span>KEY_JPEG_THUMBNAIL_HEIGHT<span class="token punctuation">,</span> height<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341

此外,高通自已也新增了一些 key

@ frameworks/base/core/java/android/hardware/Camera.java
/* ### QC ADDED PARAMETER KEYS*/
        private static final String KEY_QC_HFR_SIZE = "hfr-size";
        private static final String KEY_QC_PREVIEW_FRAME_RATE_MODE = "preview-frame-rate-mode";
        private static final String KEY_QC_PREVIEW_FRAME_RATE_AUTO_MODE = "frame-rate-auto";
        private static final String KEY_QC_PREVIEW_FRAME_RATE_FIXED_MODE = "frame-rate-fixed";
        private static final String KEY_QC_GPS_LATITUDE_REF = "gps-latitude-ref";
        private static final String KEY_QC_GPS_LONGITUDE_REF = "gps-longitude-ref";
        private static final String KEY_QC_GPS_ALTITUDE_REF = "gps-altitude-ref";
        private static final String KEY_QC_GPS_STATUS = "gps-status";
        private static final String KEY_QC_EXIF_DATETIME = "exif-datetime";
        private static final String KEY_QC_TOUCH_AF_AEC = "touch-af-aec";
        private static final String KEY_QC_TOUCH_INDEX_AEC = "touch-index-aec";
        private static final String KEY_QC_TOUCH_INDEX_AF = "touch-index-af";
        private static final String KEY_QC_MANUAL_FOCUS_POSITION = "manual-focus-position";
        private static final String KEY_QC_MANUAL_FOCUS_POS_TYPE = "manual-focus-pos-type";
        private static final String KEY_QC_SCENE_DETECT = "scene-detect";
        private static final String KEY_QC_ISO_MODE = "iso";
        private static final String KEY_QC_EXPOSURE_TIME = "exposure-time";
        private static final String KEY_QC_MIN_EXPOSURE_TIME = "min-exposure-time";
        private static final String KEY_QC_MAX_EXPOSURE_TIME = "max-exposure-time";
        private static final String KEY_QC_LENSSHADE = "lensshade";
        private static final String KEY_QC_HISTOGRAM = "histogram";
        private static final String KEY_QC_SKIN_TONE_ENHANCEMENT = "skinToneEnhancement";
        private static final String KEY_QC_AUTO_EXPOSURE = "auto-exposure";
        private static final String KEY_QC_SHARPNESS = "sharpness";
        private static final String KEY_QC_MAX_SHARPNESS = "max-sharpness";
        private static final String KEY_QC_CONTRAST = "contrast";
        private static final String KEY_QC_MAX_CONTRAST = "max-contrast";
        private static final String KEY_QC_SATURATION = "saturation";
        private static final String KEY_QC_MAX_SATURATION = "max-saturation";
        private static final String KEY_QC_DENOISE = "denoise";
        private static final String KEY_QC_CONTINUOUS_AF = "continuous-af";
        private static final String KEY_QC_SELECTABLE_ZONE_AF = "selectable-zone-af";
        private static final String KEY_QC_FACE_DETECTION = "face-detection";
        private static final String KEY_QC_MEMORY_COLOR_ENHANCEMENT = "mce";
        private static final String KEY_QC_REDEYE_REDUCTION = "redeye-reduction";
        private static final String KEY_QC_ZSL = "zsl";
        private static final String KEY_QC_CAMERA_MODE = "camera-mode";
        private static final String KEY_QC_VIDEO_HIGH_FRAME_RATE = "video-hfr";
        private static final String KEY_QC_VIDEO_HDR = "video-hdr";
        private static final String KEY_QC_POWER_MODE = "power-mode";
        private static final String KEY_QC_POWER_MODE_SUPPORTED = "power-mode-supported";
        private static final String KEY_QC_WB_MANUAL_CCT = "wb-manual-cct";
        private static final String KEY_QC_MIN_WB_CCT = "min-wb-cct";
        private static final String KEY_QC_MAX_WB_CCT = "max-wb-cct";
        private static final String KEY_QC_AUTO_HDR_ENABLE = "auto-hdr-enable";
        private static final String KEY_QC_VIDEO_ROTATION = "video-rotation";
	<span class="token keyword">public</span> String <span class="token function">getSceneDetectMode</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token function">get</span><span class="token punctuation">(</span>KEY_QC_SCENE_DETECT<span class="token punctuation">)</span><span class="token punctuation">;</span>
     <span class="token punctuation">}</span>
    <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

2.2 [Java] 层 setParameters 和 getParameters

  1. getParameters 中,主要是new Parameters() 对象 用来保存 native_getParameters() 返回的参数。
  2. setParameters 中,如果正在预览,是不能动态修改preview size 的,所以在设置参数前会先检测preview size是否一致,接着调用 native_setParameters().
  3. params.flatten()params.unflatten()分别是将所有Camera 参数以; 的格式区分保存String中,以及,从String 解析所有参数。
    private native final void native_setParameters(String params);
    private native final String native_getParameters();
<span class="token comment">/**
 * Changes the settings for this Camera service.
 *
 * @param params the Parameters to use for this Camera service
 * @throws RuntimeException if any parameter is invalid or not supported.
 * @see #getParameters()
 */</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setParameters</span><span class="token punctuation">(</span>Parameters params<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token comment">// If using preview allocations, don't allow preview size changes</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>mUsingPreviewAllocation<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        Size newPreviewSize <span class="token operator">=</span> params<span class="token punctuation">.</span><span class="token function">getPreviewSize</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        Size currentPreviewSize <span class="token operator">=</span> <span class="token function">getParameters</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getPreviewSize</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>newPreviewSize<span class="token punctuation">.</span>width <span class="token operator">!=</span> currentPreviewSize<span class="token punctuation">.</span>width <span class="token operator">||</span> newPreviewSize<span class="token punctuation">.</span>height <span class="token operator">!=</span> currentPreviewSize<span class="token punctuation">.</span>height<span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">IllegalStateException</span><span class="token punctuation">(</span><span class="token string">"Cannot change preview size"</span> <span class="token operator">+</span><span class="token string">" while a preview allocation is configured."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
    <span class="token function">native_setParameters</span><span class="token punctuation">(</span>params<span class="token punctuation">.</span><span class="token function">flatten</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/**
 * Returns the current settings for this Camera service.
 * If modifications are made to the returned Parameters, they must be passed
 * to {@link #setParameters(Camera.Parameters)} to take effect.
 *
 * @see #setParameters(Camera.Parameters)
 */</span>
<span class="token keyword">public</span> Parameters <span class="token function">getParameters</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    Parameters p <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Parameters</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    String s <span class="token operator">=</span> <span class="token function">native_getParameters</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    p<span class="token punctuation">.</span><span class="token function">unflatten</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> p<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

2.3 [JNI] 层 native_setParameters 和 native_getParameters

native 层代码位于

@ frameworks/base/core/jni/android_hardware_Camera.cpp

static const JNINativeMethod camMethods[] = {
{ “native_setParameters”, “(Ljava/lang/String;)V”, (void )android_hardware_Camera_setParameters },
{ “native_getParameters”, “()Ljava/lang/String;”, (void )android_hardware_Camera_getParameters },
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

可知,对应的函数分别为: android_hardware_Camera_setParameters()android_hardware_Camera_getParameters()

android_hardware_Camera_setParameters() 中:

  1. 获取 native 层 Camera 对象, 对应代码为 frameworks/av/camera/Camera.cpp
  2. 将JAVA 层 String 对象,保存在 jchar * str 中
  3. 调用camera->setParameters()

android_hardware_Camera_getParameters 中,主要是调用 camera->getParameters()

static void android_hardware_Camera_setParameters(JNIEnv *env, jobject thiz, jstring params)
{
    ALOGV("setParameters");
    // 1. 获取 native 层 Camera 对象, 对应代码为 frameworks/av/camera/Camera.cpp
    sp<Camera> camera = get_native_camera(env, thiz, NULL);
<span class="token comment">// 2. 将JAVA 层 String 对象,保存在 jchar * str 中</span>
<span class="token keyword">const</span> jchar<span class="token operator">*</span> str <span class="token operator">=</span> env<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">GetStringCritical</span><span class="token punctuation">(</span>params<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
String8 params8<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>params<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    params8 <span class="token operator">=</span> <span class="token function">String8</span><span class="token punctuation">(</span><span class="token keyword">reinterpret_cast</span><span class="token operator">&lt;</span><span class="token keyword">const</span> <span class="token keyword">char16_t</span><span class="token operator">*</span><span class="token operator">&gt;</span><span class="token punctuation">(</span>str<span class="token punctuation">)</span><span class="token punctuation">,</span> env<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">GetStringLength</span><span class="token punctuation">(</span>params<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    env<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">ReleaseStringCritical</span><span class="token punctuation">(</span>params<span class="token punctuation">,</span> str<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 3. 调用camera-&gt;setParameters()</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>camera<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">setParameters</span><span class="token punctuation">(</span>params8<span class="token punctuation">)</span> <span class="token operator">!=</span> NO_ERROR<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">jniThrowRuntimeException</span><span class="token punctuation">(</span>env<span class="token punctuation">,</span> <span class="token string">"setParameters failed"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

static jstring android_hardware_Camera_getParameters(JNIEnv *env, jobject thiz)
{
ALOGV(“getParameters”);
sp<Camera> camera = get_native_camera(env, thiz, NULL);
if (camera == 0) return 0;

String8 params8 <span class="token operator">=</span> camera<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">getParameters</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>params8<span class="token punctuation">.</span><span class="token function">isEmpty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">jniThrowRuntimeException</span><span class="token punctuation">(</span>env<span class="token punctuation">,</span> <span class="token string">"getParameters failed (empty parameters)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> env<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">NewStringUTF</span><span class="token punctuation">(</span>params8<span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

2.4 [Native] 层 camera->getParameters() 和 camera->setParameters()

此处的 mCamera 是 Camera Client 对象,
sp <::android::hardware::ICamera> c = mCamera 则是将 Camera Client 对象强制转换为 ICamera 对象,
然后,调用 ICamera 对象中的 setParameters().

frameworks/av/camera/Camera.cpp
// set preview/capture parameters - key/value pairs
status_t Camera::setParameters(const String8& params)
{
    ALOGV("setParameters");
    sp <::android::hardware::ICamera> c = mCamera;
    return c->setParameters(params);
}

// get preview/capture parameters - key/value pairs
String8 Camera::getParameters() const
{
ALOGV(“getParameters”);
String8 params;
sp <::android::hardware::ICamera> c = mCamera;
params = mCamera->getParameters();
return params;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2.5 [Native] 寻找 ICamera 的子类,调用子类的setParameters()方法

ICamera 类是个接口类,没有任何实现,其定义在 frameworks/av/include/camera/android/hardware/ICamera.h
因为 ICamera 中的 setParametersgetParameters 都是虚函数,
所以,
我们要去找ICamera的子类,这些方法是在它们的子类中实现的

2.5.1 class ICamera 被 ------> class BnCamera 继承

namespace hardware {
class ICameraClient;

// ICamera 继承自 IInterface
class ICamera: public IInterface
{
public:
// set preview/capture parameters - key/value pairs
virtual status_t setParameters(const String8& params) = 0;
// get preview/capture parameters - key/value pairs
virtual String8 getParameters() const = 0;
}

// BnCamera 继承自 BnInterface ,也就是继承于 ICamera
class BnCamera: public BnInterface<ICamera>
{
public:
virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0);
};

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

我们来看下 IInterfaceBnInterface 各自的定义:

@frameworks/native/include/binder/IInterface.h

class IInterface : public virtual RefBase
{
public:
IInterface();
static sp<IBinder> asBinder(const IInterface*);
static sp<IBinder> asBinder(const sp<IInterface>&);

protected:
virtual ~IInterface();
virtual IBinder* onAsBinder() = 0;
};

template<typename INTERFACE>
class BnInterface : public INTERFACE, public BBinder
{
public:
virtual sp<IInterface> queryLocalInterface(const String16& _descriptor);
virtual const String16& getInterfaceDescriptor() const;

protected:
virtual IBinder* onAsBinder();
};

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

在前面代码中:class BnCamera: public BnInterface<ICamera> 相当于是 class BnCamera: public ICamera
也就是说 BnCamera 继承自 ICamera


2.5.2 class BnCamera 被 ------> class CameraService::Client 继承

我们再来看看 谁承继了 BnCamera

frameworks/av/services/camera/libcameraservice/CameraService.h 中看到
class CameraService 的内部类 class Client 继承自 BnCamera

class CameraService :
    public BinderService<CameraService>,
    public ::android::hardware::BnCameraService,
    public IBinder::DeathRecipient,
    public camera_module_callbacks_t
{
    friend class BinderService<CameraService>;
public:
    class Client;
    class BasicClient;
<span class="token keyword">class</span> <span class="token class-name">Client</span> <span class="token operator">:</span> <span class="token keyword">public</span> hardware<span class="token operator">::</span>BnCamera<span class="token punctuation">,</span> <span class="token keyword">public</span> BasicClient
<span class="token punctuation">{</span>
<span class="token keyword">public</span><span class="token operator">:</span>
    <span class="token keyword">typedef</span> hardware<span class="token operator">::</span>ICameraClient TCamCallbacks<span class="token punctuation">;</span>
    <span class="token comment">// ICamera interface (see ICamera for details)</span>
    <span class="token keyword">virtual</span> status_t      <span class="token function">connect</span><span class="token punctuation">(</span><span class="token keyword">const</span> sp<span class="token operator">&lt;</span>hardware<span class="token operator">::</span>ICameraClient<span class="token operator">&gt;</span><span class="token operator">&amp;</span> client<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token keyword">virtual</span> status_t      <span class="token function">startPreview</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token keyword">virtual</span> <span class="token keyword">void</span>          <span class="token function">stopPreview</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token keyword">virtual</span> status_t      <span class="token function">setParameters</span><span class="token punctuation">(</span><span class="token keyword">const</span> String8<span class="token operator">&amp;</span> params<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token keyword">virtual</span> String8       <span class="token function">getParameters</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

2.5.3 class CameraService::Client 被 ------> class Camera2Client 继承

再来看下class CameraService 的内部类 class Client 被谁继承。

找下代码,发现如下:
但实际上,这个是 API1 的代码,我们现在 Camera 走的是 API2,所以CameraClient 这个继承关系是走不到的。

@ frameworks/av/services/camera/libcameraservice/api1/CameraClient.h
class CameraClient : public CameraService::Client
{
public:
    // ICamera interface (see ICamera for details)
    virtual status_t        connect(const sp<hardware::ICameraClient>& client);
    virtual status_t        startPreview();
    virtual void            stopPreview();
    virtual status_t        setParameters(const String8& params);
    virtual String8         getParameters() const;
    virtual status_t        sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
    virtual status_t        setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer);
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

frameworks/av/services/camera/libcameraservice/Android.mk 中可以看出,CameraClient.cpp 不会编译进来。


继续找代码,在 Camera2Client 中,frameworks/av/services/camera/libcameraservice/api1/Camera2Client.h 看到,
class Camera2Client 继承自 CameraService::Client

class Camera2Client :
        public Camera2ClientBase<CameraService::Client>
{
public:
    virtual status_t        connect(const sp<hardware::ICameraClient>& client);
    virtual status_t        startPreview();
    virtual void            stopPreview();
    virtual status_t        setParameters(const String8& params);
    virtual String8         getParameters() const;

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.5.4 Camera2Client::setParameters( ) 具体实现

最终,setParameters() 函数经过 class ICamera ---> class BnCamera ---> class CameraService::Client ---> class Camera2Client 这一系列继承。

最终实现在 frameworks/av/services/camera/libcameraservice/api1/Camera2Client.cpp 中。

@ frameworks/av/services/camera/libcameraservice/api1/Camera2Client.cpp

status_t Camera2Client::setParameters(const String8& params) {
ALOGV("%s: Camera %d", FUNCTION, mCameraId);

Parameters<span class="token operator">::</span>focusMode_t focusModeBefore <span class="token operator">=</span> l<span class="token punctuation">.</span>mParameters<span class="token punctuation">.</span>focusMode<span class="token punctuation">;</span>
res <span class="token operator">=</span> l<span class="token punctuation">.</span>mParameters<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>params<span class="token punctuation">)</span><span class="token punctuation">;</span>

Parameters<span class="token operator">::</span>focusMode_t focusModeAfter <span class="token operator">=</span> l<span class="token punctuation">.</span>mParameters<span class="token punctuation">.</span>focusMode<span class="token punctuation">;</span>

<span class="token keyword">if</span> <span class="token punctuation">(</span>l<span class="token punctuation">.</span>mParameters<span class="token punctuation">.</span>allowZslMode <span class="token operator">&amp;&amp;</span> focusModeAfter <span class="token operator">!=</span> focusModeBefore<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    mZslProcessor<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">clearZslQueue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
res <span class="token operator">=</span> <span class="token function">updateRequests</span><span class="token punctuation">(</span>l<span class="token punctuation">.</span>mParameters<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> res<span class="token punctuation">;</span>

}

String8 Camera2Client::getParameters() const {
ATRACE_CALL();
ALOGV("%s: Camera %d", FUNCTION, mCameraId);
Mutex::Autolock icl(mBinderSerializationLock);
// The camera service can unconditionally get the parameters at all times
if (getCallingPid() != mServicePid && checkPid(FUNCTION) != OK) return String8();

SharedParameters<span class="token operator">::</span>ReadLock <span class="token function">l</span><span class="token punctuation">(</span>mParameters<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">return</span> l<span class="token punctuation">.</span>mParameters<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

2.5.4.1 Parameters mParameters

我们来看下 l.mParameters 实际上是 Class SharedParameters 对象的私有变量 Parameters mParameters;
定义如下

@ frameworks/av/services/camera/libcameraservice/api1/Camera2Client.h
// Current camera device configuration
    camera2::SharedParameters mParameters;

struct Parameters {
// Validate and update camera parameters based on new settings
status_t set(const String8 &paramString);

<span class="token comment">// Retrieve the current settings</span>
String8 <span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>

};

class SharedParameters {
private:
Parameters mParameters;
mutable Mutex mLock;
};

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

因此,l.mParameters.set(params)l.mParameters.get() 分别对应着前面的
Camera2Client::setParameters()Camera2Client::getParameters()

2.5.4.2 获取参数Parameters::get()

l.mParameters.get() 具体实现如下:

@ frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.cpp

String8 Parameters::get() const {
return paramsFlattened;
}

  • 1
  • 2
  • 3
  • 4
  • 5

代码中,直接返回 paramsFlattened,分别是在 Parameters::initialize() 和 Parameters::set() 时更新的。


2.5.4.3 更新参数Parameters::set()
  1. 根据上层传递下来的 Parameters 字符串,生成 CameraParameters2 对象
  2. 解析上层设置的参数,且检查参数的正确性
  3. 参数更新和检测成功后,重新生成字符串,更新在 paramsFlattened 中,及保存在 params 对象中。
@ frameworks/av/services/came ra/libcameraservice/api1/client2/Parameters.cpp

status_t Parameters::set(const String8& paramString) {
// 1. 根据上层传递下来的 Parameters 字符串,生成 CameraParameters2 对象
CameraParameters2 newParams(paramString);
=>
+ @ frameworks/av/include/camera/CameraParameters2.h
+ class CameraParameters2
+ {
+ public:
+ CameraParameters2(const String8 &params) { unflatten(params); }
<=

<span class="token comment">// 2. 解析上层设置的参数,且检查参数的正确性</span>
validatedParams<span class="token punctuation">.</span>jpegRotation <span class="token operator">=</span> newParams<span class="token punctuation">.</span><span class="token function">getInt</span><span class="token punctuation">(</span>CameraParameters<span class="token operator">::</span>KEY_ROTATION<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> 省略一大段代码
<span class="token comment">// AUTO_EXPOSURE_LOCK (always supported)</span>
validatedParams<span class="token punctuation">.</span>autoExposureLock <span class="token operator">=</span> <span class="token function">boolFromString</span><span class="token punctuation">(</span> newParams<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>CameraParameters<span class="token operator">::</span>KEY_AUTO_EXPOSURE_LOCK<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// AUTO_WHITEBALANCE_LOCK (always supported)</span>
validatedParams<span class="token punctuation">.</span>autoWhiteBalanceLock <span class="token operator">=</span> <span class="token function">boolFromString</span><span class="token punctuation">(</span>newParams<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>CameraParameters<span class="token operator">::</span>KEY_AUTO_WHITEBALANCE_LOCK<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
res <span class="token operator">=</span> <span class="token function">parseAreas</span><span class="token punctuation">(</span>newParams<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>CameraParameters<span class="token operator">::</span>KEY_METERING_AREAS<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>validatedParams<span class="token punctuation">.</span>meteringAreas<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// ZOOM</span>
validatedParams<span class="token punctuation">.</span>zoom <span class="token operator">=</span> newParams<span class="token punctuation">.</span><span class="token function">getInt</span><span class="token punctuation">(</span>CameraParameters<span class="token operator">::</span>KEY_ZOOM<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// VIDEO_SIZE</span>
newParams<span class="token punctuation">.</span><span class="token function">getVideoSize</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>validatedParams<span class="token punctuation">.</span>videoWidth<span class="token punctuation">,</span><span class="token operator">&amp;</span>validatedParams<span class="token punctuation">.</span>videoHeight<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// VIDEO_STABILIZATION</span>
validatedParams<span class="token punctuation">.</span>videoStabilization <span class="token operator">=</span> <span class="token function">boolFromString</span><span class="token punctuation">(</span> newParams<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>CameraParameters<span class="token operator">::</span>KEY_VIDEO_STABILIZATION<span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
camera_metadata_ro_entry_t availableVideoStabilizationModes <span class="token operator">=</span> 
			<span class="token function">staticInfo</span><span class="token punctuation">(</span>ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/** Update internal parameters */</span>
<span class="token operator">*</span><span class="token keyword">this</span> <span class="token operator">=</span> validatedParams<span class="token punctuation">;</span>
<span class="token function">updateOverriddenJpegSize</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
res <span class="token operator">=</span> <span class="token function">calculatePictureFovs</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>horizFov<span class="token punctuation">,</span> <span class="token operator">&amp;</span>vertFov<span class="token punctuation">)</span><span class="token punctuation">;</span>
newParams<span class="token punctuation">.</span><span class="token function">setFloat</span><span class="token punctuation">(</span>CameraParameters<span class="token operator">::</span>KEY_HORIZONTAL_VIEW_ANGLE<span class="token punctuation">,</span>horizFov<span class="token punctuation">)</span><span class="token punctuation">;</span>
newParams<span class="token punctuation">.</span><span class="token function">setFloat</span><span class="token punctuation">(</span>CameraParameters<span class="token operator">::</span>KEY_VERTICAL_VIEW_ANGLE<span class="token punctuation">,</span> vertFov<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">ALOGV</span><span class="token punctuation">(</span><span class="token string">"Current still picture FOV: %f x %f deg"</span><span class="token punctuation">,</span> horizFov<span class="token punctuation">,</span> vertFov<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">// 3. 参数更新和检测成功后,重新生成字符串,更新在 paramsFlattened 中,及保存在 params 对象中。</span>
<span class="token comment">// Need to flatten again in case of overrides</span>
paramsFlattened <span class="token operator">=</span> newParams<span class="token punctuation">.</span><span class="token function">flatten</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
params <span class="token operator">=</span> newParams<span class="token punctuation">;</span>

<span class="token keyword">return</span> OK<span class="token punctuation">;</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

BpCamera

@ frameworks/av/camera/ICamera.cpp
class BpCamera: public BpInterface<ICamera>
{
public:
    // set preview/capture parameters - key/value pairs
    status_t setParameters(const String8& params)
    {
        ALOGV("setParameters");
        Parcel data, reply;
        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
        data.writeString8(params);
        remote()->transact(SET_PARAMETERS, data, &reply);
        return reply.readInt32();
    }
<span class="token comment">// get preview/capture parameters - key/value pairs</span>
String8 <span class="token function">getParameters</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
<span class="token punctuation">{</span>
    <span class="token function">ALOGV</span><span class="token punctuation">(</span><span class="token string">"getParameters"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    Parcel data<span class="token punctuation">,</span> reply<span class="token punctuation">;</span>
    data<span class="token punctuation">.</span><span class="token function">writeInterfaceToken</span><span class="token punctuation">(</span>ICamera<span class="token operator">::</span><span class="token function">getInterfaceDescriptor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">remote</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">transact</span><span class="token punctuation">(</span>GET_PARAMETERS<span class="token punctuation">,</span> data<span class="token punctuation">,</span> <span class="token operator">&amp;</span>reply<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> reply<span class="token punctuation">.</span><span class="token function">readString8</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

BnCamera

@ frameworks/av/camera/ICamera.cpp

status_t BnCamera::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
switch(code) {
case SET_PARAMETERS: {
ALOGV(“SET_PARAMETERS”);
CHECK_INTERFACE(ICamera, data, reply);
String8 params(data.readString8());
reply->writeInt32(setParameters(params));
return NO_ERROR;
} break;
case GET_PARAMETERS: {
ALOGV(“GET_PARAMETERS”);
CHECK_INTERFACE(ICamera, data, reply);
reply->writeString8(getParameters());
return NO_ERROR;
} break;
}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

2.5.4.4 下发参数updateRequests(l.mParameters)

在处理preview和录像 stream的线程mStreamingProcessor 中,

status_t Camera2Client::updateRequests(Parameters &params) {
    status_t res;
    ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
res <span class="token operator">=</span> mStreamingProcessor<span class="token operator">-&gt;</span><span class="token function">incrementStreamingIds</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 更新 preview 参数</span>
res <span class="token operator">=</span> mStreamingProcessor<span class="token operator">-&gt;</span><span class="token function">updatePreviewRequest</span><span class="token punctuation">(</span>params<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">&gt;</span>
	@ frameworks<span class="token operator">/</span>av<span class="token operator">/</span>services<span class="token operator">/</span>camera<span class="token operator">/</span>libcameraservice<span class="token operator">/</span>api1<span class="token operator">/</span>client2<span class="token operator">/</span>StreamingProcessor<span class="token punctuation">.</span>cpp
	status_t StreamingProcessor<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">updatePreviewRequest</span><span class="token punctuation">(</span><span class="token keyword">const</span> Parameters <span class="token operator">&amp;</span>params<span class="token punctuation">)</span> 
	<span class="token punctuation">{</span>
		sp<span class="token operator">&lt;</span>CameraDeviceBase<span class="token operator">&gt;</span> device <span class="token operator">=</span> mDevice<span class="token punctuation">.</span><span class="token function">promote</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token comment">// 如果当前 mBuffer==NULL </span>
		<span class="token keyword">if</span> <span class="token punctuation">(</span>mPreviewRequest<span class="token punctuation">.</span><span class="token function">entryCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    		sp<span class="token operator">&lt;</span>Camera2Client<span class="token operator">&gt;</span> client <span class="token operator">=</span> mClient<span class="token punctuation">.</span><span class="token function">promote</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	      	<span class="token comment">// Use CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG for ZSL streaming case.</span>
	        <span class="token keyword">if</span> <span class="token punctuation">(</span>client<span class="token operator">-&gt;</span><span class="token function">getCameraDeviceVersion</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&gt;=</span> CAMERA_DEVICE_API_VERSION_3_0<span class="token punctuation">)</span> <span class="token punctuation">{</span>
	            <span class="token keyword">if</span> <span class="token punctuation">(</span>params<span class="token punctuation">.</span><span class="token function">useZeroShutterLag</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token operator">!</span>params<span class="token punctuation">.</span>recordingHint<span class="token punctuation">)</span> <span class="token punctuation">{</span>
	                res <span class="token operator">=</span> device<span class="token operator">-&gt;</span><span class="token function">createDefaultRequest</span><span class="token punctuation">(</span>CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG<span class="token punctuation">,</span> <span class="token operator">&amp;</span>mPreviewRequest<span class="token punctuation">)</span><span class="token punctuation">;</span>
	            <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
	                res <span class="token operator">=</span> device<span class="token operator">-&gt;</span><span class="token function">createDefaultRequest</span><span class="token punctuation">(</span>CAMERA3_TEMPLATE_PREVIEW<span class="token punctuation">,</span> <span class="token operator">&amp;</span>mPreviewRequest<span class="token punctuation">)</span><span class="token punctuation">;</span>
	            <span class="token punctuation">}</span>
	        <span class="token punctuation">}</span>
		<span class="token punctuation">}</span>
		<span class="token comment">// 向 android.hardware.Camera 下发更新参数</span>
		@ frameworks<span class="token operator">/</span>av<span class="token operator">/</span>services<span class="token operator">/</span>camera<span class="token operator">/</span>libcameraservice<span class="token operator">/</span>api1<span class="token operator">/</span>client2<span class="token operator">/</span>Parameters<span class="token punctuation">.</span>cpp
		res <span class="token operator">=</span> params<span class="token punctuation">.</span><span class="token function">updateRequest</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>mPreviewRequest<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
<span class="token operator">&lt;=</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">=</span>
<span class="token comment">// 更新 Recording 参数</span>
res <span class="token operator">=</span> mStreamingProcessor<span class="token operator">-&gt;</span><span class="token function">updateRecordingRequest</span><span class="token punctuation">(</span>params<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">// 根椐参数判断是否要开始 Preview 还是 Recording</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>params<span class="token punctuation">.</span>state <span class="token operator">==</span> Parameters<span class="token punctuation">:</span><span class="token punctuation">:</span>PREVIEW<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    res <span class="token operator">=</span> <span class="token function">startPreviewL</span><span class="token punctuation">(</span>params<span class="token punctuation">,</span> true<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>params<span class="token punctuation">.</span>state <span class="token operator">==</span> Parameters<span class="token punctuation">:</span><span class="token punctuation">:</span>RECORD <span class="token operator">||</span> params<span class="token punctuation">.</span>state <span class="token operator">==</span> Parameters<span class="token punctuation">:</span><span class="token punctuation">:</span>VIDEO_SNAPSHOT<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    res <span class="token operator">=</span> <span class="token function">startRecordingL</span><span class="token punctuation">(</span>params<span class="token punctuation">,</span> true<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> res<span class="token punctuation">;</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

2.5.4.4.1 params.updateRequest(&mPreviewRequest)

Parameters::updateRequest() 函数中,主要是调用 request->update() 方法来对hardware 层更新参数

@ frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.cpp

status_t Parameters::updateRequest(CameraMetadata *request) const {

<span class="token keyword">uint8_t</span> metadataMode <span class="token operator">=</span> ANDROID_REQUEST_METADATA_MODE_FULL<span class="token punctuation">;</span>
res <span class="token operator">=</span> request<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">update</span><span class="token punctuation">(</span>ANDROID_REQUEST_METADATA_MODE<span class="token punctuation">,</span> <span class="token operator">&amp;</span>metadataMode<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">if</span> <span class="token punctuation">(</span>intent<span class="token punctuation">.</span>data<span class="token punctuation">.</span>u8<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">==</span> ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    res <span class="token operator">=</span> request<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">update</span><span class="token punctuation">(</span>ANDROID_CONTROL_AE_TARGET_FPS_RANGE<span class="token punctuation">,</span> fastInfo<span class="token punctuation">.</span>bestStillCaptureFpsRange<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
    res <span class="token operator">=</span> request<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">update</span><span class="token punctuation">(</span>ANDROID_CONTROL_AE_TARGET_FPS_RANGE<span class="token punctuation">,</span> previewFpsRange<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">uint8_t</span> reqWbLock <span class="token operator">=</span> autoWhiteBalanceLock <span class="token operator">?</span> ANDROID_CONTROL_AWB_LOCK_ON <span class="token operator">:</span> ANDROID_CONTROL_AWB_LOCK_OFF<span class="token punctuation">;</span>
res <span class="token operator">=</span> request<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">update</span><span class="token punctuation">(</span>ANDROID_CONTROL_AWB_LOCK<span class="token punctuation">,</span> <span class="token operator">&amp;</span>reqWbLock<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
res <span class="token operator">=</span> request<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">update</span><span class="token punctuation">(</span>ANDROID_CONTROL_EFFECT_MODE<span class="token punctuation">,</span> <span class="token operator">&amp;</span>effectMode<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
res <span class="token operator">=</span> request<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">update</span><span class="token punctuation">(</span>ANDROID_CONTROL_AE_ANTIBANDING_MODE<span class="token punctuation">,</span> <span class="token operator">&amp;</span>antibandingMode<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">uint8_t</span> reqControlMode <span class="token operator">=</span> ANDROID_CONTROL_MODE_AUTO<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>enableFaceDetect <span class="token operator">||</span> sceneModeActive<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    reqControlMode <span class="token operator">=</span> ANDROID_CONTROL_MODE_USE_SCENE_MODE<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
res <span class="token operator">=</span> request<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">update</span><span class="token punctuation">(</span>ANDROID_CONTROL_MODE<span class="token punctuation">,</span> <span class="token operator">&amp;</span>reqControlMode<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
res <span class="token operator">=</span> request<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">update</span><span class="token punctuation">(</span>ANDROID_FLASH_MODE<span class="token punctuation">,</span><span class="token operator">&amp;</span>reqFlashMode<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

2.5.4.4.2 request->update()

request->update 定义在 frameworks/av/include/camera/CameraMetadata.h

class CameraMetadata: public Parcelable {
  public:
  /**  Update metadata entry. Will create entry if it doesn't exist already, and
     * will reallocate the buffer if insufficient space exists. Overloaded for
     * the various types of valid data. */
    status_t update(uint32_t tag, const uint8_t *data, size_t data_count);
    status_t update(uint32_t tag, const int32_t *data, size_t data_count);
    status_t update(uint32_t tag, const float *data, size_t data_count);
    status_t update(uint32_t tag, const int64_t *data, size_t data_count);
    status_t update(uint32_t tag, const double *data, size_t data_count);
    status_t update(uint32_t tag, const camera_metadata_rational_t *data, size_t data_count);
    status_t update(uint32_t tag, const String8 &string);
    status_t update(const camera_metadata_ro_entry &entry);
<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">typename</span> T<span class="token operator">&gt;</span>
status_t <span class="token function">update</span><span class="token punctuation">(</span><span class="token keyword">uint32_t</span> tag<span class="token punctuation">,</span> Vector<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> data<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token function">update</span><span class="token punctuation">(</span>tag<span class="token punctuation">,</span> data<span class="token punctuation">.</span><span class="token function">array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> data<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

实际定义如下:

// frameworks/av/camera/CameraMetadata.cpp
status_t CameraMetadata::update(uint32_t tag,const int32_t *data, size_t data_count) {
    return updateImpl(tag, (const void*)data, data_count);
}

 
 
  • 1
  • 2
  • 3
  • 4

待更新中。。。。。。。。。。。


camera api1 和api2
Android Camera API2中采用CameraMetadata用于从APP到HAL的参数交互

参考:
【定制Android系统】Android O Camera(1)——简单梳理 Camera1 的 setParameters 通路.1

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
                            </div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值