From 3e018585e51bc6aeea240763a4a04300bf10cee6 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Fri, 31 Mar 2023 09:48:51 +0800 Subject: [PATCH 01/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- common/BUILD.gn | 9 + common/include/dscreen_constants.h | 28 +- common/include/dscreen_errcode.h | 6 + screenhandler/BUILD.gn | 1 + .../common/databuffer/include/data_buffer.h | 27 +- .../common/databuffer/src/data_buffer.cpp | 73 +++- .../include/screen_decision_center.h | 52 +++ .../src/screen_decision_center.cpp | 121 ++++++ .../imageJpeg/include/screen_image_jpeg.h | 55 +++ .../imageJpeg/src/screen_image_jpeg.cpp | 309 +++++++++++++++ services/screenclient/BUILD.gn | 3 +- .../include/screen_client_window_adapter.h | 1 + .../src/screen_client_window_adapter.cpp | 1 + .../screenregionmgr/include/screenregion.h | 3 + .../screenregionmgr/include/screenregionmgr.h | 1 + .../screenregionmgr/src/screenregion.cpp | 12 +- .../screenregionmgr/src/screenregionmgr.cpp | 9 +- services/screenservice/sourceservice/BUILD.gn | 6 + .../dscreenmgr/include/dscreen.h | 3 + .../dscreenmgr/include/dscreen_manager.h | 3 + .../sourceservice/dscreenmgr/src/dscreen.cpp | 26 +- .../dscreenmgr/src/dscreen_manager.cpp | 14 +- .../src/dscreen_source_service.cpp | 2 + .../sourceservice/dscreenmgr/BUILD.gn | 3 + .../dscreenmgr/src/dscreen_test.cpp | 2 + .../include/screen_refresh_channel_impl.h | 64 +++ .../src/screen_refresh_channel_impl.cpp | 370 ++++++++++++++++++ .../decoder/include/image_sink_decoder.h | 25 +- .../decoder/src/image_sink_decoder.cpp | 186 ++++++++- .../include/image_sink_processor.h | 4 +- .../src/image_sink_processor.cpp | 31 +- .../screentransport/screensinktrans/BUILD.gn | 10 + .../include/iscreen_sink_trans.h | 1 + .../include/screen_sink_trans.h | 2 + .../screensinktrans/src/screen_sink_trans.cpp | 23 +- .../encoder/include/idscreen_dbg_itf.h | 39 ++ .../encoder/include/image_source_encoder.h | 37 +- .../encoder/src/image_source_encoder.cpp | 220 ++++++++++- .../include/iimage_source_processor.h | 6 +- .../iimage_source_processor_listener.h | 3 +- .../include/image_source_processor.h | 4 +- .../src/image_source_processor.cpp | 22 +- .../screensourcetrans/BUILD.gn | 12 +- .../include/iscreen_source_trans.h | 5 +- .../include/screen_source_trans.h | 11 +- .../src/screen_source_trans.cpp | 91 ++++- .../unittest/screensinkprocessor/BUILD.gn | 2 + .../test/unittest/screensinktrans/BUILD.gn | 2 + .../test/unittest/screensourcetrans/BUILD.gn | 2 + .../src/screen_source_trans_test.cpp | 7 +- .../unittest/screentranstestutils/BUILD.gn | 2 + .../softbusadapter/src/softbus_adapter.cpp | 13 +- 52 files changed, 1869 insertions(+), 95 deletions(-) create mode 100644 services/common/decision_center/include/screen_decision_center.h create mode 100644 services/common/decision_center/src/screen_decision_center.cpp create mode 100644 services/common/imageJpeg/include/screen_image_jpeg.h create mode 100644 services/common/imageJpeg/src/screen_image_jpeg.cpp create mode 100644 services/screentransport/screendatachannel/include/screen_refresh_channel_impl.h create mode 100644 services/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp create mode 100644 services/screentransport/screensourceprocessor/encoder/include/idscreen_dbg_itf.h diff --git a/common/BUILD.gn b/common/BUILD.gn index 9a201da3..03c9ca96 100644 --- a/common/BUILD.gn +++ b/common/BUILD.gn @@ -18,11 +18,20 @@ import( ohos_shared_library("distributed_screen_utils") { include_dirs = [ + "${services_path}/common/utils/include", "//commonlibrary/c_utils/base/include", "include", "//base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include", "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", "//third_party/json/include", + "${fwk_common_path}/utils/include", + "//foundation/distributedhardware/distributed_hardware_fwk/interfaces/inner_kits/include", + "//foundation/communication/ipc/interfaces/innerkits/ipc_core/include", + "//foundation/multimedia/image_framework/mock/native/include", + ] + + deps = [ + "${distributedhardwarefwk_path}/interfaces/inner_kits:libdhfwk_sdk", ] sources = [ diff --git a/common/include/dscreen_constants.h b/common/include/dscreen_constants.h index 58913e88..c41f50b5 100644 --- a/common/include/dscreen_constants.h +++ b/common/include/dscreen_constants.h @@ -57,12 +57,36 @@ enum VideoFormat : uint8_t { VIDEO_DATA_FORMAT_RGBA8888 = 3, }; +enum DataType : uint8_t { + VIDEO_FULL_SCREEN_DATA = 0, + VIDEO_PART_SCREEN_DATA = 1, +}; + /* Screen package name */ const std::string PKG_NAME = "ohos.dhardware.dscreen"; /* Screen data session name */ const std::string DATA_SESSION_NAME = "ohos.dhardware.dscreen.data"; - +const std::string JPEG_SESSION_NAME = "ohos.dhardware.dscreen.jpeg"; +/*YUV*/ +constexpr int32_t YR_PARAM = 66; +constexpr int32_t YG_PARAM = 129; +constexpr int32_t YB_PARAM = 25; +constexpr int32_t UR_PARAM = -38; +constexpr int32_t UG_PARAM = -74; +constexpr int32_t UB_PARAM = 112; +constexpr int32_t VG_PARAM = -94; +constexpr int32_t VB_PARAM = -18; +constexpr int32_t YA_PARAM = 16; +constexpr int32_t UA_PARAM = 128; +constexpr int32_t YUV_PARAM = 255; +constexpr int32_t MOVEBITS = 8; +/* RGBA */ +constexpr uint32_t RGBA_CHROMA = 4; +constexpr uint32_t RGB_CHROMA = 3; +constexpr uint32_t ODD = 1; +constexpr uint32_t EVEN = 2; +constexpr uint32_t ALIGNEDBITS = 32; /* Screen session name max len */ constexpr uint32_t DSCREEN_MAX_SESSION_NAME_LEN = 50; @@ -87,6 +111,7 @@ constexpr int64_t MAX_YUV420_BUFFER_SIZE = 2560 * 1600 * (3 / 2) * 2; constexpr int32_t DSCREEN_MAX_LEN = 4096; constexpr int32_t INVALID_WINDOW_ID = -1; +constexpr int32_t STRIDE_ALIGNMENT = 0x8; const std::string DSCREEN_LOG_TITLE_TAG = "DSCREEN"; const std::string DSCREEN_PREFIX = "DISTRIBUTED_SCREEN"; @@ -150,6 +175,7 @@ constexpr size_t DATA_QUEUE_MAX_SIZE = 1000; constexpr uint32_t DECODE_WAIT_MILLISECONDS = 5000; constexpr size_t DATA_BUFFER_MAX_SIZE = 10 * 1024 * 1024; constexpr uint8_t TASK_WAIT_SECONDS = 1; +constexpr int32_t JPEG_QUALITY = 80; } // namespace DistributedHardware } // namespace OHOS #endif \ No newline at end of file diff --git a/common/include/dscreen_errcode.h b/common/include/dscreen_errcode.h index 7fcc64d9..bf8b73cf 100644 --- a/common/include/dscreen_errcode.h +++ b/common/include/dscreen_errcode.h @@ -103,6 +103,12 @@ enum DScreenErrorCode { // screen string param empty or screen input param invalid ERR_DH_SCREEN_STRING_PARAM_EMPTY = -56000, ERR_DH_SCREEN_INPUT_PARAM_INVALID = -56001, + ERR_DH_SCREEN_DATA_TYPE_INVALID = -56002, + // screen surface error + ERR_DH_SCREEN_SURFACE_REQUEST_FAILED = -57000, + ERR_DH_SCREEN_SURFACE_BUFFER_INVALIED = -57001, + ERR_DH_SCREEN_SURFACE_FLUSH_FAILED = -57002, + ERR_DH_SCREEN_SURFACE_INVALIED = -57003, }; } // namespace DistributedHardware } // namespace OHOS diff --git a/screenhandler/BUILD.gn b/screenhandler/BUILD.gn index 60138066..223455c3 100644 --- a/screenhandler/BUILD.gn +++ b/screenhandler/BUILD.gn @@ -39,6 +39,7 @@ ohos_shared_library("distributed_screen_handler") { deps = [ "${common_path}:distributed_screen_utils", "${windowmanager_path}/dm:libdm", + "${mediastandard_path}/interfaces/inner_api/native:media_client", ] defines = [ diff --git a/services/common/databuffer/include/data_buffer.h b/services/common/databuffer/include/data_buffer.h index 5c34a9b5..1c3399cd 100644 --- a/services/common/databuffer/include/data_buffer.h +++ b/services/common/databuffer/include/data_buffer.h @@ -18,9 +18,19 @@ #include #include +#include + +#include "dscreen_constants.h" namespace OHOS { namespace DistributedHardware { +struct DirtyRect { + int32_t xPos; + int32_t yPos; + int32_t width; + int32_t height; + int32_t dirtySize; +}; class DataBuffer { public: explicit DataBuffer(size_t capacity); @@ -28,10 +38,25 @@ public: size_t Capacity() const; uint8_t *Data() const; - + void SetSize(size_t size); + void SetDataType(uint8_t dataType); + uint8_t DataType(); + DirtyRect GetDirtyRect(); + void SetDirtyRect(DirtyRect &rect); + void SetDataNumber(size_t number); + size_t DataNumber(); + void ReapplyCapcity(size_t capacity); + void AddData(size_t dataSize, unsigned char* &inputData); + void AddDirtyRect(DirtyRect rec); + std::vector DirtyRectVec(); + int32_t GetData(int32_t offset, int32_t datasize, uint8_t* &output); private: + static const constexpr char *LOG_TAG = "DataBuffer"; + std::vector dirtyRectVec_; size_t capacity_ = 0; uint8_t *data_ = nullptr; + uint8_t dataType_ = 0; + size_t dataNumber_ = 0; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/common/databuffer/src/data_buffer.cpp b/services/common/databuffer/src/data_buffer.cpp index cb6b9387..066efbb5 100644 --- a/services/common/databuffer/src/data_buffer.cpp +++ b/services/common/databuffer/src/data_buffer.cpp @@ -15,7 +15,10 @@ #include "data_buffer.h" +#include "dscreen_errcode.h" +#include "dscreen_log.h" #include +#include namespace OHOS { namespace DistributedHardware { @@ -27,6 +30,7 @@ DataBuffer::DataBuffer(size_t capacity) capacity_ = capacity; } } + dataType_ = 0; } DataBuffer::~DataBuffer() @@ -35,7 +39,6 @@ DataBuffer::~DataBuffer() delete []data_; data_ = nullptr; } - capacity_ = 0; } @@ -48,5 +51,73 @@ uint8_t *DataBuffer::Data() const { return data_; } +void DataBuffer::SetSize(size_t size) +{ + capacity_ = size; +} +void DataBuffer::SetDataType(uint8_t dataType) +{ + dataType_ = dataType; +} +uint8_t DataBuffer::DataType() +{ + return dataType_; +} +void DataBuffer::SetDataNumber(size_t number) +{ + dataNumber_ = number; +} +size_t DataBuffer::DataNumber() +{ + return dataNumber_; +} +void DataBuffer::ReapplyCapcity(size_t capacity) +{ + DHLOGI("%s: ReapplyCapcity.", LOG_TAG); + if (capacity < capacity_) { + return; + } + delete [] data_; + data_ = new (std::nothrow) uint8_t[capacity] {0}; + if (data_ != nullptr) { + capacity_ = capacity; + } +} +void DataBuffer::AddData(size_t dataSize, unsigned char* &inputData) +{ + DHLOGI("%s: AddData.", LOG_TAG); + if (inputData == nullptr) { + return; + } + int32_t ret = memcpy_s(data_ + capacity_, dataSize, inputData, dataSize); + if (ret != EOK) { + DHLOGE("%s: in AddData memcpy data failed, ret: %.", PRId32, LOG_TAG, ret); + return; + } + capacity_ += dataSize; +} +void DataBuffer::AddDirtyRect(DirtyRect rect) +{ + DHLOGI("%s: AddDirtyRect.", LOG_TAG); + dirtyRectVec_.push_back(rect); +} +std::vector DataBuffer::DirtyRectVec() +{ + return dirtyRectVec_; +} +int32_t DataBuffer::GetData(int32_t offset, int32_t datasize, uint8_t* &output) +{ + DHLOGI("%s: GetData.", LOG_TAG); + if (offset + datasize > capacity_ || output == nullptr) { + DHLOGE("DataBuffer GetData parameter invalied."); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } + int32_t ret = memcpy_s(output, datasize, data_ + offset, datasize); + if (ret != EOK) { + DHLOGE("GetData memcpy data failed, ret: %.", PRId32, ret); + return ret; + } + return DH_SUCCESS; +} } // namespace DistributedHardware } // namespcae OHOS \ No newline at end of file diff --git a/services/common/decision_center/include/screen_decision_center.h b/services/common/decision_center/include/screen_decision_center.h new file mode 100644 index 00000000..ef53d5c9 --- /dev/null +++ b/services/common/decision_center/include/screen_decision_center.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2023 Huawei Device 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. + */ + +#ifndef OHOS_SCREEN_DECISION_CENTER_H +#define OHOS_SCREEN_DECISION_CENTER_H + +#include + +#include "image_source_processor.h" +#include "screen_image_jpeg.h" +#include "surface_type.h" +#include "video_param.h" + +namespace OHOS { +namespace DistributedHardware { +class ScreenDecisionCenter { +public: + explicit ScreenDecisionCenter(const VideoParam &configParam) : configParam_(configParam){}; + ~ScreenDecisionCenter() = default; + bool IsDirtyRectValid(const std::vector &damages); + bool JudgeDirtyThreshold(const std::vector &damages); + bool LimitTime(uint32_t timethreshold); + int32_t InputBufferDmage(sptr &surfaceBuffer, const std::vector &damages); + int32_t ConfigureDecisionCenter(std::shared_ptr &listener, + std::shared_ptr &imageProcessor); + int32_t SetJpegSurface(sptr &surface); + +private: + static const constexpr int32_t ARE_THRESHOLD = 260000; + static const constexpr int32_t THRESHOLD = 10; + static const constexpr char *LOG_TAG = "ScreenDecisionCenter"; + std::shared_ptr imageJpeg_ = nullptr; + std::shared_ptr imageProcessor_ = nullptr; + VideoParam configParam_; + int32_t frameCount_ = 0; + time_t sendFullTime_; +}; +} // namespace DistributedHardware +} // namespace OHOS +#endif \ No newline at end of file diff --git a/services/common/decision_center/src/screen_decision_center.cpp b/services/common/decision_center/src/screen_decision_center.cpp new file mode 100644 index 00000000..04dcfdb4 --- /dev/null +++ b/services/common/decision_center/src/screen_decision_center.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2023 Huawei Device 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. + */ + +#include "screen_decision_center.h" + +#include "dscreen_constants.h" +#include "dscreen_errcode.h" +#include "dscreen_log.h" + +namespace OHOS { +namespace DistributedHardware { +bool ScreenDecisionCenter::IsDirtyRectValid(const std::vector &damages) +{ + DHLOGI("%s: IsDirtyRectValid.", LOG_TAG); + if (damages.empty()) { + DHLOGE("%s: damages size is empty.", LOG_TAG); + return false; + } + for (const auto &damage : damages) { + if (damage.x < 0 || damage.x > configParam_.GetScreenWidth() || + damage.y < 0 || damage.y > configParam_.GetScreenHeight()) { + DHLOGE("%s: dirty x and y invalied.", LOG_TAG); + return false; + } + int32_t width = configParam_.GetScreenWidth() - damage.x; + int32_t height = configParam_.GetScreenHeight() - damage.y; + if (damage.x % EVEN == ODD || damage.w % EVEN == ODD) { + DHLOGE("%s: dirty x and w invalied.", LOG_TAG); + return false; + } + if (damage.w < 0 || damage.w > width || damage.h < 0 || damage.h > height) { + DHLOGE("%s: dirty invalied.", LOG_TAG); + return false; + } + } + return true; +} +bool ScreenDecisionCenter::JudgeDirtyThreshold(const std::vector &damages) +{ + DHLOGI("%s: JudgeDirtyThreshold.", LOG_TAG); + int32_t allDirtyArea = 0; + for (const auto &damage : damages) { + int32_t dirtyArea = damage.w * damage.h; + allDirtyArea += dirtyArea; + if (dirtyArea > ARE_THRESHOLD || allDirtyArea > ARE_THRESHOLD) { + DHLOGE("%s: dirtyArea is %.", PRId32, LOG_TAG, dirtyArea); + return false; + } + } + return true; +} +bool ScreenDecisionCenter::LimitTime(uint32_t timethreshold) +{ + return difftime(time(nullptr), sendFullTime_) >= timethreshold; +} + +int32_t ScreenDecisionCenter::InputBufferDmage(sptr &surfaceBuffer, + const std::vector &damages) +{ + DHLOGI("%s: InputBufferDmage.", LOG_TAG); + if (surfaceBuffer == nullptr) { + DHLOGE("%s: surfaceBuffer is null.", LOG_TAG); + return ERR_DH_SCREEN_SURFACE_BUFFER_INVALIED; + } + if (damages.empty() || frameCount_ < THRESHOLD || LimitTime(THRESHOLD) || + !IsDirtyRectValid(damages) || !JudgeDirtyThreshold(damages)) { + DHLOGI("%s: send full image data.", LOG_TAG); + sendFullTime_ = time(nullptr); + int32_t ret = imageProcessor_->ProcessFullIma ge(surfaceBuffer); + if (ret != DH_SUCCESS) { + DHLOGE("%s: send full data failed.", LOG_TAG); + return ret; + } + } else { + DHLOGI("%s: send dirty data.", LOG_TAG); + int32_t ret = imageJpeg_->ProcessPartailImage(surfaceBuffer, damages); + if (ret != DH_SUCCESS) { + DHLOGE("%s: send dirty data failed.", LOG_TAG); + return ret; + } + } + frameCount_++; + return DH_SUCCESS; +} +int32_t ScreenDecisionCenter::ConfigureDecisionCenter(std::shared_ptr &listener, + std::shared_ptr &imageProcessor) +{ + DHLOGI("%s: ConfigureDecisionCenter.", LOG_TAG); + if (listener == nullptr || imageProcessor == nullptr) { + DHLOGE("%s: Image source process is null.", LOG_TAG); + return ERR_DH_SCREEN_TRANS_NULL_VALUE; + } + imageJpeg_ = std::make_shared(configParam_); + imageJpeg_->SetImageProcessListener(listener); + imageProcessor_ = imageProcessor; + return DH_SUCCESS; +} +int32_t ScreenDecisionCenter::SetJpegSurface(sptr &surface) +{ + DHLOGI("%s: SetJpegSurface.", LOG_TAG); + int32_t ret = imageJpeg_->SetOutputSurface(surface); + if (ret != DH_SUCCESS) { + DHLOGE("%s: JPEG set surface failed.", LOG_TAG); + return ret; + } + return DH_SUCCESS; +} +} // namespace DistributedHardware +} // namespace OHOS \ No newline at end of file diff --git a/services/common/imageJpeg/include/screen_image_jpeg.h b/services/common/imageJpeg/include/screen_image_jpeg.h new file mode 100644 index 00000000..40e3e219 --- /dev/null +++ b/services/common/imageJpeg/include/screen_image_jpeg.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2023 Huawei Device 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. + */ + +#ifndef OHOS_SCREEN_IMAGE_JPEG_H +#define OHOS_SCREEN_IMAGE_JPEG_H + +#include +#include +#include + +#include "iimage_source_processor_listener.h" +#include "surface.h" +#include "video_param.h" +#include "data_buffer.h" +#include "dscreen_constants.h" + +namespace OHOS { +namespace DistributedHardware { +class ScreenImageJpeg : public std::enable_shared_from_this{ +public: + explicit ScreenImageJpeg(const VideoParam &configParam) : configParam_(configParam){}; + ~ScreenImageJpeg() = default; + int32_t SetOutputSurface(sptr surface); + int32_t MergeDirtyImagetoSurface(const std::shared_ptr &data, uint8_t *lastFrame); + int32_t ProcessPartailImage(sptr &surfaceBuffer, const std::vector &damages); + int32_t SetImageProcessListener(std::shared_ptr &imageProcessorListener); + void CodecImage(sptr &surfaceBuffer, const OHOS::Rect &damage, std::shared_ptr &data); + int32_t MergeImage(const std::shared_ptr &data, uint8_t *lastFrame); + int32_t PastImage(uint8_t *lastFrame, uint8_t *dirtyImageData, const DirtyRect rect); +private: + uint32_t CompressRgbaToJpeg(const OHOS::Rect &damage, uint8_t *inputData, std::shared_ptr &data); + void DecompressJpegToNV12(size_t jpegSize, uint8_t *inputData, uint8_t *outputData); + + static const constexpr char *LOG_TAG = "ScreenImageJpeg"; + sptr imageSurface_; + VideoParam configParam_; + std::weak_ptr imageProcessorListener_; + std::mutex dataMutex_; + std::condition_variable dataCond_; +}; +} // namespace DistributedHardware +} // namespace OHOS +#endif \ No newline at end of file diff --git a/services/common/imageJpeg/src/screen_image_jpeg.cpp b/services/common/imageJpeg/src/screen_image_jpeg.cpp new file mode 100644 index 00000000..9216a17e --- /dev/null +++ b/services/common/imageJpeg/src/screen_image_jpeg.cpp @@ -0,0 +1,309 @@ +/* + * Copyright (c) 2023 Huawei Device 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. + */ + +#include "screen_image_jpeg.h" + +#include +#include +#include +#include +#include +#include "jpeglib.h" + +#include "dscreen_errcode.h" +#include "dscreen_log.h" + +namespace OHOS { +namespace DistributedHardware { +int32_t ScreenImageJpeg::SetOutputSurface(sptr surface) +{ + DHLOGI("%s: SetOutputSurface.", LOG_TAG); + if (surface == nullptr) { + DHLOGE("%s: SetOutputSurface surface is nullptr.", LOG_TAG); + } + imageSurface_ = surface; + return DH_SUCCESS; +} +int32_t ScreenImageJpeg::MergeDirtyImagetoSurface(const std::shared_ptr &data, uint8_t *lastFrame) +{ + DHLOGI("%s: MergeDirtyImagetoSurface.", LOG_TAG); + if (imageSurface_ == nullptr) { + DHLOGE("%s: imageSurface_ is nullptr.", LOG_TAG); + return ERR_DH_SCREEN_SURFACE_INVALIED; + } + int32_t lastFrameSize = configParam_.GetScreenWidth() * configParam_.GetScreenHeight() * RGB_CHROMA / EVEN; + int32_t ret = MergeImage(data, lastFrame); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Merge dirty failed, ret: %.", PRId32, LOG_TAG, ret); + return ret; + } + sptr windowSurfaceBuffer = nullptr; + int32_t releaseFence = -1; + OHOS::BufferRequestConfig requestConfig = { + .width = configParam_.GetScreenWidth(), + .height = configParam_.GetScreenHeight(), + .strideAlignment = STRIDE_ALIGNMENT, + .format = PIXEL_FMT_YCBCR_420_SP, + .usage = HBM_USE_CPU_READ | HBM_USE_CPU_WRITE | HBM_USE_MEM_DMA, + }; + SurfaceError surfaceErr = imageSurface_->RequestBuffer(windowSurfaceBuffer, releaseFence, requestConfig); + if (surfaceErr != SURFACE_ERROR_OK || windowSurfaceBuffer == nullptr) { + DHLOGE("%s:imageSurface request buffer failed, surfaceErr: %.", PRId32, LOG_TAG, surfaceErr); + imageSurface_->CancelBuffer(windowSurfaceBuffer); + return surfaceErr; + } + int32_t surfaceBuffeSize = windowSurfaceBuffer->GetSize(); + auto windowSurfaceAddr = static_cast(windowSurfaceBuffer->GetVirAddr()); + ret = memcpy_s(windowSurfaceAddr, surfaceBuffeSize, lastFrame, lastFrameSize); + if (ret != DH_SUCCESS) { + DHLOGE("%s: memcpy lastFrame failed,ret: %.", PRId32, LOG_TAG, ret); + imageSurface_->CancelBuffer(windowSurfaceBuffer); + return ret; + } + BufferFlushConfig flushConfig = { {0, 0, windowSurfaceBuffer->GetWidth(), windowSurfaceBuffer-> GetHeight()}, 0}; + surfaceErr = imageSurface_->FlushBuffer(windowSurfaceBuffer, -1, flushConfig); + if (surfaceErr != SURFACE_ERROR_OK) { + DHLOGE("%s:imageSurface flush buffer failed, surfaceErr: %.", PRId32, LOG_TAG, surfaceErr); + imageSurface_->CancelBuffer(windowSurfaceBuffer); + return surfaceErr; + } + DHLOGI("%s: MergeDirtyImagetoSurface success.", LOG_TAG); + return DH_SUCCESS; +} +int32_t ScreenImageJpeg::ProcessPartailImage(sptr &surfaceBuffer, const std::vector &damages) +{ + DHLOGI("%s: ProcessPartailImage.", LOG_TAG); + std::shared_ptr dataBuf = std::make_shared(configParam_.GetScreenWidth() * + configParam_.GetScreenHeight() * RGBA_CHROMA); + dataBuf->SetSize(0); + for (auto item : damages) { + CodecImage(surfaceBuffer, item, dataBuf); + } + std::shared_ptr listener = imageProcessorListener_.lock(); + if (listener == nullptr) { + DHLOGE("%s: Processor listener is null.", LOG_TAG); + imageSurface_->ReleaseBuffer(surfaceBuffer, -1); + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + dataBuf->SetDataType(VIDEO_PART_SCREEN_DATA); + listener->OnImageProcessDone(dataBuf); + return DH_SUCCESS; +} +int32_t ScreenImageJpeg::SetImageProcessListener(std::shared_ptr &imageProcessorListener) +{ + DHLOGI("%s: SetImageProcessorListener.", LOG_TAG); + imageProcessorListener_ = imageProcessorListener; + return DH_SUCCESS; +} +void ScreenImageJpeg::CodecImage(sptr &surfaceBuffer, const OHOS::Rect &damage, std::shared_ptr &data) +{ + DHLOGI("%s: CodecImage.", LOG_TAG); + int32_t partialSize = damage.w * damage.h *RGBA_CHROMA; + unsigned char *partialBuffer = new unsigned char[partialSize]; + unsigned char *partialBufferIdx = partialBuffer; + auto surfaceAddrIdx = static_cast(surfaceBuffer->GetVirAddr()); + surfaceAddrIdx += damage.y * configParam_.GetScreenWidth() * RGBA_CHROMA + damage.x * RGBA_CHROMA; + for (int32_t row = 0 ; row < damage.h ; row++) { + int32_t ret = memcpy_s(partialBufferIdx, damage.w * RGBA_CHROMA, surfaceAddrIdx, damage.w * RGBA_CHROMA); + if (ret != DH_SUCCESS) { + DHLOGE("%s: get partail data failed.", LOG_TAG); + imageSurface_->ReleaseBuffer(surfaceBuffer, -1); + delete [] partialBuffer; + return; + } + partialBufferIdx += damage.w * RGBA_CHROMA; + surfaceAddrIdx += configParam_.GetScreenWidth() * RGBA_CHROMA; + } + uint32_t jpegSize = CompressRgbaToJpeg(damage, partialBuffer, data); + DHLOGI("CodecImage jpegSize %.", PRId32, jpegSize); + delete [] partialBuffer; +} + + +int32_t ScreenImageJpeg::MergeImage(const std::shared_ptr &data, uint8_t *lastFrame) +{ + DHLOGI("%s: MergeDirtyImagetoSurface.", LOG_TAG); + std::vector dirtyRectVec = data->DirtyRectVec(); + int32_t offset = 0; + int32_t screenWidth = configParam_.GetScreenWidth(); + int32_t screenHeight = configParam_.GetScreenHeight(); + for (auto item : dirtyRectVec) { + if (item.xPos > screenWidth || item.yPos > screenHeight || + item.width > screenWidth - item.xPos || item.height > screenHeight - item.yPos) { + DHLOGE("%s: Dirty rect invalied.", LOG_TAG); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } + uint8_t *jpegData = new uint8_t [item.dirtySize] {0}; + int32_t ret = data->GetData(offset, item.dirtySize, jpegData); + if (ret != DH_SUCCESS) { + delete [] jpegData; + return ret; + } + offset += item.dirtySize; + uint8_t *dirtyImageData = new uint8_t[item.width * item.height * RGB_CHROMA] {0}; + DecompressJpegToNV12(item.dirtySize, jpegData, dirtyImageData); + ret = PastImage(lastFrame, dirtyImageData, item); + if (ret != DH_SUCCESS) { + DHLOGE("PastImage failed, ret: %.", PRId32, ret); + delete [] jpegData; + delete [] dirtyImageData; + return ret; + } + delete [] jpegData; + delete [] dirtyImageData; + } + return DH_SUCCESS; +} + +int32_t ScreenImageJpeg::PastImage(uint8_t *lastFrame, uint8_t *dirtyImageData, const DirtyRect rect) +{ + DHLOGI("%s: PastImage.", LOG_TAG); + uint8_t *lastFrameIdx = lastFrame; + uint8_t *yData = lastFrameIdx + configParam_.GetScreenWidth() * rect.yPos + rect.xPos; + uint8_t *uData = lastFrameIdx + configParam_.GetScreenWidth() * configParam_.GetScreenHeight() + + configParam_.GetScreenWidth() * (rect.yPos / EVEN) + rect.xPos; + uint8_t *yDirtyData = dirtyImageData; + uint8_t *uDirtyData = dirtyImageData + rect.width * rect.height; + uint8_t *yTempData = nullptr; + uint8_t *uTempData = nullptr; + for (int32_t i = 0 ; i < rect.height ; i++) { + yTempData = yData + i * configParam_.GetScreenWidth(); + int32_t ret = memcpy_s(yTempData, rect.width, yDirtyData, rect.width); + if (ret != EOK) { + DHLOGE("%s: memcpy yData failed.", LOG_TAG); + return ret; + } + yDirtyData += rect.width; + if (i % EVEN) { + uTempData = uData + configParam_.GetScreenWidth() * (i / EVEN); + ret = memcpy_s(uTempData, rect.width, uDirtyData, rect.width); + if (ret != EOK) { + DHLOGE("%s: memcpy uData failed.", LOG_TAG); + return ret; + } + uDirtyData += rect.width; + } + } + return DH_SUCCESS; +} + +uint32_t ScreenImageJpeg::CompressRgbaToJpeg(const OHOS::Rect &damage, uint8_t *inputData, std::shared_ptr &data) +{ + DHLOGI("%s: CompressRgbaToJpeg.", LOG_TAG); + jpeg_compress_struct cinfo; + jpeg_error_mgr jerr; + JSAMPROW row_pointer[1]; + + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_compress(&cinfo); + unsigned char *outBuffer = nullptr; + unsigned long outSize = 0; + jpeg_mem_dest(&cinfo, &outBuffer, &outSize); + + cinfo.image_width = damage.w; + cinfo.image_height = damage.h; + cinfo.input_components = RGB_CHROMA; + cinfo.in_color_space = JCS_RGB; + + jpeg_set_defaults(&cinfo); + jpeg_set_quality(&cinfo, JPEG_QUALITY, TRUE); + jpeg_start_compress(&cinfo, TRUE); + unsigned char rgb_buffer[damage.w * RGB_CHROMA]; + unsigned char *pB = inputData; + unsigned char *pG = inputData + 1; + unsigned char *pR = inputData + 2; + while (cinfo.next_scanline < cinfo.image_height) { + int index = 0; + for (int i = 0 ; i < damage.w ; i++) { + rgb_buffer[index++] = *pB; + rgb_buffer[index++] = *pG; + rgb_buffer[index++] = *pR; + pB += RGBA_CHROMA; + pG += RGBA_CHROMA; + pR += RGBA_CHROMA; + } + row_pointer[0] = rgb_buffer; + (void)jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + jpeg_finish_compress(&cinfo); + DirtyRect rect = {damage.x, damage.y, damage.w, damage.h, outSize}; + data->AddData(static_cast(outSize), outBuffer); + data->AddDirtyRect(rect); + jpeg_destroy_compress(&cinfo); + if (outBuffer != NULL) { + free(outBuffer); + outBuffer = NULL; + } + return (uint32_t)outSize; +} +void ScreenImageJpeg::DecompressJpegToNV12(size_t jpegSize, uint8_t *inputData, uint8_t *outputData) +{ + DHLOGI("%s: DecompressJpegToNV12.", LOG_TAG); + jpeg_decompress_struct cinfo; + jpeg_error_mgr jerr; + JSAMPARRAY buffer; + int32_t row_stride = 0; + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + jpeg_mem_src(&cinfo, inputData, jpegSize); + (void)jpeg_read_header(&cinfo, TRUE); + (void)jpeg_start_decompress(&cinfo); + row_stride = cinfo.output_width * cinfo.output_components; + buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1); + int32_t i = 0; + int32_t yIndex = 0; + int32_t uvIndex = cinfo.output_width * cinfo.output_height; + int32_t y = 0; + int32_t u = 0; + int32_t v = 0; +#ifdef LIBYUV + int32_t rgbSize = cinfo.output_width * cinfo.output_height * RGBA_CHROMA; + uint8_t *rgb = new uint8_t[rgbSize]; + int32_t rgbIndex = 0; +#endif + while (cinfo.output_scanline < cinfo.output_height) { + (void)jpeg_read_scanlines(&cinfo, buffer, 1); + for (int j = 0 ; j < cinfo.output_width ; j++) { +#ifdef LIBYUV + rgb[rgbIndex++] = buffer[0][j * RGB_CHROMA + 2]; + rgb[rgbIndex++] = buffer[0][j * RGB_CHROMA + 1]; + rgb[rgbIndex++] = buffer[0][j * RGB_CHROMA]; + rgb[rgbIndex++] = 0xff; +#else + y = ((YR_PARAM * buffer[0][j * RGB_CHROMA] + YG_PARAM * buffer[0][j * RGB_CHROMA + 1] + + YB_PARAM * buffer[0][j * RGB_CHROMA + 2] + UA_PARAM) >> MOVEBITS) + YA_PARAM; + u = ((UR_PARAM * buffer[0][j * RGB_CHROMA] - UG_PARAM * buffer[0][j * RGB_CHROMA + 1] + + UB_PARAM * buffer[0][j * RGB_CHROMA + 2] + UA_PARAM) >> MOVEBITS) + UA_PARAM; + v = ((UB_PARAM * buffer[0][j * RGB_CHROMA] - VG_PARAM * buffer[0][j * RGB_CHROMA + 1] - + VB_PARAM * buffer[0][j * RGB_CHROMA + 2] + UA_PARAM) >> MOVEBITS) + UA_PARAM; + outputData[yIndex++] = static_cast((y < 0) ? 0 : (y > YUV_PARAM) ? YUV_PARAM : y); + if ((i % EVEN == 0) && (j % EVEN == 0)) { + outputData[uvIndex++] = static_cast((u < 0) ? 0 : (u > YUV_PARAM) ? YUV_PARAM : u); + outputData[uvIndex++] = static_cast((v < 0) ? 0 : (v > YUV_PARAM) ? YUV_PARAM : v); + } + } + ++i; + } +#endif + (void)jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); +#ifdef LIBYUV + libyuv::ARGBToNV12(rgb, cinfo.output_width * RGBA_CHROMA, outputData, cinfo.output_width, + outputData + uvIndex, cinfo.output_width, cinfo.output_width, cinfo.output_height); +#endif + DHLOGI("%s: DecompressJpegToNV12 success.", LOG_TAG); +} +} // namespace DistributedHardware +} // namespace OHOS \ No newline at end of file diff --git a/services/screenclient/BUILD.gn b/services/screenclient/BUILD.gn index 380caa65..e7e3b1b7 100644 --- a/services/screenclient/BUILD.gn +++ b/services/screenclient/BUILD.gn @@ -19,10 +19,11 @@ import( ohos_shared_library("distributed_screen_client") { include_dirs = [ "${windowmanager_path}/interfaces/innerkits/wm", - "${graphicstandard_path}/interfaces/innerkits/surface", + "${graphicstandard_path}/interfaces/inner_api/surface", "${graphicstandard_path}/rosen/modules/render_service_client/core/ui", "${fwk_common_path}/utils/include", "//foundation/multimodalinput/input/interfaces/native/innerkits/event/include/", + "//foundation/graphic/graphic_2d/interfaces/inner_api/common", ] include_dirs += [ diff --git a/services/screenclient/include/screen_client_window_adapter.h b/services/screenclient/include/screen_client_window_adapter.h index 9b8d2300..25ec72ac 100644 --- a/services/screenclient/include/screen_client_window_adapter.h +++ b/services/screenclient/include/screen_client_window_adapter.h @@ -48,6 +48,7 @@ private: ~ScreenClientWindowAdapter() = default; std::map> windowIdMap_; std::mutex windowIdMapMutex_; + sptr surface_ = nullptr; }; class ScreenClientInputEventListener : public Rosen::IInputEventConsumer { diff --git a/services/screenclient/src/screen_client_window_adapter.cpp b/services/screenclient/src/screen_client_window_adapter.cpp index a00da85a..f08f1e94 100644 --- a/services/screenclient/src/screen_client_window_adapter.cpp +++ b/services/screenclient/src/screen_client_window_adapter.cpp @@ -55,6 +55,7 @@ sptr ScreenClientWindowAdapter::CreateWindow(std::shared_ptrFlushImplicitTransaction(); std::shared_ptr listener = std::make_shared(ScreenClientInputEventListener()); diff --git a/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h b/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h index bab1ee68..878fa738 100644 --- a/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h +++ b/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h @@ -55,12 +55,15 @@ public: int32_t Start(); int32_t Stop(); std::shared_ptr GetWindowProperty(); + void SetScreenVersion(std::string version); + std::string GetScreenVersion(); private: std::string remoteDevId_; uint64_t screenId_; // local screen id uint64_t displayId_; // local display id bool isRunning = false; + std::string version_ = "1.0"; std::shared_ptr videoParam_ = nullptr; std::shared_ptr mapRelation_ = nullptr; diff --git a/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h b/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h index 0622e23f..cff8250f 100644 --- a/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h +++ b/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h @@ -42,6 +42,7 @@ private: std::map> screenRegions_; std::mutex screenRegionsMtx_; std::string localDevId_; + std::string version_ = "1.0"; sptr GetDScreenSourceSA(const std::string &devId); int32_t NotifyRemoteScreenService(const std::string &remoteDevId, const std::string &dhId, diff --git a/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp b/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp index 27fd2e0e..a8fe5697 100644 --- a/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp @@ -128,7 +128,15 @@ int32_t ScreenRegion::SetUpWindow() return DH_SUCCESS; } - +void ScreenRegion::SetScreenVersion(std::string version) +{ + DHLOGD("ScreenRegion SetScreenVersion"); + version_ = version; +} +std::string ScreenRegion::GetScreenVersion() +{ + return version_; +} int32_t ScreenRegion::SetUp() { @@ -142,7 +150,7 @@ int32_t ScreenRegion::SetUp() if (sinkTrans_ == nullptr) { sinkTrans_ = std::make_shared(); } - + sinkTrans_->SetScreenVersion(version_); sinkTrans_->RegisterStateCallback(shared_from_this()); sinkTrans_->SetImageSurface(surface_); ret = sinkTrans_->SetUp(*videoParam_, *videoParam_, remoteDevId_); diff --git a/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp b/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp index 4be61d56..17e7efd1 100644 --- a/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp @@ -121,6 +121,9 @@ bool ScreenRegionManager::CheckContentJson(json &eventContentJson) if (!IsString(eventContentJson, KEY_DH_ID)) { return false; } + if (eventContentJson.contains(KEY_VERSION) && !IsString(eventContentJson, KEY_VERSION)) { + return false; + } return true; } @@ -138,7 +141,9 @@ void ScreenRegionManager::HandleNotifySetUp(const std::string &remoteDevId, cons NotifyRemoteSourceSetUpResult(remoteDevId, "", ERR_DH_SCREEN_SA_SCREENREGION_SETUP_FAIL, ""); return; } - + if (eventContentJson.contains(KEY_VERSION)) { + version_ = eventContentJson[KEY_VERSION].get(); + } uint64_t screenId = eventContentJson[KEY_SCREEN_ID].get(); std::string dhId = eventContentJson[KEY_DH_ID].get(); @@ -167,7 +172,7 @@ void ScreenRegionManager::HandleNotifySetUp(const std::string &remoteDevId, cons } screenRegions_[remoteDevId] = screenRegion; } - + screenRegion->SetScreenVersion(version_); ret = screenRegion->SetUp(); if (ret != DH_SUCCESS) { DHLOGE("screen region setup failed"); diff --git a/services/screenservice/sourceservice/BUILD.gn b/services/screenservice/sourceservice/BUILD.gn index a9cb9d7e..d8d7e6c9 100644 --- a/services/screenservice/sourceservice/BUILD.gn +++ b/services/screenservice/sourceservice/BUILD.gn @@ -27,6 +27,9 @@ ohos_shared_library("distributed_screen_source") { "${fwk_common_path}/utils/include", "${mediastandard_path}/interfaces/inner_api/native", "${distributedhardwarefwk_path}/interfaces/inner_kits/include", + "//third_party/libjpeg-turbo", + "//foundation/graphic/graphic_2d/rosen/modules/render_service_base/include/platform/ohos", + "//foundation/graphic/graphic_2d/rosen/modules/composer/vsync/include", ] include_dirs += [ @@ -44,6 +47,8 @@ ohos_shared_library("distributed_screen_source") { "${services_path}/screentransport/screensourceprocessor/include", "${services_path}/screentransport/screensourceprocessor/encoder/include", "${services_path}/screentransport/screensourcetrans/include", + "${services_path}/common/imageJpeg/include", + "${services_path}/common/decision_center/include", "//drivers/peripheral/display/interfaces/include", "//drivers/peripheral/base", "//foundation/graphic/graphic_2d/rosen/modules/render_service_base/include", @@ -68,6 +73,7 @@ ohos_shared_library("distributed_screen_source") { "${common_path}:distributed_screen_utils", "${distributedhardwarefwk_path}/interfaces/inner_kits:libdhfwk_sdk", "${services_path}/screentransport/screensourcetrans:distributed_screen_sourcetrans", + "${mediastandard_path}/interfaces/inner_api/native:media_client", "${windowmanager_path}/dm:libdm", ] diff --git a/services/screenservice/sourceservice/dscreenmgr/include/dscreen.h b/services/screenservice/sourceservice/dscreenmgr/include/dscreen.h index 76f0b3b8..56ac3e4d 100644 --- a/services/screenservice/sourceservice/dscreenmgr/include/dscreen.h +++ b/services/screenservice/sourceservice/dscreenmgr/include/dscreen.h @@ -89,6 +89,8 @@ public: std::string GetDHId() const; std::string GetDevId() const; int32_t AddTask(const std::shared_ptr &task); + void SetScreenVersion(std::string &version); + std::string GetScreenVersion(); private: void TaskThreadLoop(); @@ -117,6 +119,7 @@ private: std::mutex taskQueueMtx_; std::queue> taskQueue_; bool taskThreadRunning_; + std::string version_; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h b/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h index 72aba53b..cd3284c7 100644 --- a/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h +++ b/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h @@ -63,6 +63,8 @@ public: int32_t RemoveFromGroup(const std::shared_ptr &changedScreen, uint64_t screenId); void GetScreenDumpInfo(std::string &result); void PublishMessage(const DHTopic topic, const std::shared_ptr &dScreen); + void SetScreenVersion(std::string &version); + std::string GetScreenVersion(); private: ~DScreenManager(); DScreenManager(); @@ -74,6 +76,7 @@ private: sptr dScreenGroupListener_ = nullptr; std::shared_ptr dScreenCallback_ = nullptr; std::string localDevId_; + std::string version_; sptr GetDScreenSinkSA(const std::string &devId); int32_t NotifyRemoteScreenService(const std::string &devId, int32_t eventCode, const std::string &eventContent); diff --git a/services/screenservice/sourceservice/dscreenmgr/src/dscreen.cpp b/services/screenservice/sourceservice/dscreenmgr/src/dscreen.cpp index bbf6c015..b7a4e704 100644 --- a/services/screenservice/sourceservice/dscreenmgr/src/dscreen.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/src/dscreen.cpp @@ -106,6 +106,15 @@ uint64_t DScreen::GetScreenId() const return screenId_; } +void DScreen::SetScreenVersion(std::string &version) +{ + version_ = version; +} +std::string DScreen::GetScreenVersion() +{ + return version_; +} + std::string DScreen::GetDHId() const { return dhId_; @@ -392,21 +401,13 @@ int32_t DScreen::SetUp() if (sourceTrans_ == nullptr) { sourceTrans_ = std::make_shared(); } - + sourceTrans_->SetScreenVersion(version_); sourceTrans_->RegisterStateCallback(shared_from_this()); int32_t ret = sourceTrans_->SetUp(*videoParam_, *videoParam_, devId_); if (ret != DH_SUCCESS) { DHLOGE("source trans SetUp failed."); return ret; } - - sptr windowSurface = sourceTrans_->GetImageSurface(); - if (windowSurface == nullptr) { - DHLOGE("DScreen SetUp failed."); - return ERR_DH_SCREEN_SA_DSCREEN_SETUP_FAILED; - } - - ScreenMgrAdapter::GetInstance().SetImageSurface(screenId_, windowSurface); DHLOGI("DScreen SetUp success."); return DH_SUCCESS; } @@ -419,12 +420,17 @@ int32_t DScreen::Start() DHLOGE("source trans not init."); return ERR_DH_SCREEN_SA_SOURCETRANS_NOT_INIT; } - int32_t ret = sourceTrans_->Start(); if (ret != DH_SUCCESS) { DHLOGE("source trans start failed."); return ret; } + sptr windowSurface = sourceTrans_->GetImageSurface(); + if (windowSurface == nullptr) { + DHLOGE("DScreen SetUp failed."); + return ERR_DH_SCREEN_SA_DSCREEN_SETUP_FAILED; + } + ScreenMgrAdapter::GetInstance().SetImageSurface(screenId_, windowSurface); return DH_SUCCESS; } diff --git a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp index 35cdb154..bfe0162f 100644 --- a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp @@ -268,7 +268,7 @@ int32_t DScreenManager::EnableDistributedScreen(const std::string &devId, const DHLOGI("dScreen state Already is ENABLED or ENABLING."); return DH_SUCCESS; } - + dScreen ->SetScreenVersion(version_); dScreens_[dScreenIdx] = dScreen; int32_t ret = dScreen->AddTask(std::make_shared(TaskType::TASK_ENABLE, reqId, attrs)); if (ret != DH_SUCCESS) { @@ -484,7 +484,7 @@ void DScreenManager::NotifyRemoteSinkSetUp(const std::shared_ptr &dScre return; } eventContentJson[KEY_VIDEO_PARAM] = *(dScreen->GetVideoParam()); - + eventContentJson[KEY_VERSION] = dScreen->GetScreenVersion(); if (mapRelations_.count(dScreen->GetScreenId()) == 0) { DHLOGE("mapRelation not found, back to enabled state screedId: %ulld", dScreen->GetScreenId()); dScreen->SetState(ENABLED); @@ -545,5 +545,15 @@ void DScreenManager::HandleNotifySetUpResult(const std::string &remoteDevId, con dScreens_[dScreenIdx]->AddTask(std::make_shared(TaskType::TASK_CONNECT, "")); } +void DScreenManager::SetScreenVersion(std::string &version) +{ + DHLOGI("SetScreenVersion"); + version_ = version; +} +std::string DScreenManager::GetScreenVersion() +{ + DHLOGI("GetScreenVersion"); + return version_; +} } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp b/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp index 0ff9d570..3676924f 100644 --- a/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp +++ b/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp @@ -112,6 +112,8 @@ int32_t DScreenSourceService::RegisterDistributedHardware(const std::string &dev const EnableParam ¶m, const std::string &reqId) { std::string attrs = param.attrs; + std::string version = param.version; + DScreenManager::GetInstance().SetScreenVersion(version); int ret = DScreenManager::GetInstance().EnableDistributedScreen(devId, dhId, attrs, reqId); if (ret != DH_SUCCESS) { DHLOGE("enable distributedScreen failed. devId: %s, dhId: %s, reqId: %s, attrs: %s", diff --git a/services/screenservice/test/unittest/sourceservice/dscreenmgr/BUILD.gn b/services/screenservice/test/unittest/sourceservice/dscreenmgr/BUILD.gn index 66a4d032..1512d9ae 100644 --- a/services/screenservice/test/unittest/sourceservice/dscreenmgr/BUILD.gn +++ b/services/screenservice/test/unittest/sourceservice/dscreenmgr/BUILD.gn @@ -35,6 +35,7 @@ config("module_private_config") { include_dirs += [ "./include", + "${services_path}/common/decision_centrt/include", "${services_path}/screenservice/sourceservice/dscreenmgr/include", "${services_path}/common/utils/include", "${services_path}/common/databuffer/include", @@ -46,6 +47,8 @@ config("module_private_config") { "${distributedscreen_path}/interfaces/innerkits/native_cpp/screen_sink/include/callback", "${distributedscreen_path}/interfaces/innerkits/native_cpp/screen_source/include", "${distributedscreen_path}/interfaces/innerkits/native_cpp/screen_source/include/callback", + "${services_path}/common/imageJpeg/include", + "${services_path}/screentransport/screensourceprocessor/encoder/include", ] } diff --git a/services/screenservice/test/unittest/sourceservice/dscreenmgr/src/dscreen_test.cpp b/services/screenservice/test/unittest/sourceservice/dscreenmgr/src/dscreen_test.cpp index a3226ff8..04d0b554 100644 --- a/services/screenservice/test/unittest/sourceservice/dscreenmgr/src/dscreen_test.cpp +++ b/services/screenservice/test/unittest/sourceservice/dscreenmgr/src/dscreen_test.cpp @@ -328,6 +328,7 @@ HWTEST_F(DScreenTest, SetUp_001, TestSize.Level1) dScreen_->videoParam_->SetVideoWidth(100); dScreen_->videoParam_->SetScreenHeight(100); dScreen_->videoParam_->SetScreenWidth(100); + dScreen_->version_ = "1.0"; int32_t ret = dScreen_->SetUp(); EXPECT_EQ(-1, ret); } @@ -348,6 +349,7 @@ HWTEST_F(DScreenTest, SetUp_002, TestSize.Level1) dScreen_->videoParam_->SetVideoWidth(100); dScreen_->videoParam_->SetScreenHeight(100); dScreen_->videoParam_->SetScreenWidth(100); + dScreen_->version_ = "1.0"; int32_t ret = dScreen_->SetUp(); EXPECT_EQ(-1, ret); } diff --git a/services/screentransport/screendatachannel/include/screen_refresh_channel_impl.h b/services/screentransport/screendatachannel/include/screen_refresh_channel_impl.h new file mode 100644 index 00000000..3a33f7e2 --- /dev/null +++ b/services/screentransport/screendatachannel/include/screen_refresh_channel_impl.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2023 Huawei Device 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. + */ + +#ifndef OHOS_SCREEN_REFRESH_CHANNEL_IMPL_H +#define OHOS_SCREEN_REFRESH_CHANNEL_IMPL_H + +#include +#include + +#include "data_buffer.h" +#include "iscreen_channel.h" +#include "softbus_adapter.h" + +namespace OHOS { +namespace DistributedHardware { +class ScreenRefreshChannelImpl : public IScreenChannel, + public ISoftbusListener, + public std::enable_shared_from_this { +public: + explicit ScreenRefreshChannelImpl(std::string peerDevId) : peerDevId_(peerDevId) {}; + ~ScreenRefreshChannelImpl() override = default; + + int32_t CreateSession(const std::shared_ptr &listener) override; + int32_t ReleaseSession() override; + int32_t OpenSession() override; + int32_t CloseSession() override; + int32_t SendData(const std::shared_ptr &screenData) override; + + void OnSessionOpened(int32_t sessionId, int32_t result) override; + void OnSessionClosed(int32_t sessionId) override; + void OnBytesReceived(int32_t sessionId, const void *data, uint32_t dataLen) override; + void OnStreamReceived(int32_t sessionId, const StreamData *data, const StreamData *ext, + const StreamFrameInfo *param) override; + + int32_t OpenDataSession(); + int32_t OpenJpegSession(); + int32_t SendFullData(const std::shared_ptr &screenData); + int32_t SendDirtyData(const std::shared_ptr &screenData); + +private: + static const constexpr char *LOG_TAG = "ScreenRefreshChannelImpl"; + + const std::string peerDevId_; + int32_t sessionId_ = 0; + int32_t jpegSessionId_ = 0; + bool dataSessionOpened = false; + bool jpegSessionOpened = false; + std::weak_ptr channelListener_; +}; +} // namespace DistributedHardware +} // namespace OHOS +#endif \ No newline at end of file diff --git a/services/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp b/services/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp new file mode 100644 index 00000000..223268fc --- /dev/null +++ b/services/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp @@ -0,0 +1,370 @@ +/* + * Copyright (c) 2022 Huawei Device 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. + */ + +#include "screen_refresh_channel_impl.h" + +#include + +#include "dscreen_constants.h" +#include "dscreen_errcode.h" +#include "dscreen_hisysevent.h" +#include "dscreen_log.h" +#include "dscreen_util.h" +#include "nlohmann/json.hpp" +#include "dscreen_json_util.h" + +namespace OHOS { +namespace DistributedHardware { +int32_t ScreenRefreshChannelImpl::CreateSession(const std::shared_ptr &listener) +{ + DHLOGI("%s: CreateSession, peerDevId(%s)", LOG_TAG, GetAnonyString(peerDevId_).c_str()); + if (listener == nullptr) { + DHLOGE("%s: Channel listener is null", LOG_TAG); + return ERR_DH_SCREEN_TRANS_NULL_VALUE; + } + + int32_t ret = + SoftbusAdapter::GetInstance().CreateSoftbusSessionServer(PKG_NAME, DATA_SESSION_NAME, peerDevId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Create softbus session failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + + std::shared_ptr softbusListener = shared_from_this(); + ret = SoftbusAdapter::GetInstance().RegisterSoftbusListener(softbusListener, DATA_SESSION_NAME, peerDevId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Register softbus adapter listener failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + + ret = SoftbusAdapter::GetInstance().CreateSoftbusSessionServer(PKG_NAME, JPEG_SESSION_NAME, peerDevId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Create softbus session failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + + ret = SoftbusAdapter::GetInstance().RegisterSoftbusListener(softbusListener, JPEG_SESSION_NAME, peerDevId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Register softbus adapter listener failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + + channelListener_ = listener; + DHLOGI("%s: Create softbus session success", LOG_TAG); + return DH_SUCCESS; +} + +int32_t ScreenRefreshChannelImpl::ReleaseSession() +{ + DHLOGI("%s: ReleaseSession, peerDevId(%s)", LOG_TAG, GetAnonyString(peerDevId_).c_str()); + int32_t ret = SoftbusAdapter::GetInstance().RemoveSoftbusSessionServer(PKG_NAME, DATA_SESSION_NAME, peerDevId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Release softbus session failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + + ret = SoftbusAdapter::GetInstance().UnRegisterSoftbusListener(DATA_SESSION_NAME, peerDevId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: UnRegister softbus adapter listener failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + + ret = SoftbusAdapter::GetInstance().RemoveSoftbusSessionServer(PKG_NAME, JPEG_SESSION_NAME, peerDevId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Release softbus session failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + + ret = SoftbusAdapter::GetInstance().UnRegisterSoftbusListener(JPEG_SESSION_NAME, peerDevId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: UnRegister softbus adapter listener failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + + DHLOGI("%s: Release softbus session success", LOG_TAG); + return DH_SUCCESS; +} + +int32_t ScreenRefreshChannelImpl::OpenSession() +{ + DHLOGI("%s: OpenSession, peerDevId(%s)", LOG_TAG, GetAnonyString(peerDevId_).c_str()); + int32_t ret = OpenDataSession(); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Open screen session failed, ret: %" PRId32, LOG_TAG, sessionId_); + return ERR_DH_SCREEN_TRANS_ERROR; + } + ret = OpenJpegSession(); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Open screen session failed, ret: %" PRId32, LOG_TAG, jpegSessionId_); + return ERR_DH_SCREEN_TRANS_ERROR; + } + return DH_SUCCESS; +} + +int32_t ScreenRefreshChannelImpl::OpenDataSession() +{ + DHLOGI("%s: OpenDataSession, peerDevId(%s)", LOG_TAG, GetAnonyString(peerDevId_).c_str()); + int32_t sessionId = + SoftbusAdapter::GetInstance().OpenSoftbusSession(DATA_SESSION_NAME, DATA_SESSION_NAME, peerDevId_); + if (sessionId < 0) { + DHLOGE("%s: Open screen session failed, ret: %" PRId32, LOG_TAG, sessionId); + ReportOptFail(DSCREEN_OPT_FAIL, sessionId, "Open screen session failed"); + return ERR_DH_SCREEN_TRANS_ERROR; + } + sessionId_ = sessionId; + + DHLOGI("%s: Open screen session success, sessionId %" PRId32, LOG_TAG, sessionId_); + return DH_SUCCESS; +} + +int32_t ScreenRefreshChannelImpl::OpenJpegSession() +{ + DHLOGI("%s: OpenJpegSession, peerDevId(%s)", LOG_TAG, GetAnonyString(peerDevId_).c_str()); + int32_t sessionId = + SoftbusAdapter::GetInstance().OpenSoftbusSession(JPEG_SESSION_NAME, JPEG_SESSION_NAME, peerDevId_); + if (sessionId < 0) { + DHLOGE("%s: Open screen session failed, ret: %" PRId32, LOG_TAG, sessionId); + ReportOptFail(DSCREEN_OPT_FAIL, sessionId, "Open screen session failed"); + return ERR_DH_SCREEN_TRANS_ERROR; + } + jpegSessionId_ = sessionId; + + DHLOGI("%s: Open screen session success, sessionId %" PRId32, LOG_TAG, sessionId_); + return DH_SUCCESS; + +} + +int32_t ScreenRefreshChannelImpl::CloseSession() +{ + DHLOGI("%s: CloseSession, sessionId %" PRId32, LOG_TAG, sessionId_); + if (sessionId_ == 0) { + DHLOGD("%s: Session is not opened.", LOG_TAG); + return ERR_DH_SCREEN_TRANS_SESSION_NOT_OPEN; + } + + int32_t ret = SoftbusAdapter::GetInstance().CloseSoftbusSession(sessionId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Close screen session failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + sessionId_ = 0; + + if (jpegSessionId_ == 0) { + DHLOGD("%s: jpegSessionId is not opened.", LOG_TAG); + return ERR_DH_SCREEN_TRANS_SESSION_NOT_OPEN; + } + + ret = SoftbusAdapter::GetInstance().CloseSoftbusSession(jpegSessionId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Close jpeg session failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + jpegSessionId_ = 0; + DHLOGI("%s: Close screen session success", LOG_TAG); + return DH_SUCCESS; +} + +int32_t ScreenRefreshChannelImpl::SendData(const std::shared_ptr &screenData) +{ + DHLOGI("%s: SendData.", LOG_TAG); + if (screenData == nullptr || screenData->Data() == nullptr) { + DHLOGE("%s: Screen data is null", LOG_TAG); + return ERR_DH_SCREEN_TRANS_NULL_VALUE; + } + uint8_t dataType = screenData->DataType(); + if (dataType == VIDEO_PART_SCREEN_DATA) { + int32_t ret = SendDirtyData(screenData); + if (ret != DH_SUCCESS) { + DHLOGE("%s: send dirty data failed, ret: %.", PRId32, LOG_TAG, ret); + return ret; + } + } else if (dataType == VIDEO_FULL_SCREEN_DATA) { + int32_t ret = SendFullData(screenData); + if (ret != DH_SUCCESS) { + DHLOGE("%s: send full data failed, ret: %.", PRId32, LOG_TAG, ret); + return ret; + } + } + return DH_SUCCESS; +} + +int32_t ScreenRefreshChannelImpl::SendFullData(const std::shared_ptr &screenData) +{ + DHLOGI("%s: SendFullData sessionId: %.", PRId32, LOG_TAG, sessionId_); + if (screenData == nullptr) { + DHLOGE("%s: Screen data is null", LOG_TAG); + return ERR_DH_SCREEN_TRANS_NULL_VALUE; + } + StreamData data = {reinterpret_cast(screenData->Data()), screenData->Capacity()}; + StreamData ext = {0}; + StreamFrameInfo frameInfo = {0}; + int32_t ret = SoftbusAdapter::GetInstance().SendSoftbusStream(sessionId_, &data, &ext, &frameInfo); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Send full data failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + DHLOGI("%s: SendFullData success.", LOG_TAG); + return DH_SUCCESS; +} +int32_t ScreenRefreshChannelImpl::SendDirtyData(const std::shared_ptr &screenData) +{ + DHLOGI("%s: SendDirtyData sessionId: %.", PRId32, LOG_TAG, jpegSessionId_); + if (screenData == nullptr) { + DHLOGE("%s: Screen data is null", LOG_TAG); + return ERR_DH_SCREEN_TRANS_NULL_VALUE; + } + nlohmann::json rectJson; + std::vector dirtyRectVec = screenData->DirtyRectVec(); + rectJson["dataType"] = screenData->DataType(); + rectJson["dirtySize"] = static_cast(dirtyRectVec.size()); + int32_t rectIndex = 0; + for (auto item : dirtyRectVec) { + std::string tempRectIndex = std::to_string(rectIndex); + rectJson[tempRectIndex] = {item.xPos, item.yPos, item.width, item.height, item.dirtySize}; + rectIndex++; + } + StreamData data = {reinterpret_cast(screenData->Data()), screenData->Capacity()}; + std::string rectInfo = rectJson.dump(); + char *dirtyInfo = new char[rectInfo.length() + 1] {0}; + int32_t ret = memcpy_s(dirtyInfo, rectInfo.length(), rectInfo.c_str(), rectInfo.length()); + if (ret != EOK) { + DHLOGE("SendDirtyData memcpy_s failed."); + delete [] dirtyInfo; + return ret; + } + StreamData ext = {dirtyInfo, rectInfo.length() + 1}; + StreamFrameInfo frameInfo = {0}; + ret = SoftbusAdapter::GetInstance().SendSoftbusStream(jpegSessionId_, &data, &ext, &frameInfo); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Send dirty data failed ret: %" PRId32, LOG_TAG, ret); + delete [] dirtyInfo; + return ret; + } + delete [] dirtyInfo; + DHLOGI("%s: SendDirtyData success.", LOG_TAG); + return DH_SUCCESS; +} + +void ScreenRefreshChannelImpl::OnSessionOpened(int32_t sessionId, int32_t result) +{ + DHLOGI("%s: OnScreenSessionOpened, sessionId: %" PRId32", result: %" PRId32, LOG_TAG, sessionId, result); + if (result != 0) { + DHLOGE("Session open failed", LOG_TAG); + return; + } + + if (sessionId == sessionId_) { + dataSessionOpened = true; + sessionId_ = sessionId; + } else if (sessionId == jpegSessionId_) { + jpegSessionOpened = true; + jpegSessionId_ = sessionId; + } + if (!dataSessionOpened || !jpegSessionOpened) { + return; + } + + std::shared_ptr listener = channelListener_.lock(); + if (listener == nullptr) { + DHLOGE("%s: Channel listener is null", LOG_TAG); + return; + } + listener->OnSessionOpened(); +} + +void ScreenRefreshChannelImpl::OnSessionClosed(int32_t sessionId) +{ + DHLOGI("%s: OnScreenSessionClosed, sessionId %" PRId32, LOG_TAG, sessionId); + std::shared_ptr listener = channelListener_.lock(); + if (listener == nullptr) { + DHLOGE("%s: Channel listener is null", LOG_TAG); + return; + } + listener->OnSessionClosed(); +} + +void ScreenRefreshChannelImpl::OnBytesReceived(int32_t sessionId, const void *data, uint32_t dataLen) +{ + (void) sessionId; + (void) data; + (void) dataLen; + + DHLOGD("%s: OnScreenBytesReceived data channel not support yet", LOG_TAG); +} + +void ScreenRefreshChannelImpl::OnStreamReceived(int32_t sessionId, const StreamData *data, const StreamData *ext, + const StreamFrameInfo *param) +{ + DHLOGI("%s: OnStreamReceived.", LOG_TAG); + if (data == nullptr) { + DHLOGE("%s: Stream data is null", LOG_TAG); + return; + } + + std::shared_ptr listener = channelListener_.lock(); + if (listener == nullptr) { + DHLOGE("%s: Channel listener is null.", LOG_TAG); + return; + } + if (ext->bufLen == 0) { + DHLOGI("sink received full data."); + auto dataBuffer = std::make_shared(data->bufLen); + int32_t ret = memcpy_s(dataBuffer->Data(), dataBuffer->Capacity(), reinterpret_cast(data->buf), data->bufLen); + if (ret != EOK) { + DHLOGE("%s: Full data memcpy failed.", LOG_TAG); + return; + } + dataBuffer->SetDataType(VIDEO_FULL_SCREEN_DATA); + listener->OnDataReceived(dataBuffer); + return; + } else { + DHLOGI("sink received dirty data."); + auto dataBuffer = std::make_shared(data->bufLen); + int32_t ret = memcpy_s(dataBuffer->Data(), dataBuffer->Capacity(), reinterpret_cast(data->buf), data->bufLen); + if (ret != EOK) { + DHLOGE("%s: Dirty data memcpy_s failed.", LOG_TAG); + return; + } + nlohmann::json rectJson = nlohmann::json::parse(ext->buf, nullptr, false); + if (rectJson.is_discarded()) { + DHLOGE("%s: OnStreamReceived rectJson invalied", LOG_TAG); + return; + } + if (!IsInt32(rectJson, "dirtySize") || !IsInt32(rectJson, "dataType")) { + return; + } + int32_t dirtySize = rectJson["dirtySize"].get(); + int32_t dataType = rectJson["dataType"].get(); + uint8_t num = 0; + while (num < dirtySize) { + auto item = std::to_string(num); + if (!rectJson.contains(item)) { + return; + } + int32_t X = rectJson[item][0].get(); + int32_t Y = rectJson[item][1].get(); + int32_t W = rectJson[item][2].get(); + int32_t H = rectJson[item][3].get(); + int32_t Size = rectJson[item][4].get(); + DirtyRect rect = {X, Y, W, H, Size}; + dataBuffer->AddDirtyRect(rect); + num++; + } + dataBuffer->SetDataType(dataType); + listener->OnDataReceived(dataBuffer); + } +} +} // namespace DistributedHardware +} // namespace OHOS \ No newline at end of file diff --git a/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h b/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h index 1e4b1cbe..66dddc30 100644 --- a/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h +++ b/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h @@ -28,6 +28,7 @@ #include "media_errors.h" #include "format.h" #include "surface.h" +#include "iconsumer_surface.h" #include "data_buffer.h" #include "iimage_sink_processor_listener.h" @@ -36,6 +37,15 @@ namespace OHOS { namespace DistributedHardware { +class ConsumBufferListener : public IBufferConsumerListener { +public: + ConsumBufferListener(const std::shared_ptr decoder) : decoder_(decoder) {}; + ~ConsumBufferListener() = default; + void OnBufferAvailable() override; +private: + static const constexpr char *LOG_TAG = "ConsumBufferListener"; + std::shared_ptr decoder_; +}; class ImageSinkDecoder : public std::enable_shared_from_this { public: explicit ImageSinkDecoder(const std::shared_ptr &imageListener) @@ -48,6 +58,12 @@ public: int32_t StopDecoder(); int32_t SetOutputSurface(sptr &surface); int32_t InputScreenData(const std::shared_ptr &data); + int32_t AddSurface(); + void ConsumeSurface(); + uint8_t *GetLastFrame(); + sptr GetWinSurfaceBuffer(); + void NormalProcess(sptr surfaceBuffer, sptr windowSurfaceBuffer); + void OffsetProcess(sptr surfaceBuffer, sptr windowSurfaceBuffer); void OnError(Media::AVCodecErrorType errorType, int32_t errorCode); void OnInputBufferAvailable(uint32_t index); @@ -64,16 +80,23 @@ private: private: static const constexpr char *LOG_TAG = "ImageSinkDecoder"; - + VideoParam configParam_; std::mutex dataMutex_; std::mutex decodeMutex_; std::thread decodeThread_; std::condition_variable decodeCond_; + uint8_t *lastFrame_ = nullptr; + int32_t lastFrameSize_ = 0; Media::Format imageFormat_; Media::AVCodecBufferInfo decoderBufferInfo_; bool isDecoderReady_ = false; + int32_t alignedHeight_ = 0; + sptr consumerSurface_; + sptr producerSurface_; + sptr windowSurface_; + sptr consumerBufferListener_; std::queue> videoDataQueue_; std::queue bufferIndexQueue_; std::shared_ptr videoDecoder_; diff --git a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp index 6fc23bb7..00d8697b 100644 --- a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp +++ b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp @@ -41,10 +41,177 @@ int32_t ImageSinkDecoder::ConfigureDecoder(const VideoParam &configParam) DHLOGE("%s: SetDecoderFormat failed.", LOG_TAG); return ret; } + configParam_ = configParam; + ret = AddSurface(); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Add surface failed ret: %.", PRId32, LOG_TAG, ret); + consumerSurface_ = nullptr; + producerSurface_ = nullptr; + return ret; + } + alignedHeight_ = configParam_.GetVideoHeight(); + if (alignedHeight_ % ALIGNEDBITS != 0) { + alignedHeight_ = ((alignedHeight_ / ALIGNEDBITS) + 1) * ALIGNEDBITS; + } + return DH_SUCCESS; +} + +int32_t ImageSinkDecoder::AddSurface() +{ + DHLOGI("%s: AddSurface.", LOG_TAG); + consumerSurface_ = IConsumerSurface::Create(); + if (consumerSurface_ == nullptr) { + DHLOGE("%s: Create consumer surface failed.", LOG_TAG); + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + + sptr producer = consumerSurface_->GetProducer(); + if (producer == nullptr) { + DHLOGE("%s: Get preducer surface failed.", LOG_TAG); + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + + producerSurface_ = Surface::CreateSurfaceAsProducer(producer); + if (producerSurface_ == nullptr) { + DHLOGE("%s: Create preducer surface failed.", LOG_TAG); + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + if (consumerBufferListener_ == nullptr) { + consumerBufferListener_ = new ConsumBufferListener(shared_from_this()); + } + consumerSurface_->RegisterConsumerListener(consumerBufferListener_); + lastFrameSize_ = configParam_.GetVideoWidth() * configParam_.GetVideoHeight() * RGB_CHROMA / EVEN; + lastFrame_ = new uint8_t[lastFrameSize_]; return DH_SUCCESS; } +uint8_t *ImageSinkDecoder::GetLastFrame() +{ + return lastFrame_; +} + +sptr ImageSinkDecoder::GetWinSurfaceBuffer() +{ + DHLOGI("%s: ConsumeSurface.", LOG_TAG); + sptr windowSurfaceBuffer = nullptr; + int32_t releaseFence = -1; + OHOS::BufferRequestConfig requestConfig = { + .width = configParam_.GetVideoWidth(), + .height = configParam_.GetVideoHeight(), + .strideAlignment = STRIDE_ALIGNMENT, + .format = PIXEL_FMT_YCBCR_420_SP, + .usage = HBM_USE_CPU_READ | HBM_USE_CPU_WRITE | HBM_USE_MEM_DMA, + }; + SurfaceError surfaceErr = windowSurface_->RequestBuffer(windowSurfaceBuffer, releaseFence, requestConfig); + if (surfaceErr != SURFACE_ERROR_OK || windowSurfaceBuffer == nullptr) { + DHLOGE("%s: windowSurface_ request buffer failed, buffer is nullptr.", LOG_TAG); + windowSurface_->CancelBuffer(windowSurfaceBuffer); + } + return windowSurfaceBuffer; +} +void ImageSinkDecoder::NormalProcess(sptr surfaceBuffer, sptr windowSurfaceBuffer) +{ + DHLOGI("%s: NormalProcess.", LOG_TAG); + auto surfaceAddr = static_cast(surfaceBuffer->GetVirAddr()); + auto windowSurfaceAddr = static_cast(windowSurfaceBuffer->GetVirAddr()); + int32_t sizeData = lastFrameSize_; + int32_t size = windowSurfaceBuffer->GetSize(); + int32_t ret = memcpy_s(windowSurfaceAddr, size, surfaceAddr, sizeData); + if (ret != EOK) { + DHLOGE("%s: surfaceBuffer memcpy run failed.", LOG_TAG); + windowSurface_->CancelBuffer(windowSurfaceBuffer); + } + +} +void ImageSinkDecoder::OffsetProcess(sptr surfaceBuffer, sptr windowSurfaceBuffer) +{ + DHLOGI("%s: OffsetProcess.", LOG_TAG); + auto surfaceAddr = static_cast(surfaceBuffer->GetVirAddr()); + auto windowSurfaceAddr = static_cast(windowSurfaceBuffer->GetVirAddr()); + int32_t size = windowSurfaceBuffer->GetSize(); + int32_t srcDataOffset = 0; + int32_t dstDataOffset = 0; + int32_t alignedWidth = surfaceBuffer->GetStride(); + int32_t chromaOffset = configParam_.GetVideoWidth() * configParam_.GetVideoHeight(); + for (int32_t yh = 0 ; yh < configParam_.GetVideoHeight() ; yh++) { + int32_t ret = memcpy_s(windowSurfaceAddr + dstDataOffset, chromaOffset - dstDataOffset, + surfaceAddr + srcDataOffset, configParam_.GetVideoWidth()); + if (ret != EOK) { + DHLOGE("%s: surfaceBuffer memcpy_s run failed.", LOG_TAG); + windowSurface_->CancelBuffer(windowSurfaceBuffer); + return; + } + dstDataOffset += configParam_.GetVideoWidth(); + srcDataOffset += alignedWidth; + } + dstDataOffset = chromaOffset; + srcDataOffset = alignedWidth * alignedHeight_; + for (int32_t uvh = 0 ; uvh < configParam_.GetVideoHeight() / EVEN; uvh++) { + int32_t ret = memcpy_s(windowSurfaceAddr + dstDataOffset, size - dstDataOffset, + surfaceAddr + srcDataOffset, configParam_.GetVideoWidth()); + if (ret != EOK) { + DHLOGE("%s: surfaceBuffer memcpy_s run failed.", LOG_TAG); + windowSurface_->CancelBuffer(windowSurfaceBuffer); + return; + } + dstDataOffset += configParam_.GetVideoWidth(); + srcDataOffset += alignedWidth; + } +} + +void ImageSinkDecoder::ConsumeSurface() +{ + DHLOGI("%s: ConsumeSurface.", LOG_TAG); + std::unique_lock bufLock(decodeMutex_); + if (consumerSurface_ == nullptr) { + DHLOGE("%s: consumerSurface_ is nullptr.", LOG_TAG); + return; + } + sptr surfaceBuffer = nullptr; + int32_t fence = -1; + int64_t timestamp = 0; + OHOS::Rect damage = {0, 0, 0, 0}; + SurfaceError surfaceErr = consumerSurface_->AcquireBuffer(surfaceBuffer, fence, timestamp, damage); + if (surfaceErr != SURFACE_ERROR_OK) { + return; + } + sptr windowSurfaceBuffer = GetWinSurfaceBuffer(); + if (windowSurfaceBuffer == nullptr) { + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + return; + } + int32_t alignedWidth = surfaceBuffer->GetStride(); + if (alignedWidth == configParam_.GetVideoWidth() && alignedHeight_ == configParam_.GetVideoHeight()) { + NormalProcess(surfaceBuffer, windowSurfaceBuffer); + } else { + OffsetProcess(surfaceBuffer, windowSurfaceBuffer); + } + auto windowSurfaceAddr = static_cast(windowSurfaceBuffer->GetVirAddr()); + BufferFlushConfig flushConfig = { {0, 0, windowSurfaceBuffer->GetWidth(), windowSurfaceBuffer->GetHeight()}, 0}; + int32_t ret = memcpy_s(lastFrame_, lastFrameSize_, windowSurfaceAddr, lastFrameSize_); + if (ret != EOK) { + DHLOGE("%s: surfaceBuffer memcpy_s run failed.", LOG_TAG); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + windowSurface_->CancelBuffer(windowSurfaceBuffer); + return; + } + surfaceErr = windowSurface_->FlushBuffer(windowSurfaceBuffer, -1, flushConfig); + if (surfaceErr != SURFACE_ERROR_OK) { + DHLOGE("%s: windowSurface_ flush buffer failed.", LOG_TAG); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + windowSurface_->CancelBuffer(windowSurfaceBuffer); + return; + } + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); +} + +void ConsumBufferListener::OnBufferAvailable() +{ + DHLOGI("%s: OnBufferAvailable.", LOG_TAG); + decoder_->ConsumeSurface(); +} + int32_t ImageSinkDecoder::ReleaseDecoder() { DHLOGI("%s: ReleaseDecoder.", LOG_TAG); @@ -206,13 +373,20 @@ int32_t ImageSinkDecoder::SetOutputSurface(sptr &surface) DHLOGE("%s: Decoder or surface is null.", LOG_TAG); return ERR_DH_SCREEN_TRANS_NULL_VALUE; } - - int32_t ret = videoDecoder_->SetOutputSurface(surface); - if (ret != Media::MSERR_OK) { - DHLOGE("%s: SetOutputSurface failed.", LOG_TAG); - return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + windowSurface_ = surface; + if (consumerSurface_ == nullptr || producerSurface_ == nullptr) { + int32_t ret = videoDecoder_->SetOutputSurface(surface); + if (ret != Media::MSERR_OK) { + DHLOGE("%s: SetOutputSurface failed.", LOG_TAG); + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + } else { + int32_t ret = videoDecoder_->SetOutputSurface(producerSurface_); + if (ret != Media::MSERR_OK) { + DHLOGE("%s: SetOutputSurface failed.", LOG_TAG); + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } } - return DH_SUCCESS; } diff --git a/services/screentransport/screensinkprocessor/include/image_sink_processor.h b/services/screentransport/screensinkprocessor/include/image_sink_processor.h index 20ab7d27..b896ad6a 100644 --- a/services/screentransport/screensinkprocessor/include/image_sink_processor.h +++ b/services/screentransport/screensinkprocessor/include/image_sink_processor.h @@ -20,6 +20,7 @@ #include "image_sink_decoder.h" #include "video_param.h" #include "data_buffer.h" +#include "screen_image_jpeg.h" namespace OHOS { namespace DistributedHardware { @@ -40,7 +41,8 @@ private: static const constexpr char *LOG_TAG = "ImageSinkProcessor"; VideoParam localParam_; VideoParam remoteParam_; - std::shared_ptr imageDecoder_; + std::shared_ptr imageDecoder_ = nullptr; + std::shared_ptr imageJpeg_ = nullptr; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screentransport/screensinkprocessor/src/image_sink_processor.cpp b/services/screentransport/screensinkprocessor/src/image_sink_processor.cpp index b9340ae0..0455940e 100644 --- a/services/screentransport/screensinkprocessor/src/image_sink_processor.cpp +++ b/services/screentransport/screensinkprocessor/src/image_sink_processor.cpp @@ -31,7 +31,7 @@ int32_t ImageSinkProcessor::ConfigureImageProcessor( remoteParam_ = remoteParam; imageDecoder_ = std::make_shared(imageListener); - + imageJpeg_ = std::make_shared(remoteParam); int32_t ret = imageDecoder_->ConfigureDecoder(localParam); if (ret != DH_SUCCESS) { DHLOGE("%s: ConfigureDecoder failed ret:%" PRId32, LOG_TAG, ret); @@ -120,6 +120,12 @@ int32_t ImageSinkProcessor::SetImageSurface(sptr &surface) return ret; } + ret = imageJpeg_->SetOutputSurface(surface); + if (ret != DH_SUCCESS) { + DHLOGE("%s: imageJpeg SetImageSurface failed ret: %" PRId32, LOG_TAG, ret); + ReportOptFail(DSCREEN_OPT_FAIL, ret, "imageJpeg SetOutputSurface failed."); + return ret; + } return DH_SUCCESS; } @@ -132,13 +138,24 @@ int32_t ImageSinkProcessor::ProcessImage(const std::shared_ptr &data return ERR_DH_SCREEN_TRANS_NULL_VALUE; } - int32_t ret = imageDecoder_->InputScreenData(data); - if (ret != DH_SUCCESS) { - DHLOGE("%s: InputScreenData failed ret:%" PRId32, LOG_TAG, ret); - ReportOptFail(DSCREEN_OPT_FAIL, ret, "InputScreenData failed."); - return ret; + if (data->DataType() == VIDEO_FULL_SCREEN_DATA) { + int32_t ret = imageDecoder_->InputScreenData(data); + if (ret != DH_SUCCESS) { + DHLOGE("%s: InputScreenData failed ret:%" PRId32, LOG_TAG, ret); + ReportOptFail(DSCREEN_OPT_FAIL, ret, "InputScreenData failed."); + return ret; + } + } else if (data->DataType() == VIDEO_PART_SCREEN_DATA){ + int32_t ret = imageJpeg_->MergeDirtyImagetoSurface(data, imageDecoder_->GetLastFrame()); + if (ret != DH_SUCCESS) { + DHLOGE("%s: MergeDirtyImagetoSurface failed ret:%" PRId32, LOG_TAG, ret); + ReportOptFail(DSCREEN_OPT_FAIL, ret, "MergeDirtyImagetoSurface failed."); + return ret; + } + } else { + DHLOGE("%s: data type is invalid.", LOG_TAG); + return ERR_DH_SCREEN_DATA_TYPE_INVALID; } - return DH_SUCCESS; } } // namespace DistributedHardware diff --git a/services/screentransport/screensinktrans/BUILD.gn b/services/screentransport/screensinktrans/BUILD.gn index e7b4ad80..1fe351e1 100644 --- a/services/screentransport/screensinktrans/BUILD.gn +++ b/services/screentransport/screensinktrans/BUILD.gn @@ -20,6 +20,8 @@ ohos_shared_library("distributed_screen_sinktrans") { include_dirs = [ "//base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include", "//third_party/json/include", + "//third_party/libjpeg", + "//third_party/libyuv/files/include", "//foundation/graphic/graphic_2d/interfaces/innerkits/surface", "${fwk_common_path}/utils/include", "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", @@ -32,20 +34,26 @@ ohos_shared_library("distributed_screen_sinktrans") { "./include", "${common_path}/include", "${services_path}/common/databuffer/include", + "${services_path}/common/imageJpeg/include", "${services_path}/common/screen_channel/include", "${services_path}/common/utils/include", "${services_path}/screentransport/screendatachannel/include", "${services_path}/screentransport/screensinktrans/include", "${services_path}/screentransport/screensinkprocessor/include", "${services_path}/screentransport/screensinkprocessor/decoder/include", + "${services_path}/screentransport/screensourceprocessor/include", "${services_path}/softbusadapter/include", + ] sources = [ + "${common_path}/src/dscreen_json_util.cpp", + "${services_path}/common/imageJpeg/src/screen_image_jpeg.cpp", "${services_path}/common/databuffer/src/data_buffer.cpp", "${services_path}/common/utils/src/dscreen_fwkkit.cpp", "${services_path}/common/utils/src/video_param.cpp", "${services_path}/screentransport/screendatachannel/src/screen_data_channel_impl.cpp", + "${services_path}/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp", "${services_path}/screentransport/screensinkprocessor/decoder/src/image_decoder_callback.cpp", "${services_path}/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp", "${services_path}/screentransport/screensinkprocessor/src/image_sink_processor.cpp", @@ -57,6 +65,8 @@ ohos_shared_library("distributed_screen_sinktrans") { "${common_path}:distributed_screen_utils", "${distributedhardwarefwk_path}/interfaces/inner_kits:libdhfwk_sdk", "//foundation/graphic/graphic_2d/frameworks/surface:surface", + "//third_party/libjpeg-turbo:turbojpeg_static", + "//third_party/libyuv:yuv", ] defines = [ diff --git a/services/screentransport/screensinktrans/include/iscreen_sink_trans.h b/services/screentransport/screensinktrans/include/iscreen_sink_trans.h index ad0f3788..b089d8d4 100644 --- a/services/screentransport/screensinktrans/include/iscreen_sink_trans.h +++ b/services/screentransport/screensinktrans/include/iscreen_sink_trans.h @@ -34,6 +34,7 @@ public: virtual int32_t Stop() = 0; virtual int32_t RegisterStateCallback(const std::shared_ptr &callBack) = 0; virtual int32_t SetImageSurface(const sptr &surface) = 0; + virtual void SetScreenVersion(std::string &version) = 0; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screentransport/screensinktrans/include/screen_sink_trans.h b/services/screentransport/screensinktrans/include/screen_sink_trans.h index 807eb932..b528e6d4 100644 --- a/services/screentransport/screensinktrans/include/screen_sink_trans.h +++ b/services/screentransport/screensinktrans/include/screen_sink_trans.h @@ -40,6 +40,7 @@ public: int32_t Stop() override; int32_t RegisterStateCallback(const std::shared_ptr &callback) override; int32_t SetImageSurface(const sptr &surface) override; + void SetScreenVersion(std::string &version) override; void OnSessionOpened() override; void OnSessionClosed() override; @@ -57,6 +58,7 @@ private: private: static const constexpr char *LOG_TAG = "ScreenSinkTrans"; + std::string version_ = "1.0"; sptr decoderSurface_; std::shared_ptr imageProcessor_; std::shared_ptr screenChannel_; diff --git a/services/screentransport/screensinktrans/src/screen_sink_trans.cpp b/services/screentransport/screensinktrans/src/screen_sink_trans.cpp index a0795f8c..060ff2d9 100644 --- a/services/screentransport/screensinktrans/src/screen_sink_trans.cpp +++ b/services/screentransport/screensinktrans/src/screen_sink_trans.cpp @@ -23,7 +23,7 @@ #include "dscreen_log.h" #include "image_sink_processor.h" #include "screen_data_channel_impl.h" - +#include "screen_refresh_channel_impl.h" namespace OHOS { namespace DistributedHardware { int32_t ScreenSinkTrans::SetUp(const VideoParam &localParam, const VideoParam &remoteParam, @@ -209,8 +209,16 @@ int32_t ScreenSinkTrans::CheckTransParam(const VideoParam &localParam, const Vid int32_t ScreenSinkTrans::InitScreenTrans(const VideoParam &localParam, const VideoParam &remoteParam, const std::string &peerDevId) { - screenChannel_ = std::make_shared(peerDevId); - + switch (atoi(version_.c_str())) { + case 1: + screenChannel_ = std::make_shared(peerDevId); + break; + case 2: + screenChannel_ = std::make_shared(peerDevId); + break; + default: + break; + } int32_t ret = RegisterChannelListener(); if (ret != DH_SUCCESS) { DHLOGE("%s: Register channel listener failed.", LOG_TAG); @@ -286,7 +294,7 @@ void ScreenSinkTrans::OnSessionOpened() if (dhFwkKit != nullptr) { int32_t ret = dhFwkKit->PublishMessage(DHTopic::TOPIC_LOW_LATENCY, ENABLE_LOW_LATENCY.dump()); if (ret != DH_FWK_SUCCESS) { - DHLOGE("%s: Sink start enable low latency failed ret: %d.", LOG_TAG, ret); + DHLOGE("%s: Sink start enable low latency failed ret: %.", PRId32, LOG_TAG, ret); } } } @@ -298,7 +306,7 @@ void ScreenSinkTrans::OnSessionClosed() if (dhFwkKit != nullptr) { int32_t ret = dhFwkKit->PublishMessage(DHTopic::TOPIC_LOW_LATENCY, DISABLE_LOW_LATENCY.dump()); if (ret != DH_FWK_SUCCESS) { - DHLOGE("%s: Sink stop enable low latency failed ret: %d.", LOG_TAG, ret); + DHLOGE("%s: Sink stop enable low latency failed ret: %.", PRId32, LOG_TAG, ret); } } @@ -323,6 +331,11 @@ void ScreenSinkTrans::OnDataReceived(const std::shared_ptr &data) } } +void ScreenSinkTrans::SetScreenVersion(std::string &version) +{ + version_ = version; +} + void ScreenSinkTrans::OnProcessorStateNotify(int32_t state) { DHLOGI("%s: OnProcessorStateNotify.", LOG_TAG); diff --git a/services/screentransport/screensourceprocessor/encoder/include/idscreen_dbg_itf.h b/services/screentransport/screensourceprocessor/encoder/include/idscreen_dbg_itf.h new file mode 100644 index 00000000..a60aa870 --- /dev/null +++ b/services/screentransport/screensourceprocessor/encoder/include/idscreen_dbg_itf.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2023 Huawei Device 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. + */ +#ifndef OHOS_DSCREEN_DBG_ITF_H +#define OHOS_DSCREEN_DBG_ITF_H + +#include +#include + +namespace OHOS { +namespace DistributedHardware { +const std::string GET_DBG_ITF_FUNC = "GetDBGItf"; +const std::string GET_IMAGE_DIRTY_FUNC = "GetImageSetDirty"; +class IDScreenDBGItf { +public: + virtual int32_t Init() = 0; + virtual int32_t Release() = 0; +}; +class IImageSetDirty { +public: + virtual void SetDamage(std::vector> dirtyVecs) = 0; + virtual std::vector> GetDamage() = 0; +}; +extern "C" __attribute__((visibility("default"))) IDScreenDBGItf *GetDBGItf(); +extern "C" __attribute__((visibility("default"))) IImageSetDirty *GetImageSetDirty(); +} +} +#endif \ No newline at end of file diff --git a/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h b/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h index d5a6dfe2..0c9f6bb4 100644 --- a/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h +++ b/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h @@ -17,6 +17,7 @@ #define OHOS_IMAGE_SOURCE_ENCODER_H #include +#include #include "avsharedmemory.h" #include "avcodec_video_encoder.h" @@ -24,13 +25,24 @@ #include "media_errors.h" #include "format.h" #include "surface.h" +#include "iconsumer_surface.h" +#include "idscreen_dbg_itf.h" #include "iimage_source_processor_listener.h" #include "image_encoder_callback.h" #include "video_param.h" namespace OHOS { namespace DistributedHardware { +class ConsumerBufferListener : public IBufferConsumerListener{ +public: + explicit ConsumerBufferListener(const std::shared_ptr encoder) : encoder_(encoder) {}; + ~ConsumerBufferListener() = default; + void OnBufferAvailable() override; +private: + static const constexpr char *LOG_TAG = "ConsumerBufferListener"; + std::shared_ptr encoder_; +}; class ImageSourceEncoder : public std::enable_shared_from_this { public: explicit ImageSourceEncoder(const std::shared_ptr &imageListener) @@ -41,15 +53,17 @@ public: int32_t ReleaseEncoder(); int32_t StartEncoder(); int32_t StopEncoder(); - sptr &GetInputSurface() - { - return videoSurface_; - } - + int32_t AddSurface(); + sptr &GetInputSurface(); void OnError(Media::AVCodecErrorType errorType, int32_t errorCode); void OnOutputBufferAvailable(uint32_t index, Media::AVCodecBufferInfo info, Media::AVCodecBufferFlag flag); void OnInputBufferAvailable(uint32_t index); void OnOutputFormatChanged(const Media::Format &format); + void ConsumeSurface(); + int32_t FeedEncoderData(sptr &surfaceBuffer); + sptr GetConsumerSurface(); + std::vector VecToDamage(std::vector> eventContent); + sptr GetEncoderInputSurfaceBuffer(); private: int32_t InitVideoEncoder(const VideoParam &configParam); @@ -60,12 +74,23 @@ private: Media::Format imageFormat_; Media::AVCodecBufferInfo encoderBufferInfo_; + VideoParam configParam_; - sptr videoSurface_; + sptr encoderSurface_; + sptr consumerSurface_; + sptr producerSurface_; + sptr consumerBufferListener_; + std::mutex bufferMtx_; std::shared_ptr videoEncoder_; std::shared_ptr videoSharedMemory_; std::shared_ptr encodeVideoCallback_; std::weak_ptr imageProcessorListener_; + std::vector> eventContent_; +private: + IDScreenDBGItf *dscreenDbgItfPtr_ = nullptr; + IImageSetDirty *imageSetDirtyPtr_ = nullptr; + void* pHandler_ = nullptr; + void InitDscreenDBG(); }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index 12a9cc98..34eb33d6 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -15,37 +15,229 @@ #include "image_source_encoder.h" +#include +#include +#include #include +#include #include +#include +#include +#include "display_type.h" #include "dscreen_constants.h" #include "dscreen_errcode.h" #include "dscreen_hisysevent.h" #include "dscreen_log.h" - +#include "jpeglib.h" +#ifdef __LP64__ +const std::string LIB_LOAD_PATH = "/system/lib64/libdistributed_screen_dbg_itf.z.so"; +#else +const std::string LIB_LOAD_PATH = "/system/lib/libdistributed_screen_dbg_itf.z.so"; +#endif +using GetDscreenDBGItfFunc = OHOS::DistributedHardware::IDScreenDBGItf* (*)(); +using GetImageDirtyFunc = OHOS::DistributedHardware::IImageSetDirty* (*)(); namespace OHOS { namespace DistributedHardware { +void ConsumerBufferListener::OnBufferAvailable() +{ + DHLOGI("%s: OnBufferAvailable.", LOG_TAG); + encoder_->ConsumeSurface(); +} + +void ImageSourceEncoder::InitDscreenDBG() +{ + char path[PATH_MAX + 1] = {0x00}; + if (LIB_LOAD_PATH.length() > PATH_MAX || realpath(LIB_LOAD_PATH.c_str(), path) == nullptr) { + DHLOGE("File connicailization failed."); + return; + } + pHandler_ = dlopen(path, RTLD_LAZY | RTLD_NODELETE | RTLD_GLOBAL); + if (pHandler_ == nullptr) { + DHLOGE("%s: handler load failed, fail reason: %s.", path, dlerror()); + return; + } + GetDscreenDBGItfFunc getDscreenDBGItfFunc = (GetDscreenDBGItfFunc)dlsym(pHandler_, GET_DBG_ITF_FUNC.c_str()); + GetImageDirtyFunc getImageDirtyFunc = (GetImageDirtyFunc)dlsym(pHandler_, GET_IMAGE_DIRTY_FUNC.c_str()); + if (getDscreenDBGItfFunc == nullptr || getImageDirtyFunc ==nullptr) { + DHLOGE("get FUNC failed, failed reason: %s.", dlerror()); + return; + } + dscreenDbgItfPtr_ = getDscreenDBGItfFunc(); + imageSetDirtyPtr_ = getImageDirtyFunc(); + if (dscreenDbgItfPtr_ == nullptr || imageSetDirtyPtr_ == nullptr) { + DHLOGE("Get interface failed."); + return; + } + DHLOGI("InitDscreenDBG success."); + dscreenDbgItfPtr_->Init(); +} + +void ImageSourceEncoder::ConsumeSurface() +{ + DHLOGI("%s: ConsumeSurface.", LOG_TAG); + std::unique_lock bufLock(bufferMtx_); + if (consumerSurface_ == nullptr) { + DHLOGE("%s: consumerSurface_ is nullptr.", LOG_TAG); + return; + } + sptr surfaceBuffer = nullptr; + int32_t fence = -1; + int64_t timestamp = 0; + OHOS::Rect damage = {0, 0, 0, 0}; + std::vector damages; + SurfaceError surfaceErr = consumerSurface_->AcquireBuffer(surfaceBuffer, fence, timestamp, damage); + if (surfaceErr != SURFACE_ERROR_OK) { + DHLOGE("%s: consumerSurface_ acquire buffer failed, errcode: %", PRId32, LOG_TAG, surfaceErr); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + return; + } + if (pHandler_ != nullptr) { + eventContent_.clear(); + eventContent_ = imageSetDirtyPtr_->GetDamage(); + } + std::vector damages = VecToDamage(eventContent_); + std::shared_ptr listener = imageProcessorListener_.lock(); + if (listener == nullptr) { + DHLOGE("%s: Processor listener is null", LOG_TAG); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + return; + } + listener->OnDamageProcessDone(surfaceBuffer, damages); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); +} + int32_t ImageSourceEncoder::ConfigureEncoder(const VideoParam &configParam) { DHLOGI("%s: ConfigureEncoder.", LOG_TAG); int32_t ret = InitVideoEncoder(configParam); if (ret != DH_SUCCESS) { - DHLOGE("%s: Init encoder failed ret:%" PRId32, LOG_TAG, ret); + DHLOGE("%s: Init encoder failed ret: %" PRId32, LOG_TAG, ret); return ret; } ret = SetEncoderFormat(configParam); if (ret != DH_SUCCESS) { - DHLOGE("%s: Set encoder format failed ret:%" PRId32, LOG_TAG, ret); + DHLOGE("%s: Set encoder format failed ret: %" PRId32, LOG_TAG, ret); return ret; } - videoSurface_ = videoEncoder_->CreateInputSurface(); - if (videoSurface_ == nullptr) { + encoderSurface_ = videoEncoder_->CreateInputSurface(); + if (encoderSurface_ == nullptr) { DHLOGE("%s: Create encoder surface failed.", LOG_TAG); return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } + configParam_ = configParam; + ret = AddSurface(); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Add surface failed ret: %.", PRId32, LOG_TAG, ret); + consumerSurface_ = nullptr; + producerSurface_ = nullptr; + return ret; + } + return DH_SUCCESS; +} +int32_t ImageSourceEncoder::AddSurface() +{ + DHLOGI("%s: AddSurface.", LOG_TAG); + consumerSurface_ = IConsumerSurface::Create(); + if (consumerSurface_ == nullptr) { + DHLOGE("%s: creat consumer surface failed: %.", PRId32, LOG_TAG); + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + sptr producer = consumerSurface_->GetProducer(); + if (producer == nullptr) { + DHLOGE("%s: Creat producer surface failed: %.", PRId32, LOG_TAG); + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + producerSurface_ = Surface::CreateSurfaceAsProducer(producer); + if (producerSurface_ == nullptr) { + DHLOGE("%s: Create preducer surface failed.", LOG_TAG); + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + consumerBufferListener_ = new ConsumerBufferListener(shared_from_this()); + consumerSurface_->RegisterConsumerListener(consumerBufferListener_); + return DH_SUCCESS; +} + +sptr ImageSourceEncoder::GetConsumerSurface() +{ + DHLOGI("%s: GetConsumerSurface.", LOG_TAG); + return consumerSurface_; +} + +sptr &ImageSourceEncoder::GetInputSurface() +{ + DHLOGI("%s: GetInputSurface.", LOG_TAG); + if (producerSurface_ == nullptr) { + return encoderSurface_; + } + return producerSurface_; +} + +std::vector ImageSourceEncoder::VecToDamage(std::vector> eventContent) +{ + DHLOGI("%s: VecToDamage.", LOG_TAG); + std::vector damages; + for (auto item : eventContent) { + OHOS::damage = {0, 0, 0, 0}; + damage.x = item.at(0); + damage.y = item.at(1); + damage.w = item.at(2); + damage.h = item.at(3); + damages.push_back(damage); + } + return damages; +} + +sptr ImageSourceEncoder::GetEncoderInputSurfaceBuffer() +{ + DHLOGI("%s: GetEncoderInputSurfaceBuffer.", LOG_TAG); + OHOS::BufferRequestConfig requestConfig; + requestConfig.width = configParam_.GetVideoWidth(); + requestConfig.height = configParam_.GetVideoHeight(); + requestConfig.usage = HBM_USE_CPU_READ | HBM_USE_CPU_WRITE | HBM_USE_MEM_DMA; + requestConfig.strideAlignment = STRIDE_ALIGNMENT; + requestConfig.format = PixelFormat::PIXEL_FMT_RGBA_8888; + requestConfig.timeout = 0; + sptr encoderSurfaceBuffer = nullptr; + int32_t releaseFence = -1; + SurfaceError surfaceErr = encoderSurface_->RequestBuffer(encoderSurfaceBuffer, releaseFence, requestConfig); + if (surfaceErr != GSERROR_OK || encoderSurfaceBuffer == nullptr) { + DHLOGE("%s: RequestBuffer failed.", LOG_TAG); + encoderSurface_->CancelBuffer(encoderSurfaceBuffer); + } + return encoderSurfaceBuffer; +} + +int32_t ImageSourceEncoder::FeedEncoderData(sptr &surfaceBuffer) +{ + DHLOGI("%s: FeedEncoderData.", LOG_TAG); + sptr encoderSurfaceBuffer = GetEncoderInputSurfaceBuffer(); + if (encoderSurfaceBuffer == nullptr) { + DHLOGE("Get encoder input producer surface buffer failed."); + return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; + } + int32_t screenDataSize = configParam_.GetVideoWidth() * configParam_.GetVideoHeight() * RGBA_CHROMA; + auto encoderSurfaceAddr = static_cast(encoderSurfaceBuffer->GetVirAddr()); + auto surfaceAddr = static_cast(surfaceBuffer->GetVirAddr()); + int32_t ret = memcpy_s(encoderSurfaceAddr, screenDataSize, surfaceAddr, screenDataSize); + if (ret != EOK) { + DHLOGE("%s: surfaceBuffer memcpy_s run failed.", LOG_TAG); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + encoderSurface_->CancelBuffer(encoderSurfaceBuffer); + return ret; + } + BufferFlushConfig flushConfig = { {0, 0, encoderSurfaceBuffer->GetWidth(), encoderSurfaceBuffer->GetHeight()}, 0}; + SurfaceError surfaceErr = encoderSurface_->FlushBuffer(encoderSurfaceBuffer, -1, flushConfig); + if (surfaceErr != SURFACE_ERROR_OK) { + DHLOGE("%s: encoderSurface_ flush buffer failed.", LOG_TAG); + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); + encoderSurface_->CancelBuffer(encoderSurfaceBuffer); + return surfaceErr; + } + consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); return DH_SUCCESS; } @@ -62,9 +254,13 @@ int32_t ImageSourceEncoder::ReleaseEncoder() DHLOGE("%s: Release encoder failed.", LOG_TAG); return ERR_DH_SCREEN_CODEC_RELEASE_FAILED; } + if (pHandler_ != nullptr) { + dscreenDbgItfPtr_->Release(); + dlclose(pHandler_); + } encodeVideoCallback_ = nullptr; videoEncoder_ = nullptr; - + consumerBufferListener_ = nullptr; return DH_SUCCESS; } @@ -87,7 +283,7 @@ int32_t ImageSourceEncoder::StartEncoder() DHLOGE("%s: Start encoder failed.", LOG_TAG); return ERR_DH_SCREEN_CODEC_START_FAILED; } - + InitDscreenDBG(); return DH_SUCCESS; } @@ -109,7 +305,12 @@ int32_t ImageSourceEncoder::StopEncoder() DHLOGE("%s: Stop encoder failed.", LOG_TAG); return ERR_DH_SCREEN_CODEC_STOP_FAILED; } - + ret = consumerSurface_->UnregisterConsumerListener(); + if (ret != SURFACE_ERROR_OK) { + DHLOGE("Unregister Consumer Listener failed."); + } + consumerSurface_ = nullptr; + producerSurface_ = nullptr; return DH_SUCCESS; } @@ -241,8 +442,9 @@ void ImageSourceEncoder::OnOutputBufferAvailable(uint32_t index, Media::AVCodecB DHLOGE("%s: Copy data failed.", LOG_TAG); return; } + dataBuf->SetDataType(VIDEO_FULL_SCREEN_DATA); + dataBuf->SetSize(dataSize); listener->OnImageProcessDone(dataBuf); - ret = videoEncoder_->ReleaseOutputBuffer(index); if (ret != Media::MSERR_OK) { DHLOGE("%s: videoEncoder ReleaseOutputBuffer failed.", LOG_TAG); diff --git a/services/screentransport/screensourceprocessor/include/iimage_source_processor.h b/services/screentransport/screensourceprocessor/include/iimage_source_processor.h index 06dad68e..3f24c8f1 100644 --- a/services/screentransport/screensourceprocessor/include/iimage_source_processor.h +++ b/services/screentransport/screensourceprocessor/include/iimage_source_processor.h @@ -17,7 +17,7 @@ #define OHOS_IIMAGE_SOURCE_PROCESSOR_H #include "surface.h" - +#include "surface_buffer.h" #include #include "data_buffer.h" @@ -35,7 +35,9 @@ public: virtual int32_t ReleaseImageProcessor() = 0; virtual int32_t StartImageProcessor() = 0; virtual int32_t StopImageProcessor() = 0; - virtual sptr &GetImageSurface() = 0; + virtual sptr GetImageSurface() = 0; + virtual sptr GetConsumerSurface() = 0; + virtual int32_t ProcessFullImage(sptr &surfaceBuffer) = 0; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screentransport/screensourceprocessor/include/iimage_source_processor_listener.h b/services/screentransport/screensourceprocessor/include/iimage_source_processor_listener.h index eab3f25a..64c5fb97 100644 --- a/services/screentransport/screensourceprocessor/include/iimage_source_processor_listener.h +++ b/services/screentransport/screensourceprocessor/include/iimage_source_processor_listener.h @@ -17,7 +17,7 @@ #define OHOS_IIMAGE_SOURCE_PROCESSOR_LISTENER_H #include "data_buffer.h" - +#include "surface_buffer.h" namespace OHOS { namespace DistributedHardware { class IImageSourceProcessorListener { @@ -26,6 +26,7 @@ public: virtual void OnImageProcessDone(const std::shared_ptr &data) = 0; virtual void OnProcessorStateNotify(int32_t state) = 0; + virtual void OnDamageProcessDone(sptr &surfaceBuffer, const std::vector &damages) = 0; }; } // namespace DistributedHardware } // namsspace OHOS diff --git a/services/screentransport/screensourceprocessor/include/image_source_processor.h b/services/screentransport/screensourceprocessor/include/image_source_processor.h index d42fbd96..d0ace6fa 100644 --- a/services/screentransport/screensourceprocessor/include/image_source_processor.h +++ b/services/screentransport/screensourceprocessor/include/image_source_processor.h @@ -33,7 +33,9 @@ public: int32_t ReleaseImageProcessor() override; int32_t StartImageProcessor() override; int32_t StopImageProcessor() override; - sptr &GetImageSurface() override; + sptr GetImageSurface() override; + sptr GetConsumerSurface() override; + int32_t ProcessFullImage(sptr &surfaceBuffer) override; private: static const constexpr char *LOG_TAG = "ImageSourceProcessor"; diff --git a/services/screentransport/screensourceprocessor/src/image_source_processor.cpp b/services/screentransport/screensourceprocessor/src/image_source_processor.cpp index dc46b5db..f7e7865d 100644 --- a/services/screentransport/screensourceprocessor/src/image_source_processor.cpp +++ b/services/screentransport/screensourceprocessor/src/image_source_processor.cpp @@ -101,10 +101,30 @@ int32_t ImageSourceProcessor::StopImageProcessor() return DH_SUCCESS; } -sptr &ImageSourceProcessor::GetImageSurface() +sptr ImageSourceProcessor::GetImageSurface() { DHLOGI("%s: GetImageSurface.", LOG_TAG); return imageEncoder_->GetInputSurface(); } + +sptr ImageSourceProcessor::GetConsumerSurface() +{ + DHLOGI("%s: GetConsumerSurface.", LOG_TAG); + return imageEncoder_->GetConsumerSurface(); +} + +int32_t ImageSourceProcessor::ProcessFullImage(sptr &surfaceBuffer) +{ + if (surfaceBuffer == nullptr) { + DHLOGE("%s: Process surfaceBuffer is null.", LOG_TAG); + return ERR_DH_SCREEN_SURFACE_BUFFER_INVALIED; + } + int32_t ret = imageEncoder_->FeedEncoderData(surfaceBuffer); + if (ret != DH_SUCCESS) { + DHLOGE("%s: FeedEncoderData failed.", LOG_TAG); + return ERR_DH_SCREEN_TRANS_ERROR; + } + return DH_SUCCESS; +} } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/services/screentransport/screensourcetrans/BUILD.gn b/services/screentransport/screensourcetrans/BUILD.gn index e9893e8c..8b613a75 100644 --- a/services/screentransport/screensourcetrans/BUILD.gn +++ b/services/screentransport/screensourcetrans/BUILD.gn @@ -20,12 +20,15 @@ ohos_shared_library("distributed_screen_sourcetrans") { include_dirs = [ "//base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include", "//third_party/json/include", - "//foundation/graphic/graphic_2d/interfaces/innerkits/surface", + "//foundation/graphic/graphic_2d/interfaces/inner_api/surface", "${fwk_common_path}/utils/include", "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", "${fwk_interfaces_path}/inner_kits/include", "${ipc_interfaces_path}/innerkits/ipc_core/include", "${services_path}/common/utils/include", + "//third_party/libjpeg-turbo", + "//third_party/libyuv/files/include", + "//foundation/ability/dmsfwk/utils/native/include", ] include_dirs += [ @@ -38,6 +41,8 @@ ohos_shared_library("distributed_screen_sourcetrans") { "${services_path}/screentransport/screensourceprocessor/include", "${services_path}/screentransport/screensourceprocessor/encoder/include", "${services_path}/softbusadapter/include", + "${services_path}/common/imageJpeg/include", + "${services_path}/common/decision_center/include", ] sources = [ @@ -45,10 +50,13 @@ ohos_shared_library("distributed_screen_sourcetrans") { "${services_path}/common/utils/src/dscreen_fwkkit.cpp", "${services_path}/common/utils/src/video_param.cpp", "${services_path}/screentransport/screendatachannel/src/screen_data_channel_impl.cpp", + "${services_path}/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp", "${services_path}/screentransport/screensourceprocessor/encoder/src/image_encoder_callback.cpp", "${services_path}/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp", "${services_path}/screentransport/screensourceprocessor/src/image_source_processor.cpp", "${services_path}/softbusadapter/src/softbus_adapter.cpp", + "${services_path}/common/imageJpeg/src/screen_image_jpeg.cpp", + "${services_path}/common/decision_center/src/screen_decision_center.cpp", "./src/screen_source_trans.cpp", ] @@ -56,6 +64,8 @@ ohos_shared_library("distributed_screen_sourcetrans") { "${common_path}:distributed_screen_utils", "${distributedhardwarefwk_path}/interfaces/inner_kits:libdhfwk_sdk", "//foundation/graphic/graphic_2d/frameworks/surface:surface", + "//third_party/libjpeg-turbo:turbojpeg_static", + "//third_party/libyuv:yuv", ] defines = [ diff --git a/services/screentransport/screensourcetrans/include/iscreen_source_trans.h b/services/screentransport/screensourcetrans/include/iscreen_source_trans.h index 2b3c8e7f..d6b6af08 100644 --- a/services/screentransport/screensourcetrans/include/iscreen_source_trans.h +++ b/services/screentransport/screensourcetrans/include/iscreen_source_trans.h @@ -33,7 +33,10 @@ public: virtual int32_t Start() = 0; virtual int32_t Stop() = 0; virtual int32_t RegisterStateCallback(const std::shared_ptr &callBack) = 0; - virtual sptr &GetImageSurface() = 0; + virtual sptr GetImageSurface() = 0; + virtual int32_t SetConsumerSurface() = 0; + virtual void SetScreenVersion(std::string &version) = 0; + virtual std::string GetScreenVersion() = 0; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screentransport/screensourcetrans/include/screen_source_trans.h b/services/screentransport/screensourcetrans/include/screen_source_trans.h index 2d63fa10..373d9ca1 100644 --- a/services/screentransport/screensourcetrans/include/screen_source_trans.h +++ b/services/screentransport/screensourcetrans/include/screen_source_trans.h @@ -23,6 +23,7 @@ #include #include +#include "screen_decision_center.h" #include "iimage_source_processor.h" #include "iscreen_source_trans.h" #include "iscreen_source_trans_callback.h" @@ -43,13 +44,17 @@ public: int32_t Start() override; int32_t Stop() override; int32_t RegisterStateCallback(const std::shared_ptr &callback) override; - sptr &GetImageSurface() override; + sptr GetImageSurface() override; void OnSessionOpened() override; void OnSessionClosed() override; void OnDataReceived(const std::shared_ptr &data) override; void OnImageProcessDone(const std::shared_ptr &data) override; void OnProcessorStateNotify(int32_t state) override; + void OnDamageProcessDone(sptr &surfaceBuffer, const std::vector &damages) override; + int32_t SetConsumerSurface() override; + void SetScreenVersion(std::string &version) override; + std::string GetScreenVersion() override; private: int32_t CheckVideoParam(const VideoParam ¶m); @@ -70,12 +75,14 @@ private: std::thread sendDataThread_; bool isChannelReady_ = false; - sptr encoderSurface_; + sptr consumerSurface_; std::queue> dataQueue_; std::shared_ptr imageProcessor_; std::shared_ptr screenChannel_; std::weak_ptr transCallback_; + std::shared_ptr screenDecisionCenter_; + std::string version_ = "1.0"; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screentransport/screensourcetrans/src/screen_source_trans.cpp b/services/screentransport/screensourcetrans/src/screen_source_trans.cpp index a43d57c5..26c8d06b 100644 --- a/services/screentransport/screensourcetrans/src/screen_source_trans.cpp +++ b/services/screentransport/screensourcetrans/src/screen_source_trans.cpp @@ -27,7 +27,7 @@ #include "dscreen_log.h" #include "image_source_processor.h" #include "screen_data_channel_impl.h" - +#include "screen_refresh_channel_impl.h" namespace OHOS { namespace DistributedHardware { constexpr const char* FDATA_THREAD = "FeedDataThread"; @@ -40,17 +40,36 @@ int32_t ScreenSourceTrans::SetUp(const VideoParam &localParam, const VideoParam DHLOGE("%s: SetUp failed param error ret: %" PRId32, LOG_TAG, ret); return ret; } - ret = InitScreenTrans(localParam, remoteParam, peerDevId); if (ret != DH_SUCCESS) { DHLOGE("%s: SetUp failed ret: %" PRId32, LOG_TAG, ret); return ret; } - + ret = SetConsumerSurface(); + if (ret != DH_SUCCESS) { + DHLOGE("sourcetrans set image surface failed."); + return ret; + } + ret = screenDecisionCenter_->SetJpegSurface(consumerSurface_); + if (ret != DH_SUCCESS) { + DHLOGE("screenDecisionCenter set jpeg surface failed."); + return ret; + } DHLOGI("%s: SetUp success.", LOG_TAG); return DH_SUCCESS; } +int32_t ScreenSourceTrans::SetConsumerSurface() +{ + DHLOGI("%s: SetConsumerSurface.", LOG_TAG); + consumerSurface_ = imageProcessor_->GetConsumerSurface(); + if (consumerSurface_ == nullptr) { + DHLOGE("%s: consumerSurface is nullptr", LOG_TAG); + return ERR_DH_SCREEN_SURFACE_INVALIED; + } + return DH_SUCCESS; +} + int32_t ScreenSourceTrans::Release() { DHLOGI("%s: Release.", LOG_TAG); @@ -111,7 +130,7 @@ int32_t ScreenSourceTrans::Start() if (dhFwkKit != nullptr) { ret = dhFwkKit->PublishMessage(DHTopic::TOPIC_LOW_LATENCY, ENABLE_LOW_LATENCY.dump()); if (ret != DH_FWK_SUCCESS) { - DHLOGE("%s: Source start enable low latency failed ret: %d.", LOG_TAG, ret); + DHLOGE("%s: Source start enable low latency failed ret: %.", PRId32, LOG_TAG, ret); } } @@ -140,7 +159,7 @@ int32_t ScreenSourceTrans::Stop() if (dhFwkKit != nullptr) { ret = dhFwkKit->PublishMessage(DHTopic::TOPIC_LOW_LATENCY, DISABLE_LOW_LATENCY.dump()); if (ret != DH_FWK_SUCCESS) { - DHLOGE("%s: Source stop enable low latency failed ret: %d.", LOG_TAG, ret); + DHLOGE("%s: Source stop enable low latency failed ret: %.", PRId32, LOG_TAG, ret); } } @@ -176,10 +195,19 @@ int32_t ScreenSourceTrans::RegisterStateCallback(const std::shared_ptr &ScreenSourceTrans::GetImageSurface() +sptr ScreenSourceTrans::GetImageSurface() { DHLOGI("%s:GetImageSurface.", LOG_TAG); - return encoderSurface_; + return imageProcessor_->GetImageSurface(); +} + +void ScreenSourceTrans::SetScreenVersion(std::string &version) +{ + version_ = version; +} +std::string ScreenSourceTrans::GetScreenVersion() +{ + return version_; } int32_t ScreenSourceTrans::CheckVideoParam(const VideoParam ¶m) @@ -248,17 +276,24 @@ int32_t ScreenSourceTrans::InitScreenTrans(const VideoParam &localParam, const V const std::string &peerDevId) { DHLOGI("%s:InitScreenTrans.", LOG_TAG); - screenChannel_ = std::make_shared(peerDevId); - + switch (atoi(version_.c_str())) { + case 1: + screenChannel_ = std::make_shared(peerDevId); + break; + case 2: + screenChannel_ = std::make_shared(peerDevId); + break; + default: + break; + } int32_t ret = RegisterChannelListener(); if (ret != DH_SUCCESS) { DHLOGE("%s: Register channel listener failed ret: %" PRId32, LOG_TAG, ret); screenChannel_ = nullptr; return ret; } - + screenDecisionCenter_ = std::make_shared(localParam); imageProcessor_ = std::make_shared(); - ret = RegisterProcessorListener(localParam, remoteParam); if (ret != DH_SUCCESS) { DHLOGE("%s: Register data processor listener failed ret: %" PRId32, LOG_TAG, ret); @@ -312,13 +347,11 @@ int32_t ScreenSourceTrans::RegisterProcessorListener(const VideoParam &localPara ReportOptFail(DSCREEN_OPT_FAIL, ret, "Config image processor failed."); return ret; } - - encoderSurface_ = imageProcessor_->GetImageSurface(); - if (encoderSurface_ == nullptr) { - DHLOGE("%s: Surface is null.", LOG_TAG); - return ERR_DH_SCREEN_TRANS_NULL_VALUE; - } - + ret = screenDecisionCenter_->ConfigureDecisionCenter(listener, imageProcessor_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Config decision center failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } return DH_SUCCESS; } @@ -364,6 +397,28 @@ void ScreenSourceTrans::OnDataReceived(const std::shared_ptr &data) DHLOGI("%s: OnChannelDataReceived source trans not support.", LOG_TAG); } +void ScreenSourceTrans::OnDamageProcessDone(sptr &surfaceBuffer, const std::vector &damages) +{ + DHLOGI("%s: OnDamageProcessDone.", LOG_TAG); + if (surfaceBuffer == nullptr) { + DHLOGE("%s: Trans surfaceBuffer is null.", LOG_TAG); + return; + } + int32_t ret = DH_SUCCESS; + switch (atoi(version_.c_str())) { + case 1: + DHLOGI("%s: ProcessFullImage.", LOG_TAG); + ret = imageProcessor_->ProcessFullImage(surfaceBuffer); + break; + case 2: + DHLOGI("%s: InputBufferDmage.", LOG_TAG); + ret = screenDecisionCenter_->InputBufferDmage(surfaceBuffer, damages); + break; + default: + break; + } +} + void ScreenSourceTrans::OnImageProcessDone(const std::shared_ptr &data) { DHLOGD("%s: OnProcessorDataReceived received data from data processor.", LOG_TAG); diff --git a/services/screentransport/test/unittest/screensinkprocessor/BUILD.gn b/services/screentransport/test/unittest/screensinkprocessor/BUILD.gn index d9a701be..fd22ea7d 100644 --- a/services/screentransport/test/unittest/screensinkprocessor/BUILD.gn +++ b/services/screentransport/test/unittest/screensinkprocessor/BUILD.gn @@ -40,6 +40,8 @@ config("module_private_config") { "${services_path}/screentransport/screensinkprocessor/include", "${services_path}/screentransport/screensinkprocessor/decoder/include", "${services_path}/softbusadapter/include", + "${services_path}/common/imageJpeg/include", + "${services_path}/screentransport/screensourceprocessor/include", ] } diff --git a/services/screentransport/test/unittest/screensinktrans/BUILD.gn b/services/screentransport/test/unittest/screensinktrans/BUILD.gn index 129f5edf..2d35e496 100644 --- a/services/screentransport/test/unittest/screensinktrans/BUILD.gn +++ b/services/screentransport/test/unittest/screensinktrans/BUILD.gn @@ -39,10 +39,12 @@ config("module_private_config") { "${services_path}/screentransport/screensinkprocessor/include", "${services_path}/screentransport/screensinkprocessor/decoder/include", "${services_path}/softbusadapter/include", + "${services_path}/common/imageJpeg/include", "//foundation/multimedia/player_framework/interfaces/inner_api/native", "//foundation/communication/dsoftbus/interfaces/kits/transport", "//foundation/graphic/graphic_2d/utils/buffer_handle/export", "//drivers/peripheral/base", + "${services_path}/screentransport/screensourceprocessor/include", ] } diff --git a/services/screentransport/test/unittest/screensourcetrans/BUILD.gn b/services/screentransport/test/unittest/screensourcetrans/BUILD.gn index 0cff7b2d..f670f119 100644 --- a/services/screentransport/test/unittest/screensourcetrans/BUILD.gn +++ b/services/screentransport/test/unittest/screensourcetrans/BUILD.gn @@ -50,6 +50,8 @@ config("module_private_config") { "//foundation/graphic/graphic_2d/utils/buffer_handle/export", "//foundation/multimedia/player_framework/interfaces/inner_api/native", "//foundation/communication/dsoftbus/interfaces/kits/transport", + "${services_path}/common/imageJpeg/include", + "${services_path}/common/decision_center/include", ] } diff --git a/services/screentransport/test/unittest/screensourcetrans/src/screen_source_trans_test.cpp b/services/screentransport/test/unittest/screensourcetrans/src/screen_source_trans_test.cpp index 0bce0f9e..a6c88508 100644 --- a/services/screentransport/test/unittest/screensourcetrans/src/screen_source_trans_test.cpp +++ b/services/screentransport/test/unittest/screensourcetrans/src/screen_source_trans_test.cpp @@ -70,9 +70,8 @@ HWTEST_F(ScreenSourceTransTest, SetUp_002, TestSize.Level1) remoteParam.SetVideoWidth(100); remoteParam.SetScreenHeight(100); remoteParam.SetScreenWidth(100); - std::string peerDevId = "peerDevId"; - int32_t actual = trans->SetUp(localParam, remoteParam, peerDevId); + int32_t actual = trans->SetUp(localParam, remoteParam, "peerDevId"); EXPECT_EQ(-1, actual); } @@ -406,10 +405,10 @@ HWTEST_F(ScreenSourceTransTest, GetImageSurface_001, TestSize.Level1) remoteParam.screenWidth_ = DSCREEN_MAX_SCREEN_DATA_WIDTH; remoteParam.screenHeight_ = DSCREEN_MAX_SCREEN_DATA_HEIGHT; trans->imageProcessor_ = std::make_shared(); + trans->screenDecisionCenter_ = std::make_shared(localParam); trans->RegisterProcessorListener(localParam, remoteParam); - sptr encoderSurface = trans->GetImageSurface(); - EXPECT_NE(nullptr, encoderSurface); + EXPECT_NE(nullptr, trans->GetImageSurface()); } /** diff --git a/services/screentransport/test/unittest/screentranstestutils/BUILD.gn b/services/screentransport/test/unittest/screentranstestutils/BUILD.gn index a9e7fafe..876c4e8c 100644 --- a/services/screentransport/test/unittest/screentranstestutils/BUILD.gn +++ b/services/screentransport/test/unittest/screentranstestutils/BUILD.gn @@ -52,6 +52,8 @@ config("module_private_config") { "//foundation/graphic/graphic_2d/utils/buffer_handle/export", "//foundation/multimedia/player_framework/interfaces/inner_api/native", "//foundation/communication/dsoftbus/interfaces/kits/transport", + "${services_path}/common/imageJpeg/include", + "${services_path}/common/decision_center/include", ] } diff --git a/services/softbusadapter/src/softbus_adapter.cpp b/services/softbusadapter/src/softbus_adapter.cpp index 24828852..7411f7b5 100644 --- a/services/softbusadapter/src/softbus_adapter.cpp +++ b/services/softbusadapter/src/softbus_adapter.cpp @@ -158,13 +158,8 @@ int32_t SoftbusAdapter::OpenSoftbusSession(const std::string &mySessionName, con { DHLOGI("%s: OpenSoftbusSession mysess:%s peersess:%s id:%s.", LOG_TAG, mySessionName.c_str(), peerSessionName.c_str(), GetAnonyString(peerDevId).c_str()); - int dataType = TYPE_BYTES; - int streamType = -1; - if (mySessionName == DATA_SESSION_NAME) { - dataType = TYPE_STREAM; - streamType = RAW_STREAM; - } - + int dataType = TYPE_STREAM; + int streamType = COMMON_VIDEO_STREAM; SessionAttribute attr = { 0 }; attr.dataType = dataType; attr.linkTypeNum = LINK_TYPE_MAX; @@ -182,11 +177,11 @@ int32_t SoftbusAdapter::OpenSoftbusSession(const std::string &mySessionName, con attr.attr.streamAttr.streamType = streamType; int32_t sessionId = OpenSession(mySessionName.c_str(), peerSessionName.c_str(), peerDevId.c_str(), "0", &attr); if (sessionId < 0) { - DHLOGE("%s: OpenSession failed sessionId:%" PRId32, LOG_TAG, sessionId); + DHLOGE("%s: OpenSession failed sessionId: %.", PRId32, LOG_TAG, sessionId); return ERR_DH_SCREEN_ADAPTER_OPEN_SESSION_FAIL; } - DHLOGI("%s: OpenSoftbusSession success sessionId:%" PRId32, LOG_TAG, sessionId); + DHLOGI("%s: OpenSoftbusSession success sessionId: %.", PRId32, LOG_TAG, sessionId); return sessionId; } -- Gitee From 927f868d95878d0c3467c2cbee506847067f2bcf Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Fri, 31 Mar 2023 15:29:16 +0800 Subject: [PATCH 02/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- common/BUILD.gn | 2 +- common/include/dscreen_constants.h | 14 +- common/include/dscreen_errcode.h | 2 +- distributedscreen.gni | 4 + screenhandler/BUILD.gn | 2 +- .../common/databuffer/include/data_buffer.h | 10 +- .../common/databuffer/src/data_buffer.cpp | 40 ++++-- .../include/screen_decision_center.h | 4 +- .../src/screen_decision_center.cpp | 32 ++--- .../imageJpeg/include/screen_image_jpeg.h | 8 +- .../imageJpeg/src/screen_image_jpeg.cpp | 70 +++++----- services/screenclient/BUILD.gn | 2 +- .../include/screen_client_window_adapter.h | 2 +- .../src/screen_client_window_adapter.cpp | 2 +- .../screenregionmgr/include/screenregion.h | 2 +- .../screenregionmgr/include/screenregionmgr.h | 2 +- .../screenregionmgr/src/screenregion.cpp | 2 +- .../screenregionmgr/src/screenregionmgr.cpp | 2 +- services/screenservice/sourceservice/BUILD.gn | 2 +- .../dscreenmgr/include/dscreen.h | 2 +- .../dscreenmgr/include/dscreen_manager.h | 2 +- .../dscreenmgr/src/dscreen_manager.cpp | 2 +- .../src/dscreen_source_service.cpp | 2 +- .../sourceservice/dscreenmgr/BUILD.gn | 2 +- .../include/screen_refresh_channel_impl.h | 2 + .../src/screen_refresh_channel_impl.cpp | 123 ++++++++++-------- .../decoder/include/image_sink_decoder.h | 2 +- .../decoder/src/image_sink_decoder.cpp | 8 +- .../include/image_sink_processor.h | 2 +- .../src/image_sink_processor.cpp | 8 +- .../screentransport/screensinktrans/BUILD.gn | 13 +- .../include/iscreen_sink_trans.h | 2 +- .../include/screen_sink_trans.h | 2 +- .../screensinktrans/src/screen_sink_trans.cpp | 12 +- .../encoder/include/image_source_encoder.h | 4 +- .../encoder/src/image_source_encoder.cpp | 25 ++-- .../include/iimage_source_processor.h | 2 +- .../iimage_source_processor_listener.h | 2 +- .../include/image_source_processor.h | 2 +- .../src/image_source_processor.cpp | 2 +- .../screensourcetrans/BUILD.gn | 10 +- .../include/iscreen_source_trans.h | 2 +- .../include/screen_source_trans.h | 2 +- .../src/screen_source_trans.cpp | 18 +-- .../unittest/screensinkprocessor/BUILD.gn | 2 +- .../test/unittest/screensinktrans/BUILD.gn | 2 +- .../test/unittest/screensourcetrans/BUILD.gn | 2 +- .../src/screen_source_trans_test.cpp | 2 +- .../unittest/screentranstestutils/BUILD.gn | 2 +- .../softbusadapter/src/softbus_adapter.cpp | 6 +- 50 files changed, 260 insertions(+), 213 deletions(-) diff --git a/common/BUILD.gn b/common/BUILD.gn index 03c9ca96..c5362dd3 100644 --- a/common/BUILD.gn +++ b/common/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Huawei Device Co., Ltd. +# Copyright (c) 2022-2023 Huawei Device 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 diff --git a/common/include/dscreen_constants.h b/common/include/dscreen_constants.h index c41f50b5..00dfa034 100644 --- a/common/include/dscreen_constants.h +++ b/common/include/dscreen_constants.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 @@ -73,10 +73,10 @@ constexpr int32_t YR_PARAM = 66; constexpr int32_t YG_PARAM = 129; constexpr int32_t YB_PARAM = 25; constexpr int32_t UR_PARAM = -38; -constexpr int32_t UG_PARAM = -74; +constexpr int32_t UG_PARAM = 74; constexpr int32_t UB_PARAM = 112; -constexpr int32_t VG_PARAM = -94; -constexpr int32_t VB_PARAM = -18; +constexpr int32_t VG_PARAM = 94; +constexpr int32_t VB_PARAM = 18; constexpr int32_t YA_PARAM = 16; constexpr int32_t UA_PARAM = 128; constexpr int32_t YUV_PARAM = 255; @@ -84,8 +84,10 @@ constexpr int32_t MOVEBITS = 8; /* RGBA */ constexpr uint32_t RGBA_CHROMA = 4; constexpr uint32_t RGB_CHROMA = 3; -constexpr uint32_t ODD = 1; -constexpr uint32_t EVEN = 2; +constexpr uint32_t ONE = 1; +constexpr uint32_t TWO = 2; +constexpr uint32_t THREE = 3; +constexpr uint32_t ZERO = 0; constexpr uint32_t ALIGNEDBITS = 32; /* Screen session name max len */ constexpr uint32_t DSCREEN_MAX_SESSION_NAME_LEN = 50; diff --git a/common/include/dscreen_errcode.h b/common/include/dscreen_errcode.h index bf8b73cf..53a1ae0f 100644 --- a/common/include/dscreen_errcode.h +++ b/common/include/dscreen_errcode.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/distributedscreen.gni b/distributedscreen.gni index 5c4a7ba9..6f89f23e 100644 --- a/distributedscreen.gni +++ b/distributedscreen.gni @@ -27,3 +27,7 @@ fwk_services_path = "${distributedhardwarefwk_path}/services" fwk_interfaces_path = "${distributedhardwarefwk_path}/interfaces" ipc_interfaces_path = "${ipc_path}/interfaces" build_flags = [ "-Werror" ] + +declare_args() { + distributed_screen_common = false; +} diff --git a/screenhandler/BUILD.gn b/screenhandler/BUILD.gn index 223455c3..7a675985 100644 --- a/screenhandler/BUILD.gn +++ b/screenhandler/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Huawei Device Co., Ltd. +# Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/common/databuffer/include/data_buffer.h b/services/common/databuffer/include/data_buffer.h index 1c3399cd..90d7d71f 100644 --- a/services/common/databuffer/include/data_buffer.h +++ b/services/common/databuffer/include/data_buffer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 @@ -41,14 +41,12 @@ public: void SetSize(size_t size); void SetDataType(uint8_t dataType); uint8_t DataType(); - DirtyRect GetDirtyRect(); - void SetDirtyRect(DirtyRect &rect); void SetDataNumber(size_t number); size_t DataNumber(); - void ReapplyCapcity(size_t capacity); + void ResetCapcity(size_t capacity); void AddData(size_t dataSize, unsigned char* &inputData); void AddDirtyRect(DirtyRect rec); - std::vector DirtyRectVec(); + std::vector GetDirtyRectVec(); int32_t GetData(int32_t offset, int32_t datasize, uint8_t* &output); private: static const constexpr char *LOG_TAG = "DataBuffer"; @@ -56,7 +54,7 @@ private: size_t capacity_ = 0; uint8_t *data_ = nullptr; uint8_t dataType_ = 0; - size_t dataNumber_ = 0; + size_t frameNumber_ = 0; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/common/databuffer/src/data_buffer.cpp b/services/common/databuffer/src/data_buffer.cpp index 066efbb5..12ac906b 100644 --- a/services/common/databuffer/src/data_buffer.cpp +++ b/services/common/databuffer/src/data_buffer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 @@ -36,9 +36,12 @@ DataBuffer::DataBuffer(size_t capacity) DataBuffer::~DataBuffer() { if (data_ != nullptr) { - delete []data_; + delete [] data_; data_ = nullptr; } + dirtyRectVec_.clear(); + dataType_ = 0; + frameNumber_ = 0; capacity_ = 0; } @@ -51,70 +54,79 @@ uint8_t *DataBuffer::Data() const { return data_; } + void DataBuffer::SetSize(size_t size) { capacity_ = size; } + void DataBuffer::SetDataType(uint8_t dataType) { dataType_ = dataType; } + uint8_t DataBuffer::DataType() { return dataType_; } + void DataBuffer::SetDataNumber(size_t number) { - dataNumber_ = number; + frameNumber_ = number; } + size_t DataBuffer::DataNumber() { - return dataNumber_; + return frameNumber_; } -void DataBuffer::ReapplyCapcity(size_t capacity) + +void DataBuffer::ResetCapcity(size_t capacity) { - DHLOGI("%s: ReapplyCapcity.", LOG_TAG); + DHLOGI("%s: ResetCapcity.", LOG_TAG); if (capacity < capacity_) { return; } delete [] data_; data_ = new (std::nothrow) uint8_t[capacity] {0}; - if (data_ != nullptr) { + if (data_ == nullptr) { + capacity_ = 0; + } else { capacity_ = capacity; } } + void DataBuffer::AddData(size_t dataSize, unsigned char* &inputData) { - DHLOGI("%s: AddData.", LOG_TAG); if (inputData == nullptr) { return; } int32_t ret = memcpy_s(data_ + capacity_, dataSize, inputData, dataSize); if (ret != EOK) { - DHLOGE("%s: in AddData memcpy data failed, ret: %.", PRId32, LOG_TAG, ret); + DHLOGE("%s: in AddData memcpy data failed, ret: %." PRId32, LOG_TAG, ret); return; } capacity_ += dataSize; } + void DataBuffer::AddDirtyRect(DirtyRect rect) { - DHLOGI("%s: AddDirtyRect.", LOG_TAG); dirtyRectVec_.push_back(rect); } -std::vector DataBuffer::DirtyRectVec() + +std::vector DataBuffer::GetDirtyRectVec() { return dirtyRectVec_; } + int32_t DataBuffer::GetData(int32_t offset, int32_t datasize, uint8_t* &output) { - DHLOGI("%s: GetData.", LOG_TAG); if (offset + datasize > capacity_ || output == nullptr) { - DHLOGE("DataBuffer GetData parameter invalied."); + DHLOGE("DataBuffer GetData parameter invalid."); return ERR_DH_SCREEN_INPUT_PARAM_INVALID; } int32_t ret = memcpy_s(output, datasize, data_ + offset, datasize); if (ret != EOK) { - DHLOGE("GetData memcpy data failed, ret: %.", PRId32, ret); + DHLOGE("GetData memcpy data failed, ret: %." PRId32, ret); return ret; } return DH_SUCCESS; diff --git a/services/common/decision_center/include/screen_decision_center.h b/services/common/decision_center/include/screen_decision_center.h index ef53d5c9..5543dfbc 100644 --- a/services/common/decision_center/include/screen_decision_center.h +++ b/services/common/decision_center/include/screen_decision_center.h @@ -32,13 +32,13 @@ public: bool IsDirtyRectValid(const std::vector &damages); bool JudgeDirtyThreshold(const std::vector &damages); bool LimitTime(uint32_t timethreshold); - int32_t InputBufferDmage(sptr &surfaceBuffer, const std::vector &damages); + int32_t InputBufferImage(sptr &surfaceBuffer, const std::vector &damages); int32_t ConfigureDecisionCenter(std::shared_ptr &listener, std::shared_ptr &imageProcessor); int32_t SetJpegSurface(sptr &surface); private: - static const constexpr int32_t ARE_THRESHOLD = 260000; + static const constexpr int32_t DIRTY_REGION_ARE_THRESHOLD = 260000; static const constexpr int32_t THRESHOLD = 10; static const constexpr char *LOG_TAG = "ScreenDecisionCenter"; std::shared_ptr imageJpeg_ = nullptr; diff --git a/services/common/decision_center/src/screen_decision_center.cpp b/services/common/decision_center/src/screen_decision_center.cpp index 04dcfdb4..d43dc423 100644 --- a/services/common/decision_center/src/screen_decision_center.cpp +++ b/services/common/decision_center/src/screen_decision_center.cpp @@ -28,22 +28,22 @@ bool ScreenDecisionCenter::IsDirtyRectValid(const std::vector &damag DHLOGE("%s: damages size is empty.", LOG_TAG); return false; } + int32_t screenWidth = configParam_.GetScreenWidth(); + int32_t screenHeight = configParam_.GetScreenHeight(); for (const auto &damage : damages) { - if (damage.x < 0 || damage.x > configParam_.GetScreenWidth() || - damage.y < 0 || damage.y > configParam_.GetScreenHeight()) { - DHLOGE("%s: dirty x and y invalied.", LOG_TAG); - return false; - } - int32_t width = configParam_.GetScreenWidth() - damage.x; - int32_t height = configParam_.GetScreenHeight() - damage.y; - if (damage.x % EVEN == ODD || damage.w % EVEN == ODD) { - DHLOGE("%s: dirty x and w invalied.", LOG_TAG); + if (damage.x < 0 || damage.x > screenWidth || damage.y < 0 || + damage.y > screenHeight || damage.x % TWO == 1 || damage.w % TWO == 1) { + DHLOGE("%s: dirty x:%" PRId32 ", y:%" PRId32 ", w:%" PRId32 ", h:%" PRId32, + LOG_TAG, damage.x, damage.y, damage.w, damage.h); return false; } + int32_t width = screenWidth - damage.x; + int32_t height = screenHeight - damage.y; if (damage.w < 0 || damage.w > width || damage.h < 0 || damage.h > height) { - DHLOGE("%s: dirty invalied.", LOG_TAG); + DHLOGE("%s: dirty x:%" PRId32 ", y:%" PRId32 ", w:%" PRId32 ", h:%" PRId32, + LOG_TAG, damage.x, damage.y, damage.w, damage.h); return false; - } + } } return true; } @@ -54,8 +54,8 @@ bool ScreenDecisionCenter::JudgeDirtyThreshold(const std::vector &da for (const auto &damage : damages) { int32_t dirtyArea = damage.w * damage.h; allDirtyArea += dirtyArea; - if (dirtyArea > ARE_THRESHOLD || allDirtyArea > ARE_THRESHOLD) { - DHLOGE("%s: dirtyArea is %.", PRId32, LOG_TAG, dirtyArea); + if (dirtyArea > DIRTY_REGION_ARE_THRESHOLD || allDirtyArea > DIRTY_REGION_ARE_THRESHOLD) { + DHLOGE("%s: dirtyArea is %." PRId32, LOG_TAG, dirtyArea); return false; } } @@ -66,10 +66,10 @@ bool ScreenDecisionCenter::LimitTime(uint32_t timethreshold) return difftime(time(nullptr), sendFullTime_) >= timethreshold; } -int32_t ScreenDecisionCenter::InputBufferDmage(sptr &surfaceBuffer, +int32_t ScreenDecisionCenter::InputBufferImage(sptr &surfaceBuffer, const std::vector &damages) { - DHLOGI("%s: InputBufferDmage.", LOG_TAG); + DHLOGI("%s: InputBufferImage.", LOG_TAG); if (surfaceBuffer == nullptr) { DHLOGE("%s: surfaceBuffer is null.", LOG_TAG); return ERR_DH_SCREEN_SURFACE_BUFFER_INVALIED; @@ -115,7 +115,7 @@ int32_t ScreenDecisionCenter::SetJpegSurface(sptr &surface) DHLOGE("%s: JPEG set surface failed.", LOG_TAG); return ret; } - return DH_SUCCESS; + return DH_SUCCESS; } } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/services/common/imageJpeg/include/screen_image_jpeg.h b/services/common/imageJpeg/include/screen_image_jpeg.h index 40e3e219..6bfa149c 100644 --- a/services/common/imageJpeg/include/screen_image_jpeg.h +++ b/services/common/imageJpeg/include/screen_image_jpeg.h @@ -20,15 +20,15 @@ #include #include -#include "iimage_source_processor_listener.h" -#include "surface.h" -#include "video_param.h" #include "data_buffer.h" #include "dscreen_constants.h" +#include "iimage_source_processor_listener.h" +#include "surface.h" +#include "video_param.h" namespace OHOS { namespace DistributedHardware { -class ScreenImageJpeg : public std::enable_shared_from_this{ +class ScreenImageJpeg : public std::enable_shared_from_this { public: explicit ScreenImageJpeg(const VideoParam &configParam) : configParam_(configParam){}; ~ScreenImageJpeg() = default; diff --git a/services/common/imageJpeg/src/screen_image_jpeg.cpp b/services/common/imageJpeg/src/screen_image_jpeg.cpp index 9216a17e..99a09aaf 100644 --- a/services/common/imageJpeg/src/screen_image_jpeg.cpp +++ b/services/common/imageJpeg/src/screen_image_jpeg.cpp @@ -18,9 +18,13 @@ #include #include #include +#include "jpeglib.h" #include #include -#include "jpeglib.h" + +#ifdef LIBYUV +#include +#endif #include "dscreen_errcode.h" #include "dscreen_log.h" @@ -43,10 +47,10 @@ int32_t ScreenImageJpeg::MergeDirtyImagetoSurface(const std::shared_ptr windowSurfaceBuffer = nullptr; @@ -60,7 +64,7 @@ int32_t ScreenImageJpeg::MergeDirtyImagetoSurface(const std::shared_ptrRequestBuffer(windowSurfaceBuffer, releaseFence, requestConfig); if (surfaceErr != SURFACE_ERROR_OK || windowSurfaceBuffer == nullptr) { - DHLOGE("%s:imageSurface request buffer failed, surfaceErr: %.", PRId32, LOG_TAG, surfaceErr); + DHLOGE("%s: imageSurface request buffer failed, surfaceErr: %." PRId32, LOG_TAG, surfaceErr); imageSurface_->CancelBuffer(windowSurfaceBuffer); return surfaceErr; } @@ -68,14 +72,14 @@ int32_t ScreenImageJpeg::MergeDirtyImagetoSurface(const std::shared_ptr(windowSurfaceBuffer->GetVirAddr()); ret = memcpy_s(windowSurfaceAddr, surfaceBuffeSize, lastFrame, lastFrameSize); if (ret != DH_SUCCESS) { - DHLOGE("%s: memcpy lastFrame failed,ret: %.", PRId32, LOG_TAG, ret); + DHLOGE("%s: memcpy lastFrame failed,ret: %." PRId32, LOG_TAG, ret); imageSurface_->CancelBuffer(windowSurfaceBuffer); return ret; } BufferFlushConfig flushConfig = { {0, 0, windowSurfaceBuffer->GetWidth(), windowSurfaceBuffer-> GetHeight()}, 0}; surfaceErr = imageSurface_->FlushBuffer(windowSurfaceBuffer, -1, flushConfig); if (surfaceErr != SURFACE_ERROR_OK) { - DHLOGE("%s:imageSurface flush buffer failed, surfaceErr: %.", PRId32, LOG_TAG, surfaceErr); + DHLOGE("%s: imageSurface flush buffer failed, surfaceErr: %." PRId32, LOG_TAG, surfaceErr); imageSurface_->CancelBuffer(windowSurfaceBuffer); return surfaceErr; } @@ -107,7 +111,8 @@ int32_t ScreenImageJpeg::SetImageProcessListener(std::shared_ptr &surfaceBuffer, const OHOS::Rect &damage, std::shared_ptr &data) +void ScreenImageJpeg::CodecImage(sptr &surfaceBuffer, + const OHOS::Rect &damage, std::shared_ptr &data) { DHLOGI("%s: CodecImage.", LOG_TAG); int32_t partialSize = damage.w * damage.h *RGBA_CHROMA; @@ -127,7 +132,7 @@ void ScreenImageJpeg::CodecImage(sptr &surfaceBuffer, const OHOS: surfaceAddrIdx += configParam_.GetScreenWidth() * RGBA_CHROMA; } uint32_t jpegSize = CompressRgbaToJpeg(damage, partialBuffer, data); - DHLOGI("CodecImage jpegSize %.", PRId32, jpegSize); + DHLOGI("CodecImage jpegSize %." PRId32, jpegSize); delete [] partialBuffer; } @@ -135,14 +140,14 @@ void ScreenImageJpeg::CodecImage(sptr &surfaceBuffer, const OHOS: int32_t ScreenImageJpeg::MergeImage(const std::shared_ptr &data, uint8_t *lastFrame) { DHLOGI("%s: MergeDirtyImagetoSurface.", LOG_TAG); - std::vector dirtyRectVec = data->DirtyRectVec(); + std::vector dirtyRectVec = data->GetDirtyRectVec(); int32_t offset = 0; int32_t screenWidth = configParam_.GetScreenWidth(); int32_t screenHeight = configParam_.GetScreenHeight(); for (auto item : dirtyRectVec) { if (item.xPos > screenWidth || item.yPos > screenHeight || item.width > screenWidth - item.xPos || item.height > screenHeight - item.yPos) { - DHLOGE("%s: Dirty rect invalied.", LOG_TAG); + DHLOGE("%s: Dirty rect invalid.", LOG_TAG); return ERR_DH_SCREEN_INPUT_PARAM_INVALID; } uint8_t *jpegData = new uint8_t [item.dirtySize] {0}; @@ -153,10 +158,12 @@ int32_t ScreenImageJpeg::MergeImage(const std::shared_ptr &data, uin } offset += item.dirtySize; uint8_t *dirtyImageData = new uint8_t[item.width * item.height * RGB_CHROMA] {0}; + DHLOGI("%s: CompressRgbaToJpeg.", LOG_TAG); DecompressJpegToNV12(item.dirtySize, jpegData, dirtyImageData); + DHLOGI("%s: DecompressJpegToNV12 success.", LOG_TAG); ret = PastImage(lastFrame, dirtyImageData, item); if (ret != DH_SUCCESS) { - DHLOGE("PastImage failed, ret: %.", PRId32, ret); + DHLOGE("PastImage failed, ret: %." PRId32, ret); delete [] jpegData; delete [] dirtyImageData; return ret; @@ -164,6 +171,7 @@ int32_t ScreenImageJpeg::MergeImage(const std::shared_ptr &data, uin delete [] jpegData; delete [] dirtyImageData; } + DHLOGI("%s: MergeDirtyImagetoSurface success.", LOG_TAG); return DH_SUCCESS; } @@ -173,7 +181,7 @@ int32_t ScreenImageJpeg::PastImage(uint8_t *lastFrame, uint8_t *dirtyImageData, uint8_t *lastFrameIdx = lastFrame; uint8_t *yData = lastFrameIdx + configParam_.GetScreenWidth() * rect.yPos + rect.xPos; uint8_t *uData = lastFrameIdx + configParam_.GetScreenWidth() * configParam_.GetScreenHeight() + - configParam_.GetScreenWidth() * (rect.yPos / EVEN) + rect.xPos; + configParam_.GetScreenWidth() * (rect.yPos / TWO) + rect.xPos; uint8_t *yDirtyData = dirtyImageData; uint8_t *uDirtyData = dirtyImageData + rect.width * rect.height; uint8_t *yTempData = nullptr; @@ -186,8 +194,8 @@ int32_t ScreenImageJpeg::PastImage(uint8_t *lastFrame, uint8_t *dirtyImageData, return ret; } yDirtyData += rect.width; - if (i % EVEN) { - uTempData = uData + configParam_.GetScreenWidth() * (i / EVEN); + if (i % TWO) { + uTempData = uData + configParam_.GetScreenWidth() * (i / TWO); ret = memcpy_s(uTempData, rect.width, uDirtyData, rect.width); if (ret != EOK) { DHLOGE("%s: memcpy uData failed.", LOG_TAG); @@ -201,7 +209,6 @@ int32_t ScreenImageJpeg::PastImage(uint8_t *lastFrame, uint8_t *dirtyImageData, uint32_t ScreenImageJpeg::CompressRgbaToJpeg(const OHOS::Rect &damage, uint8_t *inputData, std::shared_ptr &data) { - DHLOGI("%s: CompressRgbaToJpeg.", LOG_TAG); jpeg_compress_struct cinfo; jpeg_error_mgr jerr; JSAMPROW row_pointer[1]; @@ -223,7 +230,7 @@ uint32_t ScreenImageJpeg::CompressRgbaToJpeg(const OHOS::Rect &damage, uint8_t * unsigned char rgb_buffer[damage.w * RGB_CHROMA]; unsigned char *pB = inputData; unsigned char *pG = inputData + 1; - unsigned char *pR = inputData + 2; + unsigned char *pR = inputData + TWO; while (cinfo.next_scanline < cinfo.image_height) { int index = 0; for (int i = 0 ; i < damage.w ; i++) { @@ -248,26 +255,21 @@ uint32_t ScreenImageJpeg::CompressRgbaToJpeg(const OHOS::Rect &damage, uint8_t * } return (uint32_t)outSize; } + void ScreenImageJpeg::DecompressJpegToNV12(size_t jpegSize, uint8_t *inputData, uint8_t *outputData) { - DHLOGI("%s: DecompressJpegToNV12.", LOG_TAG); jpeg_decompress_struct cinfo; jpeg_error_mgr jerr; - JSAMPARRAY buffer; - int32_t row_stride = 0; cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); jpeg_mem_src(&cinfo, inputData, jpegSize); (void)jpeg_read_header(&cinfo, TRUE); (void)jpeg_start_decompress(&cinfo); - row_stride = cinfo.output_width * cinfo.output_components; - buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1); + int32_t row_stride = cinfo.output_width * cinfo.output_components; + JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1); int32_t i = 0; int32_t yIndex = 0; int32_t uvIndex = cinfo.output_width * cinfo.output_height; - int32_t y = 0; - int32_t u = 0; - int32_t v = 0; #ifdef LIBYUV int32_t rgbSize = cinfo.output_width * cinfo.output_height * RGBA_CHROMA; uint8_t *rgb = new uint8_t[rgbSize]; @@ -277,19 +279,19 @@ void ScreenImageJpeg::DecompressJpegToNV12(size_t jpegSize, uint8_t *inputData, (void)jpeg_read_scanlines(&cinfo, buffer, 1); for (int j = 0 ; j < cinfo.output_width ; j++) { #ifdef LIBYUV - rgb[rgbIndex++] = buffer[0][j * RGB_CHROMA + 2]; + rgb[rgbIndex++] = buffer[0][j * RGB_CHROMA + TWO]; rgb[rgbIndex++] = buffer[0][j * RGB_CHROMA + 1]; rgb[rgbIndex++] = buffer[0][j * RGB_CHROMA]; rgb[rgbIndex++] = 0xff; #else - y = ((YR_PARAM * buffer[0][j * RGB_CHROMA] + YG_PARAM * buffer[0][j * RGB_CHROMA + 1] + - YB_PARAM * buffer[0][j * RGB_CHROMA + 2] + UA_PARAM) >> MOVEBITS) + YA_PARAM; - u = ((UR_PARAM * buffer[0][j * RGB_CHROMA] - UG_PARAM * buffer[0][j * RGB_CHROMA + 1] + - UB_PARAM * buffer[0][j * RGB_CHROMA + 2] + UA_PARAM) >> MOVEBITS) + UA_PARAM; - v = ((UB_PARAM * buffer[0][j * RGB_CHROMA] - VG_PARAM * buffer[0][j * RGB_CHROMA + 1] - - VB_PARAM * buffer[0][j * RGB_CHROMA + 2] + UA_PARAM) >> MOVEBITS) + UA_PARAM; - outputData[yIndex++] = static_cast((y < 0) ? 0 : (y > YUV_PARAM) ? YUV_PARAM : y); - if ((i % EVEN == 0) && (j % EVEN == 0)) { + int32_t y = ((YR_PARAM * buffer[0][j * RGB_CHROMA] + YG_PARAM * buffer[0][j * RGB_CHROMA + 1] + + YB_PARAM * buffer[0][j * RGB_CHROMA + TWO] + UA_PARAM) >> MOVEBITS) + YA_PARAM; + int32_t u = ((UR_PARAM * buffer[0][j * RGB_CHROMA] - UG_PARAM * buffer[0][j * RGB_CHROMA + 1] + + UB_PARAM * buffer[0][j * RGB_CHROMA + TWO] + UA_PARAM) >> MOVEBITS) + UA_PARAM; + int32_t v = ((UB_PARAM * buffer[0][j * RGB_CHROMA] - VG_PARAM * buffer[0][j * RGB_CHROMA + 1] - + VB_PARAM * buffer[0][j * RGB_CHROMA + TWO] + UA_PARAM) >> MOVEBITS) + UA_PARAM; + outputData[ ++] = static_cast((y < 0) ? 0 : (y > YUV_PARAM) ? YUV_PARAM : y); + if ((i % TWO == 0) && (j % TWO == 0)) { outputData[uvIndex++] = static_cast((u < 0) ? 0 : (u > YUV_PARAM) ? YUV_PARAM : u); outputData[uvIndex++] = static_cast((v < 0) ? 0 : (v > YUV_PARAM) ? YUV_PARAM : v); } @@ -302,8 +304,8 @@ void ScreenImageJpeg::DecompressJpegToNV12(size_t jpegSize, uint8_t *inputData, #ifdef LIBYUV libyuv::ARGBToNV12(rgb, cinfo.output_width * RGBA_CHROMA, outputData, cinfo.output_width, outputData + uvIndex, cinfo.output_width, cinfo.output_width, cinfo.output_height); + delete [] rgb; #endif - DHLOGI("%s: DecompressJpegToNV12 success.", LOG_TAG); } } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/services/screenclient/BUILD.gn b/services/screenclient/BUILD.gn index e7e3b1b7..27221afe 100644 --- a/services/screenclient/BUILD.gn +++ b/services/screenclient/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Huawei Device Co., Ltd. +# Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screenclient/include/screen_client_window_adapter.h b/services/screenclient/include/screen_client_window_adapter.h index 25ec72ac..3cef7730 100644 --- a/services/screenclient/include/screen_client_window_adapter.h +++ b/services/screenclient/include/screen_client_window_adapter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screenclient/src/screen_client_window_adapter.cpp b/services/screenclient/src/screen_client_window_adapter.cpp index f08f1e94..c03ad677 100644 --- a/services/screenclient/src/screen_client_window_adapter.cpp +++ b/services/screenclient/src/screen_client_window_adapter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h b/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h index 878fa738..120044d2 100644 --- a/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h +++ b/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h b/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h index cff8250f..34256b74 100644 --- a/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h +++ b/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp b/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp index a8fe5697..7790d97c 100644 --- a/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp b/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp index 17e7efd1..15802569 100644 --- a/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screenservice/sourceservice/BUILD.gn b/services/screenservice/sourceservice/BUILD.gn index d8d7e6c9..5906217d 100644 --- a/services/screenservice/sourceservice/BUILD.gn +++ b/services/screenservice/sourceservice/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Huawei Device Co., Ltd. +# Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screenservice/sourceservice/dscreenmgr/include/dscreen.h b/services/screenservice/sourceservice/dscreenmgr/include/dscreen.h index 56ac3e4d..f19212ce 100644 --- a/services/screenservice/sourceservice/dscreenmgr/include/dscreen.h +++ b/services/screenservice/sourceservice/dscreenmgr/include/dscreen.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h b/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h index cd3284c7..4b8b3142 100644 --- a/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h +++ b/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp index bfe0162f..1c269c8d 100644 --- a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp b/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp index 3676924f..89d4d637 100644 --- a/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp +++ b/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screenservice/test/unittest/sourceservice/dscreenmgr/BUILD.gn b/services/screenservice/test/unittest/sourceservice/dscreenmgr/BUILD.gn index 1512d9ae..19a3bcf8 100644 --- a/services/screenservice/test/unittest/sourceservice/dscreenmgr/BUILD.gn +++ b/services/screenservice/test/unittest/sourceservice/dscreenmgr/BUILD.gn @@ -35,7 +35,7 @@ config("module_private_config") { include_dirs += [ "./include", - "${services_path}/common/decision_centrt/include", + "${services_path}/common/decision_center/include", "${services_path}/screenservice/sourceservice/dscreenmgr/include", "${services_path}/common/utils/include", "${services_path}/common/databuffer/include", diff --git a/services/screentransport/screendatachannel/include/screen_refresh_channel_impl.h b/services/screentransport/screendatachannel/include/screen_refresh_channel_impl.h index 3a33f7e2..c101b0c3 100644 --- a/services/screentransport/screendatachannel/include/screen_refresh_channel_impl.h +++ b/services/screentransport/screendatachannel/include/screen_refresh_channel_impl.h @@ -43,6 +43,8 @@ public: void OnBytesReceived(int32_t sessionId, const void *data, uint32_t dataLen) override; void OnStreamReceived(int32_t sessionId, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param) override; + void ProcessDullData(const StreamData *data, std::shared_ptr screenData); + void ProcessDirtyData(const StreamData *data, std::shared_ptr screenData, const StreamData *ext); int32_t OpenDataSession(); int32_t OpenJpegSession(); diff --git a/services/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp b/services/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp index 223268fc..ebd3c7df 100644 --- a/services/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp +++ b/services/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2023 Huawei Device 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 @@ -187,13 +187,13 @@ int32_t ScreenRefreshChannelImpl::SendData(const std::shared_ptr &sc if (dataType == VIDEO_PART_SCREEN_DATA) { int32_t ret = SendDirtyData(screenData); if (ret != DH_SUCCESS) { - DHLOGE("%s: send dirty data failed, ret: %.", PRId32, LOG_TAG, ret); + DHLOGE("%s: send dirty data failed, ret: %." PRId32, LOG_TAG, ret); return ret; } } else if (dataType == VIDEO_FULL_SCREEN_DATA) { int32_t ret = SendFullData(screenData); if (ret != DH_SUCCESS) { - DHLOGE("%s: send full data failed, ret: %.", PRId32, LOG_TAG, ret); + DHLOGE("%s: send full data failed, ret: %." PRId32, LOG_TAG, ret); return ret; } } @@ -202,7 +202,7 @@ int32_t ScreenRefreshChannelImpl::SendData(const std::shared_ptr &sc int32_t ScreenRefreshChannelImpl::SendFullData(const std::shared_ptr &screenData) { - DHLOGI("%s: SendFullData sessionId: %.", PRId32, LOG_TAG, sessionId_); + DHLOGI("%s: SendFullData sessionId: %." PRId32, LOG_TAG, sessionId_); if (screenData == nullptr) { DHLOGE("%s: Screen data is null", LOG_TAG); return ERR_DH_SCREEN_TRANS_NULL_VALUE; @@ -220,13 +220,13 @@ int32_t ScreenRefreshChannelImpl::SendFullData(const std::shared_ptr } int32_t ScreenRefreshChannelImpl::SendDirtyData(const std::shared_ptr &screenData) { - DHLOGI("%s: SendDirtyData sessionId: %.", PRId32, LOG_TAG, jpegSessionId_); + DHLOGI("%s: SendDirtyData sessionId: %." PRId32, LOG_TAG, jpegSessionId_); if (screenData == nullptr) { DHLOGE("%s: Screen data is null", LOG_TAG); return ERR_DH_SCREEN_TRANS_NULL_VALUE; } nlohmann::json rectJson; - std::vector dirtyRectVec = screenData->DirtyRectVec(); + std::vector dirtyRectVec = screenData->GetDirtyRectVec(); rectJson["dataType"] = screenData->DataType(); rectJson["dirtySize"] = static_cast(dirtyRectVec.size()); int32_t rectIndex = 0; @@ -304,66 +304,85 @@ void ScreenRefreshChannelImpl::OnBytesReceived(int32_t sessionId, const void *da DHLOGD("%s: OnScreenBytesReceived data channel not support yet", LOG_TAG); } -void ScreenRefreshChannelImpl::OnStreamReceived(int32_t sessionId, const StreamData *data, const StreamData *ext, - const StreamFrameInfo *param) +void ScreenRefreshChannelImpl::ProcessDullData(const StreamData *data, std::shared_ptr dataBuffer) { - DHLOGI("%s: OnStreamReceived.", LOG_TAG); - if (data == nullptr) { - DHLOGE("%s: Stream data is null", LOG_TAG); + DHLOGI("%s: ProcessDullData.", LOG_TAG); + std::shared_ptr listener = channelListener_.lock(); + if (listener == nullptr) { + DHLOGE("%s: Channel listener is null.", LOG_TAG); return; } + int32_t ret = memcpy_s(dataBuffer->Data(), dataBuffer->Capacity(), + reinterpret_cast(data->buf), data->bufLen); + if (ret != EOK) { + DHLOGE("%s: Full data memcpy failed.", LOG_TAG); + return; + } + dataBuffer->SetDataType(VIDEO_FULL_SCREEN_DATA); + listener->OnDataReceived(dataBuffer); +} +void ScreenRefreshChannelImpl::ProcessDirtyData(const StreamData *data, + std::shared_ptr dataBuffer, const StreamData *ext) +{ + DHLOGI("%s: ProcessDirtyData.", LOG_TAG); std::shared_ptr listener = channelListener_.lock(); if (listener == nullptr) { DHLOGE("%s: Channel listener is null.", LOG_TAG); return; } - if (ext->bufLen == 0) { - DHLOGI("sink received full data."); - auto dataBuffer = std::make_shared(data->bufLen); - int32_t ret = memcpy_s(dataBuffer->Data(), dataBuffer->Capacity(), reinterpret_cast(data->buf), data->bufLen); - if (ret != EOK) { - DHLOGE("%s: Full data memcpy failed.", LOG_TAG); + int32_t ret = memcpy_s(dataBuffer->Data(), dataBuffer->Capacity(), + reinterpret_cast(data->buf), data->bufLen); + if (ret != EOK) { + DHLOGE("%s: Dirty data memcpy_s failed.", LOG_TAG); + return; + } + nlohmann::json rectJson = nlohmann::json::parse(ext->buf, nullptr, false); + if (rectJson.is_discarded()) { + DHLOGE("%s: OnStreamReceived rectJson invalid", LOG_TAG); + return; + } + if (!IsInt32(rectJson, "dirtySize") || !IsInt32(rectJson, "dataType")) { + return; + } + int32_t dirtySize = rectJson["dirtySize"].get(); + int32_t dataType = rectJson["dataType"].get(); + uint8_t num = 0; + while (num < dirtySize) { + auto item = std::to_string(num); + if (!rectJson.contains(item)) { return; } - dataBuffer->SetDataType(VIDEO_FULL_SCREEN_DATA); - listener->OnDataReceived(dataBuffer); + int32_t X = rectJson[item][0].get(); + int32_t Y = rectJson[item][1].get(); + int32_t W = rectJson[item][2].get(); + int32_t H = rectJson[item][3].get(); + int32_t Size = rectJson[item][4].get(); + DirtyRect rect = {X, Y, W, H, Size}; + dataBuffer->AddDirtyRect(rect); + num++; + } + dataBuffer->SetDataType(dataType); + listener->OnDataReceived(dataBuffer); +} + + +void ScreenRefreshChannelImpl::OnStreamReceived(int32_t sessionId, const StreamData *data, + const StreamData *ext, const StreamFrameInfo *param) +{ + DHLOGI("%s: OnStreamReceived.", LOG_TAG); + if (data == nullptr) { + DHLOGE("%s: Stream data is null", LOG_TAG); + return; + } + auto dataBuffer = std::make_shared(data->bufLen); + if (ext->bufLen == 0) { + DHLOGI("sink received full data."); + ProcessDullData(data, dataBuffer); return; } else { DHLOGI("sink received dirty data."); - auto dataBuffer = std::make_shared(data->bufLen); - int32_t ret = memcpy_s(dataBuffer->Data(), dataBuffer->Capacity(), reinterpret_cast(data->buf), data->bufLen); - if (ret != EOK) { - DHLOGE("%s: Dirty data memcpy_s failed.", LOG_TAG); - return; - } - nlohmann::json rectJson = nlohmann::json::parse(ext->buf, nullptr, false); - if (rectJson.is_discarded()) { - DHLOGE("%s: OnStreamReceived rectJson invalied", LOG_TAG); - return; - } - if (!IsInt32(rectJson, "dirtySize") || !IsInt32(rectJson, "dataType")) { - return; - } - int32_t dirtySize = rectJson["dirtySize"].get(); - int32_t dataType = rectJson["dataType"].get(); - uint8_t num = 0; - while (num < dirtySize) { - auto item = std::to_string(num); - if (!rectJson.contains(item)) { - return; - } - int32_t X = rectJson[item][0].get(); - int32_t Y = rectJson[item][1].get(); - int32_t W = rectJson[item][2].get(); - int32_t H = rectJson[item][3].get(); - int32_t Size = rectJson[item][4].get(); - DirtyRect rect = {X, Y, W, H, Size}; - dataBuffer->AddDirtyRect(rect); - num++; - } - dataBuffer->SetDataType(dataType); - listener->OnDataReceived(dataBuffer); + ProcessDirtyData(data, dataBuffer, ext); } } } // namespace DistributedHardware diff --git a/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h b/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h index 66dddc30..2d9b181f 100644 --- a/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h +++ b/services/screentransport/screensinkprocessor/decoder/include/image_sink_decoder.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp index 00d8697b..90a675a0 100644 --- a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp +++ b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp @@ -44,11 +44,11 @@ int32_t ImageSinkDecoder::ConfigureDecoder(const VideoParam &configParam) configParam_ = configParam; ret = AddSurface(); if (ret != DH_SUCCESS) { - DHLOGE("%s: Add surface failed ret: %.", PRId32, LOG_TAG, ret); + DHLOGE("%s: Add surface failed ret: %." PRId32, LOG_TAG, ret); consumerSurface_ = nullptr; producerSurface_ = nullptr; return ret; - } + } alignedHeight_ = configParam_.GetVideoHeight(); if (alignedHeight_ % ALIGNEDBITS != 0) { alignedHeight_ = ((alignedHeight_ / ALIGNEDBITS) + 1) * ALIGNEDBITS; @@ -81,7 +81,7 @@ int32_t ImageSinkDecoder::AddSurface() consumerBufferListener_ = new ConsumBufferListener(shared_from_this()); } consumerSurface_->RegisterConsumerListener(consumerBufferListener_); - lastFrameSize_ = configParam_.GetVideoWidth() * configParam_.GetVideoHeight() * RGB_CHROMA / EVEN; + lastFrameSize_ = configParam_.GetVideoWidth() * configParam_.GetVideoHeight() * RGB_CHROMA / TWO; lastFrame_ = new uint8_t[lastFrameSize_]; return DH_SUCCESS; } @@ -147,7 +147,7 @@ void ImageSinkDecoder::OffsetProcess(sptr surfaceBuffer, sptr &data ReportOptFail(DSCREEN_OPT_FAIL, ret, "InputScreenData failed."); return ret; } - } else if (data->DataType() == VIDEO_PART_SCREEN_DATA){ + } else if (data->DataType() == VIDEO_PART_SCREEN_DATA) { int32_t ret = imageJpeg_->MergeDirtyImagetoSurface(data, imageDecoder_->GetLastFrame()); if (ret != DH_SUCCESS) { DHLOGE("%s: MergeDirtyImagetoSurface failed ret:%" PRId32, LOG_TAG, ret); @@ -153,8 +153,8 @@ int32_t ImageSinkProcessor::ProcessImage(const std::shared_ptr &data return ret; } } else { - DHLOGE("%s: data type is invalid.", LOG_TAG); - return ERR_DH_SCREEN_DATA_TYPE_INVALID; + DHLOGE("%s: data type is invalid.", LOG_TAG); + return ERR_DH_SCREEN_DATA_TYPE_INVALID; } return DH_SUCCESS; } diff --git a/services/screentransport/screensinktrans/BUILD.gn b/services/screentransport/screensinktrans/BUILD.gn index 1fe351e1..9de8c2f1 100644 --- a/services/screentransport/screensinktrans/BUILD.gn +++ b/services/screentransport/screensinktrans/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Huawei Device Co., Ltd. +# Copyright (c) 2022-2023 Huawei Device 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 @@ -21,7 +21,6 @@ ohos_shared_library("distributed_screen_sinktrans") { "//base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include", "//third_party/json/include", "//third_party/libjpeg", - "//third_party/libyuv/files/include", "//foundation/graphic/graphic_2d/interfaces/innerkits/surface", "${fwk_common_path}/utils/include", "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", @@ -43,9 +42,10 @@ ohos_shared_library("distributed_screen_sinktrans") { "${services_path}/screentransport/screensinkprocessor/decoder/include", "${services_path}/screentransport/screensourceprocessor/include", "${services_path}/softbusadapter/include", - ] + + sources = [ "${common_path}/src/dscreen_json_util.cpp", "${services_path}/common/imageJpeg/src/screen_image_jpeg.cpp", @@ -66,9 +66,14 @@ ohos_shared_library("distributed_screen_sinktrans") { "${distributedhardwarefwk_path}/interfaces/inner_kits:libdhfwk_sdk", "//foundation/graphic/graphic_2d/frameworks/surface:surface", "//third_party/libjpeg-turbo:turbojpeg_static", - "//third_party/libyuv:yuv", ] + if (!distributed_screen_common) { + cflags += [ "-DLIBYUV" ] + include_dirs += [ "//third_party/libyuv/files/include", ] + deps += [ ""//third_party/libyuv:yuv"," ] + } + defines = [ "HI_LOG_ENABLE", "DH_LOG_TAG=\"dscreensinktrans\"", diff --git a/services/screentransport/screensinktrans/include/iscreen_sink_trans.h b/services/screentransport/screensinktrans/include/iscreen_sink_trans.h index b089d8d4..9b3857d8 100644 --- a/services/screentransport/screensinktrans/include/iscreen_sink_trans.h +++ b/services/screentransport/screensinktrans/include/iscreen_sink_trans.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screentransport/screensinktrans/include/screen_sink_trans.h b/services/screentransport/screensinktrans/include/screen_sink_trans.h index b528e6d4..8738684e 100644 --- a/services/screentransport/screensinktrans/include/screen_sink_trans.h +++ b/services/screentransport/screensinktrans/include/screen_sink_trans.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screentransport/screensinktrans/src/screen_sink_trans.cpp b/services/screentransport/screensinktrans/src/screen_sink_trans.cpp index 060ff2d9..abb5599c 100644 --- a/services/screentransport/screensinktrans/src/screen_sink_trans.cpp +++ b/services/screentransport/screensinktrans/src/screen_sink_trans.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 @@ -210,14 +210,14 @@ int32_t ScreenSinkTrans::InitScreenTrans(const VideoParam &localParam, const Vid const std::string &peerDevId) { switch (atoi(version_.c_str())) { - case 1: + case ONE: screenChannel_ = std::make_shared(peerDevId); break; - case 2: + case TWO: screenChannel_ = std::make_shared(peerDevId); break; default: - break; + break; } int32_t ret = RegisterChannelListener(); if (ret != DH_SUCCESS) { @@ -294,7 +294,7 @@ void ScreenSinkTrans::OnSessionOpened() if (dhFwkKit != nullptr) { int32_t ret = dhFwkKit->PublishMessage(DHTopic::TOPIC_LOW_LATENCY, ENABLE_LOW_LATENCY.dump()); if (ret != DH_FWK_SUCCESS) { - DHLOGE("%s: Sink start enable low latency failed ret: %.", PRId32, LOG_TAG, ret); + DHLOGE("%s: Sink start enable low latency failed ret: %." PRId32, LOG_TAG, ret); } } } @@ -306,7 +306,7 @@ void ScreenSinkTrans::OnSessionClosed() if (dhFwkKit != nullptr) { int32_t ret = dhFwkKit->PublishMessage(DHTopic::TOPIC_LOW_LATENCY, DISABLE_LOW_LATENCY.dump()); if (ret != DH_FWK_SUCCESS) { - DHLOGE("%s: Sink stop enable low latency failed ret: %.", PRId32, LOG_TAG, ret); + DHLOGE("%s: Sink stop enable low latency failed ret: %." PRId32, LOG_TAG, ret); } } diff --git a/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h b/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h index 0c9f6bb4..e843c8a3 100644 --- a/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h +++ b/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 @@ -34,7 +34,7 @@ namespace OHOS { namespace DistributedHardware { -class ConsumerBufferListener : public IBufferConsumerListener{ +class ConsumerBufferListener : public IBufferConsumerListener { public: explicit ConsumerBufferListener(const std::shared_ptr encoder) : encoder_(encoder) {}; ~ConsumerBufferListener() = default; diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index 34eb33d6..0ccfe3d4 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 @@ -19,10 +19,10 @@ #include #include #include -#include +#include #include #include -#include +#include #include "display_type.h" #include "dscreen_constants.h" @@ -84,11 +84,10 @@ void ImageSourceEncoder::ConsumeSurface() sptr surfaceBuffer = nullptr; int32_t fence = -1; int64_t timestamp = 0; - OHOS::Rect damage = {0, 0, 0, 0}; - std::vector damages; + OHOS::Rect damage = {0, 0, 0, 0}; SurfaceError surfaceErr = consumerSurface_->AcquireBuffer(surfaceBuffer, fence, timestamp, damage); if (surfaceErr != SURFACE_ERROR_OK) { - DHLOGE("%s: consumerSurface_ acquire buffer failed, errcode: %", PRId32, LOG_TAG, surfaceErr); + DHLOGE("%s: consumerSurface_ acquire buffer failed, errcode: %" PRId32, LOG_TAG, surfaceErr); consumerSurface_->ReleaseBuffer(surfaceBuffer, -1); return; } @@ -130,7 +129,7 @@ int32_t ImageSourceEncoder::ConfigureEncoder(const VideoParam &configParam) configParam_ = configParam; ret = AddSurface(); if (ret != DH_SUCCESS) { - DHLOGE("%s: Add surface failed ret: %.", PRId32, LOG_TAG, ret); + DHLOGE("%s: Add surface failed ret: %." PRId32, LOG_TAG, ret); consumerSurface_ = nullptr; producerSurface_ = nullptr; return ret; @@ -143,12 +142,12 @@ int32_t ImageSourceEncoder::AddSurface() DHLOGI("%s: AddSurface.", LOG_TAG); consumerSurface_ = IConsumerSurface::Create(); if (consumerSurface_ == nullptr) { - DHLOGE("%s: creat consumer surface failed: %.", PRId32, LOG_TAG); + DHLOGE("%s: creat consumer surface failed.", LOG_TAG); return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } sptr producer = consumerSurface_->GetProducer(); if (producer == nullptr) { - DHLOGE("%s: Creat producer surface failed: %.", PRId32, LOG_TAG); + DHLOGE("%s: Creat producer surface failed.", LOG_TAG); return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } producerSurface_ = Surface::CreateSurfaceAsProducer(producer); @@ -182,10 +181,10 @@ std::vector ImageSourceEncoder::VecToDamage(std::vector damages; for (auto item : eventContent) { OHOS::damage = {0, 0, 0, 0}; - damage.x = item.at(0); - damage.y = item.at(1); - damage.w = item.at(2); - damage.h = item.at(3); + damage.x = item.at(ZERO); + damage.y = item.at(ONE); + damage.w = item.at(TWO); + damage.h = item.at(THREE); damages.push_back(damage); } return damages; diff --git a/services/screentransport/screensourceprocessor/include/iimage_source_processor.h b/services/screentransport/screensourceprocessor/include/iimage_source_processor.h index 3f24c8f1..e488bca6 100644 --- a/services/screentransport/screensourceprocessor/include/iimage_source_processor.h +++ b/services/screentransport/screensourceprocessor/include/iimage_source_processor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screentransport/screensourceprocessor/include/iimage_source_processor_listener.h b/services/screentransport/screensourceprocessor/include/iimage_source_processor_listener.h index 64c5fb97..2fe496af 100644 --- a/services/screentransport/screensourceprocessor/include/iimage_source_processor_listener.h +++ b/services/screentransport/screensourceprocessor/include/iimage_source_processor_listener.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screentransport/screensourceprocessor/include/image_source_processor.h b/services/screentransport/screensourceprocessor/include/image_source_processor.h index d0ace6fa..9a908537 100644 --- a/services/screentransport/screensourceprocessor/include/image_source_processor.h +++ b/services/screentransport/screensourceprocessor/include/image_source_processor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screentransport/screensourceprocessor/src/image_source_processor.cpp b/services/screentransport/screensourceprocessor/src/image_source_processor.cpp index f7e7865d..6b149882 100644 --- a/services/screentransport/screensourceprocessor/src/image_source_processor.cpp +++ b/services/screentransport/screensourceprocessor/src/image_source_processor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screentransport/screensourcetrans/BUILD.gn b/services/screentransport/screensourcetrans/BUILD.gn index 8b613a75..7c841d9d 100644 --- a/services/screentransport/screensourcetrans/BUILD.gn +++ b/services/screentransport/screensourcetrans/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Huawei Device Co., Ltd. +# Copyright (c) 2022-2023 Huawei Device 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 @@ -27,7 +27,6 @@ ohos_shared_library("distributed_screen_sourcetrans") { "${ipc_interfaces_path}/innerkits/ipc_core/include", "${services_path}/common/utils/include", "//third_party/libjpeg-turbo", - "//third_party/libyuv/files/include", "//foundation/ability/dmsfwk/utils/native/include", ] @@ -65,9 +64,14 @@ ohos_shared_library("distributed_screen_sourcetrans") { "${distributedhardwarefwk_path}/interfaces/inner_kits:libdhfwk_sdk", "//foundation/graphic/graphic_2d/frameworks/surface:surface", "//third_party/libjpeg-turbo:turbojpeg_static", - "//third_party/libyuv:yuv", ] + if (!distributed_screen_common) { + cflags += [ "-DLIBYUV" ] + include_dirs += [ "//third_party/libyuv/files/include", ] + deps += [ ""//third_party/libyuv:yuv"," ] + } + defines = [ "HI_LOG_ENABLE", "DH_LOG_TAG=\"dscreensourcetrans\"", diff --git a/services/screentransport/screensourcetrans/include/iscreen_source_trans.h b/services/screentransport/screensourcetrans/include/iscreen_source_trans.h index d6b6af08..528d6730 100644 --- a/services/screentransport/screensourcetrans/include/iscreen_source_trans.h +++ b/services/screentransport/screensourcetrans/include/iscreen_source_trans.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screentransport/screensourcetrans/include/screen_source_trans.h b/services/screentransport/screensourcetrans/include/screen_source_trans.h index 373d9ca1..45bd7c88 100644 --- a/services/screentransport/screensourcetrans/include/screen_source_trans.h +++ b/services/screentransport/screensourcetrans/include/screen_source_trans.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screentransport/screensourcetrans/src/screen_source_trans.cpp b/services/screentransport/screensourcetrans/src/screen_source_trans.cpp index 26c8d06b..8d38ac20 100644 --- a/services/screentransport/screensourcetrans/src/screen_source_trans.cpp +++ b/services/screentransport/screensourcetrans/src/screen_source_trans.cpp @@ -130,7 +130,7 @@ int32_t ScreenSourceTrans::Start() if (dhFwkKit != nullptr) { ret = dhFwkKit->PublishMessage(DHTopic::TOPIC_LOW_LATENCY, ENABLE_LOW_LATENCY.dump()); if (ret != DH_FWK_SUCCESS) { - DHLOGE("%s: Source start enable low latency failed ret: %.", PRId32, LOG_TAG, ret); + DHLOGE("%s: Source start enable low latency failed ret: %." PRId32, LOG_TAG, ret); } } @@ -159,7 +159,7 @@ int32_t ScreenSourceTrans::Stop() if (dhFwkKit != nullptr) { ret = dhFwkKit->PublishMessage(DHTopic::TOPIC_LOW_LATENCY, DISABLE_LOW_LATENCY.dump()); if (ret != DH_FWK_SUCCESS) { - DHLOGE("%s: Source stop enable low latency failed ret: %.", PRId32, LOG_TAG, ret); + DHLOGE("%s: Source stop enable low latency failed ret: %." PRId32, LOG_TAG, ret); } } @@ -284,7 +284,7 @@ int32_t ScreenSourceTrans::InitScreenTrans(const VideoParam &localParam, const V screenChannel_ = std::make_shared(peerDevId); break; default: - break; + break; } int32_t ret = RegisterChannelListener(); if (ret != DH_SUCCESS) { @@ -351,7 +351,7 @@ int32_t ScreenSourceTrans::RegisterProcessorListener(const VideoParam &localPara if (ret != DH_SUCCESS) { DHLOGE("%s: Config decision center failed ret: %" PRId32, LOG_TAG, ret); return ret; - } + } return DH_SUCCESS; } @@ -406,16 +406,16 @@ void ScreenSourceTrans::OnDamageProcessDone(sptr &surfaceBuffer, } int32_t ret = DH_SUCCESS; switch (atoi(version_.c_str())) { - case 1: + case ONE: DHLOGI("%s: ProcessFullImage.", LOG_TAG); ret = imageProcessor_->ProcessFullImage(surfaceBuffer); break; - case 2: - DHLOGI("%s: InputBufferDmage.", LOG_TAG); - ret = screenDecisionCenter_->InputBufferDmage(surfaceBuffer, damages); + case TWO: + DHLOGI("%s: InputBufferImage.", LOG_TAG); + ret = screenDecisionCenter_->InputBufferImage(surfaceBuffer, damages); break; default: - break; + break; } } diff --git a/services/screentransport/test/unittest/screensinkprocessor/BUILD.gn b/services/screentransport/test/unittest/screensinkprocessor/BUILD.gn index fd22ea7d..16746199 100644 --- a/services/screentransport/test/unittest/screensinkprocessor/BUILD.gn +++ b/services/screentransport/test/unittest/screensinkprocessor/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Huawei Device Co., Ltd. +# Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screentransport/test/unittest/screensinktrans/BUILD.gn b/services/screentransport/test/unittest/screensinktrans/BUILD.gn index 2d35e496..3cf7982a 100644 --- a/services/screentransport/test/unittest/screensinktrans/BUILD.gn +++ b/services/screentransport/test/unittest/screensinktrans/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Huawei Device Co., Ltd. +# Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screentransport/test/unittest/screensourcetrans/BUILD.gn b/services/screentransport/test/unittest/screensourcetrans/BUILD.gn index f670f119..96a3a47f 100644 --- a/services/screentransport/test/unittest/screensourcetrans/BUILD.gn +++ b/services/screentransport/test/unittest/screensourcetrans/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Huawei Device Co., Ltd. +# Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screentransport/test/unittest/screensourcetrans/src/screen_source_trans_test.cpp b/services/screentransport/test/unittest/screensourcetrans/src/screen_source_trans_test.cpp index a6c88508..fb111655 100644 --- a/services/screentransport/test/unittest/screensourcetrans/src/screen_source_trans_test.cpp +++ b/services/screentransport/test/unittest/screensourcetrans/src/screen_source_trans_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/screentransport/test/unittest/screentranstestutils/BUILD.gn b/services/screentransport/test/unittest/screentranstestutils/BUILD.gn index 876c4e8c..629cf613 100644 --- a/services/screentransport/test/unittest/screentranstestutils/BUILD.gn +++ b/services/screentransport/test/unittest/screentranstestutils/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Huawei Device Co., Ltd. +# Copyright (c) 2022-2023 Huawei Device 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 diff --git a/services/softbusadapter/src/softbus_adapter.cpp b/services/softbusadapter/src/softbus_adapter.cpp index 7411f7b5..e0e1efbe 100644 --- a/services/softbusadapter/src/softbus_adapter.cpp +++ b/services/softbusadapter/src/softbus_adapter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device 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 @@ -177,11 +177,11 @@ int32_t SoftbusAdapter::OpenSoftbusSession(const std::string &mySessionName, con attr.attr.streamAttr.streamType = streamType; int32_t sessionId = OpenSession(mySessionName.c_str(), peerSessionName.c_str(), peerDevId.c_str(), "0", &attr); if (sessionId < 0) { - DHLOGE("%s: OpenSession failed sessionId: %.", PRId32, LOG_TAG, sessionId); + DHLOGE("%s: OpenSession failed sessionId: %." PRId32, LOG_TAG, sessionId); return ERR_DH_SCREEN_ADAPTER_OPEN_SESSION_FAIL; } - DHLOGI("%s: OpenSoftbusSession success sessionId: %.", PRId32, LOG_TAG, sessionId); + DHLOGI("%s: OpenSoftbusSession success sessionId: %." PRId32, LOG_TAG, sessionId); return sessionId; } -- Gitee From 4b0af0502db2550b02dcec89a418c52db3294994 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 11:06:16 +0800 Subject: [PATCH 03/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- distributedscreen.gni | 2 +- .../include/screen_decision_center.h | 5 +- .../src/screen_decision_center.cpp | 29 +- .../imageJpeg/include/screen_image_jpeg.h | 18 +- .../imageJpeg/src/screen_image_jpeg.cpp | 58 +-- .../screen_channel/include/iscreen_channel.h | 2 + .../screenregionmgr/src/screenregion.cpp | 3 +- .../dscreenmgr/include/dscreen.h | 2 +- .../dscreenmgr/include/dscreen_manager.h | 2 +- .../dscreenmgr/src/dscreen_manager.cpp | 4 +- .../include/screen_data_channel_impl.h | 11 +- .../include/screen_refresh_channel_impl.h | 66 --- .../src/screen_data_channel_impl.cpp | 245 +++++++++-- .../src/screen_refresh_channel_impl.cpp | 389 ------------------ .../include/image_sink_processor.h | 2 +- .../src/image_sink_processor.cpp | 8 +- .../screentransport/screensinktrans/BUILD.gn | 7 +- .../screensinktrans/src/screen_sink_trans.cpp | 13 +- .../encoder/src/image_source_encoder.cpp | 2 +- .../screensourcetrans/BUILD.gn | 7 +- .../src/screen_source_trans.cpp | 16 +- .../include/screentrans_test_utils.h | 4 + 22 files changed, 311 insertions(+), 584 deletions(-) delete mode 100644 services/screentransport/screendatachannel/include/screen_refresh_channel_impl.h delete mode 100644 services/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp diff --git a/distributedscreen.gni b/distributedscreen.gni index 6f89f23e..417c1457 100644 --- a/distributedscreen.gni +++ b/distributedscreen.gni @@ -29,5 +29,5 @@ ipc_interfaces_path = "${ipc_path}/interfaces" build_flags = [ "-Werror" ] declare_args() { - distributed_screen_common = false; + distributed_screen_common = true } diff --git a/services/common/decision_center/include/screen_decision_center.h b/services/common/decision_center/include/screen_decision_center.h index 5543dfbc..669179d2 100644 --- a/services/common/decision_center/include/screen_decision_center.h +++ b/services/common/decision_center/include/screen_decision_center.h @@ -39,9 +39,10 @@ public: private: static const constexpr int32_t DIRTY_REGION_ARE_THRESHOLD = 260000; - static const constexpr int32_t THRESHOLD = 10; + static const constexpr int32_t FORCE_FULL_IMAGE_TIME_INTERAL = 10; //10 seconds + static const constexpr int32_t MIN_SURPPORT_FRAME_COUNT = 10; //10 frames static const constexpr char *LOG_TAG = "ScreenDecisionCenter"; - std::shared_ptr imageJpeg_ = nullptr; + std::shared_ptr imageJpeg_ = nullptr; std::shared_ptr imageProcessor_ = nullptr; VideoParam configParam_; int32_t frameCount_ = 0; diff --git a/services/common/decision_center/src/screen_decision_center.cpp b/services/common/decision_center/src/screen_decision_center.cpp index d43dc423..cc1d41e0 100644 --- a/services/common/decision_center/src/screen_decision_center.cpp +++ b/services/common/decision_center/src/screen_decision_center.cpp @@ -47,20 +47,21 @@ bool ScreenDecisionCenter::IsDirtyRectValid(const std::vector &damag } return true; } + bool ScreenDecisionCenter::JudgeDirtyThreshold(const std::vector &damages) { DHLOGI("%s: JudgeDirtyThreshold.", LOG_TAG); int32_t allDirtyArea = 0; for (const auto &damage : damages) { - int32_t dirtyArea = damage.w * damage.h; - allDirtyArea += dirtyArea; - if (dirtyArea > DIRTY_REGION_ARE_THRESHOLD || allDirtyArea > DIRTY_REGION_ARE_THRESHOLD) { - DHLOGE("%s: dirtyArea is %." PRId32, LOG_TAG, dirtyArea); + allDirtyArea += damage.w * damage.h; + if (allDirtyArea > DIRTY_REGION_ARE_THRESHOLD) { + DHLOGE("%s: dirtyArea is %." PRId32, LOG_TAG, allDirtyArea); return false; } } return true; } + bool ScreenDecisionCenter::LimitTime(uint32_t timethreshold) { return difftime(time(nullptr), sendFullTime_) >= timethreshold; @@ -74,18 +75,19 @@ int32_t ScreenDecisionCenter::InputBufferImage(sptr &surfaceBuffe DHLOGE("%s: surfaceBuffer is null.", LOG_TAG); return ERR_DH_SCREEN_SURFACE_BUFFER_INVALIED; } - if (damages.empty() || frameCount_ < THRESHOLD || LimitTime(THRESHOLD) || + if (damages.empty() || frameCount_ < MIN_SURPPORT_FRAME_COUNT || + LimitTime(FORCE_FULL_IMAGE_TIME_INTERAL) || !IsDirtyRectValid(damages) || !JudgeDirtyThreshold(damages)) { DHLOGI("%s: send full image data.", LOG_TAG); sendFullTime_ = time(nullptr); - int32_t ret = imageProcessor_->ProcessFullIma ge(surfaceBuffer); + int32_t ret = imageProcessor_->ProcessFullImage(surfaceBuffer); if (ret != DH_SUCCESS) { DHLOGE("%s: send full data failed.", LOG_TAG); return ret; } } else { DHLOGI("%s: send dirty data.", LOG_TAG); - int32_t ret = imageJpeg_->ProcessPartailImage(surfaceBuffer, damages); + int32_t ret = imageJpeg_->ProcessDamageSurface(surfaceBuffer, damages); if (ret != DH_SUCCESS) { DHLOGE("%s: send dirty data failed.", LOG_TAG); return ret; @@ -94,6 +96,7 @@ int32_t ScreenDecisionCenter::InputBufferImage(sptr &surfaceBuffe frameCount_++; return DH_SUCCESS; } + int32_t ScreenDecisionCenter::ConfigureDecisionCenter(std::shared_ptr &listener, std::shared_ptr &imageProcessor) { @@ -102,20 +105,20 @@ int32_t ScreenDecisionCenter::ConfigureDecisionCenter(std::shared_ptr(configParam_); + imageJpeg_ = std::make_shared(configParam_); imageJpeg_->SetImageProcessListener(listener); imageProcessor_ = imageProcessor; return DH_SUCCESS; } + int32_t ScreenDecisionCenter::SetJpegSurface(sptr &surface) { DHLOGI("%s: SetJpegSurface.", LOG_TAG); - int32_t ret = imageJpeg_->SetOutputSurface(surface); - if (ret != DH_SUCCESS) { - DHLOGE("%s: JPEG set surface failed.", LOG_TAG); - return ret; + if (surface ==nullptr) { + DHLOGE("%s: Jpeg source is null.", LOG_TAG); + return ERR_DH_SCREEN_TRANS_NULL_VALUE; } - return DH_SUCCESS; + return imageJpeg_->SetOutputSurface(surface); } } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/services/common/imageJpeg/include/screen_image_jpeg.h b/services/common/imageJpeg/include/screen_image_jpeg.h index 6bfa149c..42529e4c 100644 --- a/services/common/imageJpeg/include/screen_image_jpeg.h +++ b/services/common/imageJpeg/include/screen_image_jpeg.h @@ -28,22 +28,22 @@ #include "video_param.h" namespace OHOS { namespace DistributedHardware { -class ScreenImageJpeg : public std::enable_shared_from_this { +class JpegImageProcessor : public std::enable_shared_from_this { public: - explicit ScreenImageJpeg(const VideoParam &configParam) : configParam_(configParam){}; - ~ScreenImageJpeg() = default; + explicit JpegImageProcessor(const VideoParam &configParam) : configParam_(configParam){}; + ~JpegImageProcessor() = default; int32_t SetOutputSurface(sptr surface); - int32_t MergeDirtyImagetoSurface(const std::shared_ptr &data, uint8_t *lastFrame); - int32_t ProcessPartailImage(sptr &surfaceBuffer, const std::vector &damages); + int32_t FillDirtyImages2Surface(const std::shared_ptr &data, uint8_t *lastFrame); + int32_t ProcessDamageSurface(sptr &surfaceBuffer, const std::vector &damages); int32_t SetImageProcessListener(std::shared_ptr &imageProcessorListener); - void CodecImage(sptr &surfaceBuffer, const OHOS::Rect &damage, std::shared_ptr &data); - int32_t MergeImage(const std::shared_ptr &data, uint8_t *lastFrame); - int32_t PastImage(uint8_t *lastFrame, uint8_t *dirtyImageData, const DirtyRect rect); + void EncodeDamageData(sptr &surfaceBuffer, const OHOS::Rect &damage, std::shared_ptr &data); + int32_t DecodeDamageData(const std::shared_ptr &data, uint8_t *lastFrame); + int32_t ReplaceDamage2LastFrame(uint8_t *lastFrame, uint8_t *dirtyImageData, const DirtyRect rect); private: uint32_t CompressRgbaToJpeg(const OHOS::Rect &damage, uint8_t *inputData, std::shared_ptr &data); void DecompressJpegToNV12(size_t jpegSize, uint8_t *inputData, uint8_t *outputData); - static const constexpr char *LOG_TAG = "ScreenImageJpeg"; + static const constexpr char *LOG_TAG = "JpegImageProcessor"; sptr imageSurface_; VideoParam configParam_; std::weak_ptr imageProcessorListener_; diff --git a/services/common/imageJpeg/src/screen_image_jpeg.cpp b/services/common/imageJpeg/src/screen_image_jpeg.cpp index 99a09aaf..e8664c1a 100644 --- a/services/common/imageJpeg/src/screen_image_jpeg.cpp +++ b/services/common/imageJpeg/src/screen_image_jpeg.cpp @@ -31,24 +31,26 @@ namespace OHOS { namespace DistributedHardware { -int32_t ScreenImageJpeg::SetOutputSurface(sptr surface) +int32_t JpegImageProcessor::SetOutputSurface(sptr surface) { DHLOGI("%s: SetOutputSurface.", LOG_TAG); if (surface == nullptr) { DHLOGE("%s: SetOutputSurface surface is nullptr.", LOG_TAG); + return ERR_DH_SCREEN_TRANS_NULL_VALUE; } imageSurface_ = surface; return DH_SUCCESS; } -int32_t ScreenImageJpeg::MergeDirtyImagetoSurface(const std::shared_ptr &data, uint8_t *lastFrame) + +int32_t JpegImageProcessor::FillDirtyImages2Surface(const std::shared_ptr &data, uint8_t *lastFrame) { - DHLOGI("%s: MergeDirtyImagetoSurface.", LOG_TAG); + DHLOGI("%s: FillDirtyImages2Surface.", LOG_TAG); if (imageSurface_ == nullptr) { DHLOGE("%s: imageSurface_ is nullptr.", LOG_TAG); return ERR_DH_SCREEN_SURFACE_INVALIED; } int32_t lastFrameSize = configParam_.GetScreenWidth() * configParam_.GetScreenHeight() * RGB_CHROMA / TWO; - int32_t ret = MergeImage(data, lastFrame); + int32_t ret = DecodeDamageData(data, lastFrame); if (ret != DH_SUCCESS) { DHLOGE("%s: Merge dirty failed, ret: %." PRId32, LOG_TAG, ret); return ret; @@ -83,17 +85,18 @@ int32_t ScreenImageJpeg::MergeDirtyImagetoSurface(const std::shared_ptrCancelBuffer(windowSurfaceBuffer); return surfaceErr; } - DHLOGI("%s: MergeDirtyImagetoSurface success.", LOG_TAG); + DHLOGI("%s: FillDirtyImages2Surface success.", LOG_TAG); return DH_SUCCESS; } -int32_t ScreenImageJpeg::ProcessPartailImage(sptr &surfaceBuffer, const std::vector &damages) + +int32_t JpegImageProcessor::ProcessDamageSurface(sptr &surfaceBuffer, const std::vector &damages) { - DHLOGI("%s: ProcessPartailImage.", LOG_TAG); + DHLOGI("%s: ProcessDamageSurface.", LOG_TAG); std::shared_ptr dataBuf = std::make_shared(configParam_.GetScreenWidth() * configParam_.GetScreenHeight() * RGBA_CHROMA); dataBuf->SetSize(0); for (auto item : damages) { - CodecImage(surfaceBuffer, item, dataBuf); + EncodeDamageData(surfaceBuffer, item, dataBuf); } std::shared_ptr listener = imageProcessorListener_.lock(); if (listener == nullptr) { @@ -105,16 +108,18 @@ int32_t ScreenImageJpeg::ProcessPartailImage(sptr &surfaceBuffer, listener->OnImageProcessDone(dataBuf); return DH_SUCCESS; } -int32_t ScreenImageJpeg::SetImageProcessListener(std::shared_ptr &imageProcessorListener) + +int32_t JpegImageProcessor::SetImageProcessListener(std::shared_ptr &imageProcessorListener) { DHLOGI("%s: SetImageProcessorListener.", LOG_TAG); imageProcessorListener_ = imageProcessorListener; return DH_SUCCESS; } -void ScreenImageJpeg::CodecImage(sptr &surfaceBuffer, + +void JpegImageProcessor::EncodeDamageData(sptr &surfaceBuffer, const OHOS::Rect &damage, std::shared_ptr &data) { - DHLOGI("%s: CodecImage.", LOG_TAG); + DHLOGI("%s: EncodeDamageData.", LOG_TAG); int32_t partialSize = damage.w * damage.h *RGBA_CHROMA; unsigned char *partialBuffer = new unsigned char[partialSize]; unsigned char *partialBufferIdx = partialBuffer; @@ -132,14 +137,13 @@ void ScreenImageJpeg::CodecImage(sptr &surfaceBuffer, surfaceAddrIdx += configParam_.GetScreenWidth() * RGBA_CHROMA; } uint32_t jpegSize = CompressRgbaToJpeg(damage, partialBuffer, data); - DHLOGI("CodecImage jpegSize %." PRId32, jpegSize); + DHLOGI("EncodeDamageData jpegSize %." PRId32, jpegSize); delete [] partialBuffer; } - -int32_t ScreenImageJpeg::MergeImage(const std::shared_ptr &data, uint8_t *lastFrame) +int32_t JpegImageProcessor::DecodeDamageData(const std::shared_ptr &data, uint8_t *lastFrame) { - DHLOGI("%s: MergeDirtyImagetoSurface.", LOG_TAG); + DHLOGI("%s: DecodeDamageData.", LOG_TAG); std::vector dirtyRectVec = data->GetDirtyRectVec(); int32_t offset = 0; int32_t screenWidth = configParam_.GetScreenWidth(); @@ -161,9 +165,9 @@ int32_t ScreenImageJpeg::MergeImage(const std::shared_ptr &data, uin DHLOGI("%s: CompressRgbaToJpeg.", LOG_TAG); DecompressJpegToNV12(item.dirtySize, jpegData, dirtyImageData); DHLOGI("%s: DecompressJpegToNV12 success.", LOG_TAG); - ret = PastImage(lastFrame, dirtyImageData, item); + ret = ReplaceDamage2LastFrame(lastFrame, dirtyImageData, item); if (ret != DH_SUCCESS) { - DHLOGE("PastImage failed, ret: %." PRId32, ret); + DHLOGE("ReplaceDamage2LastFrame failed, ret: %." PRId32, ret); delete [] jpegData; delete [] dirtyImageData; return ret; @@ -171,13 +175,13 @@ int32_t ScreenImageJpeg::MergeImage(const std::shared_ptr &data, uin delete [] jpegData; delete [] dirtyImageData; } - DHLOGI("%s: MergeDirtyImagetoSurface success.", LOG_TAG); + DHLOGI("%s: DecodeDamageData success.", LOG_TAG); return DH_SUCCESS; } -int32_t ScreenImageJpeg::PastImage(uint8_t *lastFrame, uint8_t *dirtyImageData, const DirtyRect rect) +int32_t JpegImageProcessor::ReplaceDamage2LastFrame(uint8_t *lastFrame, uint8_t *dirtyImageData, const DirtyRect rect) { - DHLOGI("%s: PastImage.", LOG_TAG); + DHLOGI("%s: ReplaceDamage2LastFrame.", LOG_TAG); uint8_t *lastFrameIdx = lastFrame; uint8_t *yData = lastFrameIdx + configParam_.GetScreenWidth() * rect.yPos + rect.xPos; uint8_t *uData = lastFrameIdx + configParam_.GetScreenWidth() * configParam_.GetScreenHeight() + @@ -204,10 +208,11 @@ int32_t ScreenImageJpeg::PastImage(uint8_t *lastFrame, uint8_t *dirtyImageData, uDirtyData += rect.width; } } + DHLOGI("%s: ReplaceDamage2LastFrame success.", LOG_TAG); return DH_SUCCESS; } -uint32_t ScreenImageJpeg::CompressRgbaToJpeg(const OHOS::Rect &damage, uint8_t *inputData, std::shared_ptr &data) +uint32_t JpegImageProcessor::CompressRgbaToJpeg(const OHOS::Rect &damage, uint8_t *inputData, std::shared_ptr &data) { jpeg_compress_struct cinfo; jpeg_error_mgr jerr; @@ -256,7 +261,7 @@ uint32_t ScreenImageJpeg::CompressRgbaToJpeg(const OHOS::Rect &damage, uint8_t * return (uint32_t)outSize; } -void ScreenImageJpeg::DecompressJpegToNV12(size_t jpegSize, uint8_t *inputData, uint8_t *outputData) +void JpegImageProcessor::DecompressJpegToNV12(size_t jpegSize, uint8_t *inputData, uint8_t *outputData) { jpeg_decompress_struct cinfo; jpeg_error_mgr jerr; @@ -267,13 +272,14 @@ void ScreenImageJpeg::DecompressJpegToNV12(size_t jpegSize, uint8_t *inputData, (void)jpeg_start_decompress(&cinfo); int32_t row_stride = cinfo.output_width * cinfo.output_components; JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1); - int32_t i = 0; - int32_t yIndex = 0; int32_t uvIndex = cinfo.output_width * cinfo.output_height; + int32_t i = 0; #ifdef LIBYUV int32_t rgbSize = cinfo.output_width * cinfo.output_height * RGBA_CHROMA; uint8_t *rgb = new uint8_t[rgbSize]; int32_t rgbIndex = 0; +#else + int32_t yIndex = 0; #endif while (cinfo.output_scanline < cinfo.output_height) { (void)jpeg_read_scanlines(&cinfo, buffer, 1); @@ -290,15 +296,15 @@ void ScreenImageJpeg::DecompressJpegToNV12(size_t jpegSize, uint8_t *inputData, UB_PARAM * buffer[0][j * RGB_CHROMA + TWO] + UA_PARAM) >> MOVEBITS) + UA_PARAM; int32_t v = ((UB_PARAM * buffer[0][j * RGB_CHROMA] - VG_PARAM * buffer[0][j * RGB_CHROMA + 1] - VB_PARAM * buffer[0][j * RGB_CHROMA + TWO] + UA_PARAM) >> MOVEBITS) + UA_PARAM; - outputData[ ++] = static_cast((y < 0) ? 0 : (y > YUV_PARAM) ? YUV_PARAM : y); + outputData[yIndex++] = static_cast((y < 0) ? 0 : (y > YUV_PARAM) ? YUV_PARAM : y); if ((i % TWO == 0) && (j % TWO == 0)) { outputData[uvIndex++] = static_cast((u < 0) ? 0 : (u > YUV_PARAM) ? YUV_PARAM : u); outputData[uvIndex++] = static_cast((v < 0) ? 0 : (v > YUV_PARAM) ? YUV_PARAM : v); } +#endif } ++i; } -#endif (void)jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); #ifdef LIBYUV diff --git a/services/common/screen_channel/include/iscreen_channel.h b/services/common/screen_channel/include/iscreen_channel.h index b5b06ed8..74cb7681 100644 --- a/services/common/screen_channel/include/iscreen_channel.h +++ b/services/common/screen_channel/include/iscreen_channel.h @@ -32,6 +32,8 @@ public: virtual int32_t OpenSession() = 0; virtual int32_t CloseSession() = 0; virtual int32_t SendData(const std::shared_ptr &data) = 0; + virtual void SetJpegSessionFlag(bool flag) = 0; + }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp b/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp index 7790d97c..6e8fafd9 100644 --- a/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp @@ -128,11 +128,12 @@ int32_t ScreenRegion::SetUpWindow() return DH_SUCCESS; } + void ScreenRegion::SetScreenVersion(std::string version) { - DHLOGD("ScreenRegion SetScreenVersion"); version_ = version; } + std::string ScreenRegion::GetScreenVersion() { return version_; diff --git a/services/screenservice/sourceservice/dscreenmgr/include/dscreen.h b/services/screenservice/sourceservice/dscreenmgr/include/dscreen.h index f19212ce..2fb81b3a 100644 --- a/services/screenservice/sourceservice/dscreenmgr/include/dscreen.h +++ b/services/screenservice/sourceservice/dscreenmgr/include/dscreen.h @@ -119,7 +119,7 @@ private: std::mutex taskQueueMtx_; std::queue> taskQueue_; bool taskThreadRunning_; - std::string version_; + std::string version_ = "1.0"; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h b/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h index 4b8b3142..c970b29f 100644 --- a/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h +++ b/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h @@ -76,7 +76,7 @@ private: sptr dScreenGroupListener_ = nullptr; std::shared_ptr dScreenCallback_ = nullptr; std::string localDevId_; - std::string version_; + std::string version_ = "1.0"; sptr GetDScreenSinkSA(const std::string &devId); int32_t NotifyRemoteScreenService(const std::string &devId, int32_t eventCode, const std::string &eventContent); diff --git a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp index 1c269c8d..ad3191f3 100644 --- a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp @@ -545,14 +545,14 @@ void DScreenManager::HandleNotifySetUpResult(const std::string &remoteDevId, con dScreens_[dScreenIdx]->AddTask(std::make_shared(TaskType::TASK_CONNECT, "")); } + void DScreenManager::SetScreenVersion(std::string &version) { - DHLOGI("SetScreenVersion"); version_ = version; } + std::string DScreenManager::GetScreenVersion() { - DHLOGI("GetScreenVersion"); return version_; } } // namespace DistributedHardware diff --git a/services/screentransport/screendatachannel/include/screen_data_channel_impl.h b/services/screentransport/screendatachannel/include/screen_data_channel_impl.h index 7fa6a9ad..e25c1fb1 100644 --- a/services/screentransport/screendatachannel/include/screen_data_channel_impl.h +++ b/services/screentransport/screendatachannel/include/screen_data_channel_impl.h @@ -37,6 +37,12 @@ public: int32_t OpenSession() override; int32_t CloseSession() override; int32_t SendData(const std::shared_ptr &screenData) override; + void SetJpegSessionFlag(bool flag) override; + int32_t SendFullData(const std::shared_ptr &screenData); + int32_t SendDirtyData(const std::shared_ptr &screenData); + void ProcessDirtyData(const StreamData *data, std::shared_ptr dataBuffer, const StreamData *ext); + void ProcessDullData(const StreamData *data, std::shared_ptr dataBuffer); + void OnSessionOpened(int32_t sessionId, int32_t result) override; void OnSessionClosed(int32_t sessionId) override; @@ -46,9 +52,12 @@ public: private: static const constexpr char *LOG_TAG = "ScreenDataChannel"; - + bool jpegSessionFlag = false; const std::string peerDevId_; int32_t sessionId_ = 0; + int32_t jpegSessionId_ = 0; + bool dataSessionOpened = false; + bool jpegSessionOpened = false; std::weak_ptr channelListener_; }; } // namespace DistributedHardware diff --git a/services/screentransport/screendatachannel/include/screen_refresh_channel_impl.h b/services/screentransport/screendatachannel/include/screen_refresh_channel_impl.h deleted file mode 100644 index c101b0c3..00000000 --- a/services/screentransport/screendatachannel/include/screen_refresh_channel_impl.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device 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. - */ - -#ifndef OHOS_SCREEN_REFRESH_CHANNEL_IMPL_H -#define OHOS_SCREEN_REFRESH_CHANNEL_IMPL_H - -#include -#include - -#include "data_buffer.h" -#include "iscreen_channel.h" -#include "softbus_adapter.h" - -namespace OHOS { -namespace DistributedHardware { -class ScreenRefreshChannelImpl : public IScreenChannel, - public ISoftbusListener, - public std::enable_shared_from_this { -public: - explicit ScreenRefreshChannelImpl(std::string peerDevId) : peerDevId_(peerDevId) {}; - ~ScreenRefreshChannelImpl() override = default; - - int32_t CreateSession(const std::shared_ptr &listener) override; - int32_t ReleaseSession() override; - int32_t OpenSession() override; - int32_t CloseSession() override; - int32_t SendData(const std::shared_ptr &screenData) override; - - void OnSessionOpened(int32_t sessionId, int32_t result) override; - void OnSessionClosed(int32_t sessionId) override; - void OnBytesReceived(int32_t sessionId, const void *data, uint32_t dataLen) override; - void OnStreamReceived(int32_t sessionId, const StreamData *data, const StreamData *ext, - const StreamFrameInfo *param) override; - void ProcessDullData(const StreamData *data, std::shared_ptr screenData); - void ProcessDirtyData(const StreamData *data, std::shared_ptr screenData, const StreamData *ext); - - int32_t OpenDataSession(); - int32_t OpenJpegSession(); - int32_t SendFullData(const std::shared_ptr &screenData); - int32_t SendDirtyData(const std::shared_ptr &screenData); - -private: - static const constexpr char *LOG_TAG = "ScreenRefreshChannelImpl"; - - const std::string peerDevId_; - int32_t sessionId_ = 0; - int32_t jpegSessionId_ = 0; - bool dataSessionOpened = false; - bool jpegSessionOpened = false; - std::weak_ptr channelListener_; -}; -} // namespace DistributedHardware -} // namespace OHOS -#endif \ No newline at end of file diff --git a/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp b/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp index a303fa1a..6e427ce0 100644 --- a/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp +++ b/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp @@ -21,7 +21,9 @@ #include "dscreen_errcode.h" #include "dscreen_hisysevent.h" #include "dscreen_log.h" -#include "dscreen_util.h" +#include "dscreen_util.h" +#include "nlohmann/json.hpp" +#include "dscreen_json_util.h" namespace OHOS { namespace DistributedHardware { @@ -32,42 +34,71 @@ int32_t ScreenDataChannelImpl::CreateSession(const std::shared_ptr softbusListener = shared_from_this(); ret = SoftbusAdapter::GetInstance().RegisterSoftbusListener(softbusListener, DATA_SESSION_NAME, peerDevId_); if (ret != DH_SUCCESS) { - DHLOGE("%s: Register softbus adapter listener failed ret: %" PRId32, LOG_TAG, ret); + DHLOGE("%s: Register data adapter listener failed ret: %" PRId32, LOG_TAG, ret); return ret; } - + if (jpegSessionFlag == true) { + ret = + SoftbusAdapter::GetInstance().CreateSoftbusSessionServer(PKG_NAME, JPEG_SESSION_NAME, peerDevId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Create jpeg session failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + std::shared_ptr softbusListener = shared_from_this(); + ret = + SoftbusAdapter::GetInstance().RegisterSoftbusListener(softbusListener, JPEG_SESSION_NAME, peerDevId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Register jpeg adapter listener failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + } channelListener_ = listener; - DHLOGI("%s: Create softbus session success", LOG_TAG); + DHLOGI("%s: Create session success", LOG_TAG); return DH_SUCCESS; } +void ScreenDataChannelImpl::SetJpegSessionFlag(bool flag) +{ + jpegSessionFlag = flag; +} + int32_t ScreenDataChannelImpl::ReleaseSession() { DHLOGI("%s: ReleaseSession, peerDevId(%s)", LOG_TAG, GetAnonyString(peerDevId_).c_str()); int32_t ret = SoftbusAdapter::GetInstance().RemoveSoftbusSessionServer(PKG_NAME, DATA_SESSION_NAME, peerDevId_); if (ret != DH_SUCCESS) { - DHLOGE("%s: Release softbus session failed ret: %" PRId32, LOG_TAG, ret); + DHLOGE("%s: Release data session failed ret: %" PRId32, LOG_TAG, ret); return ret; } - ret = SoftbusAdapter::GetInstance().UnRegisterSoftbusListener(DATA_SESSION_NAME, peerDevId_); if (ret != DH_SUCCESS) { - DHLOGE("%s: UnRegister softbus adapter listener failed ret: %" PRId32, LOG_TAG, ret); + DHLOGE("%s: UnRegister data adapter listener failed ret: %" PRId32, LOG_TAG, ret); return ret; } - DHLOGI("%s: Release softbus session success", LOG_TAG); + if (jpegSessionFlag == true) { + int32_t ret = SoftbusAdapter::GetInstance().RemoveSoftbusSessionServer(PKG_NAME, JPEG_SESSION_NAME, peerDevId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Release jpeg session failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + ret = SoftbusAdapter::GetInstance().UnRegisterSoftbusListener(JPEG_SESSION_NAME, peerDevId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: UnRegister jpeg adapter listener failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + jpegSessionFlag = false; + } + DHLOGI("%s: Release session success", LOG_TAG); return DH_SUCCESS; } @@ -77,12 +108,21 @@ int32_t ScreenDataChannelImpl::OpenSession() int32_t sessionId = SoftbusAdapter::GetInstance().OpenSoftbusSession(DATA_SESSION_NAME, DATA_SESSION_NAME, peerDevId_); if (sessionId < 0) { - DHLOGE("%s: Open screen session failed, ret: %" PRId32, LOG_TAG, sessionId); - ReportOptFail(DSCREEN_OPT_FAIL, sessionId, "Open screen session failed"); + DHLOGE("%s: Open data session failed, ret: %" PRId32, LOG_TAG, sessionId); + ReportOptFail(DSCREEN_OPT_FAIL, sessionId, "Open data session failed"); return ERR_DH_SCREEN_TRANS_ERROR; } sessionId_ = sessionId; - + if (jpegSessionFlag == true) { + int32_t sessionId = + SoftbusAdapter::GetInstance().OpenSoftbusSession(DATA_SESSION_NAME, JPEG_SESSION_NAME, peerDevId_); + if (sessionId < 0) { + DHLOGE("%s: Open jpeg session failed, ret: %" PRId32, LOG_TAG, sessionId); + ReportOptFail(DSCREEN_OPT_FAIL, sessionId, "Open jpeg session failed"); + return ERR_DH_SCREEN_TRANS_ERROR; + } + jpegSessionId_ = sessionId; + } DHLOGI("%s: Open screen session success, sessionId %" PRId32, LOG_TAG, sessionId_); return DH_SUCCESS; } @@ -94,39 +134,107 @@ int32_t ScreenDataChannelImpl::CloseSession() DHLOGD("%s: Session is not opened.", LOG_TAG); return ERR_DH_SCREEN_TRANS_SESSION_NOT_OPEN; } - int32_t ret = SoftbusAdapter::GetInstance().CloseSoftbusSession(sessionId_); if (ret != DH_SUCCESS) { DHLOGE("%s: Close screen session failed ret: %" PRId32, LOG_TAG, ret); return ret; - } + } sessionId_ = 0; - - DHLOGI("%s: Close screen session success", LOG_TAG); + if (jpegSessionFlag == true && jpegSessionId_ != 0) { + int32_t ret = SoftbusAdapter::GetInstance().CloseSoftbusSession(sessionId_); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Close jpeg session failed ret: %" PRId32, LOG_TAG, ret); + return ret; + } + jpegSessionId_ = 0; + } + DHLOGI("%s: Close session success", LOG_TAG); return DH_SUCCESS; } int32_t ScreenDataChannelImpl::SendData(const std::shared_ptr &screenData) { - DHLOGD("%s: SendData, sessionId %" PRId32, LOG_TAG, sessionId_); - if (screenData == nullptr) { + DHLOGI("%s: SendData.", LOG_TAG); + if (screenData == nullptr || screenData->Data() == nullptr) { DHLOGE("%s: Screen data is null", LOG_TAG); return ERR_DH_SCREEN_TRANS_NULL_VALUE; } + uint8_t dataType = screenData->DataType(); + if (dataType == VIDEO_PART_SCREEN_DATA) { + int32_t ret = SendDirtyData(screenData); + if (ret != DH_SUCCESS) { + DHLOGE("%s: send dirty data failed, ret: %." PRId32, LOG_TAG, ret); + return ret; + } + } else if (dataType == VIDEO_FULL_SCREEN_DATA) { + int32_t ret = SendFullData(screenData); + if (ret != DH_SUCCESS) { + DHLOGE("%s: send full data failed, ret: %." PRId32, LOG_TAG, ret); + return ret; + } + } + return DH_SUCCESS; +} +int32_t ScreenDataChannelImpl::SendFullData(const std::shared_ptr &screenData) +{ + DHLOGI("%s: SendFullData sessionId: %." PRId32, LOG_TAG, sessionId_); + if (screenData == nullptr) { + DHLOGE("%s: Screen data is null", LOG_TAG); + return ERR_DH_SCREEN_TRANS_NULL_VALUE; + } StreamData data = {reinterpret_cast(screenData->Data()), screenData->Capacity()}; StreamData ext = {nullptr}; StreamFrameInfo frameInfo = {0}; - int32_t ret = SoftbusAdapter::GetInstance().SendSoftbusStream(sessionId_, &data, &ext, &frameInfo); if (ret != DH_SUCCESS) { - DHLOGE("%s: Send screen data failed ret: %" PRId32, LOG_TAG, ret); + DHLOGE("%s: Send full data failed ret: %" PRId32, LOG_TAG, ret); return ret; } + DHLOGI("%s: SendFullData success.", LOG_TAG); + return DH_SUCCESS; +} +int32_t ScreenDataChannelImpl::SendDirtyData(const std::shared_ptr &screenData) +{ + DHLOGI("%s: SendDirtyData sessionId: %." PRId32, LOG_TAG, jpegSessionId_); + if (screenData == nullptr) { + DHLOGE("%s: Screen data is null", LOG_TAG); + return ERR_DH_SCREEN_TRANS_NULL_VALUE; + } + nlohmann::json rectJson; + std::vector dirtyRectVec = screenData->GetDirtyRectVec(); + rectJson["dataType"] = screenData->DataType(); + rectJson["dirtySize"] = static_cast(dirtyRectVec.size()); + int32_t rectIndex = 0; + for (auto item : dirtyRectVec) { + std::string tempRectIndex = std::to_string(rectIndex); + rectJson[tempRectIndex] = {item.xPos, item.yPos, item.width, item.height, item.dirtySize}; + rectIndex++; + } + StreamData data = {reinterpret_cast(screenData->Data()), screenData->Capacity()}; + std::string rectInfo = rectJson.dump(); + char *dirtyInfo = new char[rectInfo.length() + 1] {0}; + int32_t ret = memcpy_s(dirtyInfo, rectInfo.length(), rectInfo.c_str(), rectInfo.length()); + if (ret != EOK) { + DHLOGE("SendDirtyData memcpy_s failed."); + delete [] dirtyInfo; + return ret; + } + StreamData ext = {dirtyInfo, rectInfo.length() + 1}; + StreamFrameInfo frameInfo = {0}; + ret = SoftbusAdapter::GetInstance().SendSoftbusStream(jpegSessionId_, &data, &ext, &frameInfo); + if (ret != DH_SUCCESS) { + DHLOGE("%s: Send dirty data failed ret: %" PRId32, LOG_TAG, ret); + delete [] dirtyInfo; + return ret; + } + delete [] dirtyInfo; + DHLOGI("%s: SendDirtyData success.", LOG_TAG); return DH_SUCCESS; } + void ScreenDataChannelImpl::OnSessionOpened(int32_t sessionId, int32_t result) { DHLOGI("%s: OnScreenSessionOpened, sessionId: %" PRId32", result: %" PRId32, LOG_TAG, sessionId, result); @@ -134,14 +242,27 @@ void ScreenDataChannelImpl::OnSessionOpened(int32_t sessionId, int32_t result) DHLOGE("Session open failed", LOG_TAG); return; } - + if (jpegSessionFlag == false) { + dataSessionOpened = true; + sessionId_ = sessionId; + } else { + if (sessionId == sessionId_) { + dataSessionOpened = true; + sessionId_ = sessionId; + } else if (sessionId == jpegSessionId_) { + jpegSessionOpened = true; + jpegSessionId_ = sessionId; + } + if (!dataSessionOpened || !jpegSessionOpened) { + return; + } + } std::shared_ptr listener = channelListener_.lock(); if (listener == nullptr) { DHLOGE("%s: Channel listener is null", LOG_TAG); return; } listener->OnSessionOpened(); - sessionId_ = sessionId; } void ScreenDataChannelImpl::OnSessionClosed(int32_t sessionId) @@ -164,32 +285,84 @@ void ScreenDataChannelImpl::OnBytesReceived(int32_t sessionId, const void *data, DHLOGD("%s: OnScreenBytesReceived data channel not support yet", LOG_TAG); } -void ScreenDataChannelImpl::OnStreamReceived(int32_t sessionId, const StreamData *data, const StreamData *ext, - const StreamFrameInfo *param) +void ScreenDataChannelImpl::OnStreamReceived(int32_t sessionId, const StreamData *data, + const StreamData *ext, const StreamFrameInfo *param) { - (void)ext; - (void)param; - + DHLOGI("%s: OnStreamReceived.", LOG_TAG); if (data == nullptr) { DHLOGE("%s: Stream data is null", LOG_TAG); return; } + auto dataBuffer = std::make_shared(data->bufLen); + if (ext == nullptr) { + DHLOGI("sink received full data."); + ProcessDullData(data, dataBuffer); + return; + } else { + DHLOGI("sink received dirty data."); + ProcessDirtyData(data, dataBuffer, ext); + } +} +void ScreenDataChannelImpl::ProcessDullData(const StreamData *data, std::shared_ptr dataBuffer) +{ + DHLOGI("%s: ProcessDullData.", LOG_TAG); std::shared_ptr listener = channelListener_.lock(); if (listener == nullptr) { - DHLOGE("%s: Channel listener is null", LOG_TAG); + DHLOGE("%s: Channel listener is null.", LOG_TAG); return; } + int32_t ret = memcpy_s(dataBuffer->Data(), dataBuffer->Capacity(), + reinterpret_cast(data->buf), data->bufLen); + if (ret != EOK) { + DHLOGE("%s: Full data memcpy failed.", LOG_TAG); + return; + } + dataBuffer->SetDataType(VIDEO_FULL_SCREEN_DATA); + listener->OnDataReceived(dataBuffer); +} - DHLOGI("%s: OnScreenStreamReceived, sessionId:%" PRId32", dataSize:%" PRIu32, LOG_TAG, sessionId, data->bufLen); - auto dataBuffer = std::make_shared(data->bufLen); - - int32_t ret = memcpy_s(dataBuffer->Data(), dataBuffer->Capacity(), reinterpret_cast(data->buf), - data->bufLen); +void ScreenDataChannelImpl::ProcessDirtyData(const StreamData *data, + std::shared_ptr dataBuffer, const StreamData *ext) +{ + DHLOGI("%s: ProcessDirtyData.", LOG_TAG); + std::shared_ptr listener = channelListener_.lock(); + if (listener == nullptr) { + DHLOGE("%s: Channel listener is null.", LOG_TAG); + return; + } + int32_t ret = memcpy_s(dataBuffer->Data(), dataBuffer->Capacity(), + reinterpret_cast(data->buf), data->bufLen); if (ret != EOK) { - DHLOGE("%s: Data memcpy_s failed", LOG_TAG); + DHLOGE("%s: Dirty data memcpy_s failed.", LOG_TAG); + return; + } + nlohmann::json rectJson = nlohmann::json::parse(ext->buf, nullptr, false); + if (rectJson.is_discarded()) { + DHLOGE("%s: OnStreamReceived rectJson invalid", LOG_TAG); + return; + } + if (!IsInt32(rectJson, "dirtySize") || !IsInt32(rectJson, "dataType")) { return; } + int32_t dirtySize = rectJson["dirtySize"].get(); + int32_t dataType = rectJson["dataType"].get(); + uint8_t num = 0; + while (num < dirtySize) { + auto item = std::to_string(num); + if (!rectJson.contains(item)) { + return; + } + int32_t X = rectJson[item][0].get(); + int32_t Y = rectJson[item][1].get(); + int32_t W = rectJson[item][2].get(); + int32_t H = rectJson[item][3].get(); + int32_t Size = rectJson[item][4].get(); + DirtyRect rect = {X, Y, W, H, Size}; + dataBuffer->AddDirtyRect(rect); + num++; + } + dataBuffer->SetDataType(dataType); listener->OnDataReceived(dataBuffer); } } // namespace DistributedHardware diff --git a/services/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp b/services/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp deleted file mode 100644 index ebd3c7df..00000000 --- a/services/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp +++ /dev/null @@ -1,389 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device 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. - */ - -#include "screen_refresh_channel_impl.h" - -#include - -#include "dscreen_constants.h" -#include "dscreen_errcode.h" -#include "dscreen_hisysevent.h" -#include "dscreen_log.h" -#include "dscreen_util.h" -#include "nlohmann/json.hpp" -#include "dscreen_json_util.h" - -namespace OHOS { -namespace DistributedHardware { -int32_t ScreenRefreshChannelImpl::CreateSession(const std::shared_ptr &listener) -{ - DHLOGI("%s: CreateSession, peerDevId(%s)", LOG_TAG, GetAnonyString(peerDevId_).c_str()); - if (listener == nullptr) { - DHLOGE("%s: Channel listener is null", LOG_TAG); - return ERR_DH_SCREEN_TRANS_NULL_VALUE; - } - - int32_t ret = - SoftbusAdapter::GetInstance().CreateSoftbusSessionServer(PKG_NAME, DATA_SESSION_NAME, peerDevId_); - if (ret != DH_SUCCESS) { - DHLOGE("%s: Create softbus session failed ret: %" PRId32, LOG_TAG, ret); - return ret; - } - - std::shared_ptr softbusListener = shared_from_this(); - ret = SoftbusAdapter::GetInstance().RegisterSoftbusListener(softbusListener, DATA_SESSION_NAME, peerDevId_); - if (ret != DH_SUCCESS) { - DHLOGE("%s: Register softbus adapter listener failed ret: %" PRId32, LOG_TAG, ret); - return ret; - } - - ret = SoftbusAdapter::GetInstance().CreateSoftbusSessionServer(PKG_NAME, JPEG_SESSION_NAME, peerDevId_); - if (ret != DH_SUCCESS) { - DHLOGE("%s: Create softbus session failed ret: %" PRId32, LOG_TAG, ret); - return ret; - } - - ret = SoftbusAdapter::GetInstance().RegisterSoftbusListener(softbusListener, JPEG_SESSION_NAME, peerDevId_); - if (ret != DH_SUCCESS) { - DHLOGE("%s: Register softbus adapter listener failed ret: %" PRId32, LOG_TAG, ret); - return ret; - } - - channelListener_ = listener; - DHLOGI("%s: Create softbus session success", LOG_TAG); - return DH_SUCCESS; -} - -int32_t ScreenRefreshChannelImpl::ReleaseSession() -{ - DHLOGI("%s: ReleaseSession, peerDevId(%s)", LOG_TAG, GetAnonyString(peerDevId_).c_str()); - int32_t ret = SoftbusAdapter::GetInstance().RemoveSoftbusSessionServer(PKG_NAME, DATA_SESSION_NAME, peerDevId_); - if (ret != DH_SUCCESS) { - DHLOGE("%s: Release softbus session failed ret: %" PRId32, LOG_TAG, ret); - return ret; - } - - ret = SoftbusAdapter::GetInstance().UnRegisterSoftbusListener(DATA_SESSION_NAME, peerDevId_); - if (ret != DH_SUCCESS) { - DHLOGE("%s: UnRegister softbus adapter listener failed ret: %" PRId32, LOG_TAG, ret); - return ret; - } - - ret = SoftbusAdapter::GetInstance().RemoveSoftbusSessionServer(PKG_NAME, JPEG_SESSION_NAME, peerDevId_); - if (ret != DH_SUCCESS) { - DHLOGE("%s: Release softbus session failed ret: %" PRId32, LOG_TAG, ret); - return ret; - } - - ret = SoftbusAdapter::GetInstance().UnRegisterSoftbusListener(JPEG_SESSION_NAME, peerDevId_); - if (ret != DH_SUCCESS) { - DHLOGE("%s: UnRegister softbus adapter listener failed ret: %" PRId32, LOG_TAG, ret); - return ret; - } - - DHLOGI("%s: Release softbus session success", LOG_TAG); - return DH_SUCCESS; -} - -int32_t ScreenRefreshChannelImpl::OpenSession() -{ - DHLOGI("%s: OpenSession, peerDevId(%s)", LOG_TAG, GetAnonyString(peerDevId_).c_str()); - int32_t ret = OpenDataSession(); - if (ret != DH_SUCCESS) { - DHLOGE("%s: Open screen session failed, ret: %" PRId32, LOG_TAG, sessionId_); - return ERR_DH_SCREEN_TRANS_ERROR; - } - ret = OpenJpegSession(); - if (ret != DH_SUCCESS) { - DHLOGE("%s: Open screen session failed, ret: %" PRId32, LOG_TAG, jpegSessionId_); - return ERR_DH_SCREEN_TRANS_ERROR; - } - return DH_SUCCESS; -} - -int32_t ScreenRefreshChannelImpl::OpenDataSession() -{ - DHLOGI("%s: OpenDataSession, peerDevId(%s)", LOG_TAG, GetAnonyString(peerDevId_).c_str()); - int32_t sessionId = - SoftbusAdapter::GetInstance().OpenSoftbusSession(DATA_SESSION_NAME, DATA_SESSION_NAME, peerDevId_); - if (sessionId < 0) { - DHLOGE("%s: Open screen session failed, ret: %" PRId32, LOG_TAG, sessionId); - ReportOptFail(DSCREEN_OPT_FAIL, sessionId, "Open screen session failed"); - return ERR_DH_SCREEN_TRANS_ERROR; - } - sessionId_ = sessionId; - - DHLOGI("%s: Open screen session success, sessionId %" PRId32, LOG_TAG, sessionId_); - return DH_SUCCESS; -} - -int32_t ScreenRefreshChannelImpl::OpenJpegSession() -{ - DHLOGI("%s: OpenJpegSession, peerDevId(%s)", LOG_TAG, GetAnonyString(peerDevId_).c_str()); - int32_t sessionId = - SoftbusAdapter::GetInstance().OpenSoftbusSession(JPEG_SESSION_NAME, JPEG_SESSION_NAME, peerDevId_); - if (sessionId < 0) { - DHLOGE("%s: Open screen session failed, ret: %" PRId32, LOG_TAG, sessionId); - ReportOptFail(DSCREEN_OPT_FAIL, sessionId, "Open screen session failed"); - return ERR_DH_SCREEN_TRANS_ERROR; - } - jpegSessionId_ = sessionId; - - DHLOGI("%s: Open screen session success, sessionId %" PRId32, LOG_TAG, sessionId_); - return DH_SUCCESS; - -} - -int32_t ScreenRefreshChannelImpl::CloseSession() -{ - DHLOGI("%s: CloseSession, sessionId %" PRId32, LOG_TAG, sessionId_); - if (sessionId_ == 0) { - DHLOGD("%s: Session is not opened.", LOG_TAG); - return ERR_DH_SCREEN_TRANS_SESSION_NOT_OPEN; - } - - int32_t ret = SoftbusAdapter::GetInstance().CloseSoftbusSession(sessionId_); - if (ret != DH_SUCCESS) { - DHLOGE("%s: Close screen session failed ret: %" PRId32, LOG_TAG, ret); - return ret; - } - sessionId_ = 0; - - if (jpegSessionId_ == 0) { - DHLOGD("%s: jpegSessionId is not opened.", LOG_TAG); - return ERR_DH_SCREEN_TRANS_SESSION_NOT_OPEN; - } - - ret = SoftbusAdapter::GetInstance().CloseSoftbusSession(jpegSessionId_); - if (ret != DH_SUCCESS) { - DHLOGE("%s: Close jpeg session failed ret: %" PRId32, LOG_TAG, ret); - return ret; - } - jpegSessionId_ = 0; - DHLOGI("%s: Close screen session success", LOG_TAG); - return DH_SUCCESS; -} - -int32_t ScreenRefreshChannelImpl::SendData(const std::shared_ptr &screenData) -{ - DHLOGI("%s: SendData.", LOG_TAG); - if (screenData == nullptr || screenData->Data() == nullptr) { - DHLOGE("%s: Screen data is null", LOG_TAG); - return ERR_DH_SCREEN_TRANS_NULL_VALUE; - } - uint8_t dataType = screenData->DataType(); - if (dataType == VIDEO_PART_SCREEN_DATA) { - int32_t ret = SendDirtyData(screenData); - if (ret != DH_SUCCESS) { - DHLOGE("%s: send dirty data failed, ret: %." PRId32, LOG_TAG, ret); - return ret; - } - } else if (dataType == VIDEO_FULL_SCREEN_DATA) { - int32_t ret = SendFullData(screenData); - if (ret != DH_SUCCESS) { - DHLOGE("%s: send full data failed, ret: %." PRId32, LOG_TAG, ret); - return ret; - } - } - return DH_SUCCESS; -} - -int32_t ScreenRefreshChannelImpl::SendFullData(const std::shared_ptr &screenData) -{ - DHLOGI("%s: SendFullData sessionId: %." PRId32, LOG_TAG, sessionId_); - if (screenData == nullptr) { - DHLOGE("%s: Screen data is null", LOG_TAG); - return ERR_DH_SCREEN_TRANS_NULL_VALUE; - } - StreamData data = {reinterpret_cast(screenData->Data()), screenData->Capacity()}; - StreamData ext = {0}; - StreamFrameInfo frameInfo = {0}; - int32_t ret = SoftbusAdapter::GetInstance().SendSoftbusStream(sessionId_, &data, &ext, &frameInfo); - if (ret != DH_SUCCESS) { - DHLOGE("%s: Send full data failed ret: %" PRId32, LOG_TAG, ret); - return ret; - } - DHLOGI("%s: SendFullData success.", LOG_TAG); - return DH_SUCCESS; -} -int32_t ScreenRefreshChannelImpl::SendDirtyData(const std::shared_ptr &screenData) -{ - DHLOGI("%s: SendDirtyData sessionId: %." PRId32, LOG_TAG, jpegSessionId_); - if (screenData == nullptr) { - DHLOGE("%s: Screen data is null", LOG_TAG); - return ERR_DH_SCREEN_TRANS_NULL_VALUE; - } - nlohmann::json rectJson; - std::vector dirtyRectVec = screenData->GetDirtyRectVec(); - rectJson["dataType"] = screenData->DataType(); - rectJson["dirtySize"] = static_cast(dirtyRectVec.size()); - int32_t rectIndex = 0; - for (auto item : dirtyRectVec) { - std::string tempRectIndex = std::to_string(rectIndex); - rectJson[tempRectIndex] = {item.xPos, item.yPos, item.width, item.height, item.dirtySize}; - rectIndex++; - } - StreamData data = {reinterpret_cast(screenData->Data()), screenData->Capacity()}; - std::string rectInfo = rectJson.dump(); - char *dirtyInfo = new char[rectInfo.length() + 1] {0}; - int32_t ret = memcpy_s(dirtyInfo, rectInfo.length(), rectInfo.c_str(), rectInfo.length()); - if (ret != EOK) { - DHLOGE("SendDirtyData memcpy_s failed."); - delete [] dirtyInfo; - return ret; - } - StreamData ext = {dirtyInfo, rectInfo.length() + 1}; - StreamFrameInfo frameInfo = {0}; - ret = SoftbusAdapter::GetInstance().SendSoftbusStream(jpegSessionId_, &data, &ext, &frameInfo); - if (ret != DH_SUCCESS) { - DHLOGE("%s: Send dirty data failed ret: %" PRId32, LOG_TAG, ret); - delete [] dirtyInfo; - return ret; - } - delete [] dirtyInfo; - DHLOGI("%s: SendDirtyData success.", LOG_TAG); - return DH_SUCCESS; -} - -void ScreenRefreshChannelImpl::OnSessionOpened(int32_t sessionId, int32_t result) -{ - DHLOGI("%s: OnScreenSessionOpened, sessionId: %" PRId32", result: %" PRId32, LOG_TAG, sessionId, result); - if (result != 0) { - DHLOGE("Session open failed", LOG_TAG); - return; - } - - if (sessionId == sessionId_) { - dataSessionOpened = true; - sessionId_ = sessionId; - } else if (sessionId == jpegSessionId_) { - jpegSessionOpened = true; - jpegSessionId_ = sessionId; - } - if (!dataSessionOpened || !jpegSessionOpened) { - return; - } - - std::shared_ptr listener = channelListener_.lock(); - if (listener == nullptr) { - DHLOGE("%s: Channel listener is null", LOG_TAG); - return; - } - listener->OnSessionOpened(); -} - -void ScreenRefreshChannelImpl::OnSessionClosed(int32_t sessionId) -{ - DHLOGI("%s: OnScreenSessionClosed, sessionId %" PRId32, LOG_TAG, sessionId); - std::shared_ptr listener = channelListener_.lock(); - if (listener == nullptr) { - DHLOGE("%s: Channel listener is null", LOG_TAG); - return; - } - listener->OnSessionClosed(); -} - -void ScreenRefreshChannelImpl::OnBytesReceived(int32_t sessionId, const void *data, uint32_t dataLen) -{ - (void) sessionId; - (void) data; - (void) dataLen; - - DHLOGD("%s: OnScreenBytesReceived data channel not support yet", LOG_TAG); -} - -void ScreenRefreshChannelImpl::ProcessDullData(const StreamData *data, std::shared_ptr dataBuffer) -{ - DHLOGI("%s: ProcessDullData.", LOG_TAG); - std::shared_ptr listener = channelListener_.lock(); - if (listener == nullptr) { - DHLOGE("%s: Channel listener is null.", LOG_TAG); - return; - } - int32_t ret = memcpy_s(dataBuffer->Data(), dataBuffer->Capacity(), - reinterpret_cast(data->buf), data->bufLen); - if (ret != EOK) { - DHLOGE("%s: Full data memcpy failed.", LOG_TAG); - return; - } - dataBuffer->SetDataType(VIDEO_FULL_SCREEN_DATA); - listener->OnDataReceived(dataBuffer); -} - -void ScreenRefreshChannelImpl::ProcessDirtyData(const StreamData *data, - std::shared_ptr dataBuffer, const StreamData *ext) -{ - DHLOGI("%s: ProcessDirtyData.", LOG_TAG); - std::shared_ptr listener = channelListener_.lock(); - if (listener == nullptr) { - DHLOGE("%s: Channel listener is null.", LOG_TAG); - return; - } - int32_t ret = memcpy_s(dataBuffer->Data(), dataBuffer->Capacity(), - reinterpret_cast(data->buf), data->bufLen); - if (ret != EOK) { - DHLOGE("%s: Dirty data memcpy_s failed.", LOG_TAG); - return; - } - nlohmann::json rectJson = nlohmann::json::parse(ext->buf, nullptr, false); - if (rectJson.is_discarded()) { - DHLOGE("%s: OnStreamReceived rectJson invalid", LOG_TAG); - return; - } - if (!IsInt32(rectJson, "dirtySize") || !IsInt32(rectJson, "dataType")) { - return; - } - int32_t dirtySize = rectJson["dirtySize"].get(); - int32_t dataType = rectJson["dataType"].get(); - uint8_t num = 0; - while (num < dirtySize) { - auto item = std::to_string(num); - if (!rectJson.contains(item)) { - return; - } - int32_t X = rectJson[item][0].get(); - int32_t Y = rectJson[item][1].get(); - int32_t W = rectJson[item][2].get(); - int32_t H = rectJson[item][3].get(); - int32_t Size = rectJson[item][4].get(); - DirtyRect rect = {X, Y, W, H, Size}; - dataBuffer->AddDirtyRect(rect); - num++; - } - dataBuffer->SetDataType(dataType); - listener->OnDataReceived(dataBuffer); -} - - -void ScreenRefreshChannelImpl::OnStreamReceived(int32_t sessionId, const StreamData *data, - const StreamData *ext, const StreamFrameInfo *param) -{ - DHLOGI("%s: OnStreamReceived.", LOG_TAG); - if (data == nullptr) { - DHLOGE("%s: Stream data is null", LOG_TAG); - return; - } - auto dataBuffer = std::make_shared(data->bufLen); - if (ext->bufLen == 0) { - DHLOGI("sink received full data."); - ProcessDullData(data, dataBuffer); - return; - } else { - DHLOGI("sink received dirty data."); - ProcessDirtyData(data, dataBuffer, ext); - } -} -} // namespace DistributedHardware -} // namespace OHOS \ No newline at end of file diff --git a/services/screentransport/screensinkprocessor/include/image_sink_processor.h b/services/screentransport/screensinkprocessor/include/image_sink_processor.h index a1a103bc..0ac28e00 100644 --- a/services/screentransport/screensinkprocessor/include/image_sink_processor.h +++ b/services/screentransport/screensinkprocessor/include/image_sink_processor.h @@ -42,7 +42,7 @@ private: VideoParam localParam_; VideoParam remoteParam_; std::shared_ptr imageDecoder_ = nullptr; - std::shared_ptr imageJpeg_ = nullptr; + std::shared_ptr imageJpeg_ = nullptr; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screentransport/screensinkprocessor/src/image_sink_processor.cpp b/services/screentransport/screensinkprocessor/src/image_sink_processor.cpp index 796ed0c8..f17ccbd1 100644 --- a/services/screentransport/screensinkprocessor/src/image_sink_processor.cpp +++ b/services/screentransport/screensinkprocessor/src/image_sink_processor.cpp @@ -31,7 +31,7 @@ int32_t ImageSinkProcessor::ConfigureImageProcessor( remoteParam_ = remoteParam; imageDecoder_ = std::make_shared(imageListener); - imageJpeg_ = std::make_shared(remoteParam); + imageJpeg_ = std::make_shared(remoteParam); int32_t ret = imageDecoder_->ConfigureDecoder(localParam); if (ret != DH_SUCCESS) { DHLOGE("%s: ConfigureDecoder failed ret:%" PRId32, LOG_TAG, ret); @@ -146,10 +146,10 @@ int32_t ImageSinkProcessor::ProcessImage(const std::shared_ptr &data return ret; } } else if (data->DataType() == VIDEO_PART_SCREEN_DATA) { - int32_t ret = imageJpeg_->MergeDirtyImagetoSurface(data, imageDecoder_->GetLastFrame()); + int32_t ret = imageJpeg_->FillDirtyImages2Surface(data, imageDecoder_->GetLastFrame()); if (ret != DH_SUCCESS) { - DHLOGE("%s: MergeDirtyImagetoSurface failed ret:%" PRId32, LOG_TAG, ret); - ReportOptFail(DSCREEN_OPT_FAIL, ret, "MergeDirtyImagetoSurface failed."); + DHLOGE("%s: FillDirtyImages2Surface failed ret:%" PRId32, LOG_TAG, ret); + ReportOptFail(DSCREEN_OPT_FAIL, ret, "FillDirtyImages2Surface failed."); return ret; } } else { diff --git a/services/screentransport/screensinktrans/BUILD.gn b/services/screentransport/screensinktrans/BUILD.gn index 9de8c2f1..a18f3f31 100644 --- a/services/screentransport/screensinktrans/BUILD.gn +++ b/services/screentransport/screensinktrans/BUILD.gn @@ -53,7 +53,6 @@ ohos_shared_library("distributed_screen_sinktrans") { "${services_path}/common/utils/src/dscreen_fwkkit.cpp", "${services_path}/common/utils/src/video_param.cpp", "${services_path}/screentransport/screendatachannel/src/screen_data_channel_impl.cpp", - "${services_path}/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp", "${services_path}/screentransport/screensinkprocessor/decoder/src/image_decoder_callback.cpp", "${services_path}/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp", "${services_path}/screentransport/screensinkprocessor/src/image_sink_processor.cpp", @@ -69,9 +68,9 @@ ohos_shared_library("distributed_screen_sinktrans") { ] if (!distributed_screen_common) { - cflags += [ "-DLIBYUV" ] - include_dirs += [ "//third_party/libyuv/files/include", ] - deps += [ ""//third_party/libyuv:yuv"," ] + cflags = [ "-DLIBYUV" ] + include_dirs += [ "//third_party/libyuv/files/include" ] + deps += [ "//third_party/libyuv:yuv" ] } defines = [ diff --git a/services/screentransport/screensinktrans/src/screen_sink_trans.cpp b/services/screentransport/screensinktrans/src/screen_sink_trans.cpp index abb5599c..03d88dbb 100644 --- a/services/screentransport/screensinktrans/src/screen_sink_trans.cpp +++ b/services/screentransport/screensinktrans/src/screen_sink_trans.cpp @@ -23,7 +23,6 @@ #include "dscreen_log.h" #include "image_sink_processor.h" #include "screen_data_channel_impl.h" -#include "screen_refresh_channel_impl.h" namespace OHOS { namespace DistributedHardware { int32_t ScreenSinkTrans::SetUp(const VideoParam &localParam, const VideoParam &remoteParam, @@ -209,15 +208,9 @@ int32_t ScreenSinkTrans::CheckTransParam(const VideoParam &localParam, const Vid int32_t ScreenSinkTrans::InitScreenTrans(const VideoParam &localParam, const VideoParam &remoteParam, const std::string &peerDevId) { - switch (atoi(version_.c_str())) { - case ONE: - screenChannel_ = std::make_shared(peerDevId); - break; - case TWO: - screenChannel_ = std::make_shared(peerDevId); - break; - default: - break; + screenChannel_ = std::make_shared(peerDevId); + if (atoi(version_.c_str()) == TWO) { + screenChannel_->SetJpegSessionFlag(true); } int32_t ret = RegisterChannelListener(); if (ret != DH_SUCCESS) { diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index 0ccfe3d4..28c835cc 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -180,7 +180,7 @@ std::vector ImageSourceEncoder::VecToDamage(std::vector damages; for (auto item : eventContent) { - OHOS::damage = {0, 0, 0, 0}; + OHOS::Rect damage = {0, 0, 0, 0}; damage.x = item.at(ZERO); damage.y = item.at(ONE); damage.w = item.at(TWO); diff --git a/services/screentransport/screensourcetrans/BUILD.gn b/services/screentransport/screensourcetrans/BUILD.gn index 7c841d9d..64b3edec 100644 --- a/services/screentransport/screensourcetrans/BUILD.gn +++ b/services/screentransport/screensourcetrans/BUILD.gn @@ -49,7 +49,6 @@ ohos_shared_library("distributed_screen_sourcetrans") { "${services_path}/common/utils/src/dscreen_fwkkit.cpp", "${services_path}/common/utils/src/video_param.cpp", "${services_path}/screentransport/screendatachannel/src/screen_data_channel_impl.cpp", - "${services_path}/screentransport/screendatachannel/src/screen_refresh_channel_impl.cpp", "${services_path}/screentransport/screensourceprocessor/encoder/src/image_encoder_callback.cpp", "${services_path}/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp", "${services_path}/screentransport/screensourceprocessor/src/image_source_processor.cpp", @@ -67,9 +66,9 @@ ohos_shared_library("distributed_screen_sourcetrans") { ] if (!distributed_screen_common) { - cflags += [ "-DLIBYUV" ] - include_dirs += [ "//third_party/libyuv/files/include", ] - deps += [ ""//third_party/libyuv:yuv"," ] + cflags = [ "-DLIBYUV" ] + include_dirs += [ "//third_party/libyuv/files/include" ] + deps += [ "//third_party/libyuv:yuv" ] } defines = [ diff --git a/services/screentransport/screensourcetrans/src/screen_source_trans.cpp b/services/screentransport/screensourcetrans/src/screen_source_trans.cpp index 8d38ac20..5f8a7465 100644 --- a/services/screentransport/screensourcetrans/src/screen_source_trans.cpp +++ b/services/screentransport/screensourcetrans/src/screen_source_trans.cpp @@ -27,7 +27,6 @@ #include "dscreen_log.h" #include "image_source_processor.h" #include "screen_data_channel_impl.h" -#include "screen_refresh_channel_impl.h" namespace OHOS { namespace DistributedHardware { constexpr const char* FDATA_THREAD = "FeedDataThread"; @@ -262,9 +261,8 @@ int32_t ScreenSourceTrans::CheckTransParam(const VideoParam &localParam, const V DHLOGE("%s: check remoteParam param failed.", LOG_TAG); return ret; } - + DHLOGI("%s: Local: codecType(%u), videoFormat(%u), videoSize(%ux%u), screenSize(%ux%u).", LOG_TAG, - localParam.GetCodecType(), localParam.GetVideoFormat(), localParam.GetVideoWidth(), localParam.GetVideoHeight(), localParam.GetScreenWidth(), localParam.GetScreenHeight()); DHLOGI("%s: Remote: codecType(%u), videoFormat(%u), videoSize(%ux%u), screenSize(%ux%u).", LOG_TAG, remoteParam.GetCodecType(), remoteParam.GetVideoFormat(), remoteParam.GetVideoWidth(), @@ -276,15 +274,9 @@ int32_t ScreenSourceTrans::InitScreenTrans(const VideoParam &localParam, const V const std::string &peerDevId) { DHLOGI("%s:InitScreenTrans.", LOG_TAG); - switch (atoi(version_.c_str())) { - case 1: - screenChannel_ = std::make_shared(peerDevId); - break; - case 2: - screenChannel_ = std::make_shared(peerDevId); - break; - default: - break; + screenChannel_ = std::make_shared(peerDevId); + if (atoi(version_.c_str()) == TWO) { + screenChannel_->SetJpegSessionFlag(true); } int32_t ret = RegisterChannelListener(); if (ret != DH_SUCCESS) { diff --git a/services/screentransport/test/unittest/screentranstestutils/include/screentrans_test_utils.h b/services/screentransport/test/unittest/screentranstestutils/include/screentrans_test_utils.h index 1bdee5eb..09cd1ce1 100644 --- a/services/screentransport/test/unittest/screentranstestutils/include/screentrans_test_utils.h +++ b/services/screentransport/test/unittest/screentranstestutils/include/screentrans_test_utils.h @@ -103,6 +103,10 @@ public: (void) data; return DH_SUCCESS; } + void SetJpegSessionFlag(bool flag) override + { + return; + } }; } // namespace DistributedHardware -- Gitee From a50a122e2f1d6a8a8ae533539a759f4b60d90b34 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 14:36:00 +0800 Subject: [PATCH 04/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- common/BUILD.gn | 2 +- common/include/dscreen_constants.h | 3 +++ .../src/dscreen_source_handler_test.cpp | 2 +- screenhandler/BUILD.gn | 1 - .../decision_center/include/screen_decision_center.h | 2 +- .../decision_center/src/screen_decision_center.cpp | 2 +- .../{screen_image_jpeg.h => jpeg_image_processor.h} | 4 ++-- ...creen_image_jpeg.cpp => jpeg_image_processor.cpp} | 7 ++++--- .../src/screen_data_channel_impl.cpp | 12 ++++++------ .../decoder/src/image_sink_decoder.cpp | 6 +++++- .../include/image_sink_processor.h | 2 +- services/screentransport/screensinktrans/BUILD.gn | 2 +- .../encoder/src/image_source_encoder.cpp | 10 +++++----- services/screentransport/screensourcetrans/BUILD.gn | 2 +- .../screensourcetrans/src/screen_source_trans.cpp | 5 +++-- .../src/screen_data_channel_impl_test.cpp | 4 ++-- 16 files changed, 37 insertions(+), 29 deletions(-) rename services/common/imageJpeg/include/{screen_image_jpeg.h => jpeg_image_processor.h} (97%) rename services/common/imageJpeg/src/{screen_image_jpeg.cpp => jpeg_image_processor.cpp} (98%) diff --git a/common/BUILD.gn b/common/BUILD.gn index c5362dd3..dec824b7 100644 --- a/common/BUILD.gn +++ b/common/BUILD.gn @@ -26,7 +26,6 @@ ohos_shared_library("distributed_screen_utils") { "//third_party/json/include", "${fwk_common_path}/utils/include", "//foundation/distributedhardware/distributed_hardware_fwk/interfaces/inner_kits/include", - "//foundation/communication/ipc/interfaces/innerkits/ipc_core/include", "//foundation/multimedia/image_framework/mock/native/include", ] @@ -46,6 +45,7 @@ ohos_shared_library("distributed_screen_utils") { "dsoftbus:softbus_client", "hisysevent_native:libhisysevent", "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", ] defines = [ diff --git a/common/include/dscreen_constants.h b/common/include/dscreen_constants.h index 00dfa034..e134c20f 100644 --- a/common/include/dscreen_constants.h +++ b/common/include/dscreen_constants.h @@ -81,6 +81,7 @@ constexpr int32_t YA_PARAM = 16; constexpr int32_t UA_PARAM = 128; constexpr int32_t YUV_PARAM = 255; constexpr int32_t MOVEBITS = 8; + /* RGBA */ constexpr uint32_t RGBA_CHROMA = 4; constexpr uint32_t RGB_CHROMA = 3; @@ -89,6 +90,8 @@ constexpr uint32_t TWO = 2; constexpr uint32_t THREE = 3; constexpr uint32_t ZERO = 0; constexpr uint32_t ALIGNEDBITS = 32; + + /* Screen session name max len */ constexpr uint32_t DSCREEN_MAX_SESSION_NAME_LEN = 50; diff --git a/interfaces/innerkits/native_cpp/test/unittest/screensourcetest/src/dscreen_source_handler_test.cpp b/interfaces/innerkits/native_cpp/test/unittest/screensourcetest/src/dscreen_source_handler_test.cpp index bc7608e8..47c33890 100644 --- a/interfaces/innerkits/native_cpp/test/unittest/screensourcetest/src/dscreen_source_handler_test.cpp +++ b/interfaces/innerkits/native_cpp/test/unittest/screensourcetest/src/dscreen_source_handler_test.cpp @@ -81,7 +81,7 @@ HWTEST_F(DScreenSourceHandlerTest, RegisterDistributedHardware_001, TestSize.Lev const std::string devId = "devId"; const std::string dhId = "dhId"; EnableParam param; - param.version = "1"; + param.version = "1.0"; param.attrs = "attrs"; std::string callbackParam = "callbackParam"; sptr loadCallback = new DScreenSourceLoadCallback(callbackParam); diff --git a/screenhandler/BUILD.gn b/screenhandler/BUILD.gn index 7a675985..ad0841d2 100644 --- a/screenhandler/BUILD.gn +++ b/screenhandler/BUILD.gn @@ -39,7 +39,6 @@ ohos_shared_library("distributed_screen_handler") { deps = [ "${common_path}:distributed_screen_utils", "${windowmanager_path}/dm:libdm", - "${mediastandard_path}/interfaces/inner_api/native:media_client", ] defines = [ diff --git a/services/common/decision_center/include/screen_decision_center.h b/services/common/decision_center/include/screen_decision_center.h index 669179d2..9fa2691e 100644 --- a/services/common/decision_center/include/screen_decision_center.h +++ b/services/common/decision_center/include/screen_decision_center.h @@ -19,7 +19,7 @@ #include #include "image_source_processor.h" -#include "screen_image_jpeg.h" +#include "jpeg_image_processor.h" #include "surface_type.h" #include "video_param.h" diff --git a/services/common/decision_center/src/screen_decision_center.cpp b/services/common/decision_center/src/screen_decision_center.cpp index cc1d41e0..fb9de491 100644 --- a/services/common/decision_center/src/screen_decision_center.cpp +++ b/services/common/decision_center/src/screen_decision_center.cpp @@ -98,7 +98,7 @@ int32_t ScreenDecisionCenter::InputBufferImage(sptr &surfaceBuffe } int32_t ScreenDecisionCenter::ConfigureDecisionCenter(std::shared_ptr &listener, - std::shared_ptr &imageProcessor) + std::shared_ptr &imageProcessor) { DHLOGI("%s: ConfigureDecisionCenter.", LOG_TAG); if (listener == nullptr || imageProcessor == nullptr) { diff --git a/services/common/imageJpeg/include/screen_image_jpeg.h b/services/common/imageJpeg/include/jpeg_image_processor.h similarity index 97% rename from services/common/imageJpeg/include/screen_image_jpeg.h rename to services/common/imageJpeg/include/jpeg_image_processor.h index 42529e4c..4a68a831 100644 --- a/services/common/imageJpeg/include/screen_image_jpeg.h +++ b/services/common/imageJpeg/include/jpeg_image_processor.h @@ -13,8 +13,8 @@ * limitations under the License. */ -#ifndef OHOS_SCREEN_IMAGE_JPEG_H -#define OHOS_SCREEN_IMAGE_JPEG_H +#ifndef OHOS_JPEG_IMAGE_PROCESS_H +#define OHOS_JPEG_IMAGE_PROCESS_H #include #include diff --git a/services/common/imageJpeg/src/screen_image_jpeg.cpp b/services/common/imageJpeg/src/jpeg_image_processor.cpp similarity index 98% rename from services/common/imageJpeg/src/screen_image_jpeg.cpp rename to services/common/imageJpeg/src/jpeg_image_processor.cpp index e8664c1a..254c0e84 100644 --- a/services/common/imageJpeg/src/screen_image_jpeg.cpp +++ b/services/common/imageJpeg/src/jpeg_image_processor.cpp @@ -13,7 +13,7 @@ * limitations under the License. */ -#include "screen_image_jpeg.h" +#include "jpeg_image_processor.h" #include #include @@ -154,7 +154,7 @@ int32_t JpegImageProcessor::DecodeDamageData(const std::shared_ptr & DHLOGE("%s: Dirty rect invalid.", LOG_TAG); return ERR_DH_SCREEN_INPUT_PARAM_INVALID; } - uint8_t *jpegData = new uint8_t [item.dirtySize] {0}; + uint8_t *jpegData = new uint8_t[item.dirtySize] {0}; int32_t ret = data->GetData(offset, item.dirtySize, jpegData); if (ret != DH_SUCCESS) { delete [] jpegData; @@ -212,7 +212,8 @@ int32_t JpegImageProcessor::ReplaceDamage2LastFrame(uint8_t *lastFrame, uint8_t return DH_SUCCESS; } -uint32_t JpegImageProcessor::CompressRgbaToJpeg(const OHOS::Rect &damage, uint8_t *inputData, std::shared_ptr &data) +uint32_t JpegImageProcessor::CompressRgbaToJpeg(const OHOS::Rect &damage, + uint8_t *inputData, std::shared_ptr &data) { jpeg_compress_struct cinfo; jpeg_error_mgr jerr; diff --git a/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp b/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp index 6e427ce0..214581b2 100644 --- a/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp +++ b/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp @@ -21,7 +21,7 @@ #include "dscreen_errcode.h" #include "dscreen_hisysevent.h" #include "dscreen_log.h" -#include "dscreen_util.h" +#include "dscreen_util.h" #include "nlohmann/json.hpp" #include "dscreen_json_util.h" @@ -96,7 +96,7 @@ int32_t ScreenDataChannelImpl::ReleaseSession() DHLOGE("%s: UnRegister jpeg adapter listener failed ret: %" PRId32, LOG_TAG, ret); return ret; } - jpegSessionFlag = false; + jpegSessionFlag = false; } DHLOGI("%s: Release session success", LOG_TAG); return DH_SUCCESS; @@ -138,7 +138,7 @@ int32_t ScreenDataChannelImpl::CloseSession() if (ret != DH_SUCCESS) { DHLOGE("%s: Close screen session failed ret: %" PRId32, LOG_TAG, ret); return ret; - } + } sessionId_ = 0; if (jpegSessionFlag == true && jpegSessionId_ != 0) { int32_t ret = SoftbusAdapter::GetInstance().CloseSoftbusSession(sessionId_); @@ -184,7 +184,7 @@ int32_t ScreenDataChannelImpl::SendFullData(const std::shared_ptr &s return ERR_DH_SCREEN_TRANS_NULL_VALUE; } StreamData data = {reinterpret_cast(screenData->Data()), screenData->Capacity()}; - StreamData ext = {nullptr}; + StreamData ext = {0}; StreamFrameInfo frameInfo = {0}; int32_t ret = SoftbusAdapter::GetInstance().SendSoftbusStream(sessionId_, &data, &ext, &frameInfo); if (ret != DH_SUCCESS) { @@ -294,7 +294,7 @@ void ScreenDataChannelImpl::OnStreamReceived(int32_t sessionId, const StreamData return; } auto dataBuffer = std::make_shared(data->bufLen); - if (ext == nullptr) { + if (ext->bufLen == 0) { DHLOGI("sink received full data."); ProcessDullData(data, dataBuffer); return; @@ -319,7 +319,7 @@ void ScreenDataChannelImpl::ProcessDullData(const StreamData *data, std::shared_ return; } dataBuffer->SetDataType(VIDEO_FULL_SCREEN_DATA); - listener->OnDataReceived(dataBuffer); + listener->OnDataReceived(dataBuffer); } void ScreenDataChannelImpl::ProcessDirtyData(const StreamData *data, diff --git a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp index 90a675a0..f23a1d3d 100644 --- a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp +++ b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp @@ -110,6 +110,7 @@ sptr ImageSinkDecoder::GetWinSurfaceBuffer() } return windowSurfaceBuffer; } + void ImageSinkDecoder::NormalProcess(sptr surfaceBuffer, sptr windowSurfaceBuffer) { DHLOGI("%s: NormalProcess.", LOG_TAG); @@ -124,6 +125,7 @@ void ImageSinkDecoder::NormalProcess(sptr surfaceBuffer, sptr surfaceBuffer, sptr windowSurfaceBuffer) { DHLOGI("%s: OffsetProcess.", LOG_TAG); @@ -219,7 +221,9 @@ int32_t ImageSinkDecoder::ReleaseDecoder() DHLOGE("%s: Decoder is null.", LOG_TAG); return ERR_DH_SCREEN_TRANS_NULL_VALUE; } - + if (lastFrame_ != nullptr) { + delete [] lastFrame_; + } int32_t ret = videoDecoder_->Release(); if (ret != Media::MSERR_OK) { DHLOGE("%s: ReleaseDecoder failed.", LOG_TAG); diff --git a/services/screentransport/screensinkprocessor/include/image_sink_processor.h b/services/screentransport/screensinkprocessor/include/image_sink_processor.h index 0ac28e00..b73e5694 100644 --- a/services/screentransport/screensinkprocessor/include/image_sink_processor.h +++ b/services/screentransport/screensinkprocessor/include/image_sink_processor.h @@ -20,7 +20,7 @@ #include "image_sink_decoder.h" #include "video_param.h" #include "data_buffer.h" -#include "screen_image_jpeg.h" +#include "jpeg_image_processor.h" namespace OHOS { namespace DistributedHardware { diff --git a/services/screentransport/screensinktrans/BUILD.gn b/services/screentransport/screensinktrans/BUILD.gn index a18f3f31..afb395be 100644 --- a/services/screentransport/screensinktrans/BUILD.gn +++ b/services/screentransport/screensinktrans/BUILD.gn @@ -48,7 +48,7 @@ ohos_shared_library("distributed_screen_sinktrans") { sources = [ "${common_path}/src/dscreen_json_util.cpp", - "${services_path}/common/imageJpeg/src/screen_image_jpeg.cpp", + "${services_path}/common/imageJpeg/src/jpeg_image_processor.cpp", "${services_path}/common/databuffer/src/data_buffer.cpp", "${services_path}/common/utils/src/dscreen_fwkkit.cpp", "${services_path}/common/utils/src/video_param.cpp", diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index 28c835cc..86bdfffd 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -84,7 +84,7 @@ void ImageSourceEncoder::ConsumeSurface() sptr surfaceBuffer = nullptr; int32_t fence = -1; int64_t timestamp = 0; - OHOS::Rect damage = {0, 0, 0, 0}; + OHOS::Rect damage = {0, 0, 0, 0}; SurfaceError surfaceErr = consumerSurface_->AcquireBuffer(surfaceBuffer, fence, timestamp, damage); if (surfaceErr != SURFACE_ERROR_OK) { DHLOGE("%s: consumerSurface_ acquire buffer failed, errcode: %" PRId32, LOG_TAG, surfaceErr); @@ -181,10 +181,10 @@ std::vector ImageSourceEncoder::VecToDamage(std::vector damages; for (auto item : eventContent) { OHOS::Rect damage = {0, 0, 0, 0}; - damage.x = item.at(ZERO); - damage.y = item.at(ONE); - damage.w = item.at(TWO); - damage.h = item.at(THREE); + damage.x = item[0]; + damage.y = item[1]; + damage.w = item[2]; + damage.h = item[3]; damages.push_back(damage); } return damages; diff --git a/services/screentransport/screensourcetrans/BUILD.gn b/services/screentransport/screensourcetrans/BUILD.gn index 64b3edec..3f5ebb15 100644 --- a/services/screentransport/screensourcetrans/BUILD.gn +++ b/services/screentransport/screensourcetrans/BUILD.gn @@ -53,7 +53,7 @@ ohos_shared_library("distributed_screen_sourcetrans") { "${services_path}/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp", "${services_path}/screentransport/screensourceprocessor/src/image_source_processor.cpp", "${services_path}/softbusadapter/src/softbus_adapter.cpp", - "${services_path}/common/imageJpeg/src/screen_image_jpeg.cpp", + "${services_path}/common/imageJpeg/src/jpeg_image_processor.cpp", "${services_path}/common/decision_center/src/screen_decision_center.cpp", "./src/screen_source_trans.cpp", ] diff --git a/services/screentransport/screensourcetrans/src/screen_source_trans.cpp b/services/screentransport/screensourcetrans/src/screen_source_trans.cpp index 5f8a7465..cfb8f623 100644 --- a/services/screentransport/screensourcetrans/src/screen_source_trans.cpp +++ b/services/screentransport/screensourcetrans/src/screen_source_trans.cpp @@ -204,6 +204,7 @@ void ScreenSourceTrans::SetScreenVersion(std::string &version) { version_ = version; } + std::string ScreenSourceTrans::GetScreenVersion() { return version_; @@ -398,11 +399,11 @@ void ScreenSourceTrans::OnDamageProcessDone(sptr &surfaceBuffer, } int32_t ret = DH_SUCCESS; switch (atoi(version_.c_str())) { - case ONE: + case OLD: DHLOGI("%s: ProcessFullImage.", LOG_TAG); ret = imageProcessor_->ProcessFullImage(surfaceBuffer); break; - case TWO: + case NEW: DHLOGI("%s: InputBufferImage.", LOG_TAG); ret = screenDecisionCenter_->InputBufferImage(surfaceBuffer, damages); break; diff --git a/services/screentransport/test/unittest/screendatachannel/src/screen_data_channel_impl_test.cpp b/services/screentransport/test/unittest/screendatachannel/src/screen_data_channel_impl_test.cpp index a731ca5e..e2e0cd01 100644 --- a/services/screentransport/test/unittest/screendatachannel/src/screen_data_channel_impl_test.cpp +++ b/services/screentransport/test/unittest/screendatachannel/src/screen_data_channel_impl_test.cpp @@ -81,7 +81,7 @@ HWTEST_F(ScreenDataChannelImplTest, close_session_test_002, TestSize.Level1) { dataChannelImpl_->channelListener_ = std::make_shared(); - StreamData *ext = nullptr; + StreamData ext = {0}; StreamFrameInfo *param = nullptr; int32_t sessionId = 0; @@ -89,7 +89,7 @@ HWTEST_F(ScreenDataChannelImplTest, close_session_test_002, TestSize.Level1) data.buf = new char[DATA_LEN]; data.bufLen = DATA_LEN; - dataChannelImpl_->OnStreamReceived(sessionId, &data, ext, param); + dataChannelImpl_->OnStreamReceived(sessionId, &data, &ext, param); delete[] data.buf; dataChannelImpl_->sessionId_ = 0; EXPECT_EQ(ERR_DH_SCREEN_TRANS_SESSION_NOT_OPEN, dataChannelImpl_->CloseSession()); -- Gitee From 32f6eadaa1c202adcde44487c96b0b096bc408be Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 14:50:19 +0800 Subject: [PATCH 05/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- .../imageJpeg/include/jpeg_image_processor.h | 5 +++-- .../common/imageJpeg/src/jpeg_image_processor.cpp | 10 +++++----- .../screen_channel/include/iscreen_channel.h | 2 -- .../include/screen_data_channel_impl.h | 5 +---- .../src/screen_data_channel_impl.cpp | 14 +++++++------- .../decoder/src/image_sink_decoder.cpp | 1 - 6 files changed, 16 insertions(+), 21 deletions(-) diff --git a/services/common/imageJpeg/include/jpeg_image_processor.h b/services/common/imageJpeg/include/jpeg_image_processor.h index 4a68a831..f814fd8d 100644 --- a/services/common/imageJpeg/include/jpeg_image_processor.h +++ b/services/common/imageJpeg/include/jpeg_image_processor.h @@ -35,8 +35,9 @@ public: int32_t SetOutputSurface(sptr surface); int32_t FillDirtyImages2Surface(const std::shared_ptr &data, uint8_t *lastFrame); int32_t ProcessDamageSurface(sptr &surfaceBuffer, const std::vector &damages); - int32_t SetImageProcessListener(std::shared_ptr &imageProcessorListener); - void EncodeDamageData(sptr &surfaceBuffer, const OHOS::Rect &damage, std::shared_ptr &data); + int32_t SetImageProcessListener(std::shared_ptr &listener); + void EncodeDamageData(sptr &surfaceBuffer, const OHOS::Rect &damage, + std::shared_ptr &data); int32_t DecodeDamageData(const std::shared_ptr &data, uint8_t *lastFrame); int32_t ReplaceDamage2LastFrame(uint8_t *lastFrame, uint8_t *dirtyImageData, const DirtyRect rect); private: diff --git a/services/common/imageJpeg/src/jpeg_image_processor.cpp b/services/common/imageJpeg/src/jpeg_image_processor.cpp index 254c0e84..8c6f6d25 100644 --- a/services/common/imageJpeg/src/jpeg_image_processor.cpp +++ b/services/common/imageJpeg/src/jpeg_image_processor.cpp @@ -89,7 +89,8 @@ int32_t JpegImageProcessor::FillDirtyImages2Surface(const std::shared_ptr &surfaceBuffer, const std::vector &damages) +int32_t JpegImageProcessor::ProcessDamageSurface(sptr &surfaceBuffer, + const std::vector &damages) { DHLOGI("%s: ProcessDamageSurface.", LOG_TAG); std::shared_ptr dataBuf = std::make_shared(configParam_.GetScreenWidth() * @@ -109,10 +110,10 @@ int32_t JpegImageProcessor::ProcessDamageSurface(sptr &surfaceBuf return DH_SUCCESS; } -int32_t JpegImageProcessor::SetImageProcessListener(std::shared_ptr &imageProcessorListener) +int32_t JpegImageProcessor::SetImageProcessListener(std::shared_ptr &listener) { DHLOGI("%s: SetImageProcessorListener.", LOG_TAG); - imageProcessorListener_ = imageProcessorListener; + imageProcessorListener_ = listener; return DH_SUCCESS; } @@ -276,8 +277,7 @@ void JpegImageProcessor::DecompressJpegToNV12(size_t jpegSize, uint8_t *inputDat int32_t uvIndex = cinfo.output_width * cinfo.output_height; int32_t i = 0; #ifdef LIBYUV - int32_t rgbSize = cinfo.output_width * cinfo.output_height * RGBA_CHROMA; - uint8_t *rgb = new uint8_t[rgbSize]; + uint8_t *rgb = new uint8_t[cinfo.output_width * cinfo.output_height * RGBA_CHROMA]; int32_t rgbIndex = 0; #else int32_t yIndex = 0; diff --git a/services/common/screen_channel/include/iscreen_channel.h b/services/common/screen_channel/include/iscreen_channel.h index 74cb7681..0e5a0b64 100644 --- a/services/common/screen_channel/include/iscreen_channel.h +++ b/services/common/screen_channel/include/iscreen_channel.h @@ -26,14 +26,12 @@ namespace DistributedHardware { class IScreenChannel { public: virtual ~IScreenChannel() = default; - virtual int32_t CreateSession(const std::shared_ptr &listener) = 0; virtual int32_t ReleaseSession() = 0; virtual int32_t OpenSession() = 0; virtual int32_t CloseSession() = 0; virtual int32_t SendData(const std::shared_ptr &data) = 0; virtual void SetJpegSessionFlag(bool flag) = 0; - }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screentransport/screendatachannel/include/screen_data_channel_impl.h b/services/screentransport/screendatachannel/include/screen_data_channel_impl.h index e25c1fb1..0b43f3b4 100644 --- a/services/screentransport/screendatachannel/include/screen_data_channel_impl.h +++ b/services/screentransport/screendatachannel/include/screen_data_channel_impl.h @@ -31,7 +31,6 @@ class ScreenDataChannelImpl : public IScreenChannel, public: explicit ScreenDataChannelImpl(std::string peerDevId) : peerDevId_(peerDevId) {}; ~ScreenDataChannelImpl() override = default; - int32_t CreateSession(const std::shared_ptr &listener) override; int32_t ReleaseSession() override; int32_t OpenSession() override; @@ -42,8 +41,6 @@ public: int32_t SendDirtyData(const std::shared_ptr &screenData); void ProcessDirtyData(const StreamData *data, std::shared_ptr dataBuffer, const StreamData *ext); void ProcessDullData(const StreamData *data, std::shared_ptr dataBuffer); - - void OnSessionOpened(int32_t sessionId, int32_t result) override; void OnSessionClosed(int32_t sessionId) override; void OnBytesReceived(int32_t sessionId, const void *data, uint32_t dataLen) override; @@ -52,7 +49,7 @@ public: private: static const constexpr char *LOG_TAG = "ScreenDataChannel"; - bool jpegSessionFlag = false; + bool jpegSessionFlag_ = false; const std::string peerDevId_; int32_t sessionId_ = 0; int32_t jpegSessionId_ = 0; diff --git a/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp b/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp index 214581b2..3e0b85b0 100644 --- a/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp +++ b/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp @@ -46,7 +46,7 @@ int32_t ScreenDataChannelImpl::CreateSession(const std::shared_ptr surfaceBuffer, sptrCancelBuffer(windowSurfaceBuffer); } - } void ImageSinkDecoder::OffsetProcess(sptr surfaceBuffer, sptr windowSurfaceBuffer) -- Gitee From 19fd4ede2713b185adfa260fa9ef693c2e694a4f Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 15:26:34 +0800 Subject: [PATCH 06/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- common/include/dscreen_constants.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/include/dscreen_constants.h b/common/include/dscreen_constants.h index e134c20f..d071b381 100644 --- a/common/include/dscreen_constants.h +++ b/common/include/dscreen_constants.h @@ -91,6 +91,9 @@ constexpr uint32_t THREE = 3; constexpr uint32_t ZERO = 0; constexpr uint32_t ALIGNEDBITS = 32; +/* Version */ +constexpr uint32_t OLD = 1; +constexpr uint32_t NEW = 2; /* Screen session name max len */ constexpr uint32_t DSCREEN_MAX_SESSION_NAME_LEN = 50; -- Gitee From 4adf852d44eb4a7b6fc5111becbe5ab2dce133a8 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 16:44:45 +0800 Subject: [PATCH 07/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- common/BUILD.gn | 2 -- services/screenclient/BUILD.gn | 4 +++- services/screentransport/screensourcetrans/BUILD.gn | 2 -- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/common/BUILD.gn b/common/BUILD.gn index dec824b7..ccd1c602 100644 --- a/common/BUILD.gn +++ b/common/BUILD.gn @@ -25,8 +25,6 @@ ohos_shared_library("distributed_screen_utils") { "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", "//third_party/json/include", "${fwk_common_path}/utils/include", - "//foundation/distributedhardware/distributed_hardware_fwk/interfaces/inner_kits/include", - "//foundation/multimedia/image_framework/mock/native/include", ] deps = [ diff --git a/services/screenclient/BUILD.gn b/services/screenclient/BUILD.gn index 27221afe..62fdbc00 100644 --- a/services/screenclient/BUILD.gn +++ b/services/screenclient/BUILD.gn @@ -48,7 +48,9 @@ ohos_shared_library("distributed_screen_client") { "LOG_DOMAIN=0xD004100", ] - external_deps = [ "input:libmmi-client" ] + external_deps = [ "input:libmmi-client", + "graphic_standard:libgraphic_utils", + ] part_name = "distributed_screen" subsystem_name = "distributedhardware" diff --git a/services/screentransport/screensourcetrans/BUILD.gn b/services/screentransport/screensourcetrans/BUILD.gn index 3f5ebb15..5659b5f4 100644 --- a/services/screentransport/screensourcetrans/BUILD.gn +++ b/services/screentransport/screensourcetrans/BUILD.gn @@ -20,14 +20,12 @@ ohos_shared_library("distributed_screen_sourcetrans") { include_dirs = [ "//base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include", "//third_party/json/include", - "//foundation/graphic/graphic_2d/interfaces/inner_api/surface", "${fwk_common_path}/utils/include", "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", "${fwk_interfaces_path}/inner_kits/include", "${ipc_interfaces_path}/innerkits/ipc_core/include", "${services_path}/common/utils/include", "//third_party/libjpeg-turbo", - "//foundation/ability/dmsfwk/utils/native/include", ] include_dirs += [ -- Gitee From 1b316bdc0ae094ebd2c4bbf22236548f6f97cb5b Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 17:01:48 +0800 Subject: [PATCH 08/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- services/screenclient/BUILD.gn | 4 ++-- services/screenservice/sourceservice/BUILD.gn | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/services/screenclient/BUILD.gn b/services/screenclient/BUILD.gn index 62fdbc00..e37f888b 100644 --- a/services/screenclient/BUILD.gn +++ b/services/screenclient/BUILD.gn @@ -23,7 +23,6 @@ ohos_shared_library("distributed_screen_client") { "${graphicstandard_path}/rosen/modules/render_service_client/core/ui", "${fwk_common_path}/utils/include", "//foundation/multimodalinput/input/interfaces/native/innerkits/event/include/", - "//foundation/graphic/graphic_2d/interfaces/inner_api/common", ] include_dirs += [ @@ -48,7 +47,8 @@ ohos_shared_library("distributed_screen_client") { "LOG_DOMAIN=0xD004100", ] - external_deps = [ "input:libmmi-client", + external_deps = [ + "input:libmmi-client", "graphic_standard:libgraphic_utils", ] diff --git a/services/screenservice/sourceservice/BUILD.gn b/services/screenservice/sourceservice/BUILD.gn index 5906217d..51266ffe 100644 --- a/services/screenservice/sourceservice/BUILD.gn +++ b/services/screenservice/sourceservice/BUILD.gn @@ -29,7 +29,6 @@ ohos_shared_library("distributed_screen_source") { "${distributedhardwarefwk_path}/interfaces/inner_kits/include", "//third_party/libjpeg-turbo", "//foundation/graphic/graphic_2d/rosen/modules/render_service_base/include/platform/ohos", - "//foundation/graphic/graphic_2d/rosen/modules/composer/vsync/include", ] include_dirs += [ @@ -51,7 +50,6 @@ ohos_shared_library("distributed_screen_source") { "${services_path}/common/decision_center/include", "//drivers/peripheral/display/interfaces/include", "//drivers/peripheral/base", - "//foundation/graphic/graphic_2d/rosen/modules/render_service_base/include", "//foundation/graphic/graphic_2d/utils/buffer_handle/export", ] @@ -75,6 +73,7 @@ ohos_shared_library("distributed_screen_source") { "${services_path}/screentransport/screensourcetrans:distributed_screen_sourcetrans", "${mediastandard_path}/interfaces/inner_api/native:media_client", "${windowmanager_path}/dm:libdm", + "//foundation/graphic/graphic_2d/rosen/modules/render_service_base:librender_service_base", ] defines = [ @@ -91,6 +90,7 @@ ohos_shared_library("distributed_screen_source") { "multimedia_player_framework:media_client", "safwk:system_ability_fwk", "samgr:samgr_proxy", + "graphic_standard:libcomposer", ] subsystem_name = "distributedhardware" -- Gitee From 68f0ccb8671e88f6d44738ed1544ee996af53bec Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 17:18:41 +0800 Subject: [PATCH 09/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- services/screenservice/sourceservice/BUILD.gn | 2 -- 1 file changed, 2 deletions(-) diff --git a/services/screenservice/sourceservice/BUILD.gn b/services/screenservice/sourceservice/BUILD.gn index 51266ffe..ba3469f0 100644 --- a/services/screenservice/sourceservice/BUILD.gn +++ b/services/screenservice/sourceservice/BUILD.gn @@ -28,7 +28,6 @@ ohos_shared_library("distributed_screen_source") { "${mediastandard_path}/interfaces/inner_api/native", "${distributedhardwarefwk_path}/interfaces/inner_kits/include", "//third_party/libjpeg-turbo", - "//foundation/graphic/graphic_2d/rosen/modules/render_service_base/include/platform/ohos", ] include_dirs += [ @@ -73,7 +72,6 @@ ohos_shared_library("distributed_screen_source") { "${services_path}/screentransport/screensourcetrans:distributed_screen_sourcetrans", "${mediastandard_path}/interfaces/inner_api/native:media_client", "${windowmanager_path}/dm:libdm", - "//foundation/graphic/graphic_2d/rosen/modules/render_service_base:librender_service_base", ] defines = [ -- Gitee From 525247fdd780296aff58fe38fe64391702a3fe11 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 17:35:00 +0800 Subject: [PATCH 10/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- common/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/BUILD.gn b/common/BUILD.gn index ccd1c602..4a12dc9c 100644 --- a/common/BUILD.gn +++ b/common/BUILD.gn @@ -20,11 +20,11 @@ ohos_shared_library("distributed_screen_utils") { include_dirs = [ "${services_path}/common/utils/include", "//commonlibrary/c_utils/base/include", - "include", "//base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include", "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", "//third_party/json/include", "${fwk_common_path}/utils/include", + "//foundation/distributedhardware/distributed_screen/common/include", ] deps = [ -- Gitee From 5d19ef43a0e6bc344e3882d4222b264c4d977002 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 17:53:40 +0800 Subject: [PATCH 11/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- common/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/BUILD.gn b/common/BUILD.gn index 4a12dc9c..f0326714 100644 --- a/common/BUILD.gn +++ b/common/BUILD.gn @@ -24,7 +24,7 @@ ohos_shared_library("distributed_screen_utils") { "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", "//third_party/json/include", "${fwk_common_path}/utils/include", - "//foundation/distributedhardware/distributed_screen/common/include", + "${common_path}/include", ] deps = [ -- Gitee From 98d0064cd0eb8d876f24a3308c74ad9ac37743ac Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 18:04:59 +0800 Subject: [PATCH 12/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- common/BUILD.gn | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/common/BUILD.gn b/common/BUILD.gn index f0326714..1568fa57 100644 --- a/common/BUILD.gn +++ b/common/BUILD.gn @@ -27,9 +27,7 @@ ohos_shared_library("distributed_screen_utils") { "${common_path}/include", ] - deps = [ - "${distributedhardwarefwk_path}/interfaces/inner_kits:libdhfwk_sdk", - ] + deps = [ "${distributedhardwarefwk_path}/interfaces/inner_kits:libdhfwk_sdk" ] sources = [ "src/dscreen_hisysevent.cpp", -- Gitee From 618907df876e9d5cb18795a13e3f4df6be93d825 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 18:38:54 +0800 Subject: [PATCH 13/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- common/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/BUILD.gn b/common/BUILD.gn index 1568fa57..65d39eed 100644 --- a/common/BUILD.gn +++ b/common/BUILD.gn @@ -23,8 +23,8 @@ ohos_shared_library("distributed_screen_utils") { "//base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include", "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", "//third_party/json/include", - "${fwk_common_path}/utils/include", "${common_path}/include", + "${fwk_common_path}/utils/include", ] deps = [ "${distributedhardwarefwk_path}/interfaces/inner_kits:libdhfwk_sdk" ] -- Gitee From a5a969d0d2ca72efe533359a1a19d6d4f4c0816b Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 18:47:16 +0800 Subject: [PATCH 14/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- distributedscreen.gni | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/distributedscreen.gni b/distributedscreen.gni index 417c1457..e02cbb0f 100644 --- a/distributedscreen.gni +++ b/distributedscreen.gni @@ -29,5 +29,5 @@ ipc_interfaces_path = "${ipc_path}/interfaces" build_flags = [ "-Werror" ] declare_args() { - distributed_screen_common = true + distributed_screen_common = true } -- Gitee From 4c6f5fe25f9b4564eb4a5a3c39d02b3dd2718b8f Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 18:58:23 +0800 Subject: [PATCH 15/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- services/screenclient/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/screenclient/BUILD.gn b/services/screenclient/BUILD.gn index e37f888b..1e92ec4f 100644 --- a/services/screenclient/BUILD.gn +++ b/services/screenclient/BUILD.gn @@ -48,8 +48,8 @@ ohos_shared_library("distributed_screen_client") { ] external_deps = [ - "input:libmmi-client", "graphic_standard:libgraphic_utils", + "input:libmmi-client", ] part_name = "distributed_screen" -- Gitee From ac8d3ecd89b12be946fdcc0a746c4e5b48fc6260 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 19:21:50 +0800 Subject: [PATCH 16/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- services/screenservice/sourceservice/BUILD.gn | 18 +++++++++--------- .../screentransport/screensinktrans/BUILD.gn | 2 +- .../screentransport/screensourcetrans/BUILD.gn | 6 +++--- .../test/unittest/screensinktrans/BUILD.gn | 17 +++++++++-------- .../test/unittest/screensourcetrans/BUILD.gn | 10 +++++----- 5 files changed, 27 insertions(+), 26 deletions(-) diff --git a/services/screenservice/sourceservice/BUILD.gn b/services/screenservice/sourceservice/BUILD.gn index ba3469f0..bc6511d4 100644 --- a/services/screenservice/sourceservice/BUILD.gn +++ b/services/screenservice/sourceservice/BUILD.gn @@ -19,21 +19,24 @@ import( ohos_shared_library("distributed_screen_source") { include_dirs = [ "//base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include", - "//third_party/json/include", - "${windowmanager_path}/interfaces/innerkits/dm", "//commonlibrary/c_utils/base/include", - "//utils/system/safwk/native/include", "//foundation/graphic/graphic_2d/interfaces/innerkits/surface", + "//third_party/json/include", + "//third_party/libjpeg-turbo", + "//utils/system/safwk/native/include", + "${distributedhardwarefwk_path}/interfaces/inner_kits/include", + "${windowmanager_path}/interfaces/innerkits/dm", "${fwk_common_path}/utils/include", "${mediastandard_path}/interfaces/inner_api/native", - "${distributedhardwarefwk_path}/interfaces/inner_kits/include", - "//third_party/libjpeg-turbo", ] include_dirs += [ "./dscreenservice/include", "./dscreenservice/include/callback", "./dscreenmgr/include", + "//drivers/peripheral/display/interfaces/include", + "//drivers/peripheral/base", + "//foundation/graphic/graphic_2d/utils/buffer_handle/export", "${interfaces_path}/innerkits/native_cpp/screen_sink/include", "${interfaces_path}/innerkits/native_cpp/screen_sink/include/callback", "${interfaces_path}/innerkits/native_cpp/screen_source/include", @@ -47,9 +50,6 @@ ohos_shared_library("distributed_screen_source") { "${services_path}/screentransport/screensourcetrans/include", "${services_path}/common/imageJpeg/include", "${services_path}/common/decision_center/include", - "//drivers/peripheral/display/interfaces/include", - "//drivers/peripheral/base", - "//foundation/graphic/graphic_2d/utils/buffer_handle/export", ] sources = [ @@ -82,13 +82,13 @@ ohos_shared_library("distributed_screen_source") { external_deps = [ "c_utils:utils", + "graphic_standard:libcomposer", "graphic_standard:surface", "ipc:ipc_core", "multimedia_image_framework:image_native", "multimedia_player_framework:media_client", "safwk:system_ability_fwk", "samgr:samgr_proxy", - "graphic_standard:libcomposer", ] subsystem_name = "distributedhardware" diff --git a/services/screentransport/screensinktrans/BUILD.gn b/services/screentransport/screensinktrans/BUILD.gn index afb395be..e51400cf 100644 --- a/services/screentransport/screensinktrans/BUILD.gn +++ b/services/screentransport/screensinktrans/BUILD.gn @@ -19,11 +19,11 @@ import( ohos_shared_library("distributed_screen_sinktrans") { include_dirs = [ "//base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include", + "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", "//third_party/json/include", "//third_party/libjpeg", "//foundation/graphic/graphic_2d/interfaces/innerkits/surface", "${fwk_common_path}/utils/include", - "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", "${fwk_interfaces_path}/inner_kits/include", "${ipc_interfaces_path}/innerkits/ipc_core/include", "${services_path}/common/utils/include", diff --git a/services/screentransport/screensourcetrans/BUILD.gn b/services/screentransport/screensourcetrans/BUILD.gn index 5659b5f4..f93a2a50 100644 --- a/services/screentransport/screensourcetrans/BUILD.gn +++ b/services/screentransport/screensourcetrans/BUILD.gn @@ -19,13 +19,13 @@ import( ohos_shared_library("distributed_screen_sourcetrans") { include_dirs = [ "//base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include", + "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", "//third_party/json/include", + "//third_party/libjpeg-turbo", "${fwk_common_path}/utils/include", - "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", "${fwk_interfaces_path}/inner_kits/include", "${ipc_interfaces_path}/innerkits/ipc_core/include", "${services_path}/common/utils/include", - "//third_party/libjpeg-turbo", ] include_dirs += [ @@ -43,6 +43,7 @@ ohos_shared_library("distributed_screen_sourcetrans") { ] sources = [ + "./src/screen_source_trans.cpp", "${services_path}/common/databuffer/src/data_buffer.cpp", "${services_path}/common/utils/src/dscreen_fwkkit.cpp", "${services_path}/common/utils/src/video_param.cpp", @@ -53,7 +54,6 @@ ohos_shared_library("distributed_screen_sourcetrans") { "${services_path}/softbusadapter/src/softbus_adapter.cpp", "${services_path}/common/imageJpeg/src/jpeg_image_processor.cpp", "${services_path}/common/decision_center/src/screen_decision_center.cpp", - "./src/screen_source_trans.cpp", ] deps = [ diff --git a/services/screentransport/test/unittest/screensinktrans/BUILD.gn b/services/screentransport/test/unittest/screensinktrans/BUILD.gn index 3cf7982a..36c5ee0f 100644 --- a/services/screentransport/test/unittest/screensinktrans/BUILD.gn +++ b/services/screentransport/test/unittest/screensinktrans/BUILD.gn @@ -28,23 +28,24 @@ config("module_private_config") { include_dirs += [ "./include", - "${services_path}/screentransport/test/unittest/screentranstestutils/include", "${common_path}/include", "${services_path}/common/databuffer/include", + "${services_path}/common/imageJpeg/include", "${services_path}/common/screen_channel/include", "${services_path}/common/utils/include", + "${services_path}/softbusadapter/include", "${services_path}/screentransport/screendatachannel/include", - "${services_path}/screentransport/screensourcetrans/include", - "${services_path}/screentransport/screensinktrans/include", - "${services_path}/screentransport/screensinkprocessor/include", "${services_path}/screentransport/screensinkprocessor/decoder/include", - "${services_path}/softbusadapter/include", - "${services_path}/common/imageJpeg/include", - "//foundation/multimedia/player_framework/interfaces/inner_api/native", + "${services_path}/screentransport/screensinkprocessor/include", + "${services_path}/screentransport/screensinktrans/include", + "${services_path}/screentransport/screensourceprocessor/include", + "${services_path}/screentransport/screensourcetrans/include", + "${services_path}/screentransport/test/unittest/screentranstestutils/include", "//foundation/communication/dsoftbus/interfaces/kits/transport", "//foundation/graphic/graphic_2d/utils/buffer_handle/export", + "//foundation/multimedia/player_framework/interfaces/inner_api/native", "//drivers/peripheral/base", - "${services_path}/screentransport/screensourceprocessor/include", + ] } diff --git a/services/screentransport/test/unittest/screensourcetrans/BUILD.gn b/services/screentransport/test/unittest/screensourcetrans/BUILD.gn index 96a3a47f..e6d8913f 100644 --- a/services/screentransport/test/unittest/screensourcetrans/BUILD.gn +++ b/services/screentransport/test/unittest/screensourcetrans/BUILD.gn @@ -29,29 +29,29 @@ config("module_private_config") { include_dirs += [ "./include", - "${services_path}/screentransport/test/unittest/screentranstestutils/include", "${common_path}/include", "${services_path}/common/databuffer/include", + "${services_path}/common/decision_center/include", + "${services_path}/common/imageJpeg/include", "${services_path}/common/screen_channel/include", "${services_path}/common/utils/include", "${services_path}/screentransport/screensinktrans/include", "${services_path}/screentransport/screensinkprocessor/include", - "${services_path}/screentransport/test/unittest/screensourcetrans/include", "${services_path}/screentransport/screensourcetrans/include", "${services_path}/screentransport/screendatachannel/include", "${services_path}/screentransport/screensourceprocessor/include", "${services_path}/screentransport/screensourceprocessor/encoder/include", + "${services_path}/screentransport/test/unittest/screensourcetrans/include", + "${services_path}/screentransport/test/unittest/screentranstestutils/include", "${services_path}/softbusadapter/include", "//drivers/peripheral/display/interfaces/include", "//drivers/peripheral/base", + "//foundation/communication/dsoftbus/interfaces/kits/transport", "//foundation/communication/ipc/interfaces/innerkits/ipc_core/include", "//foundation/graphic/graphic_2d/interfaces/inner_api/surface", "//foundation/graphic/graphic_2d/interfaces/inner_api/common", "//foundation/graphic/graphic_2d/utils/buffer_handle/export", "//foundation/multimedia/player_framework/interfaces/inner_api/native", - "//foundation/communication/dsoftbus/interfaces/kits/transport", - "${services_path}/common/imageJpeg/include", - "${services_path}/common/decision_center/include", ] } -- Gitee From 41ff172d06cf2c8b3d0efa74120e87865faae306 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 19:39:20 +0800 Subject: [PATCH 17/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- services/screenservice/sourceservice/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/screenservice/sourceservice/BUILD.gn b/services/screenservice/sourceservice/BUILD.gn index bc6511d4..edf5b2db 100644 --- a/services/screenservice/sourceservice/BUILD.gn +++ b/services/screenservice/sourceservice/BUILD.gn @@ -69,8 +69,8 @@ ohos_shared_library("distributed_screen_source") { deps = [ "${common_path}:distributed_screen_utils", "${distributedhardwarefwk_path}/interfaces/inner_kits:libdhfwk_sdk", - "${services_path}/screentransport/screensourcetrans:distributed_screen_sourcetrans", "${mediastandard_path}/interfaces/inner_api/native:media_client", + "${services_path}/screentransport/screensourcetrans:distributed_screen_sourcetrans", "${windowmanager_path}/dm:libdm", ] -- Gitee From 5db155ee7d12ef20edea4898220d0ee3f4d21fcf Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 20:02:36 +0800 Subject: [PATCH 18/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- services/screentransport/screensinktrans/BUILD.gn | 4 +--- .../test/unittest/screentranstestutils/BUILD.gn | 13 ++++++------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/services/screentransport/screensinktrans/BUILD.gn b/services/screentransport/screensinktrans/BUILD.gn index e51400cf..d47ccc05 100644 --- a/services/screentransport/screensinktrans/BUILD.gn +++ b/services/screentransport/screensinktrans/BUILD.gn @@ -44,12 +44,10 @@ ohos_shared_library("distributed_screen_sinktrans") { "${services_path}/softbusadapter/include", ] - - sources = [ "${common_path}/src/dscreen_json_util.cpp", - "${services_path}/common/imageJpeg/src/jpeg_image_processor.cpp", "${services_path}/common/databuffer/src/data_buffer.cpp", + "${services_path}/common/imageJpeg/src/jpeg_image_processor.cpp", "${services_path}/common/utils/src/dscreen_fwkkit.cpp", "${services_path}/common/utils/src/video_param.cpp", "${services_path}/screentransport/screendatachannel/src/screen_data_channel_impl.cpp", diff --git a/services/screentransport/test/unittest/screentranstestutils/BUILD.gn b/services/screentransport/test/unittest/screentranstestutils/BUILD.gn index 629cf613..2943c580 100644 --- a/services/screentransport/test/unittest/screentranstestutils/BUILD.gn +++ b/services/screentransport/test/unittest/screentranstestutils/BUILD.gn @@ -32,17 +32,18 @@ config("module_private_config") { "${services_path}/screentransport/test/unittest/screentranstestutils/include", "${common_path}/include", "${services_path}/common/databuffer/include", + "${services_path}/common/decision_center/include", + "${services_path}/common/imageJpeg/include", "${services_path}/common/screen_channel/include", "${services_path}/common/utils/include", - "${services_path}/screentransport/screensinktrans/include", + "${services_path}/screentransport/screendatachannel/include", + "${services_path}/screentransport/screensinkprocessor/decoder/include", "${services_path}/screentransport/screensinkprocessor/include", - "${services_path}/screentransport/test/unittest/screensourcetrans/include", + "${services_path}/screentransport/screensinktrans/include", "${services_path}/screentransport/screensourcetrans/include", - "${services_path}/screentransport/screendatachannel/include", "${services_path}/screentransport/screensourceprocessor/include", "${services_path}/screentransport/screensourceprocessor/encoder/include", - "${services_path}/screentransport/screensinkprocessor/include", - "${services_path}/screentransport/screensinkprocessor/decoder/include", + "${services_path}/screentransport/test/unittest/screensourcetrans/include", "${services_path}/softbusadapter/include", "//drivers/peripheral/display/interfaces/include", "//drivers/peripheral/base", @@ -52,8 +53,6 @@ config("module_private_config") { "//foundation/graphic/graphic_2d/utils/buffer_handle/export", "//foundation/multimedia/player_framework/interfaces/inner_api/native", "//foundation/communication/dsoftbus/interfaces/kits/transport", - "${services_path}/common/imageJpeg/include", - "${services_path}/common/decision_center/include", ] } -- Gitee From 1a115cbf2fdc8214fbcdab2b4ec38ee9c241ef37 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 20:23:12 +0800 Subject: [PATCH 19/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- services/screentransport/screensourcetrans/BUILD.gn | 4 ++-- .../test/unittest/screensinkprocessor/BUILD.gn | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/services/screentransport/screensourcetrans/BUILD.gn b/services/screentransport/screensourcetrans/BUILD.gn index f93a2a50..be3842b2 100644 --- a/services/screentransport/screensourcetrans/BUILD.gn +++ b/services/screentransport/screensourcetrans/BUILD.gn @@ -45,6 +45,8 @@ ohos_shared_library("distributed_screen_sourcetrans") { sources = [ "./src/screen_source_trans.cpp", "${services_path}/common/databuffer/src/data_buffer.cpp", + "${services_path}/common/decision_center/src/screen_decision_center.cpp", + "${services_path}/common/imageJpeg/src/jpeg_image_processor.cpp", "${services_path}/common/utils/src/dscreen_fwkkit.cpp", "${services_path}/common/utils/src/video_param.cpp", "${services_path}/screentransport/screendatachannel/src/screen_data_channel_impl.cpp", @@ -52,8 +54,6 @@ ohos_shared_library("distributed_screen_sourcetrans") { "${services_path}/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp", "${services_path}/screentransport/screensourceprocessor/src/image_source_processor.cpp", "${services_path}/softbusadapter/src/softbus_adapter.cpp", - "${services_path}/common/imageJpeg/src/jpeg_image_processor.cpp", - "${services_path}/common/decision_center/src/screen_decision_center.cpp", ] deps = [ diff --git a/services/screentransport/test/unittest/screensinkprocessor/BUILD.gn b/services/screentransport/test/unittest/screensinkprocessor/BUILD.gn index 16746199..ea9e2959 100644 --- a/services/screentransport/test/unittest/screensinkprocessor/BUILD.gn +++ b/services/screentransport/test/unittest/screensinkprocessor/BUILD.gn @@ -28,20 +28,19 @@ config("module_private_config") { include_dirs += [ "./include", - "${services_path}/screentransport/test/unittest/screentranstestutils/include", "${common_path}/include", "${services_path}/common/databuffer/include", + "${services_path}/common/imageJpeg/include", "${services_path}/common/screen_channel/include", "${services_path}/common/utils/include", + "${services_path}/softbusadapter/include", "${services_path}/screentransport/screendatachannel/include", - "${services_path}/screentransport/screensourcetrans/include", + "${services_path}/screentransport/screensinkprocessor/decoder/include", "${services_path}/screentransport/screensinkprocessor/include", "${services_path}/screentransport/screensinktrans/include", - "${services_path}/screentransport/screensinkprocessor/include", - "${services_path}/screentransport/screensinkprocessor/decoder/include", - "${services_path}/softbusadapter/include", - "${services_path}/common/imageJpeg/include", + "${services_path}/screentransport/screensourcetrans/include", "${services_path}/screentransport/screensourceprocessor/include", + "${services_path}/screentransport/test/unittest/screentranstestutils/include", ] } -- Gitee From ac00f3b935e8e5c009642954671faad920cd48ba Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 21:08:47 +0800 Subject: [PATCH 20/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- services/screentransport/screensourcetrans/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/screentransport/screensourcetrans/BUILD.gn b/services/screentransport/screensourcetrans/BUILD.gn index be3842b2..3ebcc4a1 100644 --- a/services/screentransport/screensourcetrans/BUILD.gn +++ b/services/screentransport/screensourcetrans/BUILD.gn @@ -43,7 +43,6 @@ ohos_shared_library("distributed_screen_sourcetrans") { ] sources = [ - "./src/screen_source_trans.cpp", "${services_path}/common/databuffer/src/data_buffer.cpp", "${services_path}/common/decision_center/src/screen_decision_center.cpp", "${services_path}/common/imageJpeg/src/jpeg_image_processor.cpp", @@ -54,6 +53,7 @@ ohos_shared_library("distributed_screen_sourcetrans") { "${services_path}/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp", "${services_path}/screentransport/screensourceprocessor/src/image_source_processor.cpp", "${services_path}/softbusadapter/src/softbus_adapter.cpp", + "./src/screen_source_trans.cpp", ] deps = [ -- Gitee From db30ed6f2671021a394c0ceb97a916db236b0c6a Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 21:19:44 +0800 Subject: [PATCH 21/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- services/screentransport/screensinktrans/BUILD.gn | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/screentransport/screensinktrans/BUILD.gn b/services/screentransport/screensinktrans/BUILD.gn index d47ccc05..c3f6a53c 100644 --- a/services/screentransport/screensinktrans/BUILD.gn +++ b/services/screentransport/screensinktrans/BUILD.gn @@ -66,9 +66,9 @@ ohos_shared_library("distributed_screen_sinktrans") { ] if (!distributed_screen_common) { - cflags = [ "-DLIBYUV" ] - include_dirs += [ "//third_party/libyuv/files/include" ] - deps += [ "//third_party/libyuv:yuv" ] + cflags = [ "-DLIBYUV" ] + include_dirs += [ "//third_party/libyuv/files/include" ] + deps += [ "//third_party/libyuv:yuv" ] } defines = [ -- Gitee From b2a1df6b8643610904603955797deb87c12f4a02 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 21:32:33 +0800 Subject: [PATCH 22/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- services/screenservice/sourceservice/BUILD.gn | 1 - services/screentransport/screensourcetrans/BUILD.gn | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/services/screenservice/sourceservice/BUILD.gn b/services/screenservice/sourceservice/BUILD.gn index edf5b2db..4107a6e1 100644 --- a/services/screenservice/sourceservice/BUILD.gn +++ b/services/screenservice/sourceservice/BUILD.gn @@ -23,7 +23,6 @@ ohos_shared_library("distributed_screen_source") { "//foundation/graphic/graphic_2d/interfaces/innerkits/surface", "//third_party/json/include", "//third_party/libjpeg-turbo", - "//utils/system/safwk/native/include", "${distributedhardwarefwk_path}/interfaces/inner_kits/include", "${windowmanager_path}/interfaces/innerkits/dm", "${fwk_common_path}/utils/include", diff --git a/services/screentransport/screensourcetrans/BUILD.gn b/services/screentransport/screensourcetrans/BUILD.gn index 3ebcc4a1..67a6f364 100644 --- a/services/screentransport/screensourcetrans/BUILD.gn +++ b/services/screentransport/screensourcetrans/BUILD.gn @@ -64,9 +64,9 @@ ohos_shared_library("distributed_screen_sourcetrans") { ] if (!distributed_screen_common) { - cflags = [ "-DLIBYUV" ] - include_dirs += [ "//third_party/libyuv/files/include" ] - deps += [ "//third_party/libyuv:yuv" ] + cflags = [ "-DLIBYUV" ] + include_dirs += [ "//third_party/libyuv/files/include" ] + deps += [ "//third_party/libyuv:yuv" ] } defines = [ -- Gitee From 07c34c32cb43bb002b33518653bf506b751cfe04 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 21:44:49 +0800 Subject: [PATCH 23/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- services/screenservice/sourceservice/BUILD.gn | 1 + services/screentransport/test/unittest/screensinktrans/BUILD.gn | 1 - .../screentransport/test/unittest/screensourcetrans/BUILD.gn | 2 +- .../screentransport/test/unittest/screentranstestutils/BUILD.gn | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/screenservice/sourceservice/BUILD.gn b/services/screenservice/sourceservice/BUILD.gn index 4107a6e1..edf5b2db 100644 --- a/services/screenservice/sourceservice/BUILD.gn +++ b/services/screenservice/sourceservice/BUILD.gn @@ -23,6 +23,7 @@ ohos_shared_library("distributed_screen_source") { "//foundation/graphic/graphic_2d/interfaces/innerkits/surface", "//third_party/json/include", "//third_party/libjpeg-turbo", + "//utils/system/safwk/native/include", "${distributedhardwarefwk_path}/interfaces/inner_kits/include", "${windowmanager_path}/interfaces/innerkits/dm", "${fwk_common_path}/utils/include", diff --git a/services/screentransport/test/unittest/screensinktrans/BUILD.gn b/services/screentransport/test/unittest/screensinktrans/BUILD.gn index 36c5ee0f..8b67f1da 100644 --- a/services/screentransport/test/unittest/screensinktrans/BUILD.gn +++ b/services/screentransport/test/unittest/screensinktrans/BUILD.gn @@ -45,7 +45,6 @@ config("module_private_config") { "//foundation/graphic/graphic_2d/utils/buffer_handle/export", "//foundation/multimedia/player_framework/interfaces/inner_api/native", "//drivers/peripheral/base", - ] } diff --git a/services/screentransport/test/unittest/screensourcetrans/BUILD.gn b/services/screentransport/test/unittest/screensourcetrans/BUILD.gn index e6d8913f..2b87a6ef 100644 --- a/services/screentransport/test/unittest/screensourcetrans/BUILD.gn +++ b/services/screentransport/test/unittest/screensourcetrans/BUILD.gn @@ -44,8 +44,8 @@ config("module_private_config") { "${services_path}/screentransport/test/unittest/screensourcetrans/include", "${services_path}/screentransport/test/unittest/screentranstestutils/include", "${services_path}/softbusadapter/include", - "//drivers/peripheral/display/interfaces/include", "//drivers/peripheral/base", + "//drivers/peripheral/display/interfaces/include", "//foundation/communication/dsoftbus/interfaces/kits/transport", "//foundation/communication/ipc/interfaces/innerkits/ipc_core/include", "//foundation/graphic/graphic_2d/interfaces/inner_api/surface", diff --git a/services/screentransport/test/unittest/screentranstestutils/BUILD.gn b/services/screentransport/test/unittest/screentranstestutils/BUILD.gn index 2943c580..62727fd0 100644 --- a/services/screentransport/test/unittest/screentranstestutils/BUILD.gn +++ b/services/screentransport/test/unittest/screentranstestutils/BUILD.gn @@ -47,12 +47,12 @@ config("module_private_config") { "${services_path}/softbusadapter/include", "//drivers/peripheral/display/interfaces/include", "//drivers/peripheral/base", + "//foundation/communication/dsoftbus/interfaces/kits/transport", "//foundation/communication/ipc/interfaces/innerkits/ipc_core/include", "//foundation/graphic/graphic_2d/interfaces/inner_api/surface", "//foundation/graphic/graphic_2d/interfaces/inner_api/common", "//foundation/graphic/graphic_2d/utils/buffer_handle/export", "//foundation/multimedia/player_framework/interfaces/inner_api/native", - "//foundation/communication/dsoftbus/interfaces/kits/transport", ] } -- Gitee From b844d1ebd0e2660e5cb42e431568d5a0526902a6 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 22:38:39 +0800 Subject: [PATCH 24/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- services/screenservice/sourceservice/BUILD.gn | 5 +---- services/screentransport/screensinktrans/BUILD.gn | 2 +- services/screentransport/screensourcetrans/BUILD.gn | 2 +- .../test/unittest/screensinktrans/BUILD.gn | 1 - .../test/unittest/screensourcetrans/BUILD.gn | 9 +++++---- .../test/unittest/screentranstestutils/BUILD.gn | 1 - 6 files changed, 8 insertions(+), 12 deletions(-) diff --git a/services/screenservice/sourceservice/BUILD.gn b/services/screenservice/sourceservice/BUILD.gn index edf5b2db..6d68fc6b 100644 --- a/services/screenservice/sourceservice/BUILD.gn +++ b/services/screenservice/sourceservice/BUILD.gn @@ -23,7 +23,6 @@ ohos_shared_library("distributed_screen_source") { "//foundation/graphic/graphic_2d/interfaces/innerkits/surface", "//third_party/json/include", "//third_party/libjpeg-turbo", - "//utils/system/safwk/native/include", "${distributedhardwarefwk_path}/interfaces/inner_kits/include", "${windowmanager_path}/interfaces/innerkits/dm", "${fwk_common_path}/utils/include", @@ -34,9 +33,6 @@ ohos_shared_library("distributed_screen_source") { "./dscreenservice/include", "./dscreenservice/include/callback", "./dscreenmgr/include", - "//drivers/peripheral/display/interfaces/include", - "//drivers/peripheral/base", - "//foundation/graphic/graphic_2d/utils/buffer_handle/export", "${interfaces_path}/innerkits/native_cpp/screen_sink/include", "${interfaces_path}/innerkits/native_cpp/screen_sink/include/callback", "${interfaces_path}/innerkits/native_cpp/screen_source/include", @@ -82,6 +78,7 @@ ohos_shared_library("distributed_screen_source") { external_deps = [ "c_utils:utils", + "drivers_peripheral_display:hdi_display_device", "graphic_standard:libcomposer", "graphic_standard:surface", "ipc:ipc_core", diff --git a/services/screentransport/screensinktrans/BUILD.gn b/services/screentransport/screensinktrans/BUILD.gn index c3f6a53c..46b00a47 100644 --- a/services/screentransport/screensinktrans/BUILD.gn +++ b/services/screentransport/screensinktrans/BUILD.gn @@ -19,7 +19,6 @@ import( ohos_shared_library("distributed_screen_sinktrans") { include_dirs = [ "//base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include", - "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", "//third_party/json/include", "//third_party/libjpeg", "//foundation/graphic/graphic_2d/interfaces/innerkits/surface", @@ -81,6 +80,7 @@ ohos_shared_library("distributed_screen_sinktrans") { "c_utils:utils", "dsoftbus:softbus_client", "hisysevent_native:libhisysevent", + "hisysevent_native:libhitracechain", "hitrace_native:hitrace_meter", "hiviewdfx_hilog_native:libhilog", "multimedia_player_framework:media_client", diff --git a/services/screentransport/screensourcetrans/BUILD.gn b/services/screentransport/screensourcetrans/BUILD.gn index 67a6f364..7babf89e 100644 --- a/services/screentransport/screensourcetrans/BUILD.gn +++ b/services/screentransport/screensourcetrans/BUILD.gn @@ -19,7 +19,6 @@ import( ohos_shared_library("distributed_screen_sourcetrans") { include_dirs = [ "//base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include", - "//base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter", "//third_party/json/include", "//third_party/libjpeg-turbo", "${fwk_common_path}/utils/include", @@ -79,6 +78,7 @@ ohos_shared_library("distributed_screen_sourcetrans") { "c_utils:utils", "dsoftbus:softbus_client", "hisysevent_native:libhisysevent", + "hisysevent_native:libhitracechain", "hitrace_native:hitrace_meter", "hiviewdfx_hilog_native:libhilog", "multimedia_player_framework:media_client", diff --git a/services/screentransport/test/unittest/screensinktrans/BUILD.gn b/services/screentransport/test/unittest/screensinktrans/BUILD.gn index 8b67f1da..2725a621 100644 --- a/services/screentransport/test/unittest/screensinktrans/BUILD.gn +++ b/services/screentransport/test/unittest/screensinktrans/BUILD.gn @@ -43,7 +43,6 @@ config("module_private_config") { "${services_path}/screentransport/test/unittest/screentranstestutils/include", "//foundation/communication/dsoftbus/interfaces/kits/transport", "//foundation/graphic/graphic_2d/utils/buffer_handle/export", - "//foundation/multimedia/player_framework/interfaces/inner_api/native", "//drivers/peripheral/base", ] } diff --git a/services/screentransport/test/unittest/screensourcetrans/BUILD.gn b/services/screentransport/test/unittest/screensourcetrans/BUILD.gn index 2b87a6ef..f9ec63ed 100644 --- a/services/screentransport/test/unittest/screensourcetrans/BUILD.gn +++ b/services/screentransport/test/unittest/screensourcetrans/BUILD.gn @@ -45,13 +45,10 @@ config("module_private_config") { "${services_path}/screentransport/test/unittest/screentranstestutils/include", "${services_path}/softbusadapter/include", "//drivers/peripheral/base", - "//drivers/peripheral/display/interfaces/include", - "//foundation/communication/dsoftbus/interfaces/kits/transport", "//foundation/communication/ipc/interfaces/innerkits/ipc_core/include", "//foundation/graphic/graphic_2d/interfaces/inner_api/surface", "//foundation/graphic/graphic_2d/interfaces/inner_api/common", "//foundation/graphic/graphic_2d/utils/buffer_handle/export", - "//foundation/multimedia/player_framework/interfaces/inner_api/native", ] } @@ -69,7 +66,11 @@ ohos_unittest("SourceTransTest") { "//third_party/googletest:gtest_main", ] - external_deps = [ "c_utils:utils" ] + external_deps = [ + "c_utils:utils", + "drivers_peripheral_display:hdi_display_device", + "multimedia_player_framework:media_client", + ] } group("source_trans_test") { diff --git a/services/screentransport/test/unittest/screentranstestutils/BUILD.gn b/services/screentransport/test/unittest/screentranstestutils/BUILD.gn index 62727fd0..c9a62057 100644 --- a/services/screentransport/test/unittest/screentranstestutils/BUILD.gn +++ b/services/screentransport/test/unittest/screentranstestutils/BUILD.gn @@ -47,7 +47,6 @@ config("module_private_config") { "${services_path}/softbusadapter/include", "//drivers/peripheral/display/interfaces/include", "//drivers/peripheral/base", - "//foundation/communication/dsoftbus/interfaces/kits/transport", "//foundation/communication/ipc/interfaces/innerkits/ipc_core/include", "//foundation/graphic/graphic_2d/interfaces/inner_api/surface", "//foundation/graphic/graphic_2d/interfaces/inner_api/common", -- Gitee From 963dc676ffd833ce2ce712c62ee73baadb7343f0 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sat, 1 Apr 2023 23:27:40 +0800 Subject: [PATCH 25/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- services/screentransport/screensinktrans/BUILD.gn | 1 - services/screentransport/screensourcetrans/BUILD.gn | 1 - .../screentransport/test/unittest/screensourcetrans/BUILD.gn | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/services/screentransport/screensinktrans/BUILD.gn b/services/screentransport/screensinktrans/BUILD.gn index 46b00a47..15dc171b 100644 --- a/services/screentransport/screensinktrans/BUILD.gn +++ b/services/screentransport/screensinktrans/BUILD.gn @@ -80,7 +80,6 @@ ohos_shared_library("distributed_screen_sinktrans") { "c_utils:utils", "dsoftbus:softbus_client", "hisysevent_native:libhisysevent", - "hisysevent_native:libhitracechain", "hitrace_native:hitrace_meter", "hiviewdfx_hilog_native:libhilog", "multimedia_player_framework:media_client", diff --git a/services/screentransport/screensourcetrans/BUILD.gn b/services/screentransport/screensourcetrans/BUILD.gn index 7babf89e..53502d74 100644 --- a/services/screentransport/screensourcetrans/BUILD.gn +++ b/services/screentransport/screensourcetrans/BUILD.gn @@ -78,7 +78,6 @@ ohos_shared_library("distributed_screen_sourcetrans") { "c_utils:utils", "dsoftbus:softbus_client", "hisysevent_native:libhisysevent", - "hisysevent_native:libhitracechain", "hitrace_native:hitrace_meter", "hiviewdfx_hilog_native:libhilog", "multimedia_player_framework:media_client", diff --git a/services/screentransport/test/unittest/screensourcetrans/BUILD.gn b/services/screentransport/test/unittest/screensourcetrans/BUILD.gn index f9ec63ed..ccce9895 100644 --- a/services/screentransport/test/unittest/screensourcetrans/BUILD.gn +++ b/services/screentransport/test/unittest/screensourcetrans/BUILD.gn @@ -69,7 +69,7 @@ ohos_unittest("SourceTransTest") { external_deps = [ "c_utils:utils", "drivers_peripheral_display:hdi_display_device", - "multimedia_player_framework:media_client", + "multimedia_player_framework:media_client", ] } -- Gitee From c46aab77c4531fa63082aa69d74f4cb13b3ae264 Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sun, 2 Apr 2023 10:26:13 +0800 Subject: [PATCH 26/27] =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangwei_814916 --- services/common/imageJpeg/src/jpeg_image_processor.cpp | 8 +++----- .../screendatachannel/src/screen_data_channel_impl.cpp | 2 +- .../decoder/src/image_sink_decoder.cpp | 7 ++++--- .../encoder/src/image_source_encoder.cpp | 5 +++-- .../screensourceprocessor/src/image_source_processor.cpp | 1 + .../screensourcetrans/src/screen_source_trans.cpp | 3 +-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/services/common/imageJpeg/src/jpeg_image_processor.cpp b/services/common/imageJpeg/src/jpeg_image_processor.cpp index 8c6f6d25..5fa6337c 100644 --- a/services/common/imageJpeg/src/jpeg_image_processor.cpp +++ b/services/common/imageJpeg/src/jpeg_image_processor.cpp @@ -138,7 +138,7 @@ void JpegImageProcessor::EncodeDamageData(sptr &surfaceBuffer, surfaceAddrIdx += configParam_.GetScreenWidth() * RGBA_CHROMA; } uint32_t jpegSize = CompressRgbaToJpeg(damage, partialBuffer, data); - DHLOGI("EncodeDamageData jpegSize %." PRId32, jpegSize); + DHLOGI("CompressRgbaToJpeg end, jpegSize %." PRId32, jpegSize); delete [] partialBuffer; } @@ -163,7 +163,7 @@ int32_t JpegImageProcessor::DecodeDamageData(const std::shared_ptr & } offset += item.dirtySize; uint8_t *dirtyImageData = new uint8_t[item.width * item.height * RGB_CHROMA] {0}; - DHLOGI("%s: CompressRgbaToJpeg.", LOG_TAG); + DHLOGI("%s: DecompressJpegToNV12.", LOG_TAG); DecompressJpegToNV12(item.dirtySize, jpegData, dirtyImageData); DHLOGI("%s: DecompressJpegToNV12 success.", LOG_TAG); ret = ReplaceDamage2LastFrame(lastFrame, dirtyImageData, item); @@ -216,21 +216,19 @@ int32_t JpegImageProcessor::ReplaceDamage2LastFrame(uint8_t *lastFrame, uint8_t uint32_t JpegImageProcessor::CompressRgbaToJpeg(const OHOS::Rect &damage, uint8_t *inputData, std::shared_ptr &data) { + DHLOGI("%s: CompressRgbaToJpeg.", LOG_TAG); jpeg_compress_struct cinfo; jpeg_error_mgr jerr; JSAMPROW row_pointer[1]; - cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); unsigned char *outBuffer = nullptr; unsigned long outSize = 0; jpeg_mem_dest(&cinfo, &outBuffer, &outSize); - cinfo.image_width = damage.w; cinfo.image_height = damage.h; cinfo.input_components = RGB_CHROMA; cinfo.in_color_space = JCS_RGB; - jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, JPEG_QUALITY, TRUE); jpeg_start_compress(&cinfo, TRUE); diff --git a/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp b/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp index 3e0b85b0..166b77e4 100644 --- a/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp +++ b/services/screentransport/screendatachannel/src/screen_data_channel_impl.cpp @@ -288,7 +288,7 @@ void ScreenDataChannelImpl::OnBytesReceived(int32_t sessionId, const void *data, void ScreenDataChannelImpl::OnStreamReceived(int32_t sessionId, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param) { - DHLOGI("%s: OnStreamReceived.", LOG_TAG); + DHLOGI("%s: OnStreamReceived, receiv data from softbus.", LOG_TAG); if (data == nullptr) { DHLOGE("%s: Stream data is null", LOG_TAG); return; diff --git a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp index 17f9e031..687c2527 100644 --- a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp +++ b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp @@ -93,7 +93,7 @@ uint8_t *ImageSinkDecoder::GetLastFrame() sptr ImageSinkDecoder::GetWinSurfaceBuffer() { - DHLOGI("%s: ConsumeSurface.", LOG_TAG); + DHLOGI("%s: GetWinSurfaceBuffer.", LOG_TAG); sptr windowSurfaceBuffer = nullptr; int32_t releaseFence = -1; OHOS::BufferRequestConfig requestConfig = { @@ -197,6 +197,7 @@ void ImageSinkDecoder::ConsumeSurface() windowSurface_->CancelBuffer(windowSurfaceBuffer); return; } + DHLOGI("%s: ConsumeSurface sucess, send NV12 to window.", LOG_TAG); surfaceErr = windowSurface_->FlushBuffer(windowSurfaceBuffer, -1, flushConfig); if (surfaceErr != SURFACE_ERROR_OK) { DHLOGE("%s: windowSurface_ flush buffer failed.", LOG_TAG); @@ -209,7 +210,7 @@ void ImageSinkDecoder::ConsumeSurface() void ConsumBufferListener::OnBufferAvailable() { - DHLOGI("%s: OnBufferAvailable.", LOG_TAG); + DHLOGI("%s: OnBufferAvailable, receive NV12 data from decoder.", LOG_TAG); decoder_->ConsumeSurface(); } @@ -530,7 +531,7 @@ int32_t ImageSinkDecoder::ProcessData(const std::shared_ptr &screenD return ERR_DH_SCREEN_CODEC_SURFACE_ERROR; } - DHLOGD("%s: Decode screen data.", LOG_TAG); + DHLOGD("%s: Decode screen data. send data to H264 decoder", LOG_TAG); Media::AVCodecBufferInfo bufferInfo; bufferInfo.presentationTimeUs = 0; bufferInfo.size = static_cast(screenData->Capacity()); diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index 86bdfffd..de38097a 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -41,7 +41,7 @@ namespace OHOS { namespace DistributedHardware { void ConsumerBufferListener::OnBufferAvailable() { - DHLOGI("%s: OnBufferAvailable.", LOG_TAG); + DHLOGI("%s: OnBufferAvailable, receiv data from RS.", LOG_TAG); encoder_->ConsumeSurface(); } @@ -229,6 +229,7 @@ int32_t ImageSourceEncoder::FeedEncoderData(sptr &surfaceBuffer) return ret; } BufferFlushConfig flushConfig = { {0, 0, encoderSurfaceBuffer->GetWidth(), encoderSurfaceBuffer->GetHeight()}, 0}; + DHLOGI("%s: FeedEncoderData to H264 encoder.", LOG_TAG); SurfaceError surfaceErr = encoderSurface_->FlushBuffer(encoderSurfaceBuffer, -1, flushConfig); if (surfaceErr != SURFACE_ERROR_OK) { DHLOGE("%s: encoderSurface_ flush buffer failed.", LOG_TAG); @@ -412,7 +413,7 @@ void ImageSourceEncoder::OnError(Media::AVCodecErrorType errorType, int32_t erro void ImageSourceEncoder::OnOutputBufferAvailable(uint32_t index, Media::AVCodecBufferInfo info, Media::AVCodecBufferFlag flag) { - DHLOGD("%s: OnOutputBufferAvailable.", LOG_TAG); + DHLOGD("%s: OnOutputBufferAvailable, receiv H264 data from encoder.", LOG_TAG); std::shared_ptr listener = imageProcessorListener_.lock(); if (listener == nullptr) { DHLOGE("%s: Processor listener is null", LOG_TAG); diff --git a/services/screentransport/screensourceprocessor/src/image_source_processor.cpp b/services/screentransport/screensourceprocessor/src/image_source_processor.cpp index 6b149882..34c4bfcf 100644 --- a/services/screentransport/screensourceprocessor/src/image_source_processor.cpp +++ b/services/screentransport/screensourceprocessor/src/image_source_processor.cpp @@ -115,6 +115,7 @@ sptr ImageSourceProcessor::GetConsumerSurface() int32_t ImageSourceProcessor::ProcessFullImage(sptr &surfaceBuffer) { + DHLOGI("%s: ProcessFullImage.", LOG_TAG); if (surfaceBuffer == nullptr) { DHLOGE("%s: Process surfaceBuffer is null.", LOG_TAG); return ERR_DH_SCREEN_SURFACE_BUFFER_INVALIED; diff --git a/services/screentransport/screensourcetrans/src/screen_source_trans.cpp b/services/screentransport/screensourcetrans/src/screen_source_trans.cpp index cfb8f623..66540c7f 100644 --- a/services/screentransport/screensourcetrans/src/screen_source_trans.cpp +++ b/services/screentransport/screensourcetrans/src/screen_source_trans.cpp @@ -414,7 +414,7 @@ void ScreenSourceTrans::OnDamageProcessDone(sptr &surfaceBuffer, void ScreenSourceTrans::OnImageProcessDone(const std::shared_ptr &data) { - DHLOGD("%s: OnProcessorDataReceived received data from data processor.", LOG_TAG); + DHLOGD("%s: OnImageProcessDone.", LOG_TAG); std::lock_guard lck(dataQueueMtx_); while (dataQueue_.size() >= DATA_QUEUE_MAX_SIZE) { DHLOGE("%s: Data queue overflow.", LOG_TAG); @@ -468,7 +468,6 @@ void ScreenSourceTrans::FeedChannelData() if (ret != DH_SUCCESS) { DHLOGD("%s:Send data failed.", LOG_TAG); } - DHLOGD("%s: FeedChannelData success.", LOG_TAG); } } } // namespace DistributedHardware -- Gitee From 2a6d6ed3bda15e0dc815b05e481078e4461f46ff Mon Sep 17 00:00:00 2001 From: yangwei_814916 Date: Sun, 2 Apr 2023 12:22:05 +0800 Subject: [PATCH 27/27] Signed-off-by:yangwei Signed-off-by: yangwei_814916 --- .../screensourceprocessor/encoder/src/image_source_encoder.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index de38097a..ffb8ff6f 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -212,7 +212,6 @@ sptr ImageSourceEncoder::GetEncoderInputSurfaceBuffer() int32_t ImageSourceEncoder::FeedEncoderData(sptr &surfaceBuffer) { - DHLOGI("%s: FeedEncoderData.", LOG_TAG); sptr encoderSurfaceBuffer = GetEncoderInputSurfaceBuffer(); if (encoderSurfaceBuffer == nullptr) { DHLOGE("Get encoder input producer surface buffer failed."); -- Gitee