Commit 5c5b7fe7 authored by Kuo Jen Wei's avatar Kuo Jen Wei Committed by Commit Bot

[CCA] Convert device_operator.js into ES6 module.

Bug: 141518780
Test: Pass closure compiler check, tast run <DUT> 'camera.CCAUI*' and
validate all function of CCA on HALv1/v3 device works correctly.

Change-Id: I1cff8c1913e5bdc2d3f0b3c4c036e38166d4d61c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1967018Reviewed-by: default avatarShik Chen <shik@chromium.org>
Commit-Queue: Kuo Jen Wei <inker@chromium.org>
Cr-Commit-Position: refs/heads/master@{#726244}
parent e22c74b5
...@@ -23,6 +23,7 @@ js_library("chrome_helper") { ...@@ -23,6 +23,7 @@ js_library("chrome_helper") {
js_library("device_operator") { js_library("device_operator") {
deps = [ deps = [
"..:namespace",
"..:type", "..:type",
"//media/capture/video/chromeos/mojom:cros_camera_js_library_for_compile", "//media/capture/video/chromeos/mojom:cros_camera_js_library_for_compile",
] ]
......
...@@ -2,27 +2,88 @@ ...@@ -2,27 +2,88 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
'use strict'; /* eslint-disable no-undef */
/** /**
* Namespace for the Camera app. * import {Resolution} from '../type.js';
*/ */
var cca = cca || {};
/** @typedef {Resolution} */
Resolution;
/* eslint-enbale no-undef */
/** /**
* Namespace for mojo. * Parse the entry data according to its type.
* @param {!cros.mojom.CameraMetadataEntry} entry Camera metadata entry
* from which to parse the data according to its type.
* @return {!Array<number>} An array containing elements whose types correspond
* to the format of input |tag|.
* @throws {Error} if entry type is not supported.
*/ */
cca.mojo = cca.mojo || {}; export function parseMetadataData(entry) {
const {buffer} = Uint8Array.from(entry.data);
switch (entry.type) {
case cros.mojom.EntryType.TYPE_BYTE:
return Array.from(new Uint8Array(buffer));
case cros.mojom.EntryType.TYPE_INT32:
return Array.from(new Int32Array(buffer));
case cros.mojom.EntryType.TYPE_FLOAT:
return Array.from(new Float32Array(buffer));
case cros.mojom.EntryType.TYPE_DOUBLE:
return Array.from(new Float64Array(buffer));
case cros.mojom.EntryType.TYPE_INT64:
return Array.from(new BigInt64Array(buffer), (bigIntVal) => {
const numVal = Number(bigIntVal);
if (!Number.isSafeInteger(numVal)) {
console.warn('The int64 value is not a safe integer');
}
return numVal;
});
case cros.mojom.EntryType.TYPE_RATIONAL: {
const arr = new Int32Array(buffer);
const values = [];
for (let i = 0; i < arr.length; i += 2) {
values.push(arr[i] / arr[i + 1]);
}
return values;
}
default:
throw new Error('Unsupported type: ' + entry.type);
}
}
/** /**
* import {Resolution} from '../type.js'; * Gets the data from Camera metadata by its tag.
* @param {!cros.mojom.CameraMetadata} metadata Camera metadata from which to
* query the data.
* @param {!cros.mojom.CameraMetadataTag} tag Camera metadata tag to query for.
* @return {!Array<number>} An array containing elements whose types correspond
* to the format of input |tag|. If nothing is found, returns an empty
* array.
* @private
*/
function getMetadataData(metadata, tag) {
for (let i = 0; i < metadata.entryCount; i++) {
const entry = metadata.entries[i];
if (entry.tag === tag) {
return parseMetadataData(entry);
}
}
return [];
}
/**
* The singleton instance of DeviceOperator. Initialized by the first
* invocation of getInstance().
* @type {?DeviceOperator}
*/ */
var Resolution = Resolution || {}; let instance = null;
/** /**
* Operates video capture device through CrOS Camera App Mojo interface. * Operates video capture device through CrOS Camera App Mojo interface.
*/ */
cca.mojo.DeviceOperator = class { export class DeviceOperator {
/** /**
* @public * @public
*/ */
...@@ -81,7 +142,7 @@ cca.mojo.DeviceOperator = class { ...@@ -81,7 +142,7 @@ cca.mojo.DeviceOperator = class {
const device = await this.getDevice_(deviceId); const device = await this.getDevice_(deviceId);
const {cameraInfo} = await device.getCameraInfo(); const {cameraInfo} = await device.getCameraInfo();
const staticMetadata = cameraInfo.staticCameraCharacteristics; const staticMetadata = cameraInfo.staticCameraCharacteristics;
const streamConfigs = cca.mojo.getMetadataData_( const streamConfigs = getMetadataData(
staticMetadata, staticMetadata,
cros.mojom.CameraMetadataTag cros.mojom.CameraMetadataTag
.ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS); .ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
...@@ -121,7 +182,7 @@ cca.mojo.DeviceOperator = class { ...@@ -121,7 +182,7 @@ cca.mojo.DeviceOperator = class {
const device = await this.getDevice_(deviceId); const device = await this.getDevice_(deviceId);
const {cameraInfo} = await device.getCameraInfo(); const {cameraInfo} = await device.getCameraInfo();
const staticMetadata = cameraInfo.staticCameraCharacteristics; const staticMetadata = cameraInfo.staticCameraCharacteristics;
const minFrameDurationConfigs = cca.mojo.getMetadataData_( const minFrameDurationConfigs = getMetadataData(
staticMetadata, staticMetadata,
cros.mojom.CameraMetadataTag cros.mojom.CameraMetadataTag
.ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS); .ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS);
...@@ -174,7 +235,7 @@ cca.mojo.DeviceOperator = class { ...@@ -174,7 +235,7 @@ cca.mojo.DeviceOperator = class {
const device = await this.getDevice_(deviceId); const device = await this.getDevice_(deviceId);
const {cameraInfo} = await device.getCameraInfo(); const {cameraInfo} = await device.getCameraInfo();
const staticMetadata = cameraInfo.staticCameraCharacteristics; const staticMetadata = cameraInfo.staticCameraCharacteristics;
const availableFpsRanges = cca.mojo.getMetadataData_( const availableFpsRanges = getMetadataData(
staticMetadata, staticMetadata,
cros.mojom.CameraMetadataTag cros.mojom.CameraMetadataTag
.ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); .ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
...@@ -286,9 +347,8 @@ cca.mojo.DeviceOperator = class { ...@@ -286,9 +347,8 @@ cca.mojo.DeviceOperator = class {
const device = await this.getDevice_(deviceId); const device = await this.getDevice_(deviceId);
const {cameraInfo} = await device.getCameraInfo(); const {cameraInfo} = await device.getCameraInfo();
return cca.mojo return getMetadataData(
.getMetadataData_( cameraInfo.staticCameraCharacteristics, portraitModeTag)
cameraInfo.staticCameraCharacteristics, portraitModeTag)
.length > 0; .length > 0;
} }
...@@ -389,16 +449,16 @@ cca.mojo.DeviceOperator = class { ...@@ -389,16 +449,16 @@ cca.mojo.DeviceOperator = class {
/** /**
* Creates a new instance of DeviceOperator if it is not set. Returns the * Creates a new instance of DeviceOperator if it is not set. Returns the
* exist instance. * exist instance.
* @return {!Promise<?cca.mojo.DeviceOperator>} The singleton instance. * @return {!Promise<?DeviceOperator>} The singleton instance.
*/ */
static async getInstance() { static async getInstance() {
if (this.instance_ === null) { if (instance === null) {
this.instance_ = new cca.mojo.DeviceOperator(); instance = new DeviceOperator();
} }
if (!await this.instance_.isSupported_) { if (!await instance.isSupported_) {
return null; return null;
} }
return this.instance_; return instance;
} }
/** /**
...@@ -408,71 +468,7 @@ cca.mojo.DeviceOperator = class { ...@@ -408,71 +468,7 @@ cca.mojo.DeviceOperator = class {
static async isSupported() { static async isSupported() {
return await this.getInstance() !== null; return await this.getInstance() !== null;
} }
}; }
/** cca.mojo.DeviceOperator = DeviceOperator;
* The singleton instance of DeviceOperator. Initialized by the first cca.mojo.parseMetadataData = parseMetadataData;
* invocation of getInstance().
* @type {?cca.mojo.DeviceOperator}
*/
cca.mojo.DeviceOperator.instance_ = null;
/**
* Gets the data from Camera metadata by its tag.
* @param {!cros.mojom.CameraMetadata} metadata Camera metadata from which to
* query the data.
* @param {!cros.mojom.CameraMetadataTag} tag Camera metadata tag to query for.
* @return {!Array<number>} An array containing elements whose types correspond
* to the format of input |tag|. If nothing is found, returns an empty
* array.
* @private
*/
cca.mojo.getMetadataData_ = function(metadata, tag) {
for (let i = 0; i < metadata.entryCount; i++) {
const entry = metadata.entries[i];
if (entry.tag === tag) {
return cca.mojo.parseMetadataData(entry);
}
}
return [];
};
/**
* Parse the entry data according to its type.
* @param {!cros.mojom.CameraMetadataEntry} entry Camera metadata entry
* from which to parse the data according to its type.
* @return {!Array<number>} An array containing elements whose types correspond
* to the format of input |tag|.
* @throws {Error} if entry type is not supported.
*/
cca.mojo.parseMetadataData = function(entry) {
const {buffer} = Uint8Array.from(entry.data);
switch (entry.type) {
case cros.mojom.EntryType.TYPE_BYTE:
return Array.from(new Uint8Array(buffer));
case cros.mojom.EntryType.TYPE_INT32:
return Array.from(new Int32Array(buffer));
case cros.mojom.EntryType.TYPE_FLOAT:
return Array.from(new Float32Array(buffer));
case cros.mojom.EntryType.TYPE_DOUBLE:
return Array.from(new Float64Array(buffer));
case cros.mojom.EntryType.TYPE_INT64:
return Array.from(new BigInt64Array(buffer), (bigIntVal) => {
const numVal = Number(bigIntVal);
if (!Number.isSafeInteger(numVal)) {
console.warn('The int64 value is not a safe integer');
}
return numVal;
});
case cros.mojom.EntryType.TYPE_RATIONAL: {
const arr = new Int32Array(buffer);
const values = [];
for (let i = 0; i < arr.length; i += 2) {
values.push(arr[i] / arr[i + 1]);
}
return values;
}
default:
throw new Error('Unsupported type: ' + entry.type);
}
};
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
<script src="../js/mojo/camera_app.mojom-lite.js"></script> <script src="../js/mojo/camera_app.mojom-lite.js"></script>
<script src="../js/mojo/camera_app_helper.mojom-lite.js"></script> <script src="../js/mojo/camera_app_helper.mojom-lite.js"></script>
<script type="module" src="../js/mojo/chrome_helper.js"></script> <script type="module" src="../js/mojo/chrome_helper.js"></script>
<script src="../js/mojo/device_operator.js"></script> <script type="module" src="../js/mojo/device_operator.js"></script>
<script src="../js/mojo/image_capture.js"></script> <script src="../js/mojo/image_capture.js"></script>
<script src="../js/views/view.js"></script> <script src="../js/views/view.js"></script>
<script src="../js/views/camera.js"></script> <script src="../js/views/camera.js"></script>
......
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