Search in sources :

Example 1 with Area

use of android.hardware.Camera.Area in project platform_frameworks_base by android.

the class ParameterUtils method convertMeteringRectangleToLegacy.

/**
     * Calculate the actual/effective/reported normalized rectangle data from a metering
     * rectangle.
     *
     * <p>If any of the rectangles are out-of-range of their intended bounding box,
     * the {@link #RECTANGLE_EMPTY empty rectangle} is substituted instead
     * (with a weight of {@code 0}).</p>
     *
     * <p>The metering rectangle is bound by the crop region (effective/reported respectively).
     * The metering {@link Camera.Area area} is bound by {@code [-1000, 1000]}.</p>
     *
     * <p>No parameters are mutated; returns the new metering data.</p>
     *
     * @param activeArraySize active array size of the sensor (e.g. max jpeg size)
     * @param meteringRect the user-specified metering rectangle
     * @param zoomData the calculated zoom data corresponding to this request
     *
     * @return the metering area, the reported/effective metering rectangles
     */
public static MeteringData convertMeteringRectangleToLegacy(Rect activeArray, MeteringRectangle meteringRect, ZoomData zoomData) {
    Rect previewCrop = zoomData.previewCrop;
    float scaleW = (NORMALIZED_RECTANGLE_MAX - NORMALIZED_RECTANGLE_MIN) * 1.0f / previewCrop.width();
    float scaleH = (NORMALIZED_RECTANGLE_MAX - NORMALIZED_RECTANGLE_MIN) * 1.0f / previewCrop.height();
    Matrix transform = new Matrix();
    // Move the preview crop so that top,left is at (0,0), otherwise after scaling
    // the corner bounds will be outside of [-1000, 1000]
    transform.setTranslate(-previewCrop.left, -previewCrop.top);
    // Scale into [0, 2000] range about the center of the preview
    transform.postScale(scaleW, scaleH);
    // Move so that top left of a typical rect is at [-1000, -1000]
    transform.postTranslate(/*dx*/
    NORMALIZED_RECTANGLE_MIN, /*dy*/
    NORMALIZED_RECTANGLE_MIN);
    /*
         * Calculate the preview metering region (effective), and the camera1 api
         * normalized metering region.
         */
    Rect normalizedRegionUnbounded = ParamsUtils.mapRect(transform, meteringRect.getRect());
    /*
         * Try to intersect normalized area with [-1000, 1000] rectangle; otherwise
         * it's completely out of range
         */
    Rect normalizedIntersected = new Rect(normalizedRegionUnbounded);
    Camera.Area meteringArea;
    if (!normalizedIntersected.intersect(NORMALIZED_RECTANGLE_DEFAULT)) {
        Log.w(TAG, "convertMeteringRectangleToLegacy - metering rectangle too small, " + "no metering will be done");
        normalizedIntersected.set(RECTANGLE_EMPTY);
        meteringArea = new Camera.Area(RECTANGLE_EMPTY, MeteringRectangle.METERING_WEIGHT_DONT_CARE);
    } else {
        meteringArea = new Camera.Area(normalizedIntersected, meteringRect.getMeteringWeight());
    }
    /*
         * Calculate effective preview metering region
         */
    Rect previewMetering = meteringRect.getRect();
    if (!previewMetering.intersect(previewCrop)) {
        previewMetering.set(RECTANGLE_EMPTY);
    }
    /*
         * Calculate effective reported metering region
         * - Transform the calculated metering area back into active array space
         * - Clip it to be a subset of the reported crop region
         */
    Rect reportedMetering;
    {
        Camera.Area normalizedAreaUnbounded = new Camera.Area(normalizedRegionUnbounded, meteringRect.getMeteringWeight());
        WeightedRectangle reportedMeteringRect = convertCameraAreaToActiveArrayRectangle(activeArray, zoomData, normalizedAreaUnbounded, /*usePreviewCrop*/
        false);
        reportedMetering = reportedMeteringRect.rect;
    }
    if (DEBUG) {
        Log.v(TAG, String.format("convertMeteringRectangleToLegacy - activeArray = %s, meteringRect = %s, " + "previewCrop = %s, meteringArea = %s, previewMetering = %s, " + "reportedMetering = %s, normalizedRegionUnbounded = %s", activeArray, meteringRect, previewCrop, stringFromArea(meteringArea), previewMetering, reportedMetering, normalizedRegionUnbounded));
    }
    return new MeteringData(meteringArea, previewMetering, reportedMetering);
}
Also used : Rect(android.graphics.Rect) Area(android.hardware.Camera.Area) Matrix(android.graphics.Matrix) Area(android.hardware.Camera.Area) Camera(android.hardware.Camera)

Example 2 with Area

use of android.hardware.Camera.Area in project platform_frameworks_base by android.

the class ParameterUtils method stringFromAreaList.

/**
     * Convert a camera area list into a human-readable string
     * @param areaList a list of areas (null is ok)
     */
public static String stringFromAreaList(List<Camera.Area> areaList) {
    StringBuilder sb = new StringBuilder();
    if (areaList == null) {
        return null;
    }
    int i = 0;
    for (Camera.Area area : areaList) {
        if (area == null) {
            sb.append("null");
        } else {
            sb.append(stringFromArea(area));
        }
        if (i != areaList.size() - 1) {
            sb.append(", ");
        }
        i++;
    }
    return sb.toString();
}
Also used : Area(android.hardware.Camera.Area) Camera(android.hardware.Camera) Point(android.graphics.Point)

Example 3 with Area

use of android.hardware.Camera.Area in project android_frameworks_base by DirtyUnicorns.

the class ParameterUtils method stringFromAreaList.

/**
     * Convert a camera area list into a human-readable string
     * @param areaList a list of areas (null is ok)
     */
public static String stringFromAreaList(List<Camera.Area> areaList) {
    StringBuilder sb = new StringBuilder();
    if (areaList == null) {
        return null;
    }
    int i = 0;
    for (Camera.Area area : areaList) {
        if (area == null) {
            sb.append("null");
        } else {
            sb.append(stringFromArea(area));
        }
        if (i != areaList.size() - 1) {
            sb.append(", ");
        }
        i++;
    }
    return sb.toString();
}
Also used : Area(android.hardware.Camera.Area) Camera(android.hardware.Camera) Point(android.graphics.Point)

Example 4 with Area

use of android.hardware.Camera.Area in project android_frameworks_base by AOSPA.

the class ParameterUtils method stringFromAreaList.

/**
     * Convert a camera area list into a human-readable string
     * @param areaList a list of areas (null is ok)
     */
public static String stringFromAreaList(List<Camera.Area> areaList) {
    StringBuilder sb = new StringBuilder();
    if (areaList == null) {
        return null;
    }
    int i = 0;
    for (Camera.Area area : areaList) {
        if (area == null) {
            sb.append("null");
        } else {
            sb.append(stringFromArea(area));
        }
        if (i != areaList.size() - 1) {
            sb.append(", ");
        }
        i++;
    }
    return sb.toString();
}
Also used : Area(android.hardware.Camera.Area) Camera(android.hardware.Camera) Point(android.graphics.Point)

Example 5 with Area

use of android.hardware.Camera.Area in project android_frameworks_base by AOSPA.

the class ParameterUtils method convertMeteringRectangleToLegacy.

/**
     * Calculate the actual/effective/reported normalized rectangle data from a metering
     * rectangle.
     *
     * <p>If any of the rectangles are out-of-range of their intended bounding box,
     * the {@link #RECTANGLE_EMPTY empty rectangle} is substituted instead
     * (with a weight of {@code 0}).</p>
     *
     * <p>The metering rectangle is bound by the crop region (effective/reported respectively).
     * The metering {@link Camera.Area area} is bound by {@code [-1000, 1000]}.</p>
     *
     * <p>No parameters are mutated; returns the new metering data.</p>
     *
     * @param activeArraySize active array size of the sensor (e.g. max jpeg size)
     * @param meteringRect the user-specified metering rectangle
     * @param zoomData the calculated zoom data corresponding to this request
     *
     * @return the metering area, the reported/effective metering rectangles
     */
public static MeteringData convertMeteringRectangleToLegacy(Rect activeArray, MeteringRectangle meteringRect, ZoomData zoomData) {
    Rect previewCrop = zoomData.previewCrop;
    float scaleW = (NORMALIZED_RECTANGLE_MAX - NORMALIZED_RECTANGLE_MIN) * 1.0f / previewCrop.width();
    float scaleH = (NORMALIZED_RECTANGLE_MAX - NORMALIZED_RECTANGLE_MIN) * 1.0f / previewCrop.height();
    Matrix transform = new Matrix();
    // Move the preview crop so that top,left is at (0,0), otherwise after scaling
    // the corner bounds will be outside of [-1000, 1000]
    transform.setTranslate(-previewCrop.left, -previewCrop.top);
    // Scale into [0, 2000] range about the center of the preview
    transform.postScale(scaleW, scaleH);
    // Move so that top left of a typical rect is at [-1000, -1000]
    transform.postTranslate(/*dx*/
    NORMALIZED_RECTANGLE_MIN, /*dy*/
    NORMALIZED_RECTANGLE_MIN);
    /*
         * Calculate the preview metering region (effective), and the camera1 api
         * normalized metering region.
         */
    Rect normalizedRegionUnbounded = ParamsUtils.mapRect(transform, meteringRect.getRect());
    /*
         * Try to intersect normalized area with [-1000, 1000] rectangle; otherwise
         * it's completely out of range
         */
    Rect normalizedIntersected = new Rect(normalizedRegionUnbounded);
    Camera.Area meteringArea;
    if (!normalizedIntersected.intersect(NORMALIZED_RECTANGLE_DEFAULT)) {
        Log.w(TAG, "convertMeteringRectangleToLegacy - metering rectangle too small, " + "no metering will be done");
        normalizedIntersected.set(RECTANGLE_EMPTY);
        meteringArea = new Camera.Area(RECTANGLE_EMPTY, MeteringRectangle.METERING_WEIGHT_DONT_CARE);
    } else {
        meteringArea = new Camera.Area(normalizedIntersected, meteringRect.getMeteringWeight());
    }
    /*
         * Calculate effective preview metering region
         */
    Rect previewMetering = meteringRect.getRect();
    if (!previewMetering.intersect(previewCrop)) {
        previewMetering.set(RECTANGLE_EMPTY);
    }
    /*
         * Calculate effective reported metering region
         * - Transform the calculated metering area back into active array space
         * - Clip it to be a subset of the reported crop region
         */
    Rect reportedMetering;
    {
        Camera.Area normalizedAreaUnbounded = new Camera.Area(normalizedRegionUnbounded, meteringRect.getMeteringWeight());
        WeightedRectangle reportedMeteringRect = convertCameraAreaToActiveArrayRectangle(activeArray, zoomData, normalizedAreaUnbounded, /*usePreviewCrop*/
        false);
        reportedMetering = reportedMeteringRect.rect;
    }
    if (DEBUG) {
        Log.v(TAG, String.format("convertMeteringRectangleToLegacy - activeArray = %s, meteringRect = %s, " + "previewCrop = %s, meteringArea = %s, previewMetering = %s, " + "reportedMetering = %s, normalizedRegionUnbounded = %s", activeArray, meteringRect, previewCrop, stringFromArea(meteringArea), previewMetering, reportedMetering, normalizedRegionUnbounded));
    }
    return new MeteringData(meteringArea, previewMetering, reportedMetering);
}
Also used : Rect(android.graphics.Rect) Area(android.hardware.Camera.Area) Matrix(android.graphics.Matrix) Area(android.hardware.Camera.Area) Camera(android.hardware.Camera)

Aggregations

Area (android.hardware.Camera.Area)17 Camera (android.hardware.Camera)15 Rect (android.graphics.Rect)12 Point (android.graphics.Point)10 Matrix (android.graphics.Matrix)5 TargetApi (android.annotation.TargetApi)2