1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_SERVERS_ZOOMRATIOMAPPER_H
18 #define ANDROID_SERVERS_ZOOMRATIOMAPPER_H
19 
20 #include <utils/Errors.h>
21 #include <array>
22 
23 #include "camera/CameraMetadata.h"
24 #include "device3/CoordinateMapper.h"
25 
26 namespace android {
27 
28 namespace camera3 {
29 
30 /**
31  * Utilities to convert between the new zoomRatio and existing cropRegion
32  * metadata tags. Note that this class does conversions in 2 scenarios:
33  * - HAL supports zoomRatio and the application uses cropRegion, or
34  * - HAL doesn't support zoomRatio, but the application uses zoomRatio
35  */
36 class ZoomRatioMapper : private CoordinateMapper {
37   public:
38     ZoomRatioMapper() = default;
39     ZoomRatioMapper(const CameraMetadata *deviceInfo,
40             bool supportNativeZoomRatio, bool usePrecorrectArray);
ZoomRatioMapper(const ZoomRatioMapper & other)41     ZoomRatioMapper(const ZoomRatioMapper& other) :
42             mHalSupportsZoomRatio(other.mHalSupportsZoomRatio),
43             mArrayWidth(other.mArrayWidth), mArrayHeight(other.mArrayHeight),
44             mIsValid(other.mIsValid) {}
45 
46     /**
47      * Initialize request template with valid zoomRatio if necessary.
48      */
49     static status_t initZoomRatioInTemplate(CameraMetadata *request);
50 
51     /**
52      * Override zoomRatio related tags in the static metadata.
53      */
54     static status_t overrideZoomRatioTags(
55             CameraMetadata* deviceInfo, bool* supportNativeZoomRatio);
56 
57     /**
58      * Update capture request to handle both cropRegion and zoomRatio.
59      */
60     status_t updateCaptureRequest(CameraMetadata *request);
61 
62     /**
63      * Update capture result to handle both cropRegion and zoomRatio.
64      */
65     status_t updateCaptureResult(CameraMetadata *request, bool requestedZoomRatioIs1);
66 
67   public: // Visible for testing. Do not use concurently.
68     void scaleCoordinates(int32_t* coordPairs, int coordCount,
69             float scaleRatio, bool clamp);
70 
isValid()71     bool isValid() { return mIsValid; }
72   private:
73     // const after construction
74     bool mHalSupportsZoomRatio;
75     // active array / pre-correction array dimension
76     int32_t mArrayWidth, mArrayHeight;
77 
78     bool mIsValid = false;
79 
80     float deriveZoomRatio(const CameraMetadata* metadata);
81     void scaleRects(int32_t* rects, int rectCount, float scaleRatio);
82 
83     status_t separateZoomFromCropLocked(CameraMetadata* metadata, bool isResult);
84     status_t combineZoomAndCropLocked(CameraMetadata* metadata, bool isResult);
85 };
86 
87 } // namespace camera3
88 
89 } // namespace android
90 
91 #endif
92