diff --git a/neuralnetworks/1.0/utils/include/nnapi/hal/1.0/Utils.h b/neuralnetworks/1.0/utils/include/nnapi/hal/1.0/Utils.h index 4cec545cf0..b695f48550 100644 --- a/neuralnetworks/1.0/utils/include/nnapi/hal/1.0/Utils.h +++ b/neuralnetworks/1.0/utils/include/nnapi/hal/1.0/Utils.h @@ -44,6 +44,12 @@ bool valid(const Type& halObject) { return result.has_value(); } +template +auto convertFromNonCanonical(const Type& nonCanonicalObject) + -> decltype(convert(nn::convert(nonCanonicalObject).value())) { + return convert(NN_TRY(nn::convert(nonCanonicalObject))); +} + } // namespace android::hardware::neuralnetworks::V1_0::utils #endif // ANDROID_HARDWARE_INTERFACES_NEURALNETWORKS_1_0_UTILS_H diff --git a/neuralnetworks/1.1/utils/include/nnapi/hal/1.1/Utils.h b/neuralnetworks/1.1/utils/include/nnapi/hal/1.1/Utils.h index 052d88e922..09597a31f8 100644 --- a/neuralnetworks/1.1/utils/include/nnapi/hal/1.1/Utils.h +++ b/neuralnetworks/1.1/utils/include/nnapi/hal/1.1/Utils.h @@ -47,6 +47,12 @@ bool valid(const Type& halObject) { return result.has_value(); } +template +auto convertFromNonCanonical(const Type& nonCanonicalObject) + -> decltype(convert(nn::convert(nonCanonicalObject).value())) { + return convert(NN_TRY(nn::convert(nonCanonicalObject))); +} + } // namespace android::hardware::neuralnetworks::V1_1::utils #endif // ANDROID_HARDWARE_INTERFACES_NEURALNETWORKS_1_1_UTILS_H diff --git a/neuralnetworks/1.2/utils/include/nnapi/hal/1.2/Utils.h b/neuralnetworks/1.2/utils/include/nnapi/hal/1.2/Utils.h index c289fc89ab..323311439f 100644 --- a/neuralnetworks/1.2/utils/include/nnapi/hal/1.2/Utils.h +++ b/neuralnetworks/1.2/utils/include/nnapi/hal/1.2/Utils.h @@ -54,6 +54,12 @@ bool valid(const Type& halObject) { return result.has_value(); } +template +auto convertFromNonCanonical(const Type& nonCanonicalObject) + -> decltype(convert(nn::convert(nonCanonicalObject).value())) { + return convert(NN_TRY(nn::convert(nonCanonicalObject))); +} + } // namespace android::hardware::neuralnetworks::V1_2::utils #endif // ANDROID_HARDWARE_INTERFACES_NEURALNETWORKS_1_2_UTILS_H diff --git a/neuralnetworks/1.2/utils/src/Callbacks.cpp b/neuralnetworks/1.2/utils/src/Callbacks.cpp index fefa122101..9f54bb12dd 100644 --- a/neuralnetworks/1.2/utils/src/Callbacks.cpp +++ b/neuralnetworks/1.2/utils/src/Callbacks.cpp @@ -43,6 +43,15 @@ namespace android::hardware::neuralnetworks::V1_2::utils { namespace { +nn::GeneralResult prepareModelCallback( + V1_0::ErrorStatus status, const sp& preparedModel) { + if (const auto dynamicPreparedModel = + V1_2::IPreparedModel::castFrom(preparedModel).withDefault(nullptr)) { + return V1_2::utils::prepareModelCallback(status, dynamicPreparedModel); + } + return V1_0::utils::prepareModelCallback(status, preparedModel); +} + nn::GeneralResult, nn::Timing>> convertExecutionGeneralResultsHelper(const hidl_vec& outputShapes, const Timing& timing) { @@ -72,7 +81,7 @@ nn::ExecutionResult, nn::Timing>> executi Return PreparedModelCallback::notify(V1_0::ErrorStatus status, const sp& preparedModel) { - mData.put(V1_0::utils::prepareModelCallback(status, preparedModel)); + mData.put(prepareModelCallback(status, preparedModel)); return Void(); } diff --git a/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/Utils.h b/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/Utils.h index 29b0c806ff..3ce412cde6 100644 --- a/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/Utils.h +++ b/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/Utils.h @@ -49,6 +49,12 @@ bool valid(const Type& halObject) { return result.has_value(); } +template +auto convertFromNonCanonical(const Type& nonCanonicalObject) + -> decltype(convert(nn::convert(nonCanonicalObject).value())) { + return convert(NN_TRY(nn::convert(nonCanonicalObject))); +} + } // namespace android::hardware::neuralnetworks::V1_3::utils #endif // ANDROID_HARDWARE_INTERFACES_NEURALNETWORKS_1_3_UTILS_H diff --git a/neuralnetworks/1.3/utils/src/Callbacks.cpp b/neuralnetworks/1.3/utils/src/Callbacks.cpp index af76e6a87e..8e9fb833b1 100644 --- a/neuralnetworks/1.3/utils/src/Callbacks.cpp +++ b/neuralnetworks/1.3/utils/src/Callbacks.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -46,6 +47,20 @@ namespace android::hardware::neuralnetworks::V1_3::utils { namespace { +nn::GeneralResult prepareModelCallback( + V1_0::ErrorStatus status, const sp& preparedModel) { + if (const auto dynamicPreparedModel = + V1_3::IPreparedModel::castFrom(preparedModel).withDefault(nullptr)) { + const auto currentVersionStatus = NN_TRY(convertFromNonCanonical(status)); + return V1_3::utils::prepareModelCallback(currentVersionStatus, dynamicPreparedModel); + } + if (const auto dynamicPreparedModel = + V1_2::IPreparedModel::castFrom(preparedModel).withDefault(nullptr)) { + return V1_2::utils::prepareModelCallback(status, dynamicPreparedModel); + } + return V1_0::utils::prepareModelCallback(status, preparedModel); +} + nn::GeneralResult, nn::Timing>> convertExecutionGeneralResultsHelper(const hidl_vec& outputShapes, const V1_2::Timing& timing) { @@ -82,13 +97,13 @@ nn::ExecutionResult, nn::Timing>> executi Return PreparedModelCallback::notify(V1_0::ErrorStatus status, const sp& preparedModel) { - mData.put(V1_0::utils::prepareModelCallback(status, preparedModel)); + mData.put(prepareModelCallback(status, preparedModel)); return Void(); } Return PreparedModelCallback::notify_1_2(V1_0::ErrorStatus status, const sp& preparedModel) { - mData.put(V1_2::utils::prepareModelCallback(status, preparedModel)); + mData.put(prepareModelCallback(status, preparedModel)); return Void(); }