blob: 14677398581621e1ed7a035429170f745a067c1b [file] [log] [blame]
charleszhao17777f92020-04-23 12:53:11 +10001// Copyright 2020 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ml/handwriting_recognizer_impl.h"
6
7#include <utility>
charleszhao492441e2020-05-26 16:17:07 +10008#include <vector>
charleszhao17777f92020-04-23 12:53:11 +10009
charleszhao05c5a4a2020-06-09 16:49:54 +100010#include "ml/handwriting_path.h"
charleszhao17777f92020-04-23 12:53:11 +100011#include "ml/handwriting_proto_mojom_conversion.h"
charleszhao5a7050e2020-07-14 15:21:41 +100012#include "ml/request_metrics.h"
charleszhao17777f92020-04-23 12:53:11 +100013
14namespace ml {
15namespace {
16
17using ::chromeos::machine_learning::mojom::HandwritingRecognitionQueryPtr;
charleszhao492441e2020-05-26 16:17:07 +100018using ::chromeos::machine_learning::mojom::HandwritingRecognizerCandidatePtr;
Andrew Moylanb481af72020-07-09 15:22:00 +100019using ::chromeos::machine_learning::mojom::HandwritingRecognizer;
charleszhao492441e2020-05-26 16:17:07 +100020using ::chromeos::machine_learning::mojom::HandwritingRecognizerResult;
charleszhao05c5a4a2020-06-09 16:49:54 +100021using ::chromeos::machine_learning::mojom::HandwritingRecognizerSpecPtr;
charleszhao17777f92020-04-23 12:53:11 +100022
23} // namespace
24
Andrew Moylanb481af72020-07-09 15:22:00 +100025bool HandwritingRecognizerImpl::Create(
26 HandwritingRecognizerSpecPtr spec,
27 mojo::PendingReceiver<HandwritingRecognizer> receiver) {
charleszhao17777f92020-04-23 12:53:11 +100028 auto recognizer_impl =
Andrew Moylanb481af72020-07-09 15:22:00 +100029 new HandwritingRecognizerImpl(std::move(spec), std::move(receiver));
charleszhao17777f92020-04-23 12:53:11 +100030
Andrew Moylanb481af72020-07-09 15:22:00 +100031 // Set the disconnection handler to strongly bind `recognizer_impl` to delete
32 // `recognizer_impl` when the connection is gone.
33 recognizer_impl->receiver_.set_disconnect_handler(base::Bind(
charleszhao17777f92020-04-23 12:53:11 +100034 [](const HandwritingRecognizerImpl* const recognizer_impl) {
35 delete recognizer_impl;
36 },
37 base::Unretained(recognizer_impl)));
38
39 return recognizer_impl->successfully_loaded_;
40}
41
42HandwritingRecognizerImpl::HandwritingRecognizerImpl(
Andrew Moylanb481af72020-07-09 15:22:00 +100043 HandwritingRecognizerSpecPtr spec,
44 mojo::PendingReceiver<HandwritingRecognizer> receiver)
45 : receiver_(this, std::move(receiver)) {
charleszhao17777f92020-04-23 12:53:11 +100046 auto* const hwr_library = ml::HandwritingLibrary::GetInstance();
47 DCHECK(hwr_library->GetStatus() == ml::HandwritingLibrary::Status::kOk)
48 << "HandwritingRecognizerImpl should be created only if "
49 "HandwritingLibrary is initialized successfully.";
50
charleszhao05c5a4a2020-06-09 16:49:54 +100051 const auto model_path = GetModelPaths(std::move(spec));
52 if (!model_path.has_value()) {
53 successfully_loaded_ = false;
54 return;
55 }
56
charleszhao17777f92020-04-23 12:53:11 +100057 recognizer_ = hwr_library->CreateHandwritingRecognizer();
58
59 successfully_loaded_ = hwr_library->LoadHandwritingRecognizer(
60 recognizer_, chrome_knowledge::HandwritingRecognizerOptions(),
charleszhao05c5a4a2020-06-09 16:49:54 +100061 model_path.value());
charleszhao17777f92020-04-23 12:53:11 +100062}
63
64HandwritingRecognizerImpl::~HandwritingRecognizerImpl() {
65 ml::HandwritingLibrary::GetInstance()->DestroyHandwritingRecognizer(
66 recognizer_);
67}
68
69void HandwritingRecognizerImpl::Recognize(HandwritingRecognitionQueryPtr query,
70 RecognizeCallback callback) {
charleszhao5a7050e2020-07-14 15:21:41 +100071 RequestMetrics request_metrics("HandwritingModel", "Recognize");
72 request_metrics.StartRecordingPerformanceMetrics();
73
charleszhao17777f92020-04-23 12:53:11 +100074 chrome_knowledge::HandwritingRecognizerResult result_proto;
charleszhao17777f92020-04-23 12:53:11 +100075
charleszhao492441e2020-05-26 16:17:07 +100076 if (ml::HandwritingLibrary::GetInstance()->RecognizeHandwriting(
77 recognizer_, HandwritingRecognitionQueryToProto(std::move(query)),
78 &result_proto)) {
79 // Recognition succeeded, run callback on the result.
80 std::move(callback).Run(HandwritingRecognizerResultFromProto(result_proto));
charleszhao5a7050e2020-07-14 15:21:41 +100081 request_metrics.FinishRecordingPerformanceMetrics();
82 request_metrics.RecordRequestEvent(HandwritingRecognizerResult::Status::OK);
charleszhao492441e2020-05-26 16:17:07 +100083 } else {
84 // Recognition failed, run callback on empty result and status = ERROR.
85 std::move(callback).Run(HandwritingRecognizerResult::New(
86 HandwritingRecognizerResult::Status::ERROR,
87 std::vector<HandwritingRecognizerCandidatePtr>()));
charleszhao5a7050e2020-07-14 15:21:41 +100088 request_metrics.RecordRequestEvent(
89 HandwritingRecognizerResult::Status::ERROR);
charleszhao492441e2020-05-26 16:17:07 +100090 }
charleszhao17777f92020-04-23 12:53:11 +100091}
92
93} // namespace ml