From ae6cce6240cc15fe995efa2ad6f64baa6e1faa9f Mon Sep 17 00:00:00 2001 From: yihuiyang Date: Tue, 21 May 2024 16:19:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=96=E6=8E=A5=E7=BA=B9=E7=90=86=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E4=BF=AE=E6=94=B9=EF=BC=8C=E5=8E=BB=E9=99=A4=E5=86=97?= =?UTF-8?q?=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yihuiyang --- .../ohos/flutter_embedding/flutter/index.ets | 9 +- .../src/main/cpp/types/libflutter/index.d.ets | 6 +- .../main/ets/embedding/engine/FlutterNapi.ets | 16 +-- .../engine/renderer/FlutterRenderer.ets | 109 +++--------------- .../engine/renderer/SurfaceTextureWrapper.ets | 30 ----- .../src/main/ets/view/TextureRegistry.ets | 38 ++++-- shell/platform/ohos/library_loader.cpp | 4 +- .../ohos/napi/platform_view_ohos_napi.cpp | 12 +- .../ohos/napi/platform_view_ohos_napi.h | 12 +- shell/platform/ohos/platform_view_ohos.cpp | 8 +- shell/platform/ohos/platform_view_ohos.h | 2 +- 11 files changed, 80 insertions(+), 166 deletions(-) delete mode 100644 shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/renderer/SurfaceTextureWrapper.ets diff --git a/shell/platform/ohos/flutter_embedding/flutter/index.ets b/shell/platform/ohos/flutter_embedding/flutter/index.ets index aacaefda73..18152e8a8d 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/index.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/index.ets @@ -42,9 +42,8 @@ import { WindowFocusChangedListener, OnSaveStateListener, } from './src/main/ets/embedding/engine/plugins/ability/AbilityPluginBinding'; -import { FlutterRenderer, SurfaceTextureRegistryEntry } from './src/main/ets/embedding/engine/renderer/FlutterRenderer'; +import { FlutterRenderer, OhosTextureWrapper } from './src/main/ets/embedding/engine/renderer/FlutterRenderer'; import { FlutterUiDisplayListener } from './src/main/ets/embedding/engine/renderer/FlutterUiDisplayListener'; -import { SurfaceTextureWrapper } from './src/main/ets/embedding/engine/renderer/SurfaceTextureWrapper'; import AccessibilityChannel from './src/main/ets/embedding/engine/systemchannels/AccessibilityChannel'; import KeyEventChannel from './src/main/ets/embedding/engine/systemchannels/KeyEventChannel'; import LifecycleChannel from './src/main/ets/embedding/engine/systemchannels/LifecycleChannel'; @@ -106,7 +105,7 @@ import AccessibilityBridge from './src/main/ets/view/AccessibilityBridge'; import { FlutterCallbackInformation } from './src/main/ets/view/FlutterCallbackInformation'; import FlutterRunArguments from './src/main/ets/view/FlutterRunArguments'; import { FirstFrameListener, FlutterView } from './src/main/ets/view/FlutterView'; -import { TextureRegistry } from './src/main/ets/view/TextureRegistry'; +import { TextureRegistry, OhosTexture } from './src/main/ets/view/TextureRegistry'; import { ByteBuffer } from './src/main/ets/util/ByteBuffer'; import Log from './src/main/ets/util/Log'; import MessageChannelUtils from './src/main/ets/util/MessageChannelUtils'; @@ -147,9 +146,8 @@ export { WindowFocusChangedListener, OnSaveStateListener, FlutterRenderer, - SurfaceTextureRegistryEntry, + OhosTextureWrapper, FlutterUiDisplayListener, - SurfaceTextureWrapper, AccessibilityChannel, KeyEventChannel, LifecycleChannel, @@ -214,6 +212,7 @@ export { FlutterRunArguments, FlutterView, TextureRegistry, + OhosTexture, ByteBuffer, Log, MessageChannelUtils, diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/cpp/types/libflutter/index.d.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/cpp/types/libflutter/index.d.ets index 6cb09bd9f0..26d0cd4db1 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/cpp/types/libflutter/index.d.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/cpp/types/libflutter/index.d.ets @@ -105,6 +105,8 @@ export const nativeInitNativeImage: (nativeShellHolderId: number, textureId: num export const nativeUnregisterTexture: (nativeShellHolderId: number, textureId: number) => void; -export const nativeRegisterPixelMap: (nativeShellHolderId: number, textureId: number, pixelMap: PixelMap) => void; +export const nativeRegisterTexture: (nativeShellHolderId: number, textureId: number) => number; -export const nativeRegisterTexture: (nativeShellHolderId: number, textureId: number) => number; \ No newline at end of file +export const nativeUpdatePixelMap: (nativeShellHolderId: number, textureId: number, pixelMap: PixelMap) => void; + +export const nativeMarkTextureFrameAvailable: (nativeShellHolderId: number, textureId: number) => void; diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/FlutterNapi.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/FlutterNapi.ets index 1058081faf..f5c2700264 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/FlutterNapi.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/FlutterNapi.ets @@ -387,24 +387,24 @@ export default class FlutterNapi { } initNativeImage(textureId: number, aImage: image.Image) { - Log.d(TAG, "called initNativeImage "); flutter.nativeInitNativeImage(this.nativeShellHolderId!, textureId, aImage); } unregisterTexture(textureId: number): void { - Log.d(TAG, "called unregisterTexture "); flutter.nativeUnregisterTexture(this.nativeShellHolderId!, textureId); } - registerPixelMap(textureId: number, pixelMap: PixelMap): void { - Log.d(TAG, "called registerPixelMap "); - flutter.nativeRegisterPixelMap(this.nativeShellHolderId!, textureId, pixelMap); - } - registerTexture(textureId: number): number { - Log.d(TAG, "called unregisterTexture "); return flutter.nativeRegisterTexture(this.nativeShellHolderId!, textureId); } + + updatePixelMap(textureId: number, pixelMap: PixelMap): void { + flutter.nativeUpdatePixelMap(this.nativeShellHolderId!, textureId, pixelMap); + } + + markTextureFrameAvailable(textureId: number): void { + flutter.nativeMarkTextureFrameAvailable(this.nativeShellHolderId!, textureId); + } } export interface AccessibilityDelegate { diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/renderer/FlutterRenderer.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/renderer/FlutterRenderer.ets index f1624aaa4d..424c60a848 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/renderer/FlutterRenderer.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/renderer/FlutterRenderer.ets @@ -14,107 +14,34 @@ */ import image from '@ohos.multimedia.image'; -import { BusinessError } from '@ohos.base'; -import { SurfaceTextureEntry, TextureRegistry } from '../../../view/TextureRegistry'; -import { FlutterAbility } from '../../ohos/FlutterAbility'; +import { OhosTexture, OnTrimMemoryListener, TextureRegistry } from '../../../view/TextureRegistry'; import FlutterNapi from '../FlutterNapi'; -import { SurfaceTextureWrapper } from './SurfaceTextureWrapper'; -import Log from '../../../util/Log'; const TAG = "FlutterRenderer" export class FlutterRenderer implements TextureRegistry { - private nextTextureId: number = 0; + private static nextTextureWrapperId: number = 0; private flutterNapi: FlutterNapi; constructor(flutterNapi: FlutterNapi) { this.flutterNapi = flutterNapi; } - createSurfaceTexture(): SurfaceTextureEntry { - let receiver: image.ImageReceiver = this.getImageReceiver(); - return this.registerSurfaceTexture(receiver); - } - - getTextureId(): number { - this.nextTextureId = this.nextTextureId + 1; - Log.i(TAG, "getTextureId: ", this.nextTextureId ) - return this.nextTextureId; - } - - registerTexture(textureId: number): SurfaceTextureEntry { - let surfaceTextureRegistryEntry = new SurfaceTextureRegistryEntry(this.nextTextureId); - let surfaceId = this.flutterNapi.registerTexture(textureId); - Log.i(TAG, "registerTexture, surfaceId=" + surfaceId); - surfaceTextureRegistryEntry.setSurfaceId(surfaceId); - return surfaceTextureRegistryEntry; - } - - registerSurfaceTexture(receiver: image.ImageReceiver): SurfaceTextureEntry { - this.nextTextureId = this.nextTextureId + 1; - let surfaceTextureRegistryEntry = new SurfaceTextureRegistryEntry(this.nextTextureId); - surfaceTextureRegistryEntry.setImageReceiver(receiver); - this.registerImage(surfaceTextureRegistryEntry.getTextureId(), surfaceTextureRegistryEntry.textureWrapper()); - return surfaceTextureRegistryEntry; - } - - registerPixelMap(pixelMap: PixelMap): number { - this.nextTextureId = this.nextTextureId + 1; - this.flutterNapi.registerPixelMap(this.nextTextureId, pixelMap); - return this.nextTextureId; - } - - unregisterTexture(textureId: number): void { - this.flutterNapi.unregisterTexture(textureId); - } - onTrimMemory(level: number) { - throw new Error('Method not implemented.'); - } - private getImageReceiver(): image.ImageReceiver { - let receiver: image.ImageReceiver = image.createImageReceiver(640, 480, 4, 8); - if (receiver !== undefined) { - console.info('[camera test] ImageReceiver is ok'); - } else { - console.info('[camera test] ImageReceiver is not ok'); - } - return receiver; - } - private registerImage(textureId: number, surfaceTextureWrapper: SurfaceTextureWrapper): void { - let receiver = surfaceTextureWrapper.getImageReceiver(); - receiver.on('imageArrival', () => { - receiver.readNextImage((err: BusinessError, nextImage: image.Image) => { - if (err || nextImage === undefined) { - return; - } - this.flutterNapi.initNativeImage(textureId, nextImage); - console.log("[camera test] format: " + nextImage.format); - nextImage.release((err : BusinessError) =>{ - if (err != undefined) { - console.log('Failed to release the image source instance.'); - } else { - console.log('Succeeded in releasing the image source instance.'); - } - }); - }) - }) + registerOhosTexture(): OhosTexture { + FlutterRenderer.nextTextureWrapperId++; + let ohosTexture = new OhosTextureWrapper(this.flutterNapi, FlutterRenderer.nextTextureWrapperId); + return ohosTexture; } } -export class SurfaceTextureRegistryEntry implements SurfaceTextureEntry { +export class OhosTextureWrapper implements OhosTexture { private textureId: number = 0; private surfaceId: number = 0; - private surfaceTextureWrapper: SurfaceTextureWrapper | null = null; - private released: boolean = false; + private flutterNapi: FlutterNapi; - constructor(id: number) { + constructor(flutterNapi: FlutterNapi, id: number) { + this.flutterNapi = flutterNapi; this.textureId = id; - } - - getImageReceiver(): image.ImageReceiver { - return this.surfaceTextureWrapper!.getImageReceiver(); - } - - setImageReceiver(receiver: image.ImageReceiver): void { - this.surfaceTextureWrapper = new SurfaceTextureWrapper(receiver); + this.surfaceId = this.flutterNapi.registerTexture(this.textureId); } getTextureId(): number { @@ -125,14 +52,16 @@ export class SurfaceTextureRegistryEntry implements SurfaceTextureEntry { return this.surfaceId; } - setSurfaceId(surfaceId: number): void { - this.surfaceId = surfaceId; + updatePixelMap(pixelMap: image.PixelMap): number { + this.flutterNapi.updatePixelMap(this.textureId, pixelMap); + return this.textureId; } - textureWrapper(): SurfaceTextureWrapper { - return this.surfaceTextureWrapper!; + markTextureFrameAvailable(): void { + this.flutterNapi.markTextureFrameAvailable(this.textureId); } - release() { - throw new Error('Method not implemented.'); + + release(): void { + this.flutterNapi.unregisterTexture(this.textureId); } } \ No newline at end of file diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/renderer/SurfaceTextureWrapper.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/renderer/SurfaceTextureWrapper.ets deleted file mode 100644 index b1da18061b..0000000000 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/renderer/SurfaceTextureWrapper.ets +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import image from '@ohos.multimedia.image'; - -export class SurfaceTextureWrapper { - private receiver: image.ImageReceiver; - private released: boolean = false; - private attached: boolean = false; - - constructor(receiver: image.ImageReceiver) { - this.receiver = receiver; - } - - getImageReceiver(): image.ImageReceiver { - return this.receiver; - } -} \ No newline at end of file diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/view/TextureRegistry.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/view/TextureRegistry.ets index fa79eb238c..4961a81c4f 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/view/TextureRegistry.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/view/TextureRegistry.ets @@ -12,26 +12,40 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import image from '@ohos.multimedia.image'; export interface TextureRegistry { - - createSurfaceTexture(): SurfaceTextureEntry; - getTextureId(): number; - registerTexture(textureId: number): SurfaceTextureEntry; - registerSurfaceTexture(receiver: image.ImageReceiver): SurfaceTextureEntry; - registerPixelMap(pixelMap: PixelMap): number; - unregisterTexture(textureId: number): void; - onTrimMemory(level: number) : void; + /* + * create a OhosTextureWrapper, OhosTextureWrapper is mapping to OHOSExternalTextureGL in flutter engine + * if OhosTextureWrapper end of used, call release() to release engine resource + */ + registerOhosTexture(): OhosTexture; } -export interface SurfaceTextureEntry { +export interface OhosTexture { + /* + * get TextureWrapper id ,not real Texture id + */ getTextureId(): number; + /* + * get OHOS NativeImage Surface id which create in flutter engine, same as NDK function "OH_NativeImage_GetSurfaceId" + * this Surface id could be used to consume video frame and update to external texture, e.g. camera preview output + * if camera preview frame arrived, it will callback to NativeImage in engine, then update frame to real texture + */ getSurfaceId(): number; - getImageReceiver(): image.ImageReceiver; - + /* + * update a new PixelMap to engine external texture + */ + updatePixelMap(pixelMap: PixelMap): number; + + /* + * mark a texture frame available after updatePixelMap + */ + markTextureFrameAvailable(): void; + /* + * release engine texture resource, e.g. OHOSExternalTextureGL + */ release(): void; } diff --git a/shell/platform/ohos/library_loader.cpp b/shell/platform/ohos/library_loader.cpp index 415bf46a65..4ecef14c13 100644 --- a/shell/platform/ohos/library_loader.cpp +++ b/shell/platform/ohos/library_loader.cpp @@ -120,8 +120,8 @@ static napi_value Init(napi_env env, napi_value exports) { "nativeMarkTextureFrameAvailable", flutter::PlatformViewOHOSNapi::nativeMarkTextureFrameAvailable), DECLARE_NAPI_FUNCTION( - "nativeRegisterPixelMap", - flutter::PlatformViewOHOSNapi::nativeRegisterPixelMap), + "nativeUpdatePixelMap", + flutter::PlatformViewOHOSNapi::nativeUpdatePixelMap), }; diff --git a/shell/platform/ohos/napi/platform_view_ohos_napi.cpp b/shell/platform/ohos/napi/platform_view_ohos_napi.cpp index 142fe4558b..686fe22247 100644 --- a/shell/platform/ohos/napi/platform_view_ohos_napi.cpp +++ b/shell/platform/ohos/napi/platform_view_ohos_napi.cpp @@ -1491,11 +1491,8 @@ napi_value PlatformViewOHOSNapi::nativeMarkTextureFrameAvailable( return nullptr; } -napi_value PlatformViewOHOSNapi::nativeRegisterPixelMap( - napi_env env, - napi_callback_info info) -{ - FML_DLOG(INFO)<<"PlatformViewOHOSNapi::nativeRegisterPixelMap"; +napi_value PlatformViewOHOSNapi::nativeUpdatePixelMap(napi_env env, + napi_callback_info info) { size_t argc = 3; napi_value args[3] = {nullptr}; int64_t shell_holder; @@ -1503,8 +1500,9 @@ napi_value PlatformViewOHOSNapi::nativeRegisterPixelMap( NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr)); NAPI_CALL(env, napi_get_value_int64(env, args[0], &shell_holder)); NAPI_CALL(env, napi_get_value_int64(env, args[1], &textureId)); - NativePixelMap *nativePixelMap = OH_PixelMap_InitNativePixelMap(env, args[2]); - OHOS_SHELL_HOLDER->GetPlatformView()->RegisterExternalTextureByPixelMap(textureId, nativePixelMap); + NativePixelMap* nativePixelMap = OH_PixelMap_InitNativePixelMap(env, args[2]); + OHOS_SHELL_HOLDER->GetPlatformView()->UpdatePixelMap(textureId, + nativePixelMap); return nullptr; } diff --git a/shell/platform/ohos/napi/platform_view_ohos_napi.h b/shell/platform/ohos/napi/platform_view_ohos_napi.h index f998fbf553..a3c2bba89b 100644 --- a/shell/platform/ohos/napi/platform_view_ohos_napi.h +++ b/shell/platform/ohos/napi/platform_view_ohos_napi.h @@ -155,13 +155,13 @@ class PlatformViewOHOSNapi { napi_env env, napi_callback_info info); - static napi_value nativeRegisterPixelMap( - napi_env env, - napi_callback_info info); + static napi_value nativeRegisterTexture( + napi_env env, + napi_callback_info info); - static napi_value nativeRegisterTexture( - napi_env env, - napi_callback_info info); + static napi_value nativeUpdatePixelMap( + napi_env env, + napi_callback_info info); // Surface相关,XComponent调用 static void SurfaceCreated(int64_t shell_holder, void* window); diff --git a/shell/platform/ohos/platform_view_ohos.cpp b/shell/platform/ohos/platform_view_ohos.cpp index bf65b2252e..510e7ce9df 100644 --- a/shell/platform/ohos/platform_view_ohos.cpp +++ b/shell/platform/ohos/platform_view_ohos.cpp @@ -464,8 +464,11 @@ void PlatformViewOHOS::UnRegisterExternalTexture(int64_t texture_id) UnregisterTexture(texture_id); } -void PlatformViewOHOS::RegisterExternalTextureByPixelMap(int64_t texture_id, NativePixelMap* pixelMap) -{ +void PlatformViewOHOS::UpdatePixelMap(int64_t texture_id, + NativePixelMap* pixelMap) { + if (pixelMap == nullptr) { + return; + } if (ohos_context_->RenderingApi() == OHOSRenderingAPI::kOpenGLES) { auto iter = external_texture_gl_.find(texture_id); if (iter != external_texture_gl_.end()) { @@ -477,7 +480,6 @@ void PlatformViewOHOS::RegisterExternalTextureByPixelMap(int64_t texture_id, Nat RegisterTexture(ohos_external_gl); ohos_external_gl->DispatchPixelMap(pixelMap); } - MarkTextureFrameAvailable(texture_id); } } diff --git a/shell/platform/ohos/platform_view_ohos.h b/shell/platform/ohos/platform_view_ohos.h index a9793dd73a..b739af8e45 100644 --- a/shell/platform/ohos/platform_view_ohos.h +++ b/shell/platform/ohos/platform_view_ohos.h @@ -94,7 +94,7 @@ class PlatformViewOHOS final : public PlatformView { uint64_t RegisterExternalTexture(int64_t texture_id); - void RegisterExternalTextureByPixelMap(int64_t texture_id, NativePixelMap* pixelMap); + void UpdatePixelMap(int64_t texture_id, NativePixelMap* pixelMap); void UnRegisterExternalTexture(int64_t texture_id); -- Gitee