• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 namespace OHOS {
28 namespace Media {
29 using namespace OHOS::HiviewDFX;
30 using namespace std;
31 using namespace ImagePlugin;
32 
IncrementalSourceStream(IncrementalMode mode)33 IncrementalSourceStream::IncrementalSourceStream(IncrementalMode mode)
34     : incrementalMode_(mode), isFinalize_(false), dataSize_(0), dataOffset_(0)
35 {}
36 
CreateSourceStream(IncrementalMode mode)37 unique_ptr<IncrementalSourceStream> IncrementalSourceStream::CreateSourceStream(IncrementalMode mode)
38 {
39     IMAGE_LOGD("[IncrementalSourceStream]mode:%{public}d.", mode);
40     return (unique_ptr<IncrementalSourceStream>(new IncrementalSourceStream(mode)));
41 }
42 
Read(uint32_t desiredSize,DataStreamBuffer & outData)43 bool IncrementalSourceStream::Read(uint32_t desiredSize, DataStreamBuffer &outData)
44 {
45     if (!Peek(desiredSize, outData)) {
46         IMAGE_LOGE("[IncrementalSourceStream]read fail.");
47         return false;
48     }
49     dataOffset_ += outData.dataSize;
50     return true;
51 }
52 
Peek(uint32_t desiredSize,DataStreamBuffer & outData)53 bool IncrementalSourceStream::Peek(uint32_t desiredSize, DataStreamBuffer &outData)
54 {
55     if (desiredSize == 0) {
56         IMAGE_LOGE("[IncrementalSourceStream]input the parameter exception.");
57         return false;
58     }
59     if (sourceData_.empty() || dataSize_ == 0 || dataOffset_ >= dataSize_) {
60         IMAGE_LOGE("[IncrementalSourceStream]source data exception. dataSize_:%{public}zu, dataOffset_:%{public}zu.",
61                    dataSize_, dataOffset_);
62         return false;
63     }
64     outData.bufferSize = dataSize_ - dataOffset_;
65     if (desiredSize > dataSize_ - dataOffset_) {
66         desiredSize = dataSize_ - dataOffset_;
67     }
68     outData.dataSize = desiredSize;
69     outData.inputStreamBuffer = sourceData_.data() + dataOffset_;
70     IMAGE_LOGD("[IncrementalSourceStream]Peek end. desiredSize:%{public}u, offset:%{public}zu, dataSize_:%{public}zu, \
71                dataOffset_:%{public}zu.",
72                desiredSize, dataOffset_, dataSize_, dataOffset_);
73     return true;
74 }
75 
Read(uint32_t desiredSize,uint8_t * outBuffer,uint32_t bufferSize,uint32_t & readSize)76 bool IncrementalSourceStream::Read(uint32_t desiredSize, uint8_t *outBuffer, uint32_t bufferSize, uint32_t &readSize)
77 {
78     if (!Peek(desiredSize, outBuffer, bufferSize, readSize)) {
79         IMAGE_LOGE("[IncrementalSourceStream]read fail.");
80         return false;
81     }
82     dataOffset_ += readSize;
83     return true;
84 }
85 
Peek(uint32_t desiredSize,uint8_t * outBuffer,uint32_t bufferSize,uint32_t & readSize)86 bool IncrementalSourceStream::Peek(uint32_t desiredSize, uint8_t *outBuffer, uint32_t bufferSize, uint32_t &readSize)
87 {
88     if (desiredSize == 0 || outBuffer == nullptr || desiredSize > bufferSize) {
89         IMAGE_LOGE("[IncrementalSourceStream]input parameter exception, desiredSize:%{public}u, bufferSize:%{public}u.",
90                    desiredSize, bufferSize);
91         return false;
92     }
93     if (sourceData_.empty() || dataSize_ == 0 || dataOffset_ >= dataSize_) {
94         IMAGE_LOGE("[IncrementalSourceStream]source data exception. dataSize_:%{public}zu, dataOffset_:%{public}zu.",
95                    dataSize_, dataOffset_);
96         return false;
97     }
98     if (desiredSize > (dataSize_ - dataOffset_)) {
99         desiredSize = dataSize_ - dataOffset_;
100     }
101     errno_t ret = memcpy_s(outBuffer, bufferSize, sourceData_.data() + dataOffset_, desiredSize);
102     if (ret != 0) {
103         IMAGE_LOGE("[IncrementalSourceStream]copy data fail, ret:%{public}d, bufferSize:%{public}u, \
104                     offset:%{public}zu, desiredSize:%{public}u, dataSize:%{public}zu.",
105                    ret, bufferSize, dataOffset_, desiredSize, dataSize_);
106         return false;
107     }
108     readSize = desiredSize;
109     return true;
110 }
111 
Tell()112 uint32_t IncrementalSourceStream::Tell()
113 {
114     return dataOffset_;
115 }
116 
Seek(uint32_t position)117 bool IncrementalSourceStream::Seek(uint32_t position)
118 {
119     if (position >= dataSize_) {
120         IMAGE_LOGE("[IncrementalSourceStream]Seek the position greater than the Data Size.");
121         return false;
122     }
123     dataOffset_ = position;
124     return true;
125 }
126 
UpdateData(const uint8_t * data,uint32_t size,bool isCompleted)127 uint32_t IncrementalSourceStream::UpdateData(const uint8_t *data, uint32_t size, bool isCompleted)
128 {
129     if (data == nullptr) {
130         IMAGE_LOGE("[IncrementalSourceStream]input the parameter exception.");
131         return ERR_IMAGE_DATA_ABNORMAL;
132     }
133     if (size == 0) {
134         IMAGE_LOGD("[IncrementalSourceStream]no need to update data.");
135         return SUCCESS;
136     }
137     if (incrementalMode_ == IncrementalMode::INCREMENTAL_DATA) {
138         vector<uint8_t> newData;
139         newData.resize(size);
140         copy(data, data + size, newData.begin());
141         sourceData_.resize(dataSize_ + size);
142         sourceData_.insert(sourceData_.begin() + dataSize_, newData.begin(), newData.end());
143         dataSize_ += size;
144         isFinalize_ = isCompleted;
145     } else {
146         sourceData_.clear();
147         sourceData_.resize(size);
148         dataSize_ = size;
149         copy(data, data + size, sourceData_.begin());
150         isFinalize_ = true;
151     }
152     return SUCCESS;
153 }
154 
IsStreamCompleted()155 bool IncrementalSourceStream::IsStreamCompleted()
156 {
157     return isFinalize_;
158 }
159 
GetStreamSize()160 size_t IncrementalSourceStream::GetStreamSize()
161 {
162     return dataSize_;
163 }
164 } // namespace Media
165 } // namespace OHOS
166