1 /*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "incremental_source_stream.h"
17
18 #include <algorithm>
19 #include <vector>
20 #include "image_log.h"
21 #ifndef _WIN32
22 #include "securec.h"
23 #else
24 #include "memory.h"
25 #endif
26
27 #undef LOG_DOMAIN
28 #define LOG_DOMAIN LOG_TAG_DOMAIN_ID_IMAGE
29
30 #undef LOG_TAG
31 #define LOG_TAG "IncrementalSourceStream"
32
33 namespace OHOS {
34 namespace Media {
35 using namespace std;
36 using namespace ImagePlugin;
37 const uint32_t MAX_SOURCE_SIZE = 1024 * 1024 * 1024;
38
IncrementalSourceStream(IncrementalMode mode)39 IncrementalSourceStream::IncrementalSourceStream(IncrementalMode mode)
40 : incrementalMode_(mode), isFinalize_(false), dataSize_(0), dataOffset_(0)
41 {}
42
CreateSourceStream(IncrementalMode mode)43 unique_ptr<IncrementalSourceStream> IncrementalSourceStream::CreateSourceStream(IncrementalMode mode)
44 {
45 IMAGE_LOGD("[IncrementalSourceStream]mode:%{public}d.", mode);
46 return make_unique<IncrementalSourceStream>(mode);
47 }
48
Read(uint32_t desiredSize,DataStreamBuffer & outData)49 bool IncrementalSourceStream::Read(uint32_t desiredSize, DataStreamBuffer &outData)
50 {
51 if (!Peek(desiredSize, outData)) {
52 IMAGE_LOGE("[IncrementalSourceStream]read fail.");
53 return false;
54 }
55 dataOffset_ += outData.dataSize;
56 return true;
57 }
58
Peek(uint32_t desiredSize,DataStreamBuffer & outData)59 bool IncrementalSourceStream::Peek(uint32_t desiredSize, DataStreamBuffer &outData)
60 {
61 if (desiredSize == 0) {
62 IMAGE_LOGE("[IncrementalSourceStream]input the parameter exception.");
63 return false;
64 }
65 if (sourceData_.empty() || dataSize_ == 0 || dataOffset_ >= dataSize_) {
66 IMAGE_LOGE("[IncrementalSourceStream]source data exception. dataSize_:%{public}zu,"
67 "dataOffset_:%{public}zu.", dataSize_, dataOffset_);
68 return false;
69 }
70 outData.bufferSize = dataSize_ - dataOffset_;
71 if (desiredSize > dataSize_ - dataOffset_) {
72 desiredSize = dataSize_ - dataOffset_;
73 }
74 outData.dataSize = desiredSize;
75 outData.inputStreamBuffer = sourceData_.data() + dataOffset_;
76 IMAGE_LOGD("[IncrementalSourceStream]Peek end. desiredSize:%{public}u, offset:%{public}zu,"
77 "dataSize_:%{public}zu,dataOffset_:%{public}zu.", desiredSize, dataOffset_, dataSize_, dataOffset_);
78 return true;
79 }
80
Read(uint32_t desiredSize,uint8_t * outBuffer,uint32_t bufferSize,uint32_t & readSize)81 bool IncrementalSourceStream::Read(uint32_t desiredSize, uint8_t *outBuffer, uint32_t bufferSize, uint32_t &readSize)
82 {
83 if (!Peek(desiredSize, outBuffer, bufferSize, readSize)) {
84 IMAGE_LOGE("[IncrementalSourceStream]read fail.");
85 return false;
86 }
87 dataOffset_ += readSize;
88 return true;
89 }
90
Peek(uint32_t desiredSize,uint8_t * outBuffer,uint32_t bufferSize,uint32_t & readSize)91 bool IncrementalSourceStream::Peek(uint32_t desiredSize, uint8_t *outBuffer, uint32_t bufferSize, uint32_t &readSize)
92 {
93 if (desiredSize == 0 || outBuffer == nullptr || desiredSize > bufferSize) {
94 IMAGE_LOGE("[IncrementalSourceStream]input parameter exception, desiredSize:%{public}u,"
95 "bufferSize:%{public}u.", desiredSize, bufferSize);
96 return false;
97 }
98 if (sourceData_.empty() || dataSize_ == 0 || dataOffset_ >= dataSize_) {
99 IMAGE_LOGE("[IncrementalSourceStream]source data exception. dataSize_:%{public}zu,"
100 "dataOffset_:%{public}zu.", dataSize_, dataOffset_);
101 return false;
102 }
103 if (desiredSize > (dataSize_ - dataOffset_)) {
104 desiredSize = dataSize_ - dataOffset_;
105 }
106 errno_t ret = memcpy_s(outBuffer, bufferSize, sourceData_.data() + dataOffset_, desiredSize);
107 if (ret != 0) {
108 IMAGE_LOGE("[IncrementalSourceStream]copy data fail, ret:%{public}d, bufferSize:%{public}u,"
109 "offset:%{public}zu, desiredSize:%{public}u, dataSize:%{public}zu.", ret, bufferSize, dataOffset_,
110 desiredSize, dataSize_);
111 return false;
112 }
113 readSize = desiredSize;
114 return true;
115 }
116
Tell()117 uint32_t IncrementalSourceStream::Tell()
118 {
119 return dataOffset_;
120 }
121
Seek(uint32_t position)122 bool IncrementalSourceStream::Seek(uint32_t position)
123 {
124 if (position >= dataSize_) {
125 IMAGE_LOGE("[IncrementalSourceStream]Seek the position greater than the Data Size.");
126 return false;
127 }
128 dataOffset_ = position;
129 return true;
130 }
131
UpdateData(const uint8_t * data,uint32_t size,bool isCompleted)132 uint32_t IncrementalSourceStream::UpdateData(const uint8_t *data, uint32_t size, bool isCompleted)
133 {
134 if (data == nullptr || size > MAX_SOURCE_SIZE) {
135 IMAGE_LOGE("[IncrementalSourceStream]input the parameter exception.");
136 return ERR_IMAGE_DATA_ABNORMAL;
137 }
138 if (size == 0) {
139 IMAGE_LOGD("[IncrementalSourceStream]no need to update data.");
140 return SUCCESS;
141 }
142 if (incrementalMode_ == IncrementalMode::INCREMENTAL_DATA) {
143 vector<uint8_t> newData;
144 newData.resize(size);
145 copy(data, data + size, newData.begin());
146 sourceData_.resize(dataSize_ + size);
147 sourceData_.insert(sourceData_.begin() + dataSize_, newData.begin(), newData.end());
148 dataSize_ += size;
149 isFinalize_ = isCompleted;
150 } else {
151 sourceData_.clear();
152 sourceData_.resize(size);
153 dataSize_ = size;
154 copy(data, data + size, sourceData_.begin());
155 isFinalize_ = true;
156 }
157 return SUCCESS;
158 }
159
IsStreamCompleted()160 bool IncrementalSourceStream::IsStreamCompleted()
161 {
162 return isFinalize_;
163 }
164
GetStreamSize()165 size_t IncrementalSourceStream::GetStreamSize()
166 {
167 return dataSize_;
168 }
169
GetDataPtr()170 uint8_t *IncrementalSourceStream::GetDataPtr()
171 {
172 return sourceData_.data();
173 }
174
175 } // namespace Media
176 } // namespace OHOS
177