Merge "AudioFlinger: Do not dereference a nullptr for a reference" into udc-dev-plus-aosp
diff --git a/media/codec2/hal/client/Android.bp b/media/codec2/hal/client/Android.bp
index 38c5aa5..61ec10e 100644
--- a/media/codec2/hal/client/Android.bp
+++ b/media/codec2/hal/client/Android.bp
@@ -28,6 +28,10 @@
"output.cpp",
],
+ defaults: [
+ "libcodec2-aidl-client-defaults",
+ ],
+
header_libs: [
"libcodec2_internal", // private
],
@@ -38,6 +42,7 @@
"android.hardware.media.c2@1.0",
"android.hardware.media.c2@1.1",
"android.hardware.media.c2@1.2",
+ "android.hardware.media.c2-V1-ndk",
"libbase",
"libbinder",
"libbinder_ndk",
diff --git a/media/codec2/hal/client/client.cpp b/media/codec2/hal/client/client.cpp
index 97c0806..00820eb 100644
--- a/media/codec2/hal/client/client.cpp
+++ b/media/codec2/hal/client/client.cpp
@@ -24,6 +24,7 @@
#include <C2Config.h> // for C2StreamUsageTuning
#include <C2PlatformSupport.h>
+#include <android/binder_auto_utils.h>
#include <android/hardware/media/bufferpool/2.0/IClientManager.h>
#include <android/hardware/media/c2/1.0/IComponent.h>
#include <android/hardware/media/c2/1.0/IComponentInterface.h>
@@ -32,8 +33,18 @@
#include <android/hardware/media/c2/1.0/IConfigurable.h>
#include <android/hidl/manager/1.2/IServiceManager.h>
+#include <aidl/android/hardware/media/c2/FieldSupportedValues.h>
+#include <aidl/android/hardware/media/c2/FieldSupportedValuesQuery.h>
+#include <aidl/android/hardware/media/c2/FieldSupportedValuesQueryResult.h>
+#include <aidl/android/hardware/media/c2/IComponent.h>
+#include <aidl/android/hardware/media/c2/IComponentInterface.h>
+#include <aidl/android/hardware/media/c2/IComponentStore.h>
+#include <aidl/android/hardware/media/c2/IConfigurable.h>
+#include <aidl/android/hardware/media/c2/ParamDescriptor.h>
+
#include <android-base/properties.h>
#include <bufferpool/ClientManager.h>
+#include <codec2/aidl/ParamTypes.h>
#include <codec2/hidl/1.0/types.h>
#include <codec2/hidl/1.1/types.h>
#include <codec2/hidl/1.2/types.h>
@@ -47,7 +58,6 @@
#include <system/window.h> // for NATIVE_WINDOW_QUERY_*
#include <media/stagefright/foundation/ADebug.h> // for asString(status_t)
-
#include <deque>
#include <iterator>
#include <limits>
@@ -65,11 +75,6 @@
using ::android::hardware::Return;
using ::android::hardware::Void;
-using namespace ::android::hardware::media::c2::V1_1;
-using namespace ::android::hardware::media::c2::V1_1::utils;
-using namespace ::android::hardware::media::bufferpool::V2_0;
-using namespace ::android::hardware::media::bufferpool::V2_0::implementation;
-
using HGraphicBufferProducer1 = ::android::hardware::graphics::bufferqueue::
V1_0::IGraphicBufferProducer;
using HGraphicBufferProducer2 = ::android::hardware::graphics::bufferqueue::
@@ -80,6 +85,13 @@
V2_0::utils::H2BGraphicBufferProducer;
using ::android::hardware::media::c2::V1_2::SurfaceSyncObj;
+namespace bufferpool_hidl = ::android::hardware::media::bufferpool::V2_0;
+namespace c2_aidl = ::aidl::android::hardware::media::c2;
+namespace c2_hidl_base = ::android::hardware::media::c2;
+namespace c2_hidl = ::android::hardware::media::c2::V1_2;
+
+using c2_hidl::utils::operator<<;
+
namespace /* unnamed */ {
// c2_status_t value that corresponds to hwbinder transaction failure.
@@ -254,15 +266,43 @@
return sCaches;
}
};
+// Codec2ConfigurableClient::HidlImpl
-// Codec2ConfigurableClient
+struct Codec2ConfigurableClient::HidlImpl : public Codec2ConfigurableClient::ImplBase {
+ typedef c2_hidl::IConfigurable Base;
-const C2String& Codec2ConfigurableClient::getName() const {
- return mName;
-}
+ // base cannot be null.
+ explicit HidlImpl(const sp<Base>& base);
-Codec2ConfigurableClient::Codec2ConfigurableClient(
- const sp<IConfigurable>& base)
+ const C2String& getName() const override {
+ return mName;
+ }
+
+ c2_status_t query(
+ const std::vector<C2Param*>& stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const heapParams) const override;
+
+ c2_status_t config(
+ const std::vector<C2Param*> ¶ms,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) override;
+
+ c2_status_t querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>>* const params
+ ) const override;
+
+ c2_status_t querySupportedValues(
+ std::vector<C2FieldSupportedValuesQuery>& fields,
+ c2_blocking_t mayBlock) const override;
+
+private:
+ sp<Base> mBase;
+ const C2String mName;
+};
+
+Codec2ConfigurableClient::HidlImpl::HidlImpl(const sp<Base>& base)
: mBase{base},
mName{[base]() -> C2String {
C2String outName;
@@ -274,12 +314,12 @@
}()} {
}
-c2_status_t Codec2ConfigurableClient::query(
+c2_status_t Codec2ConfigurableClient::HidlImpl::query(
const std::vector<C2Param*> &stackParams,
const std::vector<C2Param::Index> &heapParamIndices,
c2_blocking_t mayBlock,
std::vector<std::unique_ptr<C2Param>>* const heapParams) const {
- hidl_vec<ParamIndex> indices(
+ hidl_vec<c2_hidl::ParamIndex> indices(
stackParams.size() + heapParamIndices.size());
size_t numIndices = 0;
for (C2Param* const& stackParam : stackParams) {
@@ -287,12 +327,12 @@
LOG(WARNING) << "query -- null stack param encountered.";
continue;
}
- indices[numIndices++] = static_cast<ParamIndex>(stackParam->index());
+ indices[numIndices++] = static_cast<c2_hidl::ParamIndex>(stackParam->index());
}
size_t numStackIndices = numIndices;
for (const C2Param::Index& index : heapParamIndices) {
indices[numIndices++] =
- static_cast<ParamIndex>(static_cast<uint32_t>(index));
+ static_cast<c2_hidl::ParamIndex>(static_cast<uint32_t>(index));
}
indices.resize(numIndices);
if (heapParams) {
@@ -303,7 +343,7 @@
indices,
mayBlock == C2_MAY_BLOCK,
[&status, &numStackIndices, &stackParams, heapParams](
- Status s, const Params& p) {
+ c2_hidl::Status s, const c2_hidl::Params& p) {
status = static_cast<c2_status_t>(s);
if (status != C2_OK && status != C2_BAD_INDEX) {
LOG(DEBUG) << "query -- call failed: "
@@ -311,7 +351,7 @@
return;
}
std::vector<C2Param*> paramPointers;
- if (!parseParamsBlob(¶mPointers, p)) {
+ if (!c2_hidl::utils::parseParamsBlob(¶mPointers, p)) {
LOG(ERROR) << "query -- error while parsing params.";
status = C2_CORRUPTED;
return;
@@ -371,12 +411,12 @@
return status;
}
-c2_status_t Codec2ConfigurableClient::config(
+c2_status_t Codec2ConfigurableClient::HidlImpl::config(
const std::vector<C2Param*> ¶ms,
c2_blocking_t mayBlock,
std::vector<std::unique_ptr<C2SettingResult>>* const failures) {
- Params hidlParams;
- if (!createParamsBlob(&hidlParams, params)) {
+ c2_hidl::Params hidlParams;
+ if (!c2_hidl::utils::createParamsBlob(&hidlParams, params)) {
LOG(ERROR) << "config -- bad input.";
return C2_TRANSACTION_FAILED;
}
@@ -385,9 +425,9 @@
hidlParams,
mayBlock == C2_MAY_BLOCK,
[&status, ¶ms, failures](
- Status s,
- const hidl_vec<SettingResult> f,
- const Params& o) {
+ c2_hidl::Status s,
+ const hidl_vec<c2_hidl::SettingResult> f,
+ const c2_hidl::Params& o) {
status = static_cast<c2_status_t>(s);
if (status != C2_OK && status != C2_BAD_INDEX) {
LOG(DEBUG) << "config -- call failed: "
@@ -395,14 +435,14 @@
}
size_t i = failures->size();
failures->resize(i + f.size());
- for (const SettingResult& sf : f) {
- if (!objcpy(&(*failures)[i++], sf)) {
+ for (const c2_hidl::SettingResult& sf : f) {
+ if (!c2_hidl::utils::objcpy(&(*failures)[i++], sf)) {
LOG(ERROR) << "config -- "
<< "invalid SettingResult returned.";
return;
}
}
- if (!updateParamsFromBlob(params, o)) {
+ if (!c2_hidl::utils::updateParamsFromBlob(params, o)) {
LOG(ERROR) << "config -- "
<< "failed to parse returned params.";
status = C2_CORRUPTED;
@@ -415,7 +455,7 @@
return status;
}
-c2_status_t Codec2ConfigurableClient::querySupportedParams(
+c2_status_t Codec2ConfigurableClient::HidlImpl::querySupportedParams(
std::vector<std::shared_ptr<C2ParamDescriptor>>* const params) const {
// TODO: Cache and query properly!
c2_status_t status;
@@ -423,8 +463,8 @@
std::numeric_limits<uint32_t>::min(),
std::numeric_limits<uint32_t>::max(),
[&status, params](
- Status s,
- const hidl_vec<ParamDescriptor>& p) {
+ c2_hidl::Status s,
+ const hidl_vec<c2_hidl::ParamDescriptor>& p) {
status = static_cast<c2_status_t>(s);
if (status != C2_OK) {
LOG(DEBUG) << "querySupportedParams -- call failed: "
@@ -433,8 +473,8 @@
}
size_t i = params->size();
params->resize(i + p.size());
- for (const ParamDescriptor& sp : p) {
- if (!objcpy(&(*params)[i++], sp)) {
+ for (const c2_hidl::ParamDescriptor& sp : p) {
+ if (!c2_hidl::utils::objcpy(&(*params)[i++], sp)) {
LOG(ERROR) << "querySupportedParams -- "
<< "invalid returned ParamDescriptor.";
return;
@@ -448,12 +488,12 @@
return status;
}
-c2_status_t Codec2ConfigurableClient::querySupportedValues(
+c2_status_t Codec2ConfigurableClient::HidlImpl::querySupportedValues(
std::vector<C2FieldSupportedValuesQuery>& fields,
c2_blocking_t mayBlock) const {
- hidl_vec<FieldSupportedValuesQuery> inFields(fields.size());
+ hidl_vec<c2_hidl::FieldSupportedValuesQuery> inFields(fields.size());
for (size_t i = 0; i < fields.size(); ++i) {
- if (!objcpy(&inFields[i], fields[i])) {
+ if (!c2_hidl::utils::objcpy(&inFields[i], fields[i])) {
LOG(ERROR) << "querySupportedValues -- bad input";
return C2_TRANSACTION_FAILED;
}
@@ -464,8 +504,8 @@
inFields,
mayBlock == C2_MAY_BLOCK,
[&status, &inFields, &fields](
- Status s,
- const hidl_vec<FieldSupportedValuesQueryResult>& r) {
+ c2_hidl::Status s,
+ const hidl_vec<c2_hidl::FieldSupportedValuesQueryResult>& r) {
status = static_cast<c2_status_t>(s);
if (status != C2_OK) {
LOG(DEBUG) << "querySupportedValues -- call failed: "
@@ -480,7 +520,7 @@
return;
}
for (size_t i = 0; i < fields.size(); ++i) {
- if (!objcpy(&fields[i], inFields[i], r[i])) {
+ if (!c2_hidl::utils::objcpy(&fields[i], inFields[i], r[i])) {
LOG(ERROR) << "querySupportedValues -- "
"invalid returned value.";
status = C2_CORRUPTED;
@@ -495,14 +535,304 @@
return status;
}
+// Codec2ConfigurableClient::AidlImpl
+
+struct Codec2ConfigurableClient::AidlImpl : public Codec2ConfigurableClient::ImplBase {
+ typedef c2_aidl::IConfigurable Base;
+
+ // base cannot be null.
+ explicit AidlImpl(const std::shared_ptr<Base>& base);
+
+ const C2String& getName() const override {
+ return mName;
+ }
+
+ c2_status_t query(
+ const std::vector<C2Param*>& stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const heapParams) const override;
+
+ c2_status_t config(
+ const std::vector<C2Param*> ¶ms,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) override;
+
+ c2_status_t querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>>* const params
+ ) const override;
+
+ c2_status_t querySupportedValues(
+ std::vector<C2FieldSupportedValuesQuery>& fields,
+ c2_blocking_t mayBlock) const override;
+
+private:
+ std::shared_ptr<Base> mBase;
+ const C2String mName;
+};
+
+Codec2ConfigurableClient::AidlImpl::AidlImpl(const std::shared_ptr<Base>& base)
+ : mBase{base},
+ mName{[base]() -> C2String {
+ std::string outName;
+ ndk::ScopedAStatus status = base->getName(&outName);
+ return status.isOk() ? outName : "";
+ }()} {
+}
+
+c2_status_t Codec2ConfigurableClient::AidlImpl::query(
+ const std::vector<C2Param*> &stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const heapParams) const {
+ std::vector<int> indices(
+ stackParams.size() + heapParamIndices.size());
+ size_t numIndices = 0;
+ for (C2Param* const& stackParam : stackParams) {
+ if (!stackParam) {
+ LOG(WARNING) << "query -- null stack param encountered.";
+ continue;
+ }
+ indices[numIndices++] = int(stackParam->index());
+ }
+ size_t numStackIndices = numIndices;
+ for (const C2Param::Index& index : heapParamIndices) {
+ indices[numIndices++] = int(static_cast<uint32_t>(index));
+ }
+ indices.resize(numIndices);
+ if (heapParams) {
+ heapParams->reserve(heapParams->size() + numIndices);
+ }
+ c2_aidl::Params result;
+ ndk::ScopedAStatus transStatus = mBase->query(indices, (mayBlock == C2_MAY_BLOCK), &result);
+ if (!transStatus.isOk()) {
+ if (transStatus.getExceptionCode() == EX_SERVICE_SPECIFIC) {
+ c2_status_t status = static_cast<c2_status_t>(transStatus.getServiceSpecificError());
+ LOG(DEBUG) << "query -- call failed: " << status << ".";
+ return status;
+ } else {
+ LOG(ERROR) << "query -- transaction failed.";
+ return C2_TRANSACTION_FAILED;
+ }
+ }
+
+ c2_status_t status = C2_OK;
+ std::vector<C2Param*> paramPointers;
+ if (!c2_aidl::utils::ParseParamsBlob(¶mPointers, result)) {
+ LOG(ERROR) << "query -- error while parsing params.";
+ return C2_CORRUPTED;
+ }
+ size_t i = 0;
+ for (auto it = paramPointers.begin();
+ it != paramPointers.end(); ) {
+ C2Param* paramPointer = *it;
+ if (numStackIndices > 0) {
+ --numStackIndices;
+ if (!paramPointer) {
+ LOG(DEBUG) << "query -- null stack param.";
+ ++it;
+ continue;
+ }
+ for (; i < stackParams.size() && !stackParams[i]; ) {
+ ++i;
+ }
+ if (i >= stackParams.size()) {
+ LOG(ERROR) << "query -- unexpected error.";
+ status = C2_CORRUPTED;
+ break;
+ }
+ if (stackParams[i]->index() != paramPointer->index()) {
+ LOG(DEBUG) << "query -- param skipped: "
+ "index = "
+ << stackParams[i]->index() << ".";
+ stackParams[i++]->invalidate();
+ // this means that the param could not be queried.
+ // signalling C2_BAD_INDEX to the client.
+ status = C2_BAD_INDEX;
+ continue;
+ }
+ if (!stackParams[i++]->updateFrom(*paramPointer)) {
+ LOG(WARNING) << "query -- param update failed: "
+ "index = "
+ << paramPointer->index() << ".";
+ }
+ } else {
+ if (!paramPointer) {
+ LOG(DEBUG) << "query -- null heap param.";
+ ++it;
+ continue;
+ }
+ if (!heapParams) {
+ LOG(WARNING) << "query -- "
+ "unexpected extra stack param.";
+ } else {
+ heapParams->emplace_back(C2Param::Copy(*paramPointer));
+ }
+ }
+ ++it;
+ }
+ return status;
+}
+
+c2_status_t Codec2ConfigurableClient::AidlImpl::config(
+ const std::vector<C2Param*> ¶ms,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) {
+ c2_aidl::Params aidlParams;
+ if (!c2_aidl::utils::CreateParamsBlob(&aidlParams, params)) {
+ LOG(ERROR) << "config -- bad input.";
+ return C2_TRANSACTION_FAILED;
+ }
+ c2_aidl::IConfigurable::ConfigResult result;
+ ndk::ScopedAStatus transStatus = mBase->config(aidlParams, (mayBlock == C2_MAY_BLOCK), &result);
+ if (!transStatus.isOk()) {
+ if (transStatus.getExceptionCode() == EX_SERVICE_SPECIFIC) {
+ c2_status_t status = static_cast<c2_status_t>(transStatus.getServiceSpecificError());
+ LOG(DEBUG) << "config -- call failed: " << status << ".";
+ return status;
+ } else {
+ LOG(ERROR) << "config -- transaction failed.";
+ return C2_TRANSACTION_FAILED;
+ }
+ }
+ c2_status_t status = C2_OK;
+ size_t i = failures->size();
+ failures->resize(i + result.failures.size());
+ for (const c2_aidl::SettingResult& sf : result.failures) {
+ if (!c2_aidl::utils::FromAidl(&(*failures)[i++], sf)) {
+ LOG(ERROR) << "config -- invalid SettingResult returned.";
+ return C2_CORRUPTED;
+ }
+ }
+ if (!c2_aidl::utils::UpdateParamsFromBlob(params, result.params)) {
+ LOG(ERROR) << "config -- "
+ << "failed to parse returned params.";
+ status = C2_CORRUPTED;
+ }
+ return status;
+}
+
+c2_status_t Codec2ConfigurableClient::AidlImpl::querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>>* const params) const {
+ // TODO: Cache and query properly!
+ std::vector<c2_aidl::ParamDescriptor> result;
+ ndk::ScopedAStatus transStatus = mBase->querySupportedParams(
+ std::numeric_limits<uint32_t>::min(),
+ std::numeric_limits<uint32_t>::max(),
+ &result);
+ if (!transStatus.isOk()) {
+ if (transStatus.getExceptionCode() == EX_SERVICE_SPECIFIC) {
+ c2_status_t status = static_cast<c2_status_t>(transStatus.getServiceSpecificError());
+ LOG(DEBUG) << "querySupportedParams -- call failed: " << status << ".";
+ return status;
+ } else {
+ LOG(ERROR) << "querySupportedParams -- transaction failed.";
+ return C2_TRANSACTION_FAILED;
+ }
+ }
+ c2_status_t status = C2_OK;
+ size_t i = params->size();
+ params->resize(i + result.size());
+ for (const c2_aidl::ParamDescriptor& sp : result) {
+ if (!c2_aidl::utils::FromAidl(&(*params)[i++], sp)) {
+ LOG(ERROR) << "querySupportedParams -- invalid returned ParamDescriptor.";
+ return C2_CORRUPTED;
+ }
+ }
+ return status;
+}
+
+c2_status_t Codec2ConfigurableClient::AidlImpl::querySupportedValues(
+ std::vector<C2FieldSupportedValuesQuery>& fields,
+ c2_blocking_t mayBlock) const {
+ std::vector<c2_aidl::FieldSupportedValuesQuery> inFields(fields.size());
+ for (size_t i = 0; i < fields.size(); ++i) {
+ if (!c2_aidl::utils::ToAidl(&inFields[i], fields[i])) {
+ LOG(ERROR) << "querySupportedValues -- bad input";
+ return C2_TRANSACTION_FAILED;
+ }
+ }
+
+ std::vector<c2_aidl::FieldSupportedValuesQueryResult> result;
+ ndk::ScopedAStatus transStatus = mBase->querySupportedValues(
+ inFields, (mayBlock == C2_MAY_BLOCK), &result);
+ if (!transStatus.isOk()) {
+ if (transStatus.getExceptionCode() == EX_SERVICE_SPECIFIC) {
+ c2_status_t status = static_cast<c2_status_t>(transStatus.getServiceSpecificError());
+ LOG(DEBUG) << "querySupportedValues -- call failed: " << status << ".";
+ return status;
+ } else {
+ LOG(ERROR) << "querySupportedValues -- transaction failed.";
+ return C2_TRANSACTION_FAILED;
+ }
+ }
+ c2_status_t status = C2_OK;
+ if (result.size() != fields.size()) {
+ LOG(ERROR) << "querySupportedValues -- "
+ "input and output lists "
+ "have different sizes.";
+ return C2_CORRUPTED;
+ }
+ for (size_t i = 0; i < fields.size(); ++i) {
+ if (!c2_aidl::utils::FromAidl(&fields[i], inFields[i], result[i])) {
+ LOG(ERROR) << "querySupportedValues -- "
+ "invalid returned value.";
+ return C2_CORRUPTED;
+ }
+ }
+ return status;
+}
+
+// Codec2ConfigurableClient
+
+Codec2ConfigurableClient::Codec2ConfigurableClient(const sp<HidlBase> &hidlBase)
+ : mImpl(new Codec2ConfigurableClient::HidlImpl(hidlBase)) {
+}
+
+Codec2ConfigurableClient::Codec2ConfigurableClient(
+ const std::shared_ptr<AidlBase> &aidlBase)
+ : mImpl(new Codec2ConfigurableClient::AidlImpl(aidlBase)) {
+}
+
+const C2String& Codec2ConfigurableClient::getName() const {
+ return mImpl->getName();
+}
+
+c2_status_t Codec2ConfigurableClient::query(
+ const std::vector<C2Param*>& stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const heapParams) const {
+ return mImpl->query(stackParams, heapParamIndices, mayBlock, heapParams);
+}
+
+c2_status_t Codec2ConfigurableClient::config(
+ const std::vector<C2Param*> ¶ms,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) {
+ return mImpl->config(params, mayBlock, failures);
+}
+
+c2_status_t Codec2ConfigurableClient::querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>>* const params) const {
+ return mImpl->querySupportedParams(params);
+}
+
+c2_status_t Codec2ConfigurableClient::querySupportedValues(
+ std::vector<C2FieldSupportedValuesQuery>& fields,
+ c2_blocking_t mayBlock) const {
+ return mImpl->querySupportedValues(fields, mayBlock);
+}
+
+
// Codec2Client::Component::HidlListener
-struct Codec2Client::Component::HidlListener : public IComponentListener {
+struct Codec2Client::Component::HidlListener : public c2_hidl::IComponentListener {
std::weak_ptr<Component> component;
std::weak_ptr<Listener> base;
- virtual Return<void> onWorkDone(const WorkBundle& workBundle) override {
+ virtual Return<void> onWorkDone(const c2_hidl::WorkBundle& workBundle) override {
std::list<std::unique_ptr<C2Work>> workItems;
- if (!objcpy(&workItems, workBundle)) {
+ if (!c2_hidl::utils::objcpy(&workItems, workBundle)) {
LOG(DEBUG) << "onWorkDone -- received corrupted WorkBundle.";
return Void();
}
@@ -521,12 +851,12 @@
}
virtual Return<void> onTripped(
- const hidl_vec<SettingResult>& settingResults) override {
+ const hidl_vec<c2_hidl::SettingResult>& settingResults) override {
std::vector<std::shared_ptr<C2SettingResult>> c2SettingResults(
settingResults.size());
for (size_t i = 0; i < settingResults.size(); ++i) {
std::unique_ptr<C2SettingResult> c2SettingResult;
- if (!objcpy(&c2SettingResult, settingResults[i])) {
+ if (!c2_hidl::utils::objcpy(&c2SettingResult, settingResults[i])) {
LOG(DEBUG) << "onTripped -- received corrupted SettingResult.";
return Void();
}
@@ -540,13 +870,13 @@
return Void();
}
- virtual Return<void> onError(Status s, uint32_t errorCode) override {
+ virtual Return<void> onError(c2_hidl::Status s, uint32_t errorCode) override {
LOG(DEBUG) << "onError --"
<< " status = " << s
<< ", errorCode = " << errorCode
<< ".";
if (std::shared_ptr<Listener> listener = base.lock()) {
- listener->onError(component, s == Status::OK ?
+ listener->onError(component, s == c2_hidl::Status::OK ?
errorCode : static_cast<c2_status_t>(s));
} else {
LOG(DEBUG) << "onError -- listener died.";
@@ -610,18 +940,18 @@
// Codec2Client
Codec2Client::Codec2Client(sp<Base> const& base,
- sp<IConfigurable> const& configurable,
+ sp<c2_hidl::IConfigurable> const& configurable,
size_t serviceIndex)
: Configurable{configurable},
mBase1_0{base},
mBase1_1{Base1_1::castFrom(base)},
mBase1_2{Base1_2::castFrom(base)},
mServiceIndex{serviceIndex} {
- Return<sp<IClientManager>> transResult = base->getPoolClientManager();
+ Return<sp<bufferpool_hidl::IClientManager>> transResult = base->getPoolClientManager();
if (!transResult.isOk()) {
LOG(ERROR) << "getPoolClientManager -- transaction failed.";
} else {
- mHostPoolManager = static_cast<sp<IClientManager>>(transResult);
+ mHostPoolManager = static_cast<sp<bufferpool_hidl::IClientManager>>(transResult);
}
}
@@ -658,10 +988,10 @@
transStatus = mBase1_2->createComponent_1_2(
name,
hidlListener,
- ClientManager::getInstance(),
+ bufferpool_hidl::implementation::ClientManager::getInstance(),
[&status, component, hidlListener](
- Status s,
- const sp<IComponent>& c) {
+ c2_hidl::Status s,
+ const sp<c2_hidl::IComponent>& c) {
status = static_cast<c2_status_t>(s);
if (status != C2_OK) {
return;
@@ -674,10 +1004,10 @@
transStatus = mBase1_1->createComponent_1_1(
name,
hidlListener,
- ClientManager::getInstance(),
+ bufferpool_hidl::implementation::ClientManager::getInstance(),
[&status, component, hidlListener](
- Status s,
- const sp<IComponent>& c) {
+ c2_hidl::Status s,
+ const sp<c2_hidl_base::V1_1::IComponent>& c) {
status = static_cast<c2_status_t>(s);
if (status != C2_OK) {
return;
@@ -689,10 +1019,10 @@
transStatus = mBase1_0->createComponent(
name,
hidlListener,
- ClientManager::getInstance(),
+ bufferpool_hidl::implementation::ClientManager::getInstance(),
[&status, component, hidlListener](
- Status s,
- const sp<hardware::media::c2::V1_0::IComponent>& c) {
+ c2_hidl::Status s,
+ const sp<c2_hidl_base::V1_0::IComponent>& c) {
status = static_cast<c2_status_t>(s);
if (status != C2_OK) {
return;
@@ -740,8 +1070,8 @@
Return<void> transStatus = mBase1_0->createInterface(
name,
[&status, interface](
- Status s,
- const sp<IComponentInterface>& i) {
+ c2_hidl::Status s,
+ const sp<c2_hidl::IComponentInterface>& i) {
status = static_cast<c2_status_t>(s);
if (status != C2_OK) {
return;
@@ -771,8 +1101,8 @@
c2_status_t status;
Return<void> transStatus = mBase1_0->createInputSurface(
[&status, inputSurface](
- Status s,
- const sp<IInputSurface>& i) {
+ c2_hidl::Status s,
+ const sp<c2_hidl::IInputSurface>& i) {
status = static_cast<c2_status_t>(s);
if (status != C2_OK) {
return;
@@ -798,16 +1128,16 @@
std::vector<C2Component::Traits> traits;
std::string const& serviceName = getServiceName();
Return<void> transStatus = mBase1_0->listComponents(
- [&traits, &serviceName](Status s,
- const hidl_vec<IComponentStore::ComponentTraits>& t) {
- if (s != Status::OK) {
+ [&traits, &serviceName](c2_hidl::Status s,
+ const hidl_vec<c2_hidl::IComponentStore::ComponentTraits>& t) {
+ if (s != c2_hidl::Status::OK) {
LOG(DEBUG) << "_listComponents -- call failed: "
<< static_cast<c2_status_t>(s) << ".";
return;
}
traits.resize(t.size());
for (size_t i = 0; i < t.size(); ++i) {
- if (!objcpy(&traits[i], t[i])) {
+ if (!c2_hidl::utils::objcpy(&traits[i], t[i])) {
LOG(ERROR) << "_listComponents -- corrupted output.";
return;
}
@@ -839,14 +1169,14 @@
// should reflect the HAL API.
struct SimpleParamReflector : public C2ParamReflector {
virtual std::unique_ptr<C2StructDescriptor> describe(C2Param::CoreIndex coreIndex) const {
- hidl_vec<ParamIndex> indices(1);
- indices[0] = static_cast<ParamIndex>(coreIndex.coreIndex());
+ hidl_vec<c2_hidl::ParamIndex> indices(1);
+ indices[0] = static_cast<c2_hidl::ParamIndex>(coreIndex.coreIndex());
std::unique_ptr<C2StructDescriptor> descriptor;
Return<void> transStatus = mBase->getStructDescriptors(
indices,
[&descriptor](
- Status s,
- const hidl_vec<StructDescriptor>& sd) {
+ c2_hidl::Status s,
+ const hidl_vec<c2_hidl::StructDescriptor>& sd) {
c2_status_t status = static_cast<c2_status_t>(s);
if (status != C2_OK) {
LOG(DEBUG) << "SimpleParamReflector -- "
@@ -864,7 +1194,7 @@
descriptor.reset();
return;
}
- if (!objcpy(&descriptor, sd[0])) {
+ if (!c2_hidl::utils::objcpy(&descriptor, sd[0])) {
LOG(DEBUG) << "SimpleParamReflector -- "
"getStructDescriptors() returned "
"corrupted data.";
@@ -1196,11 +1526,11 @@
// Codec2Client::Interface
Codec2Client::Interface::Interface(const sp<Base>& base)
: Configurable{
- [base]() -> sp<IConfigurable> {
- Return<sp<IConfigurable>> transResult =
+ [base]() -> sp<c2_hidl::IConfigurable> {
+ Return<sp<c2_hidl::IConfigurable>> transResult =
base->getConfigurable();
return transResult.isOk() ?
- static_cast<sp<IConfigurable>>(transResult) :
+ static_cast<sp<c2_hidl::IConfigurable>>(transResult) :
nullptr;
}()
},
@@ -1210,17 +1540,17 @@
// Codec2Client::Component
Codec2Client::Component::Component(const sp<Base>& base)
: Configurable{
- [base]() -> sp<IConfigurable> {
- Return<sp<IComponentInterface>> transResult1 =
+ [base]() -> sp<c2_hidl::IConfigurable> {
+ Return<sp<c2_hidl::IComponentInterface>> transResult1 =
base->getInterface();
if (!transResult1.isOk()) {
return nullptr;
}
- Return<sp<IConfigurable>> transResult2 =
- static_cast<sp<IComponentInterface>>(transResult1)->
+ Return<sp<c2_hidl::IConfigurable>> transResult2 =
+ static_cast<sp<c2_hidl::IComponentInterface>>(transResult1)->
getConfigurable();
return transResult2.isOk() ?
- static_cast<sp<IConfigurable>>(transResult2) :
+ static_cast<sp<c2_hidl::IConfigurable>>(transResult2) :
nullptr;
}()
},
@@ -1233,17 +1563,17 @@
Codec2Client::Component::Component(const sp<Base1_1>& base)
: Configurable{
- [base]() -> sp<IConfigurable> {
- Return<sp<IComponentInterface>> transResult1 =
+ [base]() -> sp<c2_hidl::IConfigurable> {
+ Return<sp<c2_hidl::IComponentInterface>> transResult1 =
base->getInterface();
if (!transResult1.isOk()) {
return nullptr;
}
- Return<sp<IConfigurable>> transResult2 =
- static_cast<sp<IComponentInterface>>(transResult1)->
+ Return<sp<c2_hidl::IConfigurable>> transResult2 =
+ static_cast<sp<c2_hidl::IComponentInterface>>(transResult1)->
getConfigurable();
return transResult2.isOk() ?
- static_cast<sp<IConfigurable>>(transResult2) :
+ static_cast<sp<c2_hidl::IConfigurable>>(transResult2) :
nullptr;
}()
},
@@ -1256,17 +1586,17 @@
Codec2Client::Component::Component(const sp<Base1_2>& base)
: Configurable{
- [base]() -> sp<IConfigurable> {
- Return<sp<IComponentInterface>> transResult1 =
+ [base]() -> sp<c2_hidl::IConfigurable> {
+ Return<sp<c2_hidl::IComponentInterface>> transResult1 =
base->getInterface();
if (!transResult1.isOk()) {
return nullptr;
}
- Return<sp<IConfigurable>> transResult2 =
- static_cast<sp<IComponentInterface>>(transResult1)->
+ Return<sp<c2_hidl::IConfigurable>> transResult2 =
+ static_cast<sp<c2_hidl::IComponentInterface>>(transResult1)->
getConfigurable();
return transResult2.isOk() ?
- static_cast<sp<IConfigurable>>(transResult2) :
+ static_cast<sp<c2_hidl::IConfigurable>>(transResult2) :
nullptr;
}()
},
@@ -1288,9 +1618,9 @@
Return<void> transStatus = mBase1_0->createBlockPool(
static_cast<uint32_t>(id),
[&status, blockPoolId, configurable](
- Status s,
+ c2_hidl::Status s,
uint64_t pId,
- const sp<IConfigurable>& c) {
+ const sp<c2_hidl::IConfigurable>& c) {
status = static_cast<c2_status_t>(s);
configurable->reset();
if (status != C2_OK) {
@@ -1310,13 +1640,13 @@
c2_status_t Codec2Client::Component::destroyBlockPool(
C2BlockPool::local_id_t localId) {
- Return<Status> transResult = mBase1_0->destroyBlockPool(
+ Return<c2_hidl::Status> transResult = mBase1_0->destroyBlockPool(
static_cast<uint64_t>(localId));
if (!transResult.isOk()) {
LOG(ERROR) << "destroyBlockPool -- transaction failed.";
return C2_TRANSACTION_FAILED;
}
- return static_cast<c2_status_t>(static_cast<Status>(transResult));
+ return static_cast<c2_status_t>(static_cast<c2_hidl::Status>(transResult));
}
void Codec2Client::Component::handleOnWorkDone(
@@ -1327,18 +1657,18 @@
c2_status_t Codec2Client::Component::queue(
std::list<std::unique_ptr<C2Work>>* const items) {
- WorkBundle workBundle;
+ c2_hidl::WorkBundle workBundle;
if (!objcpy(&workBundle, *items, mBufferPoolSender.get())) {
LOG(ERROR) << "queue -- bad input.";
return C2_TRANSACTION_FAILED;
}
- Return<Status> transStatus = mBase1_0->queue(workBundle);
+ Return<c2_hidl::Status> transStatus = mBase1_0->queue(workBundle);
if (!transStatus.isOk()) {
LOG(ERROR) << "queue -- transaction failed.";
return C2_TRANSACTION_FAILED;
}
c2_status_t status =
- static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ static_cast<c2_status_t>(static_cast<c2_hidl::Status>(transStatus));
if (status != C2_OK) {
LOG(DEBUG) << "queue -- call failed: " << status << ".";
}
@@ -1352,13 +1682,13 @@
c2_status_t status;
Return<void> transStatus = mBase1_0->flush(
[&status, flushedWork](
- Status s, const WorkBundle& wb) {
+ c2_hidl::Status s, const c2_hidl::WorkBundle& wb) {
status = static_cast<c2_status_t>(s);
if (status != C2_OK) {
LOG(DEBUG) << "flush -- call failed: " << status << ".";
return;
}
- if (!objcpy(flushedWork, wb)) {
+ if (!c2_hidl::utils::objcpy(flushedWork, wb)) {
status = C2_CORRUPTED;
} else {
status = C2_OK;
@@ -1391,14 +1721,14 @@
}
c2_status_t Codec2Client::Component::drain(C2Component::drain_mode_t mode) {
- Return<Status> transStatus = mBase1_0->drain(
+ Return<c2_hidl::Status> transStatus = mBase1_0->drain(
mode == C2Component::DRAIN_COMPONENT_WITH_EOS);
if (!transStatus.isOk()) {
LOG(ERROR) << "drain -- transaction failed.";
return C2_TRANSACTION_FAILED;
}
c2_status_t status =
- static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ static_cast<c2_status_t>(static_cast<c2_hidl::Status>(transStatus));
if (status != C2_OK) {
LOG(DEBUG) << "drain -- call failed: " << status << ".";
}
@@ -1406,13 +1736,13 @@
}
c2_status_t Codec2Client::Component::start() {
- Return<Status> transStatus = mBase1_0->start();
+ Return<c2_hidl::Status> transStatus = mBase1_0->start();
if (!transStatus.isOk()) {
LOG(ERROR) << "start -- transaction failed.";
return C2_TRANSACTION_FAILED;
}
c2_status_t status =
- static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ static_cast<c2_status_t>(static_cast<c2_hidl::Status>(transStatus));
if (status != C2_OK) {
LOG(DEBUG) << "start -- call failed: " << status << ".";
}
@@ -1420,13 +1750,13 @@
}
c2_status_t Codec2Client::Component::stop() {
- Return<Status> transStatus = mBase1_0->stop();
+ Return<c2_hidl::Status> transStatus = mBase1_0->stop();
if (!transStatus.isOk()) {
LOG(ERROR) << "stop -- transaction failed.";
return C2_TRANSACTION_FAILED;
}
c2_status_t status =
- static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ static_cast<c2_status_t>(static_cast<c2_hidl::Status>(transStatus));
if (status != C2_OK) {
LOG(DEBUG) << "stop -- call failed: " << status << ".";
}
@@ -1434,13 +1764,13 @@
}
c2_status_t Codec2Client::Component::reset() {
- Return<Status> transStatus = mBase1_0->reset();
+ Return<c2_hidl::Status> transStatus = mBase1_0->reset();
if (!transStatus.isOk()) {
LOG(ERROR) << "reset -- transaction failed.";
return C2_TRANSACTION_FAILED;
}
c2_status_t status =
- static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ static_cast<c2_status_t>(static_cast<c2_hidl::Status>(transStatus));
if (status != C2_OK) {
LOG(DEBUG) << "reset -- call failed: " << status << ".";
}
@@ -1448,13 +1778,13 @@
}
c2_status_t Codec2Client::Component::release() {
- Return<Status> transStatus = mBase1_0->release();
+ Return<c2_hidl::Status> transStatus = mBase1_0->release();
if (!transStatus.isOk()) {
LOG(ERROR) << "release -- transaction failed.";
return C2_TRANSACTION_FAILED;
}
c2_status_t status =
- static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ static_cast<c2_status_t>(static_cast<c2_hidl::Status>(transStatus));
if (status != C2_OK) {
LOG(DEBUG) << "release -- call failed: " << status << ".";
}
@@ -1471,7 +1801,7 @@
c2_status_t status{};
Return<void> transStatus = mBase1_1->configureVideoTunnel(avSyncHwId,
[&status, sidebandHandle](
- Status s, hardware::hidl_handle const& h) {
+ c2_hidl::Status s, hardware::hidl_handle const& h) {
status = static_cast<c2_status_t>(s);
if (h.getNativeHandle()) {
*sidebandHandle = native_handle_clone(h.getNativeHandle());
@@ -1550,7 +1880,7 @@
ALOGD("setOutputSurface -- generation=%u consumer usage=%#llx%s",
generation, (long long)consumerUsage, syncObj ? " sync" : "");
- Return<Status> transStatus = syncObj ?
+ Return<c2_hidl::Status> transStatus = syncObj ?
mBase1_2->setOutputSurfaceWithSyncObj(
static_cast<uint64_t>(blockPoolId),
bqId == 0 ? nullHgbp : igbp, *syncObj) :
@@ -1565,7 +1895,7 @@
return C2_TRANSACTION_FAILED;
}
c2_status_t status =
- static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ static_cast<c2_status_t>(static_cast<c2_hidl::Status>(transStatus));
if (status != C2_OK) {
LOG(DEBUG) << "setOutputSurface -- call failed: " << status << ".";
}
@@ -1593,13 +1923,13 @@
C2BlockPool::local_id_t blockPoolId) {
std::scoped_lock lock(mOutputMutex);
mOutputBufferQueue->stop();
- Return<Status> transStatus = mBase1_0->setOutputSurface(
+ Return<c2_hidl::Status> transStatus = mBase1_0->setOutputSurface(
static_cast<uint64_t>(blockPoolId), nullptr);
if (!transStatus.isOk()) {
LOG(ERROR) << "setOutputSurface(stopUsingOutputSurface) -- transaction failed.";
} else {
c2_status_t status =
- static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ static_cast<c2_status_t>(static_cast<c2_hidl::Status>(transStatus));
if (status != C2_OK) {
LOG(DEBUG) << "setOutputSurface(stopUsingOutputSurface) -- call failed: "
<< status << ".";
@@ -1615,7 +1945,7 @@
Return<void> transStatus = mBase1_0->connectToInputSurface(
inputSurface->mBase,
[&status, connection](
- Status s, const sp<IInputSurfaceConnection>& c) {
+ c2_hidl::Status s, const sp<c2_hidl::IInputSurfaceConnection>& c) {
status = static_cast<c2_status_t>(s);
if (status != C2_OK) {
LOG(DEBUG) << "connectToInputSurface -- call failed: "
@@ -1639,7 +1969,7 @@
Return<void> transStatus = mBase1_0->connectToOmxInputSurface(
producer, source,
[&status, connection](
- Status s, const sp<IInputSurfaceConnection>& c) {
+ c2_hidl::Status s, const sp<c2_hidl::IInputSurfaceConnection>& c) {
status = static_cast<c2_status_t>(s);
if (status != C2_OK) {
LOG(DEBUG) << "connectToOmxInputSurface -- call failed: "
@@ -1656,13 +1986,13 @@
}
c2_status_t Codec2Client::Component::disconnectFromInputSurface() {
- Return<Status> transStatus = mBase1_0->disconnectFromInputSurface();
+ Return<c2_hidl::Status> transStatus = mBase1_0->disconnectFromInputSurface();
if (!transStatus.isOk()) {
LOG(ERROR) << "disconnectToInputSurface -- transaction failed.";
return C2_TRANSACTION_FAILED;
}
c2_status_t status =
- static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ static_cast<c2_status_t>(static_cast<c2_hidl::Status>(transStatus));
if (status != C2_OK) {
LOG(DEBUG) << "disconnectFromInputSurface -- call failed: "
<< status << ".";
@@ -1709,13 +2039,13 @@
}
// Codec2Client::InputSurface
-Codec2Client::InputSurface::InputSurface(const sp<IInputSurface>& base)
+Codec2Client::InputSurface::InputSurface(const sp<c2_hidl::IInputSurface>& base)
: Configurable{
- [base]() -> sp<IConfigurable> {
- Return<sp<IConfigurable>> transResult =
+ [base]() -> sp<c2_hidl::IConfigurable> {
+ Return<sp<c2_hidl::IConfigurable>> transResult =
base->getConfigurable();
return transResult.isOk() ?
- static_cast<sp<IConfigurable>>(transResult) :
+ static_cast<sp<c2_hidl::IConfigurable>>(transResult) :
nullptr;
}()
},
@@ -1735,19 +2065,19 @@
return mGraphicBufferProducer;
}
-sp<IInputSurface> Codec2Client::InputSurface::getHalInterface() const {
+sp<c2_hidl::IInputSurface> Codec2Client::InputSurface::getHalInterface() const {
return mBase;
}
// Codec2Client::InputSurfaceConnection
Codec2Client::InputSurfaceConnection::InputSurfaceConnection(
- const sp<IInputSurfaceConnection>& base)
+ const sp<c2_hidl::IInputSurfaceConnection>& base)
: Configurable{
- [base]() -> sp<IConfigurable> {
- Return<sp<IConfigurable>> transResult =
+ [base]() -> sp<c2_hidl::IConfigurable> {
+ Return<sp<c2_hidl::IConfigurable>> transResult =
base->getConfigurable();
return transResult.isOk() ?
- static_cast<sp<IConfigurable>>(transResult) :
+ static_cast<sp<c2_hidl::IConfigurable>>(transResult) :
nullptr;
}()
},
@@ -1755,8 +2085,8 @@
}
c2_status_t Codec2Client::InputSurfaceConnection::disconnect() {
- Return<Status> transResult = mBase->disconnect();
- return static_cast<c2_status_t>(static_cast<Status>(transResult));
+ Return<c2_hidl::Status> transResult = mBase->disconnect();
+ return static_cast<c2_status_t>(static_cast<c2_hidl::Status>(transResult));
}
} // namespace android
diff --git a/media/codec2/hal/client/include/codec2/hidl/client.h b/media/codec2/hal/client/include/codec2/hidl/client.h
index 5267394..6fa19b0 100644
--- a/media/codec2/hal/client/include/codec2/hidl/client.h
+++ b/media/codec2/hal/client/include/codec2/hidl/client.h
@@ -84,6 +84,13 @@
struct IComponentStore;
} // namespace android::hardware::media::c2::V1_2
+namespace aidl::android::hardware::media::c2 {
+class IComponent;
+class IComponentInterface;
+class IComponentStore;
+class IConfigurable;
+} // namespace aidl::android::hardware::media::c2
+
namespace android::hardware::media::bufferpool::V2_0 {
struct IClientManager;
} // namespace android::hardware::media::bufferpool::V2_0
@@ -106,7 +113,36 @@
// declaration of an inner class is not possible.
struct Codec2ConfigurableClient {
- typedef ::android::hardware::media::c2::V1_0::IConfigurable Base;
+ typedef ::android::hardware::media::c2::V1_0::IConfigurable HidlBase;
+ typedef ::aidl::android::hardware::media::c2::IConfigurable AidlBase;
+
+ struct ImplBase {
+ virtual ~ImplBase() = default;
+
+ virtual const C2String& getName() const = 0;
+
+ virtual c2_status_t query(
+ const std::vector<C2Param*>& stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const heapParams) const = 0;
+
+ virtual c2_status_t config(
+ const std::vector<C2Param*> ¶ms,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) = 0;
+
+ virtual c2_status_t querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>>* const params
+ ) const = 0;
+
+ virtual c2_status_t querySupportedValues(
+ std::vector<C2FieldSupportedValuesQuery>& fields,
+ c2_blocking_t mayBlock) const = 0;
+ };
+
+ explicit Codec2ConfigurableClient(const sp<HidlBase> &hidlBase);
+ explicit Codec2ConfigurableClient(const std::shared_ptr<AidlBase> &aidlBase);
const C2String& getName() const;
@@ -128,15 +164,11 @@
c2_status_t querySupportedValues(
std::vector<C2FieldSupportedValuesQuery>& fields,
c2_blocking_t mayBlock) const;
+private:
+ struct HidlImpl;
+ struct AidlImpl;
- // base cannot be null.
- Codec2ConfigurableClient(const sp<Base>& base);
-
-protected:
- sp<Base> mBase;
- C2String mName;
-
- friend struct Codec2Client;
+ const std::unique_ptr<ImplBase> mImpl;
};
struct Codec2Client : public Codec2ConfigurableClient {
diff --git a/media/libaudiohal/impl/EffectConversionHelperAidl.cpp b/media/libaudiohal/impl/EffectConversionHelperAidl.cpp
index 9cf0cb8..4e34fca 100644
--- a/media/libaudiohal/impl/EffectConversionHelperAidl.cpp
+++ b/media/libaudiohal/impl/EffectConversionHelperAidl.cpp
@@ -25,6 +25,7 @@
#include <media/AidlConversionCppNdk.h>
#include <media/AidlConversionNdk.h>
#include <media/AidlConversionEffect.h>
+#include <media/AudioContainers.h>
#include <system/audio_effects/effect_visualizer.h>
#include <utils/Log.h>
@@ -61,6 +62,7 @@
{EFFECT_CMD_RESET, &EffectConversionHelperAidl::handleReset},
{EFFECT_CMD_ENABLE, &EffectConversionHelperAidl::handleEnable},
{EFFECT_CMD_DISABLE, &EffectConversionHelperAidl::handleDisable},
+ {EFFECT_CMD_SET_AUDIO_MODE, &EffectConversionHelperAidl::handleSetAudioMode},
{EFFECT_CMD_SET_AUDIO_SOURCE, &EffectConversionHelperAidl::handleSetAudioSource},
{EFFECT_CMD_SET_DEVICE, &EffectConversionHelperAidl::handleSetDevice},
{EFFECT_CMD_SET_INPUT_DEVICE, &EffectConversionHelperAidl::handleSetDevice},
@@ -279,6 +281,10 @@
pReplyData);
return BAD_VALUE;
}
+ if (!getDescriptor().common.flags.audioSourceIndication) {
+ ALOGW("%s parameter no audioSourceIndication, skipping", __func__);
+ return OK;
+ }
audio_source_t source = *(audio_source_t*)pCmdData;
AudioSource aidlSource =
@@ -295,6 +301,10 @@
pReplyData);
return BAD_VALUE;
}
+ if (!getDescriptor().common.flags.audioModeIndication) {
+ ALOGW("%s parameter no audioModeIndication, skipping", __func__);
+ return OK;
+ }
audio_mode_t mode = *(audio_mode_t *)pCmdData;
AudioMode aidlMode =
VALUE_OR_RETURN_STATUS(::aidl::android::legacy2aidl_audio_mode_t_AudioMode(mode));
@@ -310,9 +320,26 @@
pReplyData);
return BAD_VALUE;
}
- // TODO: convert from audio_devices_t to std::vector<AudioDeviceDescription>
- // const auto& legacyDevice = *(uint32_t*)(pCmdData);
+ if (!getDescriptor().common.flags.deviceIndication) {
+ ALOGW("%s parameter no deviceIndication, skipping", __func__);
+ return OK;
+ }
+ // convert from bitmask of audio_devices_t to std::vector<AudioDeviceDescription>
+ auto legacyDevices = *(uint32_t*)(pCmdData);
+ // extract the input bit and remove it from bitmasks
+ const auto inputBit = legacyDevices & AUDIO_DEVICE_BIT_IN;
+ legacyDevices &= ~AUDIO_DEVICE_BIT_IN;
std::vector<AudioDeviceDescription> aidlDevices;
+ while (legacyDevices) {
+ // get audio_devices_t represented by the last true bit and convert to AIDL
+ const auto lowestBitDevice = legacyDevices & -legacyDevices;
+ AudioDeviceDescription deviceDesc = VALUE_OR_RETURN_STATUS(
+ ::aidl::android::legacy2aidl_audio_devices_t_AudioDeviceDescription(
+ static_cast<audio_devices_t>(lowestBitDevice | inputBit)));
+ aidlDevices.emplace_back(deviceDesc);
+ legacyDevices -= lowestBitDevice;
+ }
+
RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
mEffect->setParameter(Parameter::make<Parameter::deviceDescription>(aidlDevices))));
return *static_cast<int32_t*>(pReplyData) = OK;
@@ -435,5 +462,19 @@
(mIsProxyEffect && std::static_pointer_cast<EffectProxy>(mEffect)->isBypassing()));
}
+Descriptor EffectConversionHelperAidl::getDescriptor() const {
+ if (!mIsProxyEffect) {
+ return mDesc;
+ }
+
+ Descriptor desc;
+ if (const auto status = mEffect->getDescriptor(&desc); !status.isOk()) {
+ ALOGE("%s failed to get proxy descriptor (%d:%s), using default", __func__,
+ status.getStatus(), status.getMessage());
+ return mDesc;
+ }
+ return desc;
+}
+
} // namespace effect
} // namespace android
diff --git a/media/libaudiohal/impl/EffectConversionHelperAidl.h b/media/libaudiohal/impl/EffectConversionHelperAidl.h
index 7c8f11b..85e877e 100644
--- a/media/libaudiohal/impl/EffectConversionHelperAidl.h
+++ b/media/libaudiohal/impl/EffectConversionHelperAidl.h
@@ -43,6 +43,8 @@
std::shared_ptr<android::hardware::EventFlag> getEventFlagGroup() { return mEfGroup; }
bool isBypassing() const;
+ ::aidl::android::hardware::audio::effect::Descriptor getDescriptor() const;
+
protected:
const int32_t mSessionId;
const int32_t mIoId;
@@ -134,7 +136,6 @@
virtual status_t visualizerMeasure(uint32_t* replySize __unused, void* pReplyData __unused) {
return BAD_VALUE;
}
-
};
} // namespace effect
diff --git a/media/libaudiohal/impl/EffectHalAidl.cpp b/media/libaudiohal/impl/EffectHalAidl.cpp
index b8e62ae..642d352 100644
--- a/media/libaudiohal/impl/EffectHalAidl.cpp
+++ b/media/libaudiohal/impl/EffectHalAidl.cpp
@@ -69,7 +69,6 @@
mEffect(effect),
mSessionId(sessionId),
mIoId(ioId),
- mDesc(desc),
mIsProxyEffect(isProxyEffect) {
createAidlConversion(effect, sessionId, ioId, desc);
}
@@ -169,7 +168,8 @@
State state = State::INIT;
if (mConversion->isBypassing() || !mEffect->getState(&state).isOk() ||
state != State::PROCESSING) {
- ALOGI("%s skipping %s process because it's %s", __func__, mDesc.common.name.c_str(),
+ ALOGI("%s skipping %s process because it's %s", __func__,
+ mConversion->getDescriptor().common.name.c_str(),
mConversion->isBypassing()
? "bypassing"
: aidl::android::hardware::audio::effect::toString(state).c_str());
@@ -225,8 +225,8 @@
return INVALID_OPERATION;
}
- ALOGD("%s %s consumed %zu produced %zu", __func__, mDesc.common.name.c_str(), floatsToWrite,
- floatsToRead);
+ ALOGD("%s %s consumed %zu produced %zu", __func__,
+ mConversion->getDescriptor().common.name.c_str(), floatsToWrite, floatsToRead);
return OK;
}
diff --git a/media/libaudiohal/impl/EffectHalAidl.h b/media/libaudiohal/impl/EffectHalAidl.h
index 1b7a3d6..bbcb7e2 100644
--- a/media/libaudiohal/impl/EffectHalAidl.h
+++ b/media/libaudiohal/impl/EffectHalAidl.h
@@ -72,7 +72,6 @@
const std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect> mEffect;
const int32_t mSessionId;
const int32_t mIoId;
- const ::aidl::android::hardware::audio::effect::Descriptor mDesc;
const bool mIsProxyEffect;
std::unique_ptr<EffectConversionHelperAidl> mConversion;
diff --git a/media/libaudiohal/impl/EffectProxy.cpp b/media/libaudiohal/impl/EffectProxy.cpp
index 8b629ed..7b5e195 100644
--- a/media/libaudiohal/impl/EffectProxy.cpp
+++ b/media/libaudiohal/impl/EffectProxy.cpp
@@ -169,12 +169,6 @@
common.flags.hwAcceleratorMode = Flags::HardwareAccelerator::TUNNEL;
}
- // initial flag values before we know which sub-effect to active (with setOffloadParam)
- // same as HIDL EffectProxy flags
- common.flags.type = Flags::Type::INSERT;
- common.flags.insert = Flags::Insert::LAST;
- common.flags.volume = Flags::Volume::NONE;
-
// set indication if any sub-effect indication was set
common.flags.offloadIndication |= desc.common.flags.offloadIndication;
common.flags.deviceIndication |= desc.common.flags.deviceIndication;
diff --git a/media/libaudiohal/tests/EffectsFactoryHalInterface_test.cpp b/media/libaudiohal/tests/EffectsFactoryHalInterface_test.cpp
index 2854496..0cb654c 100644
--- a/media/libaudiohal/tests/EffectsFactoryHalInterface_test.cpp
+++ b/media/libaudiohal/tests/EffectsFactoryHalInterface_test.cpp
@@ -347,6 +347,45 @@
}
}
+TEST_P(libAudioHalEffectParamTest, deviceIndicationUpdate) {
+ for (auto& interface : mHalInterfaces) {
+ EXPECT_NO_FATAL_FAILURE(initEffect(interface));
+
+ // output device
+ uint32_t deviceTypes = AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_BLE_SPEAKER;
+ status_t cmdStatus;
+ uint32_t replySize = sizeof(cmdStatus);
+ EXPECT_EQ(OK, interface->command(EFFECT_CMD_SET_DEVICE, sizeof(uint32_t), &deviceTypes,
+ &replySize, &cmdStatus));
+ // input device
+ deviceTypes = AUDIO_DEVICE_IN_WIRED_HEADSET | AUDIO_DEVICE_IN_BLUETOOTH_BLE;
+ EXPECT_EQ(OK, interface->command(EFFECT_CMD_SET_DEVICE, sizeof(uint32_t), &deviceTypes,
+ &replySize, &cmdStatus));
+ }
+}
+
+TEST_P(libAudioHalEffectParamTest, audioModeIndicationUpdate) {
+ for (auto& interface : mHalInterfaces) {
+ EXPECT_NO_FATAL_FAILURE(initEffect(interface));
+ uint32_t mode = AUDIO_MODE_IN_CALL;
+ status_t cmdStatus;
+ uint32_t replySize = sizeof(cmdStatus);
+ EXPECT_EQ(OK, interface->command(EFFECT_CMD_SET_AUDIO_MODE, sizeof(uint32_t), &mode,
+ &replySize, &cmdStatus));
+ }
+}
+
+TEST_P(libAudioHalEffectParamTest, audioSourceIndicationUpdate) {
+ for (auto& interface : mHalInterfaces) {
+ EXPECT_NO_FATAL_FAILURE(initEffect(interface));
+ uint32_t source = AUDIO_SOURCE_MIC;
+ status_t cmdStatus;
+ uint32_t replySize = sizeof(cmdStatus);
+ EXPECT_EQ(OK, interface->command(EFFECT_CMD_SET_AUDIO_SOURCE, sizeof(uint32_t), &source,
+ &replySize, &cmdStatus));
+ }
+}
+
INSTANTIATE_TEST_SUITE_P(
libAudioHalEffectParamTest, libAudioHalEffectParamTest, ::testing::ValuesIn(testPairs),
[](const testing::TestParamInfo<libAudioHalEffectParamTest::ParamType>& info) {