166f3657fSopenharmony_ci/* 266f3657fSopenharmony_ci * Copyright (c) 2022-2024 Huawei Device Co., Ltd. 366f3657fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 466f3657fSopenharmony_ci * you may not use this file except in compliance with the License. 566f3657fSopenharmony_ci * You may obtain a copy of the License at 666f3657fSopenharmony_ci * 766f3657fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 866f3657fSopenharmony_ci * 966f3657fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1066f3657fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1166f3657fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1266f3657fSopenharmony_ci * See the License for the specific language governing permissions and 1366f3657fSopenharmony_ci * limitations under the License. 1466f3657fSopenharmony_ci */ 1566f3657fSopenharmony_ci 1666f3657fSopenharmony_ci#include "data_buffer.h" 1766f3657fSopenharmony_ci 1866f3657fSopenharmony_ci#include "dscreen_errcode.h" 1966f3657fSopenharmony_ci#include "dscreen_log.h" 2066f3657fSopenharmony_ci#include <new> 2166f3657fSopenharmony_ci#include <securec.h> 2266f3657fSopenharmony_ci 2366f3657fSopenharmony_cinamespace OHOS { 2466f3657fSopenharmony_cinamespace DistributedHardware { 2566f3657fSopenharmony_ciDataBuffer::DataBuffer(size_t capacity) 2666f3657fSopenharmony_ci{ 2766f3657fSopenharmony_ci if (capacity != 0) { 2866f3657fSopenharmony_ci data_ = new (std::nothrow) uint8_t[capacity] {0}; 2966f3657fSopenharmony_ci if (data_ != nullptr) { 3066f3657fSopenharmony_ci capacity_ = capacity; 3166f3657fSopenharmony_ci } 3266f3657fSopenharmony_ci } 3366f3657fSopenharmony_ci dataType_ = 0; 3466f3657fSopenharmony_ci} 3566f3657fSopenharmony_ci 3666f3657fSopenharmony_ciDataBuffer::~DataBuffer() 3766f3657fSopenharmony_ci{ 3866f3657fSopenharmony_ci if (data_ != nullptr) { 3966f3657fSopenharmony_ci delete [] data_; 4066f3657fSopenharmony_ci data_ = nullptr; 4166f3657fSopenharmony_ci } 4266f3657fSopenharmony_ci dirtyRectVec_.clear(); 4366f3657fSopenharmony_ci dataType_ = 0; 4466f3657fSopenharmony_ci frameNumber_ = 0; 4566f3657fSopenharmony_ci capacity_ = 0; 4666f3657fSopenharmony_ci} 4766f3657fSopenharmony_ci 4866f3657fSopenharmony_cisize_t DataBuffer::Capacity() const 4966f3657fSopenharmony_ci{ 5066f3657fSopenharmony_ci return capacity_; 5166f3657fSopenharmony_ci} 5266f3657fSopenharmony_ci 5366f3657fSopenharmony_ciuint8_t *DataBuffer::Data() const 5466f3657fSopenharmony_ci{ 5566f3657fSopenharmony_ci return data_; 5666f3657fSopenharmony_ci} 5766f3657fSopenharmony_ci 5866f3657fSopenharmony_civoid DataBuffer::SetSize(size_t size) 5966f3657fSopenharmony_ci{ 6066f3657fSopenharmony_ci capacity_ = size; 6166f3657fSopenharmony_ci} 6266f3657fSopenharmony_ci 6366f3657fSopenharmony_civoid DataBuffer::SetDataType(uint8_t dataType) 6466f3657fSopenharmony_ci{ 6566f3657fSopenharmony_ci dataType_ = dataType; 6666f3657fSopenharmony_ci} 6766f3657fSopenharmony_ci 6866f3657fSopenharmony_ciuint8_t DataBuffer::DataType() 6966f3657fSopenharmony_ci{ 7066f3657fSopenharmony_ci return dataType_; 7166f3657fSopenharmony_ci} 7266f3657fSopenharmony_ci 7366f3657fSopenharmony_civoid DataBuffer::SetDataNumber(size_t number) 7466f3657fSopenharmony_ci{ 7566f3657fSopenharmony_ci frameNumber_ = number; 7666f3657fSopenharmony_ci} 7766f3657fSopenharmony_ci 7866f3657fSopenharmony_cisize_t DataBuffer::DataNumber() 7966f3657fSopenharmony_ci{ 8066f3657fSopenharmony_ci return frameNumber_; 8166f3657fSopenharmony_ci} 8266f3657fSopenharmony_ci 8366f3657fSopenharmony_civoid DataBuffer::ResetCapcity(size_t capacity) 8466f3657fSopenharmony_ci{ 8566f3657fSopenharmony_ci DHLOGI("%{public}s: ResetCapcity.", DSCREEN_LOG_TAG); 8666f3657fSopenharmony_ci if (capacity < capacity_) { 8766f3657fSopenharmony_ci return; 8866f3657fSopenharmony_ci } 8966f3657fSopenharmony_ci delete [] data_; 9066f3657fSopenharmony_ci data_ = new (std::nothrow) uint8_t[capacity] {0}; 9166f3657fSopenharmony_ci if (data_ == nullptr) { 9266f3657fSopenharmony_ci capacity_ = 0; 9366f3657fSopenharmony_ci } else { 9466f3657fSopenharmony_ci capacity_ = capacity; 9566f3657fSopenharmony_ci } 9666f3657fSopenharmony_ci} 9766f3657fSopenharmony_ci 9866f3657fSopenharmony_civoid DataBuffer::AddData(size_t dataSize, unsigned char* &inputData) 9966f3657fSopenharmony_ci{ 10066f3657fSopenharmony_ci if (inputData == nullptr) { 10166f3657fSopenharmony_ci return; 10266f3657fSopenharmony_ci } 10366f3657fSopenharmony_ci int32_t ret = memcpy_s(data_ + capacity_, dataSize, inputData, dataSize); 10466f3657fSopenharmony_ci if (ret != EOK) { 10566f3657fSopenharmony_ci DHLOGE("%{public}s: in AddData memcpy data failed, ret: %{public}" PRId32, DSCREEN_LOG_TAG, ret); 10666f3657fSopenharmony_ci return; 10766f3657fSopenharmony_ci } 10866f3657fSopenharmony_ci capacity_ += dataSize; 10966f3657fSopenharmony_ci} 11066f3657fSopenharmony_ci 11166f3657fSopenharmony_civoid DataBuffer::AddDirtyRect(DirtyRect rect) 11266f3657fSopenharmony_ci{ 11366f3657fSopenharmony_ci dirtyRectVec_.push_back(rect); 11466f3657fSopenharmony_ci} 11566f3657fSopenharmony_ci 11666f3657fSopenharmony_cistd::vector<DirtyRect> DataBuffer::GetDirtyRectVec() 11766f3657fSopenharmony_ci{ 11866f3657fSopenharmony_ci return dirtyRectVec_; 11966f3657fSopenharmony_ci} 12066f3657fSopenharmony_ci 12166f3657fSopenharmony_ciint32_t DataBuffer::GetData(int32_t offset, int32_t datasize, uint8_t* &output) 12266f3657fSopenharmony_ci{ 12366f3657fSopenharmony_ci if (static_cast<unsigned long>(offset + datasize) > capacity_ || output == nullptr) { 12466f3657fSopenharmony_ci DHLOGE("DataBuffer GetData parameter invalid."); 12566f3657fSopenharmony_ci return ERR_DH_SCREEN_INPUT_PARAM_INVALID; 12666f3657fSopenharmony_ci } 12766f3657fSopenharmony_ci int32_t ret = memcpy_s(output, datasize, data_ + offset, datasize); 12866f3657fSopenharmony_ci if (ret != EOK) { 12966f3657fSopenharmony_ci DHLOGE("GetData memcpy data failed, ret: %{public}" PRId32, ret); 13066f3657fSopenharmony_ci return ret; 13166f3657fSopenharmony_ci } 13266f3657fSopenharmony_ci return DH_SUCCESS; 13366f3657fSopenharmony_ci} 13466f3657fSopenharmony_ci} // namespace DistributedHardware 13566f3657fSopenharmony_ci} // namespace OHOS