CCA: Remove BigBuffer usage on ARM devices
Remove BigBuffer usage on ARM devices since the fail rate is high.
Test: tast run <cherry> camera.DocumentScanning
Test: Ensure BigBuffer is not used by adding logs.
Bug: b:360028048
Change-Id: Ide932293669f0dbba8af66d7456b8ece73f2616a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5802838
Reviewed-by: Sean Li <seannli@google.com>
Commit-Queue: Chu-Hsuan Yang <chuhsuan@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1347145}
diff --git a/ash/webui/camera_app_ui/resources/js/models/load_time_data.ts b/ash/webui/camera_app_ui/resources/js/models/load_time_data.ts
index 7727f4a..9396e21 100644
--- a/ash/webui/camera_app_ui/resources/js/models/load_time_data.ts
+++ b/ash/webui/camera_app_ui/resources/js/models/load_time_data.ts
@@ -86,3 +86,11 @@
export function getOsVersion(): string {
return loadTimeData.getString('os_version');
}
+
+
+/**
+ * Returns if BigBuffer can be used.
+ */
+export function getCanUseBigBuffer(): boolean {
+ return loadTimeData.getBoolean('can_use_big_buffer');
+}
diff --git a/ash/webui/camera_app_ui/resources/js/mojo/chrome_helper.ts b/ash/webui/camera_app_ui/resources/js/mojo/chrome_helper.ts
index 4b2c4d1..d823a69 100644
--- a/ash/webui/camera_app_ui/resources/js/mojo/chrome_helper.ts
+++ b/ash/webui/camera_app_ui/resources/js/mojo/chrome_helper.ts
@@ -6,6 +6,7 @@
import {reportError} from '../error.js';
import {Point} from '../geometry.js';
import * as localDev from '../local_dev.js';
+import {getCanUseBigBuffer} from '../models/load_time_data.js';
import {
ErrorLevel,
ErrorType,
@@ -113,15 +114,32 @@
return castToNumberArray(new Uint8Array(buffer));
}
-export abstract class ChromeHelper {
- /**
- * TODO(b/349015781): A flag to determine if we should use BigBuffer. It
- * will be turned off when something went wrong when using BigBuffer. In the
- * future, we want to monitor the error metrics to see if this flag is still
- * needed.
- */
- static useBigBuffer = true;
+/**
+ * When BigBuffer fails, set this flag to `true` and fallback to inline buffer
+ * for further calls.
+ */
+let bigBufferFailed = false;
+/**
+ * Returns if BigBuffer should be used.
+ */
+export function shouldUseBigBuffer(): boolean {
+ return getCanUseBigBuffer() && !bigBufferFailed;
+}
+
+/**
+ * Sets the `bigBufferFailed` flag and reports the error.
+ */
+export function handleBigBufferError(e: unknown): void {
+ bigBufferFailed = true;
+ reportError(
+ ErrorType.BIG_BUFFER_FAILURE,
+ ErrorLevel.WARNING,
+ assertInstanceof(e, Error),
+ );
+}
+
+export abstract class ChromeHelper {
/**
* Starts monitoring tablet mode state of device.
*
@@ -299,15 +317,6 @@
}
return instance;
}
-
- static handleBigBufferError(e: unknown): void {
- ChromeHelper.useBigBuffer = false;
- reportError(
- ErrorType.BIG_BUFFER_FAILURE,
- ErrorLevel.WARNING,
- assertInstanceof(e, Error),
- );
- }
}
export const getInstanceImpl =
@@ -560,13 +569,13 @@
override async performOcr(jpeg: Blob): Promise<OcrResult> {
try {
- if (ChromeHelper.useBigBuffer) {
+ if (shouldUseBigBuffer()) {
const bigBuffer = await createBigBufferFromBlob(jpeg);
const {ocrResult} = await this.remote.performOcr(bigBuffer);
return ocrResult;
}
} catch (e) {
- ChromeHelper.handleBigBufferError(e);
+ handleBigBufferError(e);
}
const numArray = await createNumArrayFromBlob(jpeg);
const {ocrResult} = await this.remote.performOcrInline(numArray);
diff --git a/ash/webui/camera_app_ui/resources/js/views/document_review.ts b/ash/webui/camera_app_ui/resources/js/views/document_review.ts
index 900175c..5a52aa7 100644
--- a/ash/webui/camera_app_ui/resources/js/views/document_review.ts
+++ b/ash/webui/camera_app_ui/resources/js/views/document_review.ts
@@ -25,6 +25,8 @@
ChromeHelper,
createBigBufferFromBlob,
createNumArrayFromBlob,
+ handleBigBufferError,
+ shouldUseBigBuffer,
} from '../mojo/chrome_helper.js';
import {
BigBuffer,
@@ -645,13 +647,13 @@
async addPage(jpg: Blob, index: number): Promise<void> {
assert(this.builder !== null);
try {
- if (ChromeHelper.useBigBuffer) {
+ if (shouldUseBigBuffer()) {
const bigBuffer = await createBigBufferFromBlob(jpg);
this.builder.addPage(bigBuffer, index);
return;
}
} catch (e) {
- ChromeHelper.handleBigBufferError(e);
+ handleBigBufferError(e);
}
const numArray = await createNumArrayFromBlob(jpg);
this.builder.addPageInline(numArray, index);
@@ -671,12 +673,12 @@
async save(): Promise<Blob> {
assert(this.builder !== null);
try {
- if (ChromeHelper.useBigBuffer) {
+ if (shouldUseBigBuffer()) {
const {pdf} = await this.builder.save();
return this.createPdfBlob(pdf);
}
} catch (e) {
- ChromeHelper.handleBigBufferError(e);
+ handleBigBufferError(e);
}
const {pdf} = await this.builder.saveInline();
return new Blob([new Uint8Array(pdf)], {type: MimeType.PDF});
diff --git a/chrome/browser/ash/system_web_apps/apps/camera_app/chrome_camera_app_ui_delegate.cc b/chrome/browser/ash/system_web_apps/apps/camera_app/chrome_camera_app_ui_delegate.cc
index 814dbb8..5164c659 100644
--- a/chrome/browser/ash/system_web_apps/apps/camera_app/chrome_camera_app_ui_delegate.cc
+++ b/chrome/browser/ash/system_web_apps/apps/camera_app/chrome_camera_app_ui_delegate.cc
@@ -557,6 +557,10 @@
source->AddString("browser_version",
std::string(version_info::GetVersionNumber()));
source->AddString("os_version", base::SysInfo::OperatingSystemVersion());
+
+ // BigBuffer doesn't work well on ARM devices. See b/360028048.
+ std::string arch = base::SysInfo::ProcessCPUArchitecture();
+ source->AddBoolean("can_use_big_buffer", !base::StartsWith(arch, "ARM"));
}
bool ChromeCameraAppUIDelegate::IsMetricsAndCrashReportingEnabled() {