diff --git a/common/include/dscreen_constants.h b/common/include/dscreen_constants.h index 962c21d2f81ec0316f37a92ce6179ba3104b9d79..083d0b44d4ac2a7ab59a21433a5efa0ecda9bd25 100644 --- a/common/include/dscreen_constants.h +++ b/common/include/dscreen_constants.h @@ -120,6 +120,7 @@ constexpr int32_t DSCREEN_MAX_LEN = 4096; constexpr int32_t INVALID_WINDOW_ID = -1; constexpr int32_t STRIDE_ALIGNMENT = 0x8; +constexpr int32_t SURFACE_SYNC_FENCE_TIMEOUT = 100; const std::string DSCREEN_LOG_TITLE_TAG = "DSCREEN"; const std::string DSCREEN_PREFIX = "DISTRIBUTED_SCREEN"; diff --git a/services/common/test/unittest/decision_center/BUILD.gn b/services/common/test/unittest/decision_center/BUILD.gn index b5c26e9491a7b08c9c5aa5a9e9a7f271f5008a1f..eda3080b77264835ef5c5291a92ccb0d1283673c 100644 --- a/services/common/test/unittest/decision_center/BUILD.gn +++ b/services/common/test/unittest/decision_center/BUILD.gn @@ -44,6 +44,7 @@ ohos_unittest("ScreenDecisionCenterTest") { external_deps = [ "graphic_standard:surface", + "graphic_standard:sync_fence", "multimedia_player_framework:media_client", ] } diff --git a/services/screenservice/test/unittest/sourceservice/dscreenmgr/BUILD.gn b/services/screenservice/test/unittest/sourceservice/dscreenmgr/BUILD.gn index 19a3bcf88525162590142ae6b376c486b13a2e10..01b53dc593e3738bb3951998174770651a67b081 100644 --- a/services/screenservice/test/unittest/sourceservice/dscreenmgr/BUILD.gn +++ b/services/screenservice/test/unittest/sourceservice/dscreenmgr/BUILD.gn @@ -76,6 +76,7 @@ ohos_unittest("DscreenMgrTest") { external_deps = [ "c_utils:utils", + "graphic_standard:sync_fence", "hdf_core:libhdi", ] } diff --git a/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h b/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h index e843c8a38a4be03ba4a67c09f47bb7fef1fce522..79a28cb344d9dcaa11d93abde7c6ce8f4007474b 100644 --- a/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h +++ b/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h @@ -22,10 +22,11 @@ #include "avsharedmemory.h" #include "avcodec_video_encoder.h" #include "avcodec_common.h" -#include "media_errors.h" #include "format.h" -#include "surface.h" #include "iconsumer_surface.h" +#include "media_errors.h" +#include "surface.h" +#include "sync_fence.h" #include "idscreen_dbg_itf.h" #include "iimage_source_processor_listener.h" @@ -86,6 +87,7 @@ private: std::shared_ptr encodeVideoCallback_; std::weak_ptr imageProcessorListener_; std::vector> eventContent_; + OHOS::sptr syncFence_ = SyncFence::INVALID_FENCE; private: IDScreenDBGItf *dscreenDbgItfPtr_ = nullptr; IImageSetDirty *imageSetDirtyPtr_ = nullptr; diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index e743964da7f88ce12bf58251a34424823aea74ef..a0649cca44e44c50c1610e352c5fcb3df5272ba2 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -82,15 +82,20 @@ void ImageSourceEncoder::ConsumeSurface() return; } sptr surfaceBuffer = nullptr; - int32_t fence = -1; + syncFence_ = SyncFence::INVALID_FENCE; int64_t timestamp = 0; OHOS::Rect damage = {0, 0, 0, 0}; - SurfaceError surfaceErr = consumerSurface_->AcquireBuffer(surfaceBuffer, fence, timestamp, damage); + SurfaceError surfaceErr = consumerSurface_->AcquireBuffer(surfaceBuffer, syncFence_, timestamp, damage); if (surfaceErr != SURFACE_ERROR_OK) { DHLOGE("%s: consumerSurface_ acquire buffer failed, errcode: %" PRId32, LOG_TAG, surfaceErr); consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); return; } + int32_t retcode = syncFence_->Wait(SURFACE_SYNC_FENCE_TIMEOUT); + if (retcode == -ETIME) { + DHLOGE("%s: Sync fence wait timeout, retcode is %." PRId32, LOG_TAG, retcode); + return; + } if (pHandler_ != nullptr) { eventContent_.clear(); eventContent_ = imageSetDirtyPtr_->GetDamage(); diff --git a/services/screentransport/screensourcetrans/BUILD.gn b/services/screentransport/screensourcetrans/BUILD.gn index 53502d741b6713e475fab95364a053d54bf496c6..f1c13ade55a169f2ce59fe0ee21bfc4b6314cb66 100644 --- a/services/screentransport/screensourcetrans/BUILD.gn +++ b/services/screentransport/screensourcetrans/BUILD.gn @@ -77,6 +77,7 @@ ohos_shared_library("distributed_screen_sourcetrans") { external_deps = [ "c_utils:utils", "dsoftbus:softbus_client", + "graphic_standard:sync_fence", "hisysevent_native:libhisysevent", "hitrace_native:hitrace_meter", "hiviewdfx_hilog_native:libhilog", diff --git a/services/screentransport/test/unittest/screensourceprocessor/BUILD.gn b/services/screentransport/test/unittest/screensourceprocessor/BUILD.gn index ddc96c5deafac6df3955b5988bb0a4b629892a50..ffc296a20d2f0eecb3e31f522371b83a6939f553 100644 --- a/services/screentransport/test/unittest/screensourceprocessor/BUILD.gn +++ b/services/screentransport/test/unittest/screensourceprocessor/BUILD.gn @@ -66,6 +66,7 @@ ohos_unittest("SourceProcessorTest") { external_deps = [ "c_utils:utils", "graphic_standard:surface", + "graphic_standard:sync_fence", "multimedia_player_framework:media_client", ] } diff --git a/services/screentransport/test/unittest/screensourcetrans/BUILD.gn b/services/screentransport/test/unittest/screensourcetrans/BUILD.gn index 00c3791dfdaa65cb5f3ecb0edcfb521675244d72..ec457af5b6dcf764f311305c2fc2e4794dabfd3c 100644 --- a/services/screentransport/test/unittest/screensourcetrans/BUILD.gn +++ b/services/screentransport/test/unittest/screensourcetrans/BUILD.gn @@ -69,6 +69,7 @@ ohos_unittest("SourceTransTest") { external_deps = [ "c_utils:utils", "graphic_standard:surface", + "graphic_standard:sync_fence", "multimedia_player_framework:media_client", ] } diff --git a/services/screentransport/test/unittest/screentranstestutils/BUILD.gn b/services/screentransport/test/unittest/screentranstestutils/BUILD.gn index c9a62057e90f54c18c4710dd33074674bdedb701..76e4d2abbc8e1472728dff1677988e02408d2573 100644 --- a/services/screentransport/test/unittest/screentranstestutils/BUILD.gn +++ b/services/screentransport/test/unittest/screentranstestutils/BUILD.gn @@ -72,6 +72,7 @@ ohos_unittest("ScreenCallbackTest") { external_deps = [ "c_utils:utils", + "graphic_standard:sync_fence", "multimedia_player_framework:media_client", ] }