| Pawin Vongmasa | 3665390 | 2018-11-15 00:10:25 -0800 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2018 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 | #include <C2ParamInternal.h> | 
 | 18 | #include <util/C2Debug-interface.h> | 
 | 19 | #include <util/C2Debug-param.h> | 
 | 20 | #include <util/C2InterfaceUtils.h> | 
 | 21 |  | 
 | 22 | #include <iostream> | 
 | 23 |  | 
 | 24 | #include <android-base/stringprintf.h> | 
 | 25 |  | 
 | 26 | using android::base::StringPrintf; | 
 | 27 |  | 
 | 28 | /* -------------------------------- asString -------------------------------- */ | 
 | 29 |  | 
 | 30 | const char *asString(c2_status_t i, const char *def) { | 
 | 31 |     switch (i) { | 
 | 32 |         case C2_OK:        return "OK"; | 
 | 33 |         case C2_BAD_VALUE: return "BAD_VALUE"; | 
 | 34 |         case C2_BAD_INDEX: return "BAD_INDEX"; | 
 | 35 |         case C2_CANNOT_DO: return "CANNOT_DO"; | 
 | 36 |         case C2_DUPLICATE: return "DUPLICATE"; | 
 | 37 |         case C2_NOT_FOUND: return "NOT_FOUND"; | 
 | 38 |         case C2_BAD_STATE: return "BAD_STATE"; | 
 | 39 |         case C2_BLOCKING:  return "BLOCKING"; | 
 | 40 |         case C2_CANCELED:  return "CANCELED"; | 
 | 41 |         case C2_NO_MEMORY: return "NO_MEMORY"; | 
 | 42 |         case C2_REFUSED:   return "REFUSED"; | 
 | 43 |         case C2_TIMED_OUT: return "TIMED_OUT"; | 
 | 44 |         case C2_OMITTED:   return "OMITTED"; | 
 | 45 |         case C2_CORRUPTED: return "CORRUPTED"; | 
 | 46 |         case C2_NO_INIT:   return "NO_INIT"; | 
 | 47 |         default:           return def; | 
 | 48 |     } | 
 | 49 | } | 
 | 50 |  | 
 | 51 | const char *asString(C2FieldDescriptor::type_t i, const char *def) { | 
 | 52 |     switch (i) { | 
 | 53 |         case C2FieldDescriptor::BLOB:   return "u8"; | 
 | 54 |         case C2FieldDescriptor::CNTR32: return "c32"; | 
 | 55 |         case C2FieldDescriptor::CNTR64: return "c64"; | 
 | 56 |         case C2FieldDescriptor::FLOAT:  return "fp"; | 
 | 57 |         case C2FieldDescriptor::INT32:  return "i32"; | 
 | 58 |         case C2FieldDescriptor::INT64:  return "i64"; | 
 | 59 |         case C2FieldDescriptor::STRING: return "chr"; | 
 | 60 |         case C2FieldDescriptor::UINT32: return "u32"; | 
 | 61 |         case C2FieldDescriptor::UINT64: return "u64"; | 
 | 62 |         default: return (i & C2FieldDescriptor::STRUCT_FLAG) ? "struct" : def; | 
 | 63 |     } | 
 | 64 | } | 
 | 65 |  | 
 | 66 | /* ------------------------------ C2ParamField ------------------------------ */ | 
 | 67 |  | 
 | 68 | static std::string attribParamCoreIndex(const C2Param::CoreIndex &i) { | 
 | 69 |     return StringPrintf("%c%c%03x", | 
 | 70 |             i.isFlexible() ? 'F' : '-', | 
 | 71 |             i.isVendor() ? 'V' : '-', | 
 | 72 |             i.coreIndex()); | 
 | 73 | } | 
 | 74 |  | 
 | 75 | static std::string attribParamIndex( | 
 | 76 |         const C2Param::Type &i, bool addStream, unsigned streamId) { | 
 | 77 |     std::string v = StringPrintf("%c%c", | 
 | 78 |             i.forInput() ? 'I' : i.forOutput() ? 'O' : '-', | 
 | 79 |             i.forStream() ? 'S' : i.forPort() ? 'P' : 'G'); | 
 | 80 |     if (addStream) { | 
 | 81 |         if (i.forStream()) { | 
 | 82 |             v += StringPrintf("%02d", streamId); | 
 | 83 |         } else { | 
 | 84 |             v += "--"; | 
 | 85 |         } | 
 | 86 |     } | 
 | 87 |  | 
 | 88 |     return v | 
 | 89 |             + StringPrintf("%c ", | 
 | 90 |                        i.kind() == C2Param::STRUCT  ? 'S' : | 
 | 91 |                        i.kind() == C2Param::INFO    ? 'i' : | 
 | 92 |                        i.kind() == C2Param::TUNING  ? 't' : | 
 | 93 |                        i.kind() == C2Param::SETTING ? 's' : | 
 | 94 |                        i.kind() == C2Param::NONE    ? '-' : '?') | 
 | 95 |             + attribParamCoreIndex(i); | 
 | 96 | } | 
 | 97 |  | 
 | 98 | std::ostream& operator<<(std::ostream& os, const C2Param::CoreIndex &i) { | 
 | 99 |     return os << "Param::CoreIndex(" << attribParamCoreIndex(i) << ")"; | 
 | 100 | } | 
 | 101 |  | 
 | 102 | std::ostream& operator<<(std::ostream& os, const C2Param::Type &i) { | 
 | 103 |     return os << StringPrintf("Param::Type(%08x: ", i.type()) | 
 | 104 |             << attribParamIndex(i, false, 0) << ")"; | 
 | 105 | } | 
 | 106 |  | 
 | 107 | std::ostream& operator<<(std::ostream& os, const C2Param::Index &i) { | 
 | 108 |     return os << StringPrintf("Param::Index(%08x: ", (uint32_t)i) | 
 | 109 |             << attribParamIndex(i, true, i.stream()) << ")"; | 
 | 110 | } | 
 | 111 |  | 
 | 112 | static std::string attribFieldId(const _C2FieldId &i) { | 
 | 113 |     return StringPrintf("Field(@%02x+%02x)", | 
 | 114 |             _C2ParamInspector::GetOffset(i), | 
 | 115 |             _C2ParamInspector::GetSize(i)); | 
 | 116 | } | 
 | 117 |  | 
 | 118 |  | 
 | 119 | std::ostream& operator<<(std::ostream& os, const _C2FieldId &i) { | 
 | 120 |     return os << "<" << attribFieldId(i) << ">"; | 
 | 121 | } | 
 | 122 |  | 
 | 123 |  | 
 | 124 | std::ostream& operator<<(std::ostream& os, const C2FieldDescriptor &i) { | 
 | 125 |     os << attribFieldId(_C2ParamInspector::GetField(i)) << " "; | 
 | 126 |     if (i.namedValues().size()) { | 
 | 127 |         os << "enum "; | 
 | 128 |     } | 
 | 129 |     return os << asString(i.type()) << " " << i.name() | 
 | 130 |             << StringPrintf("[%zu]", i.extent()); | 
 | 131 | } | 
 | 132 |  | 
 | 133 |  | 
 | 134 | std::ostream& operator<<(std::ostream& os, const C2ParamField &i) { | 
 | 135 |     os << "<" << C2Param::Index(_C2ParamInspector::GetIndex(i)) | 
 | 136 |             << StringPrintf("::Field(@%02x+%02x)>", | 
 | 137 |                             _C2ParamInspector::GetOffset(i), | 
 | 138 |                             _C2ParamInspector::GetSize(i)); | 
 | 139 |     return os; | 
 | 140 | } | 
 | 141 |  | 
 | 142 |  | 
 | 143 | /* -------------------------- _C2FieldValueHelper -------------------------- */ | 
 | 144 |  | 
 | 145 | std::ostream& _C2FieldValueHelper<char>::put(std::ostream &os, const C2Value::Primitive &p) { | 
 | 146 |     if (isprint(p.i32)) { | 
 | 147 |         return os << StringPrintf("'%c'", p.i32); | 
 | 148 |     } else { | 
 | 149 |         return os << StringPrintf("'\\x%02x'", (uint32_t)p.i32); | 
 | 150 |     } | 
 | 151 | } | 
 | 152 |  | 
 | 153 | std::ostream& _C2FieldValueHelper<uint8_t>::put(std::ostream &os, const C2Value::Primitive &p) { | 
 | 154 |     return os << StringPrintf("0x%02x", p.u32); | 
 | 155 | } | 
 | 156 |  | 
 | 157 | /* ---------------------- C2FieldSupportedValuesHelper ---------------------- */ | 
 | 158 |  | 
 | 159 | template<typename T> | 
 | 160 | std::ostream& operator<<(std::ostream &os, const c2_cntr_t<T> &v) { | 
 | 161 |     return os << "ctr(" << v.peeku() << ")"; | 
 | 162 | } | 
 | 163 |  | 
 | 164 | template<typename T> | 
 | 165 | std::ostream& operator<<(std::ostream& os, const C2SupportedRange<T> &i) { | 
 | 166 |     os << "Range("; | 
 | 167 |     _C2FieldValueHelper<T>::put(os, i.min()); | 
 | 168 |     os << ".."; | 
 | 169 |     _C2FieldValueHelper<T>::put(os, i.max()); | 
 | 170 |     os << " *= " << i.num() << " /= " << i.denom() << " += " << i.step() << ")"; | 
 | 171 |     return os; | 
 | 172 | } | 
 | 173 | template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<char> &i); | 
 | 174 | template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<uint8_t> &i); | 
 | 175 | template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<int32_t> &i); | 
 | 176 | template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<uint32_t> &i); | 
 | 177 | //template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<c2_cntr32_t> &i); | 
 | 178 | template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<int64_t> &i); | 
 | 179 | template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<uint64_t> &i); | 
 | 180 | //template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<c2_cntr64_t> &i); | 
 | 181 | template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<float> &i); | 
 | 182 |  | 
 | 183 | template<typename T> | 
 | 184 | std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<T> &i) { | 
 | 185 |     os << "Flags["; | 
 | 186 |     if (!i.isEmpty()) { | 
 | 187 |         os << "min="; | 
 | 188 |         _C2FieldValueHelper<T>::put(os, i.min()); | 
 | 189 |     } | 
 | 190 |     bool comma = false; | 
 | 191 |     for (const T &v : i.flags()) { | 
 | 192 |         if (comma) { | 
 | 193 |             os << ", "; | 
 | 194 |         } | 
 | 195 |         _C2FieldValueHelper<T>::put(os, v); | 
 | 196 |         comma = true; | 
 | 197 |     } | 
 | 198 |     os << "]"; | 
 | 199 |     return os; | 
 | 200 | } | 
 | 201 | template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<char> &i); | 
 | 202 | template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<uint8_t> &i); | 
 | 203 | template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<int32_t> &i); | 
 | 204 | template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<uint32_t> &i); | 
 | 205 | //template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<c2_cntr32_t> &i); | 
 | 206 | template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<int64_t> &i); | 
 | 207 | template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<uint64_t> &i); | 
 | 208 | //template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<c2_cntr64_t> &i); | 
 | 209 | template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<float> &i); | 
 | 210 |  | 
 | 211 | template<typename T> | 
 | 212 | std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<T> &i) { | 
 | 213 |     os << "Values["; | 
 | 214 |     bool comma = false; | 
 | 215 |     for (const T &v : i.values()) { | 
 | 216 |         if (comma) { | 
 | 217 |             os << ", "; | 
 | 218 |         } | 
 | 219 |         _C2FieldValueHelper<T>::put(os, v); | 
 | 220 |         comma = true; | 
 | 221 |     } | 
 | 222 |     os << "]"; | 
 | 223 |     return os; | 
 | 224 | } | 
 | 225 | template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<char> &i); | 
 | 226 | template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<uint8_t> &i); | 
 | 227 | template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<int32_t> &i); | 
 | 228 | template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<uint32_t> &i); | 
 | 229 | //template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<c2_cntr32_t> &i); | 
 | 230 | template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<int64_t> &i); | 
 | 231 | template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<uint64_t> &i); | 
 | 232 | //template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<c2_cntr64_t> &i); | 
 | 233 | template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<float> &i); | 
 | 234 |  | 
 | 235 | template<typename T> | 
 | 236 | struct C2FieldSupportedValuesHelper<T>::Impl { | 
 | 237 |     Impl(const C2FieldSupportedValues &values); | 
 | 238 |  | 
 | 239 | private: | 
 | 240 |     typedef typename _C2FieldValueHelper<T>::ValueType ValueType; | 
 | 241 |     C2FieldSupportedValues::type_t _mType; | 
 | 242 |     C2SupportedRange<ValueType> _mRange; | 
 | 243 |     C2SupportedValueSet<ValueType> _mValues; | 
 | 244 |     C2SupportedFlags<ValueType> _mFlags; | 
 | 245 |  | 
 | 246 | public: | 
 | 247 | //    friend std::ostream& operator<< <T>(std::ostream& os, const C2FieldSupportedValuesHelper<T>::Impl &i); | 
 | 248 | //    friend std::ostream& operator<<(std::ostream& os, const Impl &i); | 
 | 249 |     std::ostream& streamOut(std::ostream& os) const; | 
 | 250 | }; | 
 | 251 |  | 
 | 252 | template<typename T> | 
 | 253 | std::ostream& C2FieldSupportedValuesHelper<T>::Impl::streamOut(std::ostream& os) const { | 
 | 254 |     if (_mType == C2FieldSupportedValues::RANGE) { | 
 | 255 |         os << _mRange; | 
 | 256 |     } else if (_mType == C2FieldSupportedValues::VALUES) { | 
 | 257 |         os << _mValues; | 
 | 258 |     } else if (_mType == C2FieldSupportedValues::FLAGS) { | 
 | 259 |         os << _mFlags; | 
 | 260 |     } else { | 
 | 261 |         os << "Unknown FSV type: " << (uint32_t)_mType; | 
 | 262 |     } | 
 | 263 |     return os; | 
 | 264 | } | 
 | 265 |  | 
 | 266 | template<typename T> | 
 | 267 | std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<T> &i) { | 
 | 268 |     return i._mImpl->streamOut(os); | 
 | 269 | } | 
 | 270 | template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<char> &i); | 
 | 271 | template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<uint8_t> &i); | 
 | 272 | template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<int32_t> &i); | 
 | 273 | template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<uint32_t> &i); | 
 | 274 | //template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<c2_cntr32_t> &i); | 
 | 275 | template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<int64_t> &i); | 
 | 276 | template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<uint64_t> &i); | 
 | 277 | //template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<c2_cntr64_t> &i); | 
 | 278 | template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<float> &i); | 
 | 279 |  |