1 /*
2 * Copyright (c) 2023 Shenzhen Kaihong DID 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 "codec_jpeg_helper.h"
17 #include <ashmem.h>
18 #include <cerrno>
19 #include <cstring>
20 #include <securec.h>
21 #include "hdf_log.h"
22
23 static int8_t UnZigZagTable[64] = {
24 0, 1, 5, 6, 14, 15, 27, 28,
25 2, 4, 7, 13, 16, 26, 29, 42,
26 3, 8, 12, 17, 25, 30, 41, 43,
27 9, 11, 18, 24, 31, 40, 44, 53,
28 10, 19, 23, 32, 39, 45, 52, 54,
29 20, 22, 33, 38, 46, 51, 55, 60,
30 21, 34, 37, 47, 50, 56, 59, 61,
31 35, 36, 48, 49, 57, 58, 62, 63};
32
33 using namespace OHOS::HDI::Codec::Image::V2_0;
JpegAssemble(const struct CodecJpegDecInfo & decInfo,int8_t * buffer,int32_t fd)34 int32_t CodecJpegHelper::JpegAssemble(const struct CodecJpegDecInfo &decInfo, int8_t *buffer, int32_t fd)
35 {
36 HDF_LOGI("enter");
37 int32_t curPos = 0;
38 // SOI
39 curPos = PutInt16(buffer, curPos, 0xffd8);
40 if (curPos < 0) {
41 HDF_LOGE("assemble SOI error");
42 return -1;
43 }
44
45 // DQT
46 curPos = JpegDqtAssemble(decInfo, buffer, curPos);
47 if (curPos < 0) {
48 HDF_LOGE("assemble DQT error");
49 return -1;
50 }
51
52 // DHT
53 curPos = JpegDhtAssemble(decInfo, buffer, curPos);
54 if (curPos < 0) {
55 HDF_LOGE("assemble DHT error");
56 return -1;
57 }
58 // DRI
59 curPos = JpegDriAssemble(decInfo, buffer, curPos);
60 if (curPos < 0) {
61 HDF_LOGE("assemble DRI error");
62 return -1;
63 }
64
65 // SOF
66 curPos = JpegSofAssemble(decInfo, buffer, curPos);
67 if (curPos < 0) {
68 HDF_LOGE("assemble SOF error");
69 return -1;
70 }
71 // SOS
72 curPos = JpegSosAssemble(decInfo, buffer, curPos);
73 if (curPos < 0) {
74 HDF_LOGE("assemble SOS error");
75 return -1;
76 }
77 // DATA
78 curPos = JpegDataAssemble(buffer, curPos, fd);
79 if (curPos < 0) {
80 HDF_LOGE("assemble CompressedData error");
81 return -1;
82 }
83 // EOI
84 curPos = PutInt16(buffer, curPos, 0xffd9);
85 if (curPos < 0) {
86 HDF_LOGE("assemble EOI error");
87 return -1;
88 }
89 return curPos;
90 }
91
DessambleJpeg(int8_t * buffer,size_t bufferLen,struct CodecJpegDecInfo & decInfo,std::unique_ptr<int8_t[]> & compressBuffer,uint32_t & comBufLen,uint32_t & dataStart)92 bool CodecJpegHelper::DessambleJpeg(int8_t *buffer, size_t bufferLen, struct CodecJpegDecInfo &decInfo,
93 std::unique_ptr<int8_t[]> &compressBuffer, uint32_t &comBufLen, uint32_t &dataStart)
94 {
95 HDF_LOGI("enter");
96 int8_t *start = buffer;
97 const int8_t *end = buffer + bufferLen;
98 while (start < end) {
99 JpegMarker marker = (JpegMarker)FindMarker(start);
100 start += 2; // 2: marker len
101 switch (marker) {
102 case SOI:
103 case EOI:
104 break;
105 case SOF0:
106 start += DessambleSof(start, decInfo);
107 break;
108 case DHT:
109 start += DessambleDht(start, decInfo);
110 break;
111 case SOS: {
112 start += DessambleSos(start, decInfo);
113 dataStart = start - buffer;
114 // compressed data start
115 auto len = DessambleCompressData(start, compressBuffer, comBufLen);
116 if (len < 0) {
117 HDF_LOGE("copy compressed data error");
118 return false;
119 }
120 start += len;
121 break;
122 }
123
124 case DQT:
125 start += DessambleDqt(start, decInfo);
126 break;
127 case DRI: {
128 start += 2; // 2: marker len
129 decInfo.restartInterval = GetInt16(start);
130 start += 2; // 2: interval len
131 break;
132 }
133 default: {
134 short len = GetInt16(start);
135 start += len;
136 HDF_LOGW("skip marker[%{public}x], len[%{public}d]", marker, len);
137 break;
138 }
139 }
140 }
141 return true;
142 }
JpegDqtAssemble(const struct CodecJpegDecInfo & decInfo,int8_t * buffer,int32_t curPos)143 int32_t CodecJpegHelper::JpegDqtAssemble(const struct CodecJpegDecInfo &decInfo, int8_t *buffer, int32_t curPos)
144 {
145 HDF_LOGI("enter. curPos = %{public}d", curPos);
146 // flag
147 curPos = PutInt16(buffer, curPos, 0xffdb);
148 if (curPos < 0) {
149 HDF_LOGE("assemble DQT flag error");
150 return curPos;
151 }
152
153 // skip len first
154 int32_t lenPos = curPos;
155 curPos += 2; // 2: marker len
156
157 // data
158 for (size_t i = 0; i < decInfo.quantTbl.size(); i++) {
159 if (!decInfo.quantTbl[i].tableFlag) {
160 break;
161 }
162 uint8_t index = 0; // precision 1:16bit, 0: 8bit, deault:1
163 index = (index << 4) | i; // precision << 4 | tableid
164 curPos = PutInt8(buffer, curPos, index);
165 if (curPos < 0) {
166 HDF_LOGE("assemble precision and tableid error");
167 return curPos;
168 }
169
170 for (size_t j = 0; j < decInfo.quantTbl[i].quantVal.size(); j++) {
171 HDF_LOGI("decInfo.quantTbl[%{public}zu].quantVal[%{public}zu] = %{public}d", i, j,
172 decInfo.quantTbl[i].quantVal[j]);
173 curPos = PutInt16(buffer, curPos, decInfo.quantTbl[i].quantVal[j]);
174 }
175 }
176 int16_t bufferLen = static_cast<int16_t>(curPos - lenPos);
177 auto ret = PutInt16(buffer, lenPos, bufferLen);
178 if (ret < 0) {
179 HDF_LOGE("assemble len error");
180 return ret;
181 }
182 return curPos;
183 }
JpegDriAssemble(const struct CodecJpegDecInfo & decInfo,int8_t * buffer,int32_t curPos)184 int32_t CodecJpegHelper::JpegDriAssemble(const struct CodecJpegDecInfo &decInfo, int8_t *buffer, int32_t curPos)
185 {
186 HDF_LOGI("enter, restartInterval = %{public}d curPos = %{public}d", decInfo.restartInterval, curPos);
187 if (decInfo.restartInterval <= 0) {
188 return curPos;
189 }
190 curPos = PutInt16(buffer, curPos, 0xffdd);
191 if (curPos < 0) {
192 HDF_LOGE("assemble DRI flag error");
193 return curPos;
194 }
195
196 curPos = PutInt16(buffer, curPos, 4); // 4: dri data len( marker len included)
197 if (curPos < 0) {
198 HDF_LOGE("assemble DRI len error");
199 return curPos;
200 }
201
202 curPos = PutInt16(buffer, curPos, decInfo.restartInterval);
203 if (curPos < 0) {
204 HDF_LOGE("assemble dri value error");
205 return curPos;
206 }
207 return curPos;
208 }
JpegDhtAssemble(const struct CodecJpegDecInfo & decInfo,int8_t * buffer,int32_t curPos)209 int32_t CodecJpegHelper::JpegDhtAssemble(const struct CodecJpegDecInfo &decInfo, int8_t *buffer, int32_t curPos)
210 {
211 HDF_LOGI("enter. curPos = %{public}d", curPos);
212 curPos = JpegDhtAssemble(decInfo.dcHuffTbl, buffer, curPos);
213 if (curPos < 0) {
214 HDF_LOGE("assemble dc hufman error");
215 return curPos;
216 }
217
218 curPos = JpegDhtAssemble(decInfo.acHuffTbl, buffer, curPos, false);
219 if (curPos < 0) {
220 HDF_LOGE("assemble ac hufman error");
221 }
222 return curPos;
223 }
JpegDhtAssemble(const std::vector<CodecJpegHuffTable> & table,int8_t * buffer,int32_t curPos,bool dc)224 int32_t CodecJpegHelper::JpegDhtAssemble(const std::vector<CodecJpegHuffTable> &table, int8_t *buffer, int32_t curPos,
225 bool dc)
226 {
227 HDF_LOGI("enter. curPos = %{public}d", curPos);
228 // DC Hufman
229 curPos = PutInt16(buffer, curPos, 0xffc4);
230 if (curPos < 0) {
231 HDF_LOGE("assemble hufman flag error");
232 return curPos;
233 }
234 // skip len
235 int32_t lenPos = curPos;
236 curPos += 2; // 2: marker len
237 for (size_t i = 0; i < table.size(); i++) {
238 if (!table[i].tableFlag) {
239 break;
240 }
241 uint8_t type = 0; // type 0:DC, 1:AC
242 if (!dc) {
243 type = 1;
244 }
245 type = (type << 4) | i; // type << 4 | tableid
246 curPos = PutInt8(buffer, curPos, type);
247 if (curPos < 0) {
248 HDF_LOGE("assemble tableid and dc/ac error");
249 return curPos;
250 }
251 // bits
252 auto ret = memcpy_s(buffer + curPos, table[i].bits.size(), table[i].bits.data(), table[i].bits.size());
253 if (ret != EOK) {
254 char buf[MAX_BUFFER_LEN] = {0};
255 strerror_r(errno, buf, sizeof(buf));
256 HDF_LOGE("assemble bits error ret = %{public}s", buf);
257 return ret;
258 }
259 curPos += table[i].bits.size();
260 // val
261 ret = memcpy_s(buffer + curPos, table[i].huffVal.size(), table[i].huffVal.data(), table[i].huffVal.size());
262 if (ret != EOK) {
263 HDF_LOGE("assemble huffVal error, ret = %{public}d", ret);
264 return ret;
265 }
266 curPos += table[i].huffVal.size();
267 }
268 int16_t bufferLen = static_cast<int16_t>(curPos - lenPos);
269 auto ret = PutInt16(buffer, lenPos, bufferLen);
270 if (ret < 0) {
271 HDF_LOGE("assemble len error");
272 return ret;
273 }
274 return curPos;
275 }
276
JpegSofAssemble(const struct CodecJpegDecInfo & decInfo,int8_t * buffer,int32_t curPos)277 int32_t CodecJpegHelper::JpegSofAssemble(const struct CodecJpegDecInfo &decInfo, int8_t *buffer, int32_t curPos)
278 {
279 HDF_LOGI("enter. curPos = %{public}d", curPos);
280 // flag
281 curPos = PutInt16(buffer, curPos, 0xffc0);
282 if (curPos < 0) {
283 HDF_LOGE("assemble SOF flag error");
284 return curPos;
285 }
286
287 int16_t len = decInfo.numComponents * 3 + 8; // * rgb channel + other data
288 curPos = PutInt16(buffer, curPos, len);
289 if (curPos < 0) {
290 HDF_LOGE("assemble SOF len error");
291 return curPos;
292 }
293
294 int8_t precision = decInfo.dataPrecision & 0xFF;
295 curPos = PutInt8(buffer, curPos, precision);
296 if (curPos < 0) {
297 HDF_LOGE("assemble SOF precision error");
298 return curPos;
299 }
300
301 // width
302 int16_t width = decInfo.imageHeight & 0xFFFF;
303 curPos = PutInt16(buffer, curPos, width);
304 if (curPos < 0) {
305 HDF_LOGE("assemble SOF width error");
306 return curPos;
307 }
308
309 // height
310 int16_t height = decInfo.imageWidth & 0xFFFF;
311 curPos = PutInt16(buffer, curPos, height);
312 if (curPos < 0) {
313 HDF_LOGE("assemble SOF width error");
314 return curPos;
315 }
316 // components
317 int8_t components = decInfo.numComponents & 0xFF;
318 curPos = PutInt8(buffer, curPos, components);
319 if (curPos < 0) {
320 HDF_LOGE("assemble SOF components error");
321 return curPos;
322 }
323 for (size_t i = 0; i < decInfo.compInfo.size(); i++) {
324 int8_t componentId = decInfo.compInfo[i].componentId;
325 // byte offset
326 int8_t sampFactor = ((decInfo.compInfo[i].hSampFactor & 0xFF) << 4) | (decInfo.compInfo[i].vSampFactor & 0xFF);
327 int8_t quantity = decInfo.compInfo[i].quantTableNo;
328 int8_t bufferValue[] = {componentId, sampFactor, quantity};
329 auto ret = memcpy_s(buffer + curPos, sizeof(bufferValue), bufferValue, sizeof(bufferValue));
330 if (ret != EOK) {
331 HDF_LOGE("assemble component error, ret = %{public}d", ret);
332 return ret;
333 }
334 curPos += sizeof(bufferValue);
335 }
336 return curPos;
337 }
JpegSosAssemble(const struct CodecJpegDecInfo & decInfo,int8_t * buffer,int32_t curPos)338 int32_t CodecJpegHelper::JpegSosAssemble(const struct CodecJpegDecInfo &decInfo, int8_t *buffer, int32_t curPos)
339 {
340 HDF_LOGI("enter. curPos = %{public}d", curPos);
341 // flag
342 curPos = PutInt16(buffer, curPos, 0xffda);
343 if (curPos < 0) {
344 HDF_LOGE("assemble SOS flag error");
345 return curPos;
346 }
347
348 int16_t len = decInfo.numComponents * 2 + 6; // * rgb table length + other data
349 curPos = PutInt16(buffer, curPos, len);
350 if (curPos < 0) {
351 HDF_LOGE("assemble SOS len error");
352 return curPos;
353 }
354
355 int8_t components = decInfo.numComponents & 0xFF;
356 curPos = PutInt8(buffer, curPos, components);
357 if (curPos < 0) {
358 HDF_LOGE("assemble SOS components error");
359 return curPos;
360 }
361
362 for (size_t i = 0; i < decInfo.compInfo.size(); i++) {
363 int8_t componentId = decInfo.compInfo[i].componentId;
364 int8_t indexNo = ((decInfo.compInfo[i].dcTableNo & 0xFF) << 4) | (decInfo.compInfo[i].acTableNo & 0xFF);
365 int16_t value = ((componentId << 8) | indexNo) & 0xffff;
366 curPos = PutInt16(buffer, curPos, value);
367 if (curPos < 0) {
368 HDF_LOGE("assemble SOS component value error");
369 return curPos;
370 }
371 }
372 int8_t dataStart[] = {0x00, 0x3F, 0x00};
373 auto ret = memcpy_s(buffer + curPos, sizeof(dataStart), dataStart, sizeof(dataStart));
374 if (ret != EOK) {
375 HDF_LOGE("assemble SOS data flag error, ret = %{public}d", ret);
376 return ret;
377 }
378 curPos += sizeof(dataStart);
379 return curPos;
380 }
JpegDataAssemble(int8_t * buffer,int32_t curPos,int32_t fd)381 int32_t CodecJpegHelper::JpegDataAssemble(int8_t *buffer, int32_t curPos, int32_t fd)
382 {
383 HDF_LOGI("enter. curPos = %{public}d", curPos);
384 int32_t size = OHOS::AshmemGetSize(fd);
385 HDF_LOGI("get size %{public}d from fd %{public}d", size, fd);
386 OHOS::Ashmem mem(fd, size);
387 // check ret value
388 mem.MapReadOnlyAshmem();
389 auto addr = const_cast<void *>(mem.ReadFromAshmem(0, 0));
390 auto ret = memcpy_s(buffer + curPos, size, addr, size);
391 if (ret != EOK) {
392 HDF_LOGE("assemble compressed data error, ret = %{public}d", ret);
393 mem.UnmapAshmem();
394 if (ret > 0) {
395 return -ret;
396 }
397 return ret;
398 }
399 mem.UnmapAshmem();
400 mem.CloseAshmem();
401 curPos += size;
402 return curPos;
403 }
404
DessambleSof(int8_t * buffer,struct CodecJpegDecInfo & decInfo)405 int32_t CodecJpegHelper::DessambleSof(int8_t *buffer, struct CodecJpegDecInfo &decInfo)
406 {
407 HDF_LOGI("dessamble SOI");
408 // len
409 int32_t len = GetInt16(buffer);
410 buffer += 2; // 2: marker len
411 // precision
412 decInfo.dataPrecision = GetInt8(buffer);
413 buffer++;
414 // height
415 decInfo.imageHeight = GetInt16(buffer);
416 buffer += 2; // 2: height len
417 // width
418 decInfo.imageWidth = GetInt16(buffer);
419 buffer += 2; // 2: width len
420
421 decInfo.numComponents = GetInt8(buffer);
422 buffer++;
423
424 HDF_LOGI("image width[%{public}d],height[%{public}d],components[%{public}d]", decInfo.imageWidth,
425 decInfo.imageHeight, decInfo.numComponents);
426 for (size_t i = 0; i < decInfo.numComponents; i++) {
427 CodecJpegCompInfo comInfo;
428
429 comInfo.infoFlag = true;
430 comInfo.componentId = GetInt8(buffer);
431 buffer++;
432
433 int8_t sampFactor = GetInt8(buffer);
434 buffer++;
435 comInfo.hSampFactor = (sampFactor >> 4) & 0xFF; // 4: hsampfactor offset
436 comInfo.vSampFactor = sampFactor & 0x0F;
437
438 comInfo.quantTableNo = GetInt8(buffer);
439 buffer++;
440 decInfo.compInfo.push_back(std::move(comInfo));
441 HDF_LOGI("componentId[%{public}d],hSampFactor[%{public}d],vSampFactor[%{public}d],quantTableNo[%{public}d]",
442 comInfo.componentId, comInfo.hSampFactor, comInfo.vSampFactor, comInfo.quantTableNo);
443 }
444 return len;
445 }
DessambleSos(int8_t * buffer,struct CodecJpegDecInfo & decInfo)446 int32_t CodecJpegHelper::DessambleSos(int8_t *buffer, struct CodecJpegDecInfo &decInfo)
447 {
448 HDF_LOGI("dessamble SOS");
449 int32_t len = GetInt16(buffer);
450 buffer += 2; // 2:marker len
451
452 int32_t components = GetInt8(buffer);
453 buffer++;
454
455 for (int32_t i = 0; i < components; i++) {
456 decInfo.compInfo[i].infoFlag = true;
457
458 int32_t componentId = GetInt8(buffer);
459 (void)componentId;
460 buffer++;
461 // index not used
462 auto data = GetInt8(buffer);
463 buffer++;
464 decInfo.compInfo[i].dcTableNo = (data >> 4) & 0x0F; // 4: dctable offset
465 decInfo.compInfo[i].acTableNo = data & 0x0F;
466 HDF_LOGI("componentId[%{public}d],dcTableNo[%{public}d],acTableNo[%{public}d]", componentId,
467 decInfo.compInfo[i].dcTableNo, decInfo.compInfo[i].acTableNo);
468 }
469 buffer += 3; // skip 0x003F00
470 return len;
471 }
DessambleCompressData(int8_t * buffer,std::unique_ptr<int8_t[]> & compressBuffer,uint32_t & comBufLen)472 int32_t CodecJpegHelper::DessambleCompressData(int8_t *buffer, std::unique_ptr<int8_t[]> &compressBuffer,
473 uint32_t &comBufLen)
474 {
475 int8_t *dataStart = buffer;
476 do {
477 int32_t v = GetInt8(buffer);
478 buffer++;
479 if (v != 0xff) {
480 continue;
481 }
482 v = GetInt8(buffer);
483 buffer++;
484 if (v != 0xd9) {
485 continue;
486 }
487 buffer -= 2; // 2: marker len
488 break;
489 } while (1);
490 comBufLen = (int32_t)(buffer - dataStart) + 1;
491 compressBuffer = std::make_unique<int8_t[]>(comBufLen);
492 auto ret = memcpy_s(compressBuffer.get(), comBufLen, dataStart, comBufLen);
493 if (ret != EOK) {
494 HDF_LOGE("copy compressed data error, dataLen %{public}d, ret %{public}d", comBufLen, ret);
495 compressBuffer = nullptr;
496 return ret;
497 }
498 return comBufLen;
499 }
DessambleDqt(int8_t * buffer,struct CodecJpegDecInfo & decInfo)500 int32_t CodecJpegHelper::DessambleDqt(int8_t *buffer, struct CodecJpegDecInfo &decInfo)
501 {
502 HDF_LOGI("dessamble DQT");
503 int8_t *bufferOri = buffer;
504 int32_t len = GetInt16(buffer);
505 buffer += 2; // 2: marker len
506 // maybe has more dqt table
507 while ((buffer - bufferOri) < len) {
508 auto data = GetInt8(buffer);
509 buffer++;
510 int32_t tableId = data & 0x000f;
511 (void)tableId;
512 int32_t size = 64;
513 CodecJpegQuantTable table;
514 table.tableFlag = true;
515 table.quantVal.resize(size);
516 std::vector<uint16_t> mtx;
517 HDF_LOGI("tableid[%{public}d]", tableId);
518 for (int32_t i = 0; i < size; i++) {
519 if (((data >> 4) & 0x0f) == 1) { // 4: low 4 bits, 1: for 16 bits
520 mtx.push_back(static_cast<int16_t>(GetInt16(buffer)));
521 buffer += 2; // 2: data offset
522 } else {
523 mtx.push_back(static_cast<int8_t>(GetInt8(buffer)));
524 buffer += 1; // 1: data offset
525 }
526 }
527 // unzigzag quant table
528 for (int32_t i = 0; i < size; i++) {
529 table.quantVal[i] = mtx[UnZigZagTable[i]];
530 }
531 decInfo.quantTbl.push_back(std::move(table));
532 }
533 return len;
534 }
DessambleDht(int8_t * buffer,struct CodecJpegDecInfo & decInfo)535 int32_t CodecJpegHelper::DessambleDht(int8_t *buffer, struct CodecJpegDecInfo &decInfo)
536 {
537 HDF_LOGI("dessamble DHT");
538 int8_t *bufferOri = buffer;
539 int32_t len = GetInt16(buffer);
540 buffer += 2; // 2: marker len
541 // 可能存在多个表在同一个dht marker 中
542 while ((buffer - bufferOri) < len) {
543 auto data = GetInt8(buffer);
544 buffer++;
545 int32_t tableId = data & 0x000f;
546 (void)tableId;
547 int32_t acOrDc = (data >> 4) & 0x0f; // 0:DC, 1:AC, 4: ac/dc data offset
548 CodecJpegHuffTable table;
549 table.tableFlag = true;
550 int32_t num = 0;
551 for (size_t i = 0; i < 16; i++) { // 16: Data size
552 auto data = GetInt8(buffer);
553 buffer++;
554 table.bits.push_back(data);
555 num += data & 0x00ff;
556 }
557 HDF_LOGI("tableid[%{public}d], acOrDc[%{public}d], num[%{public}d]", tableId, acOrDc, num);
558 // val
559 for (int32_t i = 0; i < num; i++) {
560 table.huffVal.push_back(*buffer++);
561 }
562 if (acOrDc == 1) {
563 decInfo.acHuffTbl.push_back(std::move(table));
564 } else {
565 decInfo.dcHuffTbl.push_back(std::move(table));
566 }
567 }
568 return len;
569 }
570
FindMarker(int8_t * start)571 int32_t CodecJpegHelper::FindMarker(int8_t *start)
572 {
573 int32_t marker = GetInt16(start);
574 return marker;
575 }
576
PutInt16(int8_t * buffer,int32_t curPos,int16_t value)577 int32_t CodecJpegHelper::PutInt16(int8_t *buffer, int32_t curPos, int16_t value)
578 {
579 int8_t data[] = {value >> 8, value & 0xFF};
580 auto ret = memcpy_s(buffer + curPos, sizeof(data), data, sizeof(data));
581 if (ret != EOK) {
582 HDF_LOGE("memcpy ret err %{public}d", ret);
583 return -1;
584 }
585 return curPos + sizeof(data);
586 }
587
PutInt8(int8_t * buffer,int32_t curPos,int8_t value)588 int32_t CodecJpegHelper::PutInt8(int8_t *buffer, int32_t curPos, int8_t value)
589 {
590 auto ret = memcpy_s(buffer + curPos, sizeof(value), &value, sizeof(value));
591 if (ret != EOK) {
592 HDF_LOGE("memcpy ret err %{public}d", ret);
593 return -1;
594 }
595 return curPos + sizeof(value);
596 }
597
GetInt8(int8_t * buffer)598 int32_t CodecJpegHelper::GetInt8(int8_t *buffer)
599 {
600 return buffer[0] & 0x00ff;
601 }
602
GetInt16(int8_t * buffer)603 int32_t CodecJpegHelper::GetInt16(int8_t *buffer)
604 {
605 return ((buffer[0] << 8) & 0x00ff00) | (buffer[1] & 0x00ff); // 8:data offset
606 }
607