blob: f7018480c7d3935e65de10168a173f7b6f6bad61 [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
10#include "ml/handwriting_proto_mojom_conversion.h"
charleszhao5a7050e2020-07-14 15:21:41 +100011#include "ml/request_metrics.h"
charleszhao17777f92020-04-23 12:53:11 +100012
Qijiang Fan713061e2021-03-08 15:45:12 +090013#include <base/check.h>
14
charleszhao17777f92020-04-23 12:53:11 +100015namespace ml {
16namespace {
17
18using ::chromeos::machine_learning::mojom::HandwritingRecognitionQueryPtr;
Andrew Moylanb481af72020-07-09 15:22:00 +100019using ::chromeos::machine_learning::mojom::HandwritingRecognizer;
Tom Hughes1d1c1922020-08-27 16:16:53 -070020using ::chromeos::machine_learning::mojom::HandwritingRecognizerCandidatePtr;
charleszhao492441e2020-05-26 16:17:07 +100021using ::chromeos::machine_learning::mojom::HandwritingRecognizerResult;
charleszhao05c5a4a2020-06-09 16:49:54 +100022using ::chromeos::machine_learning::mojom::HandwritingRecognizerSpecPtr;
charleszhao17777f92020-04-23 12:53:11 +100023
24} // namespace
25
Andrew Moylanb481af72020-07-09 15:22:00 +100026bool HandwritingRecognizerImpl::Create(
27 HandwritingRecognizerSpecPtr spec,
28 mojo::PendingReceiver<HandwritingRecognizer> receiver) {
charleszhao17777f92020-04-23 12:53:11 +100029 auto recognizer_impl =
Andrew Moylanb481af72020-07-09 15:22:00 +100030 new HandwritingRecognizerImpl(std::move(spec), std::move(receiver));
charleszhao17777f92020-04-23 12:53:11 +100031
Andrew Moylanb481af72020-07-09 15:22:00 +100032 // Set the disconnection handler to strongly bind `recognizer_impl` to delete
33 // `recognizer_impl` when the connection is gone.
34 recognizer_impl->receiver_.set_disconnect_handler(base::Bind(
charleszhao17777f92020-04-23 12:53:11 +100035 [](const HandwritingRecognizerImpl* const recognizer_impl) {
36 delete recognizer_impl;
37 },
38 base::Unretained(recognizer_impl)));
39
40 return recognizer_impl->successfully_loaded_;
41}
42
43HandwritingRecognizerImpl::HandwritingRecognizerImpl(
Andrew Moylanb481af72020-07-09 15:22:00 +100044 HandwritingRecognizerSpecPtr spec,
45 mojo::PendingReceiver<HandwritingRecognizer> receiver)
Charles Zhaoc882eb02020-07-27 10:02:35 +100046 : library_(ml::HandwritingLibrary::GetInstance()),
47 receiver_(this, std::move(receiver)) {
48 DCHECK(library_->GetStatus() == ml::HandwritingLibrary::Status::kOk)
charleszhao17777f92020-04-23 12:53:11 +100049 << "HandwritingRecognizerImpl should be created only if "
50 "HandwritingLibrary is initialized successfully.";
51
Charles Zhaoc882eb02020-07-27 10:02:35 +100052 recognizer_ = library_->CreateHandwritingRecognizer();
charleszhao05c5a4a2020-06-09 16:49:54 +100053
Charles Zhaoc882eb02020-07-27 10:02:35 +100054 successfully_loaded_ =
Honglin Yu0f5b21d2021-04-06 23:39:04 +100055 library_->LoadHandwritingRecognizer(recognizer_, spec->language);
charleszhao17777f92020-04-23 12:53:11 +100056}
57
58HandwritingRecognizerImpl::~HandwritingRecognizerImpl() {
Charles Zhaoc882eb02020-07-27 10:02:35 +100059 library_->DestroyHandwritingRecognizer(recognizer_);
charleszhao17777f92020-04-23 12:53:11 +100060}
61
62void HandwritingRecognizerImpl::Recognize(HandwritingRecognitionQueryPtr query,
63 RecognizeCallback callback) {
charleszhao5a7050e2020-07-14 15:21:41 +100064 RequestMetrics request_metrics("HandwritingModel", "Recognize");
65 request_metrics.StartRecordingPerformanceMetrics();
66
charleszhao17777f92020-04-23 12:53:11 +100067 chrome_knowledge::HandwritingRecognizerResult result_proto;
charleszhao17777f92020-04-23 12:53:11 +100068
Charles Zhaoc882eb02020-07-27 10:02:35 +100069 if (library_->RecognizeHandwriting(
charleszhao492441e2020-05-26 16:17:07 +100070 recognizer_, HandwritingRecognitionQueryToProto(std::move(query)),
71 &result_proto)) {
72 // Recognition succeeded, run callback on the result.
73 std::move(callback).Run(HandwritingRecognizerResultFromProto(result_proto));
charleszhao5a7050e2020-07-14 15:21:41 +100074 request_metrics.FinishRecordingPerformanceMetrics();
75 request_metrics.RecordRequestEvent(HandwritingRecognizerResult::Status::OK);
charleszhao492441e2020-05-26 16:17:07 +100076 } else {
77 // Recognition failed, run callback on empty result and status = ERROR.
78 std::move(callback).Run(HandwritingRecognizerResult::New(
79 HandwritingRecognizerResult::Status::ERROR,
80 std::vector<HandwritingRecognizerCandidatePtr>()));
charleszhao5a7050e2020-07-14 15:21:41 +100081 request_metrics.RecordRequestEvent(
82 HandwritingRecognizerResult::Status::ERROR);
charleszhao492441e2020-05-26 16:17:07 +100083 }
charleszhao17777f92020-04-23 12:53:11 +100084}
85
86} // namespace ml