1 /*
2 * Copyright (C) 2024 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 "box/basic_box.h"
17
18 namespace OHOS {
19 namespace ImagePlugin {
ParseContent(HeifStreamReader & reader)20 heif_error HeifFtypBox::ParseContent(HeifStreamReader &reader)
21 {
22 majorBrand_ = reader.Read32();
23 minorVersion_ = reader.Read32();
24
25 // (box size - headersize - majorbrand bytes - minorversion bytes) / (compatibleBrand bytes)
26 uint64_t compatibleBrandNum =
27 (GetBoxSize() - GetHeaderSize() - UINT32_BYTES_NUM - UINT32_BYTES_NUM) / UINT32_BYTES_NUM;
28 for (uint64_t i = 0; i < compatibleBrandNum && !reader.HasError(); i++) {
29 compatibleBrands_.push_back(reader.Read32());
30 }
31 return reader.GetError();
32 }
33
Write(HeifStreamWriter & writer) const34 heif_error HeifFtypBox::Write(HeifStreamWriter &writer) const
35 {
36 size_t boxStart = ReserveHeader(writer);
37
38 writer.Write32(majorBrand_);
39 writer.Write32(minorVersion_);
40 for (uint32_t b: compatibleBrands_) {
41 writer.Write32(b);
42 }
43
44 WriteCalculatedHeader(writer, boxStart);
45 return heif_error_ok;
46 }
47
ParseContentChildren(HeifStreamReader & reader,uint32_t & recursionCount)48 heif_error HeifMetaBox::ParseContentChildren(HeifStreamReader &reader, uint32_t &recursionCount)
49 {
50 recursionCount++;
51 if (recursionCount > MAX_RECURSION_COUNT) {
52 return heif_error_too_many_recursion;
53 }
54 ParseFullHeader(reader);
55 return ReadChildren(reader, recursionCount);
56 }
57
ParseContent(HeifStreamReader & reader)58 heif_error HeifHdlrBox::ParseContent(HeifStreamReader &reader)
59 {
60 ParseFullHeader(reader);
61 isPreDefined_ = reader.Read32();
62 handlerType_ = reader.Read32();
63 for (int i = 0; i < HDLR_BOX_RESERVED_SIZE; i++) {
64 reserved_[i] = reader.Read32();
65 }
66 name_ = reader.ReadString();
67 return reader.GetError();
68 }
69
Write(HeifStreamWriter & writer) const70 heif_error HeifHdlrBox::Write(HeifStreamWriter &writer) const
71 {
72 size_t boxStart = ReserveHeader(writer);
73
74 writer.Write32(isPreDefined_);
75 writer.Write32(handlerType_);
76 for (uint32_t reservedValue : reserved_) {
77 writer.Write32(reservedValue);
78 }
79 writer.Write(name_);
80
81 WriteCalculatedHeader(writer, boxStart);
82 return heif_error_ok;
83 }
84 } // namespace ImagePlugin
85 } // namespace OHOS
86