You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
280 lines
11 KiB
280 lines
11 KiB
/*
|
|
* Copyright (C) 2018 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <C2ParamInternal.h>
|
|
#include <util/C2Debug-interface.h>
|
|
#include <util/C2Debug-param.h>
|
|
#include <util/C2InterfaceUtils.h>
|
|
|
|
#include <iostream>
|
|
|
|
#include <android-base/stringprintf.h>
|
|
|
|
using android::base::StringPrintf;
|
|
|
|
/* -------------------------------- asString -------------------------------- */
|
|
|
|
const char *asString(c2_status_t i, const char *def) {
|
|
switch (i) {
|
|
case C2_OK: return "OK";
|
|
case C2_BAD_VALUE: return "BAD_VALUE";
|
|
case C2_BAD_INDEX: return "BAD_INDEX";
|
|
case C2_CANNOT_DO: return "CANNOT_DO";
|
|
case C2_DUPLICATE: return "DUPLICATE";
|
|
case C2_NOT_FOUND: return "NOT_FOUND";
|
|
case C2_BAD_STATE: return "BAD_STATE";
|
|
case C2_BLOCKING: return "BLOCKING";
|
|
case C2_CANCELED: return "CANCELED";
|
|
case C2_NO_MEMORY: return "NO_MEMORY";
|
|
case C2_REFUSED: return "REFUSED";
|
|
case C2_TIMED_OUT: return "TIMED_OUT";
|
|
case C2_OMITTED: return "OMITTED";
|
|
case C2_CORRUPTED: return "CORRUPTED";
|
|
case C2_NO_INIT: return "NO_INIT";
|
|
default: return def;
|
|
}
|
|
}
|
|
|
|
const char *asString(C2FieldDescriptor::type_t i, const char *def) {
|
|
switch (i) {
|
|
case C2FieldDescriptor::BLOB: return "u8";
|
|
case C2FieldDescriptor::CNTR32: return "c32";
|
|
case C2FieldDescriptor::CNTR64: return "c64";
|
|
case C2FieldDescriptor::FLOAT: return "fp";
|
|
case C2FieldDescriptor::INT32: return "i32";
|
|
case C2FieldDescriptor::INT64: return "i64";
|
|
case C2FieldDescriptor::STRING: return "chr";
|
|
case C2FieldDescriptor::UINT32: return "u32";
|
|
case C2FieldDescriptor::UINT64: return "u64";
|
|
default: return (i & C2FieldDescriptor::STRUCT_FLAG) ? "struct" : def;
|
|
}
|
|
}
|
|
|
|
/* ------------------------------ C2ParamField ------------------------------ */
|
|
|
|
static std::string attribParamCoreIndex(const C2Param::CoreIndex &i) {
|
|
return StringPrintf("%c%c%03x",
|
|
i.isFlexible() ? 'F' : '-',
|
|
i.isVendor() ? 'V' : '-',
|
|
i.coreIndex());
|
|
}
|
|
|
|
static std::string attribParamIndex(
|
|
const C2Param::Type &i, bool addStream, unsigned streamId) {
|
|
std::string v = StringPrintf("%c%c",
|
|
i.forInput() ? 'I' : i.forOutput() ? 'O' : '-',
|
|
i.forStream() ? 'S' : i.forPort() ? 'P' : 'G');
|
|
if (addStream) {
|
|
if (i.forStream()) {
|
|
v += StringPrintf("%02d", streamId);
|
|
} else {
|
|
v += "--";
|
|
}
|
|
}
|
|
|
|
return v
|
|
+ StringPrintf("%c ",
|
|
i.kind() == C2Param::STRUCT ? 'S' :
|
|
i.kind() == C2Param::INFO ? 'i' :
|
|
i.kind() == C2Param::TUNING ? 't' :
|
|
i.kind() == C2Param::SETTING ? 's' :
|
|
i.kind() == C2Param::NONE ? '-' : '?')
|
|
+ attribParamCoreIndex(i);
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const C2Param::CoreIndex &i) {
|
|
return os << "Param::CoreIndex(" << attribParamCoreIndex(i) << ")";
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const C2Param::Type &i) {
|
|
return os << StringPrintf("Param::Type(%08x: ", i.type())
|
|
<< attribParamIndex(i, false, 0) << ")";
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const C2Param::Index &i) {
|
|
return os << StringPrintf("Param::Index(%08x: ", (uint32_t)i)
|
|
<< attribParamIndex(i, true, i.stream()) << ")";
|
|
}
|
|
|
|
static std::string attribFieldId(const _C2FieldId &i) {
|
|
return StringPrintf("Field(@%02x+%02x)",
|
|
_C2ParamInspector::GetOffset(i),
|
|
_C2ParamInspector::GetSize(i));
|
|
}
|
|
|
|
|
|
std::ostream& operator<<(std::ostream& os, const _C2FieldId &i) {
|
|
return os << "<" << attribFieldId(i) << ">";
|
|
}
|
|
|
|
|
|
std::ostream& operator<<(std::ostream& os, const C2FieldDescriptor &i) {
|
|
os << attribFieldId(_C2ParamInspector::GetField(i)) << " ";
|
|
if (i.namedValues().size()) {
|
|
os << "enum ";
|
|
}
|
|
return os << asString(i.type()) << " " << i.name()
|
|
<< StringPrintf("[%zu]", i.extent());
|
|
}
|
|
|
|
|
|
std::ostream& operator<<(std::ostream& os, const C2ParamField &i) {
|
|
os << "<" << C2Param::Index(_C2ParamInspector::GetIndex(i))
|
|
<< StringPrintf("::Field(@%02x+%02x)>",
|
|
_C2ParamInspector::GetOffset(i),
|
|
_C2ParamInspector::GetSize(i));
|
|
return os;
|
|
}
|
|
|
|
|
|
/* -------------------------- _C2FieldValueHelper -------------------------- */
|
|
|
|
std::ostream& _C2FieldValueHelper<char>::put(std::ostream &os, const C2Value::Primitive &p) {
|
|
if (isprint(p.i32)) {
|
|
return os << StringPrintf("'%c'", p.i32);
|
|
} else {
|
|
return os << StringPrintf("'\\x%02x'", (uint32_t)p.i32);
|
|
}
|
|
}
|
|
|
|
std::ostream& _C2FieldValueHelper<uint8_t>::put(std::ostream &os, const C2Value::Primitive &p) {
|
|
return os << StringPrintf("0x%02x", p.u32);
|
|
}
|
|
|
|
/* ---------------------- C2FieldSupportedValuesHelper ---------------------- */
|
|
|
|
template<typename T>
|
|
std::ostream& operator<<(std::ostream &os, const c2_cntr_t<T> &v) {
|
|
return os << "ctr(" << v.peeku() << ")";
|
|
}
|
|
|
|
template<typename T>
|
|
std::ostream& operator<<(std::ostream& os, const C2SupportedRange<T> &i) {
|
|
os << "Range(";
|
|
_C2FieldValueHelper<T>::put(os, i.min());
|
|
os << "..";
|
|
_C2FieldValueHelper<T>::put(os, i.max());
|
|
os << " *= " << i.num() << " /= " << i.denom() << " += " << i.step() << ")";
|
|
return os;
|
|
}
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<char> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<uint8_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<int32_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<uint32_t> &i);
|
|
//template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<c2_cntr32_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<int64_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<uint64_t> &i);
|
|
//template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<c2_cntr64_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<float> &i);
|
|
|
|
template<typename T>
|
|
std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<T> &i) {
|
|
os << "Flags[";
|
|
if (!i.isEmpty()) {
|
|
os << "min=";
|
|
_C2FieldValueHelper<T>::put(os, i.min());
|
|
}
|
|
bool comma = false;
|
|
for (const T &v : i.flags()) {
|
|
if (comma) {
|
|
os << ", ";
|
|
}
|
|
_C2FieldValueHelper<T>::put(os, v);
|
|
comma = true;
|
|
}
|
|
os << "]";
|
|
return os;
|
|
}
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<char> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<uint8_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<int32_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<uint32_t> &i);
|
|
//template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<c2_cntr32_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<int64_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<uint64_t> &i);
|
|
//template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<c2_cntr64_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<float> &i);
|
|
|
|
template<typename T>
|
|
std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<T> &i) {
|
|
os << "Values[";
|
|
bool comma = false;
|
|
for (const T &v : i.values()) {
|
|
if (comma) {
|
|
os << ", ";
|
|
}
|
|
_C2FieldValueHelper<T>::put(os, v);
|
|
comma = true;
|
|
}
|
|
os << "]";
|
|
return os;
|
|
}
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<char> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<uint8_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<int32_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<uint32_t> &i);
|
|
//template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<c2_cntr32_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<int64_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<uint64_t> &i);
|
|
//template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<c2_cntr64_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<float> &i);
|
|
|
|
template<typename T>
|
|
struct C2FieldSupportedValuesHelper<T>::Impl {
|
|
Impl(const C2FieldSupportedValues &values);
|
|
|
|
private:
|
|
typedef typename _C2FieldValueHelper<T>::ValueType ValueType;
|
|
C2FieldSupportedValues::type_t _mType;
|
|
C2SupportedRange<ValueType> _mRange;
|
|
C2SupportedValueSet<ValueType> _mValues;
|
|
C2SupportedFlags<ValueType> _mFlags;
|
|
|
|
public:
|
|
// friend std::ostream& operator<< <T>(std::ostream& os, const C2FieldSupportedValuesHelper<T>::Impl &i);
|
|
// friend std::ostream& operator<<(std::ostream& os, const Impl &i);
|
|
std::ostream& streamOut(std::ostream& os) const;
|
|
};
|
|
|
|
template<typename T>
|
|
std::ostream& C2FieldSupportedValuesHelper<T>::Impl::streamOut(std::ostream& os) const {
|
|
if (_mType == C2FieldSupportedValues::RANGE) {
|
|
os << _mRange;
|
|
} else if (_mType == C2FieldSupportedValues::VALUES) {
|
|
os << _mValues;
|
|
} else if (_mType == C2FieldSupportedValues::FLAGS) {
|
|
os << _mFlags;
|
|
} else {
|
|
os << "Unknown FSV type: " << (uint32_t)_mType;
|
|
}
|
|
return os;
|
|
}
|
|
|
|
template<typename T>
|
|
std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<T> &i) {
|
|
return i._mImpl->streamOut(os);
|
|
}
|
|
template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<char> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<uint8_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<int32_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<uint32_t> &i);
|
|
//template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<c2_cntr32_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<int64_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<uint64_t> &i);
|
|
//template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<c2_cntr64_t> &i);
|
|
template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<float> &i);
|
|
|