• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #define LOG_TAG "StreamConfigurationMap"
18 #include "StreamConfigurationMap.h"
19 
20 #include <log/log.h>
21 
22 namespace android {
AppendAvailableStreamConfigurations(const camera_metadata_ro_entry & entry)23 void StreamConfigurationMap::AppendAvailableStreamConfigurations(
24     const camera_metadata_ro_entry& entry) {
25   for (size_t i = 0; i < entry.count; i += kStreamConfigurationSize) {
26     int32_t width = entry.data.i32[i + kStreamWidthOffset];
27     int32_t height = entry.data.i32[i + kStreamHeightOffset];
28     auto format = static_cast<android_pixel_format_t>(
29         entry.data.i32[i + kStreamFormatOffset]);
30     int32_t isInput = entry.data.i32[i + kStreamIsInputOffset];
31     if (!isInput) {
32       stream_output_formats_.insert(format);
33       stream_output_size_map_[format].insert(std::make_pair(width, height));
34     }
35   }
36 }
37 
AppendAvailableStreamMinDurations(const camera_metadata_ro_entry_t & entry)38 void StreamConfigurationMap::AppendAvailableStreamMinDurations(
39     const camera_metadata_ro_entry_t& entry) {
40   for (size_t i = 0; i < entry.count; i += kStreamConfigurationSize) {
41     auto format = static_cast<android_pixel_format_t>(
42         entry.data.i64[i + kStreamFormatOffset]);
43     uint32_t width = entry.data.i64[i + kStreamWidthOffset];
44     uint32_t height = entry.data.i64[i + kStreamHeightOffset];
45     nsecs_t duration = entry.data.i64[i + kStreamMinDurationOffset];
46     auto streamConfiguration =
47         std::make_pair(format, std::make_pair(width, height));
48     stream_min_duration_map_[streamConfiguration] = duration;
49   }
50 }
51 
AppendAvailableStreamStallDurations(const camera_metadata_ro_entry & entry)52 void StreamConfigurationMap::AppendAvailableStreamStallDurations(
53     const camera_metadata_ro_entry& entry) {
54   for (size_t i = 0; i < entry.count; i += kStreamConfigurationSize) {
55     auto format = static_cast<android_pixel_format_t>(
56         entry.data.i64[i + kStreamFormatOffset]);
57     uint32_t width = entry.data.i64[i + kStreamWidthOffset];
58     uint32_t height = entry.data.i64[i + kStreamHeightOffset];
59     nsecs_t duration = entry.data.i64[i + kStreamStallDurationOffset];
60     auto streamConfiguration =
61         std::make_pair(format, std::make_pair(width, height));
62     stream_stall_map_[streamConfiguration] = duration;
63   }
64 }
65 
StreamConfigurationMap(const HalCameraMetadata & chars)66 StreamConfigurationMap::StreamConfigurationMap(const HalCameraMetadata& chars) {
67   camera_metadata_ro_entry_t entry;
68   auto ret = chars.Get(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, &entry);
69   if (ret != OK) {
70     ALOGW("%s: ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS missing!",
71           __FUNCTION__);
72     entry.count = 0;
73   }
74   AppendAvailableStreamConfigurations(entry);
75 
76   ret = chars.Get(ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS, &entry);
77   if (ret == OK) {
78     AppendAvailableStreamConfigurations(entry);
79   }
80 
81   ret = chars.Get(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, &entry);
82   if (ret != OK) {
83     ALOGW("%s: ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS missing!",
84           __FUNCTION__);
85     entry.count = 0;
86   }
87   AppendAvailableStreamMinDurations(entry);
88 
89   ret = chars.Get(ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS, &entry);
90   if (ret == OK) {
91     AppendAvailableStreamMinDurations(entry);
92   }
93 
94   ret = chars.Get(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, &entry);
95   if (ret != OK) {
96     ALOGW("%s: ANDROID_SCALER_AVAILABLE_STALL_DURATIONS missing!", __FUNCTION__);
97     entry.count = 0;
98   }
99   AppendAvailableStreamStallDurations(entry);
100 
101   ret = chars.Get(ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS, &entry);
102   if (ret == OK) {
103     AppendAvailableStreamStallDurations(entry);
104   }
105 
106   ret = chars.Get(ANDROID_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP, &entry);
107   if (ret == OK) {
108     size_t i = 0;
109     while (i < entry.count) {
110       auto input_format =
111           static_cast<android_pixel_format_t>(entry.data.i32[i++]);
112       auto output_format_count = entry.data.i32[i++];
113       if (output_format_count <= 0 ||
114           ((output_format_count + i) > entry.count)) {
115         ALOGE("%s: Invalid output format count: %d!", __func__,
116               output_format_count);
117         break;
118       }
119       size_t output_formats_end = output_format_count + i;
120       for (; i < output_formats_end; i++) {
121         stream_input_output_map_[input_format].insert(
122             static_cast<android_pixel_format_t>(entry.data.i32[i]));
123       }
124       stream_input_formats_.insert(input_format);
125     }
126   }
127 }
128 
129 }  // namespace android
130