Commit f235ff79 authored by Brandon Mayer's avatar Brandon Mayer Committed by Commit Bot

Adding FEATURE_EDGE_EMBEDDINGS and named_template_arguments messages.

Enabled edge embedding computation in subgraphs via feature
flag. Additionally, the named_template_arguments allows graph template
arguments to be modified at runtime via legacy javascript API until
IPC refactor work is complete. This cl looks to support m72 and should
be deprecated either at the end of beta m72 or early m73.

Bug: 914959, b/120986539
Change-Id: I2b42c0989800afa9339ae8176a1a833c85ddcbdd
Reviewed-on: https://chromium-review.googlesource.com/c/1376812Reviewed-by: default avatarToni Baržić <tbarzic@chromium.org>
Reviewed-by: default avatarSteven Bennetts <stevenjb@chromium.org>
Commit-Queue: Brandon Mayer <bmayer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#619659}
parent b164f843
...@@ -94,10 +94,28 @@ message State { ...@@ -94,10 +94,28 @@ message State {
FEATURE_AUTOZOOM = 1; FEATURE_AUTOZOOM = 1;
FEATURE_HOTWORD_DETECTION = 2; FEATURE_HOTWORD_DETECTION = 2;
FEATURE_OCCUPANCY_DETECTION = 3; FEATURE_OCCUPANCY_DETECTION = 3;
FEATURE_EDGE_EMBEDDINGS = 4;
} }
// A list of enabled media perception features. // A list of enabled media perception features.
repeated Feature features = 6; repeated Feature features = 6;
message NamedTemplateArgument {
optional string name = 1;
oneof value {
string str = 2;
double num = 3;
}
}
// An optional list of template arguments to be substituted at
// run-time. Each argument present in this list will be set to the
// specified values, others will not be changed. Furthermore, nested
// arguments (dictionaries) are not supported.
// CAUTION: These template args can be used to overwrite the
// Feature flags defined above since feature flags are implemented
// as numeric template args.
repeated NamedTemplateArgument named_template_arguments = 7;
} }
// This is the output of the MediaPerceptionSinkCalculator. // This is the output of the MediaPerceptionSinkCalculator.
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#include "extensions/browser/api/media_perception_private/conversion_utils.h" #include "extensions/browser/api/media_perception_private/conversion_utils.h"
namespace extensions { namespace extensions {
namespace api { namespace api {
namespace media_perception_private { namespace media_perception_private {
...@@ -535,6 +534,8 @@ Feature FeatureProtoToIdl(int feature) { ...@@ -535,6 +534,8 @@ Feature FeatureProtoToIdl(int feature) {
return FEATURE_HOTWORD_DETECTION; return FEATURE_HOTWORD_DETECTION;
case mri::State::FEATURE_OCCUPANCY_DETECTION: case mri::State::FEATURE_OCCUPANCY_DETECTION:
return FEATURE_OCCUPANCY_DETECTION; return FEATURE_OCCUPANCY_DETECTION;
case mri::State::FEATURE_EDGE_EMBEDDINGS:
return FEATURE_EDGE_EMBEDDINGS;
case mri::State::FEATURE_UNSET: case mri::State::FEATURE_UNSET:
return FEATURE_NONE; return FEATURE_NONE;
} }
...@@ -550,6 +551,8 @@ mri::State::Feature FeatureIdlToProto(const Feature& feature) { ...@@ -550,6 +551,8 @@ mri::State::Feature FeatureIdlToProto(const Feature& feature) {
return mri::State::FEATURE_HOTWORD_DETECTION; return mri::State::FEATURE_HOTWORD_DETECTION;
case FEATURE_OCCUPANCY_DETECTION: case FEATURE_OCCUPANCY_DETECTION:
return mri::State::FEATURE_OCCUPANCY_DETECTION; return mri::State::FEATURE_OCCUPANCY_DETECTION;
case FEATURE_EDGE_EMBEDDINGS:
return mri::State::FEATURE_EDGE_EMBEDDINGS;
case FEATURE_NONE: case FEATURE_NONE:
return mri::State::FEATURE_UNSET; return mri::State::FEATURE_UNSET;
} }
...@@ -557,6 +560,63 @@ mri::State::Feature FeatureIdlToProto(const Feature& feature) { ...@@ -557,6 +560,63 @@ mri::State::Feature FeatureIdlToProto(const Feature& feature) {
return mri::State::FEATURE_UNSET; return mri::State::FEATURE_UNSET;
} }
base::Value NamedTemplateArgumentValueProtoToValue(
const mri::State::NamedTemplateArgument& named_template_argument) {
switch (named_template_argument.value_case()) {
case mri::State::NamedTemplateArgument::ValueCase::kStr:
return base::Value(named_template_argument.str());
case mri::State::NamedTemplateArgument::ValueCase::kNum:
return base::Value(named_template_argument.num());
case mri::State::NamedTemplateArgument::ValueCase::VALUE_NOT_SET:
return base::Value();
}
NOTREACHED() << "Unknown NamedTemplateArgument::ValueCase "
<< named_template_argument.value_case();
return base::Value();
}
bool NamedTemplateArgumentProtoToIdl(
const mri::State::NamedTemplateArgument named_template_argument_proto,
NamedTemplateArgument* named_template_argument) {
named_template_argument->name =
std::make_unique<std::string>(named_template_argument_proto.name());
base::Value value =
NamedTemplateArgumentValueProtoToValue(named_template_argument_proto);
named_template_argument->value =
std::make_unique<NamedTemplateArgument::Value>();
if (!NamedTemplateArgument::Value::Populate(
value, named_template_argument->value.get())) {
return false;
}
return true;
}
mri::State::NamedTemplateArgument NamedTemplateArgumentIdlToProto(
const NamedTemplateArgument& named_template_argument) {
mri::State::NamedTemplateArgument named_template_argument_proto;
if (named_template_argument.name)
named_template_argument_proto.set_name(*named_template_argument.name);
if (named_template_argument.value) {
if (named_template_argument.value->as_string) {
named_template_argument_proto.set_str(
*named_template_argument.value->as_string);
} else if (named_template_argument.value->as_number) {
named_template_argument_proto.set_num(
*named_template_argument.value->as_number);
} else {
NOTREACHED() << "Failed to convert NamedTemplateARgument::Value IDL to "
"Proto, unkown value type.";
}
}
return named_template_argument_proto;
}
void VideoStreamParamIdlToProto(mri::VideoStreamParam* param_result, void VideoStreamParamIdlToProto(mri::VideoStreamParam* param_result,
const VideoStreamParam& param) { const VideoStreamParam& param) {
if (param_result == nullptr) if (param_result == nullptr)
...@@ -652,6 +712,22 @@ State StateProtoToIdl(const mri::State& state) { ...@@ -652,6 +712,22 @@ State StateProtoToIdl(const mri::State& state) {
state_result.features->emplace_back(feature_result); state_result.features->emplace_back(feature_result);
} }
} }
if (state.named_template_arguments_size() > 0) {
state_result.named_template_arguments =
std::make_unique<std::vector<NamedTemplateArgument>>(
state.named_template_arguments_size());
for (int i = 0; i < state.named_template_arguments_size(); ++i) {
const mri::State::NamedTemplateArgument& named_template_argument_proto =
state.named_template_arguments(i);
NamedTemplateArgumentProtoToIdl(
named_template_argument_proto,
&state_result.named_template_arguments->at(i));
}
}
return state_result; return state_result;
} }
...@@ -681,6 +757,17 @@ mri::State StateIdlToProto(const State& state) { ...@@ -681,6 +757,17 @@ mri::State StateIdlToProto(const State& state) {
state_result.add_features(FeatureIdlToProto(state.features.get()->at(i))); state_result.add_features(FeatureIdlToProto(state.features.get()->at(i)));
} }
if (state.named_template_arguments) {
for (const NamedTemplateArgument& named_template_argument_idl :
*state.named_template_arguments) {
mri::State::NamedTemplateArgument* new_named_template_argument_proto =
state_result.add_named_template_arguments();
*new_named_template_argument_proto =
NamedTemplateArgumentIdlToProto(named_template_argument_idl);
}
}
return state_result; return state_result;
} }
......
...@@ -38,6 +38,15 @@ constexpr float kWhiteboardBottomRightX = 0.85; ...@@ -38,6 +38,15 @@ constexpr float kWhiteboardBottomRightX = 0.85;
constexpr float kWhiteboardBottomRightY = 0.79; constexpr float kWhiteboardBottomRightY = 0.79;
constexpr float kWhiteboardAspectRatio = 1.76; constexpr float kWhiteboardAspectRatio = 1.76;
// One numerical value, one empty and one string NamedTemplateArgument
constexpr unsigned kNamedTemplateArgumentsSize = 3;
constexpr char kNumericalTemplateArgumentName[] = "numerical_template_argument";
constexpr double kNumericalTemplateArgumentValue = 42;
constexpr char kStringTemplateArgumentName[] = "string_template_argument";
constexpr char kStringTemplateArgumentValue[] = "string_value";
constexpr double kDoubleTolerance = 0.01;
void InitializeVideoStreamParam(media_perception::VideoStreamParam& param, void InitializeVideoStreamParam(media_perception::VideoStreamParam& param,
const std::string& id, const std::string& id,
int width, int width,
...@@ -518,8 +527,23 @@ TEST(MediaPerceptionConversionUtilsTest, StateProtoToIdl) { ...@@ -518,8 +527,23 @@ TEST(MediaPerceptionConversionUtilsTest, StateProtoToIdl) {
state.add_features(mri::State::FEATURE_AUTOZOOM); state.add_features(mri::State::FEATURE_AUTOZOOM);
state.add_features(mri::State::FEATURE_HOTWORD_DETECTION); state.add_features(mri::State::FEATURE_HOTWORD_DETECTION);
state.add_features(mri::State::FEATURE_OCCUPANCY_DETECTION); state.add_features(mri::State::FEATURE_OCCUPANCY_DETECTION);
state.add_features(mri::State::FEATURE_EDGE_EMBEDDINGS);
state.add_features(mri::State::FEATURE_UNSET); state.add_features(mri::State::FEATURE_UNSET);
// Number NamedTemplateArgument.
mri::State::NamedTemplateArgument* named_template_argument_proto =
state.add_named_template_arguments();
named_template_argument_proto->set_name(kNumericalTemplateArgumentName);
named_template_argument_proto->set_num(kNumericalTemplateArgumentValue);
// Empty
named_template_argument_proto = state.add_named_template_arguments();
// String NamedTemplateArgument.
named_template_argument_proto = state.add_named_template_arguments();
named_template_argument_proto->set_name(kStringTemplateArgumentName);
named_template_argument_proto->set_str(kStringTemplateArgumentValue);
media_perception::State state_result = media_perception::State state_result =
media_perception::StateProtoToIdl(state); media_perception::StateProtoToIdl(state);
EXPECT_EQ(state_result.status, media_perception::STATUS_RUNNING); EXPECT_EQ(state_result.status, media_perception::STATUS_RUNNING);
...@@ -540,13 +564,42 @@ TEST(MediaPerceptionConversionUtilsTest, StateProtoToIdl) { ...@@ -540,13 +564,42 @@ TEST(MediaPerceptionConversionUtilsTest, StateProtoToIdl) {
ASSERT_TRUE(state_result.features); ASSERT_TRUE(state_result.features);
ASSERT_TRUE(state_result.features.get()); ASSERT_TRUE(state_result.features.get());
ASSERT_EQ(state_result.features.get()->size(), 3u); ASSERT_EQ(state_result.features.get()->size(), 4u);
EXPECT_EQ(state_result.features.get()->at(0), EXPECT_EQ(state_result.features.get()->at(0),
media_perception::FEATURE_AUTOZOOM); media_perception::FEATURE_AUTOZOOM);
EXPECT_EQ(state_result.features.get()->at(1), EXPECT_EQ(state_result.features.get()->at(1),
media_perception::FEATURE_HOTWORD_DETECTION); media_perception::FEATURE_HOTWORD_DETECTION);
EXPECT_EQ(state_result.features.get()->at(2), EXPECT_EQ(state_result.features.get()->at(2),
media_perception::FEATURE_OCCUPANCY_DETECTION); media_perception::FEATURE_OCCUPANCY_DETECTION);
EXPECT_EQ(state_result.features.get()->at(3),
media_perception::FEATURE_EDGE_EMBEDDINGS);
ASSERT_EQ(state_result.named_template_arguments->size(),
kNamedTemplateArgumentsSize);
// Number.
EXPECT_EQ(*state_result.named_template_arguments->at(0).name,
kNumericalTemplateArgumentName);
EXPECT_NEAR(*state_result.named_template_arguments->at(0).value->as_number,
kNumericalTemplateArgumentValue, kDoubleTolerance);
EXPECT_EQ(state_result.named_template_arguments->at(0).value->as_string,
nullptr);
// Empty.
EXPECT_EQ(*state_result.named_template_arguments->at(1).name, "");
EXPECT_EQ(state_result.named_template_arguments->at(1).value->as_string,
nullptr);
EXPECT_EQ(state_result.named_template_arguments->at(1).value->as_number,
nullptr);
// String.
EXPECT_EQ(*state_result.named_template_arguments->at(2).name,
kStringTemplateArgumentName);
EXPECT_EQ(state_result.named_template_arguments->at(2).value->as_number,
nullptr);
EXPECT_EQ(*state_result.named_template_arguments->at(2).value->as_string,
kStringTemplateArgumentValue);
state.set_status(mri::State::STARTED); state.set_status(mri::State::STARTED);
state.set_device_context(kTestDeviceContext); state.set_device_context(kTestDeviceContext);
...@@ -590,8 +643,31 @@ TEST(MediaPerceptionConversionUtilsTest, StateIdlToProto) { ...@@ -590,8 +643,31 @@ TEST(MediaPerceptionConversionUtilsTest, StateIdlToProto) {
state.features->emplace_back(media_perception::FEATURE_AUTOZOOM); state.features->emplace_back(media_perception::FEATURE_AUTOZOOM);
state.features->emplace_back(media_perception::FEATURE_HOTWORD_DETECTION); state.features->emplace_back(media_perception::FEATURE_HOTWORD_DETECTION);
state.features->emplace_back(media_perception::FEATURE_OCCUPANCY_DETECTION); state.features->emplace_back(media_perception::FEATURE_OCCUPANCY_DETECTION);
state.features->emplace_back(media_perception::FEATURE_EDGE_EMBEDDINGS);
state.features->emplace_back(media_perception::FEATURE_NONE); state.features->emplace_back(media_perception::FEATURE_NONE);
// {Number, Empty, String} test cases.
state.named_template_arguments =
std::make_unique<std::vector<media_perception::NamedTemplateArgument>>(
kNamedTemplateArgumentsSize);
state.named_template_arguments->at(0).name =
std::make_unique<std::string>(kNumericalTemplateArgumentName);
state.named_template_arguments->at(0).value =
std::make_unique<media_perception::NamedTemplateArgument::Value>();
media_perception::NamedTemplateArgument::Value::Populate(
base::Value(kNumericalTemplateArgumentValue),
state.named_template_arguments->at(0).value.get());
state.named_template_arguments->at(2).name =
std::make_unique<std::string>(kStringTemplateArgumentName);
state.named_template_arguments->at(2).value =
std::make_unique<media_perception::NamedTemplateArgument::Value>();
media_perception::NamedTemplateArgument::Value::Populate(
base::Value(kStringTemplateArgumentValue),
state.named_template_arguments->at(2).value.get());
state_proto = StateIdlToProto(state); state_proto = StateIdlToProto(state);
EXPECT_EQ(state_proto.status(), mri::State::RUNNING); EXPECT_EQ(state_proto.status(), mri::State::RUNNING);
ASSERT_TRUE(state_proto.has_configuration()); ASSERT_TRUE(state_proto.has_configuration());
...@@ -612,11 +688,29 @@ TEST(MediaPerceptionConversionUtilsTest, StateIdlToProto) { ...@@ -612,11 +688,29 @@ TEST(MediaPerceptionConversionUtilsTest, StateIdlToProto) {
ASSERT_TRUE(state_proto.whiteboard().has_aspect_ratio()); ASSERT_TRUE(state_proto.whiteboard().has_aspect_ratio());
EXPECT_EQ(state_proto.whiteboard().aspect_ratio(), kWhiteboardAspectRatio); EXPECT_EQ(state_proto.whiteboard().aspect_ratio(), kWhiteboardAspectRatio);
ASSERT_EQ(state_proto.features_size(), 4); ASSERT_EQ(state_proto.features_size(), 5);
EXPECT_EQ(state_proto.features(0), mri::State::FEATURE_AUTOZOOM); EXPECT_EQ(state_proto.features(0), mri::State::FEATURE_AUTOZOOM);
EXPECT_EQ(state_proto.features(1), mri::State::FEATURE_HOTWORD_DETECTION); EXPECT_EQ(state_proto.features(1), mri::State::FEATURE_HOTWORD_DETECTION);
EXPECT_EQ(state_proto.features(2), mri::State::FEATURE_OCCUPANCY_DETECTION); EXPECT_EQ(state_proto.features(2), mri::State::FEATURE_OCCUPANCY_DETECTION);
EXPECT_EQ(state_proto.features(3), mri::State::FEATURE_UNSET); EXPECT_EQ(state_proto.features(3), mri::State::FEATURE_EDGE_EMBEDDINGS);
EXPECT_EQ(state_proto.features(4), mri::State::FEATURE_UNSET);
ASSERT_EQ(state_proto.named_template_arguments_size(),
static_cast<int>(kNamedTemplateArgumentsSize));
EXPECT_EQ(state_proto.named_template_arguments(0).name(),
kNumericalTemplateArgumentName);
EXPECT_NEAR(state_proto.named_template_arguments(0).num(),
kNumericalTemplateArgumentValue, kDoubleTolerance);
EXPECT_FALSE(state_proto.named_template_arguments(1).has_name());
EXPECT_FALSE(state_proto.named_template_arguments(1).has_str());
EXPECT_FALSE(state_proto.named_template_arguments(1).has_num());
EXPECT_EQ(state_proto.named_template_arguments(2).name(),
kStringTemplateArgumentName);
EXPECT_EQ(state_proto.named_template_arguments(2).str(),
kStringTemplateArgumentValue);
state.status = media_perception::STATUS_SUSPENDED; state.status = media_perception::STATUS_SUSPENDED;
state.device_context = std::make_unique<std::string>(kTestDeviceContext); state.device_context = std::make_unique<std::string>(kTestDeviceContext);
......
...@@ -66,7 +66,13 @@ namespace mediaPerceptionPrivate { ...@@ -66,7 +66,13 @@ namespace mediaPerceptionPrivate {
enum Feature { enum Feature {
AUTOZOOM, AUTOZOOM,
HOTWORD_DETECTION, HOTWORD_DETECTION,
OCCUPANCY_DETECTION OCCUPANCY_DETECTION,
EDGE_EMBEDDINGS
};
dictionary NamedTemplateArgument {
DOMString? name;
(DOMString or double)? value;
}; };
enum ComponentType { enum ComponentType {
...@@ -207,6 +213,10 @@ namespace mediaPerceptionPrivate { ...@@ -207,6 +213,10 @@ namespace mediaPerceptionPrivate {
// A list of enabled media perception features. // A list of enabled media perception features.
Feature[]? features; Feature[]? features;
// A list of named parameters to be substituted at start-up. Will
// only have effect when setting state to <code>RUNNING</code>.
NamedTemplateArgument[]? namedTemplateArguments;
}; };
dictionary BoundingBox { dictionary BoundingBox {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment