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