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 #ifndef PLUGINS_COMMON_LIBS_IMAGE_LIBEXTPLUGIN_INCLUDE_HEIF_PARSER_ITEM_PROPERTY_HVCC_BOX_H
17 #define PLUGINS_COMMON_LIBS_IMAGE_LIBEXTPLUGIN_INCLUDE_HEIF_PARSER_ITEM_PROPERTY_HVCC_BOX_H
18 
19 #include "box/heif_box.h"
20 
21 namespace OHOS {
22 namespace ImagePlugin {
23 // defined in ISO/IEC 14496-15
24 struct HvccConfig {
25     uint8_t version;
26     uint8_t generalProfileSpace;
27     uint8_t generalTierFlag;
28     uint8_t generalProfileIdc;
29     uint32_t generalProfileCompatibilityFlags;
30     uint64_t generalConstraintIndicatorFlags;
31     uint8_t generalLevelIdc;
32     uint16_t minSpatialSegmentationIdc;
33     uint8_t parallelismType;
34     uint8_t chromaFormat;
35     uint8_t bitDepthLuma;
36     uint8_t bitDepthChroma;
37     uint16_t avgFrameRate;
38     uint8_t constFrameRate;
39     uint8_t numTemporalLayers;
40     uint8_t temporalIdNested;
41 };
42 
43 struct HvccSpsConfig {
44     uint8_t forbiddenZeroBit;
45     uint8_t nalUnitType;
46     uint8_t nuhLayerId;
47     uint8_t nuhTemporalIdPlus1;
48     uint8_t spsVideoParameterSetId;
49     uint8_t spsMaxSubLayersMinus1;
50     uint8_t spsTemporalIdNestingFlag;
51     uint32_t spsSeqParameterSetId;
52     uint32_t chromaFormatIdc;
53     uint8_t separateColourPlaneFlag;
54     uint32_t picWidthInLumaSamples;
55     uint32_t picHeightInLumaSamples;
56     uint8_t conformanceWindowFlag;
57     uint32_t confWinLefOffset;
58     uint32_t confWinRightOffset;
59     uint32_t confWinTopOffset;
60     uint32_t confWinBottomOffset;
61     uint32_t bitDepthLumaMinus8;
62     uint32_t bitDepthChromaMinus8;
63     uint32_t log2MaxPicOrderCntLsbMinus4;
64     uint8_t spsSubLayerOrderingInfoPresentFlag;
65     uint8_t scalingListEnabeldFlag;
66     uint8_t pcmEnabledFlag;
67     uint32_t numShortTermRefPicSets;
68     uint8_t longTermRefPicsPresentFlag;
69     uint8_t vuiParameterPresentFlag;
70     uint8_t videoRangeFlag;
71 };
72 
73 struct HvccNalArray {
74     uint8_t arrayCompleteness;
75     uint8_t nalUnitType;
76     std::vector<std::vector<uint8_t>> nalUnits;
77 };
78 
79 class HeifHvccBox : public HeifBox {
80 public:
HeifHvccBox()81     HeifHvccBox() : HeifBox(BOX_TYPE_HVCC) {}
82 
83     bool GetHeaders(std::vector<uint8_t>* outData) const;
84 
SetConfig(const HvccConfig & config)85     void SetConfig(const HvccConfig& config) { config_ = config; }
86 
GetConfig()87     const HvccConfig& GetConfig() const { return config_; }
88 
89     void AppendNalData(const std::vector<uint8_t>& nalData);
90 
91     heif_error Write(HeifStreamWriter& writer) const override;
92 
GetSpsConfig()93     const HvccSpsConfig& GetSpsConfig() const { return spsConfig_; }
94 
95     uint32_t GetWord(const std::vector<uint8_t>& nalu, int length);
96 
97     uint32_t GetGolombCode(const std::vector<uint8_t> &nalu);
98 
99     int32_t GetNaluTypeId(std::vector<uint8_t>& nalu);
100 
101     void ParserHvccColorRangeFlag(const std::vector<HvccNalArray> &nalArrays);
102 
GetNalArrays()103     std::vector<HvccNalArray> GetNalArrays() const { return nalArrays_; };
104 
105     std::vector<uint8_t> GetNaluData(const std::vector<HvccNalArray>& nalArrays, int8_t naluId);
106 
107     void ProcessBoxData(std::vector<uint8_t>& nalu);
108 
109     void ProfileTierLevel(std::vector<uint8_t>& SPSBox, int32_t profilePresentFlag, int32_t maxNumSubLayersMinus1);
110 
111     bool ParseNalUnitAnalysisSps(std::vector<uint8_t>& nalUnits);
112 
113     bool ParseSpsSyntax(std::vector<uint8_t> &nalUnits);
114 
115     bool ParseSpsSyntaxScalingList(std::vector<uint8_t>& nalUnits);
116 
117     void ParseSpsScallListData(std::vector<uint8_t> &nalUnits);
118 
119     bool ParseSpsVuiParameter(std::vector<uint8_t> &nalUnits);
120 
121     void ReadGolombCodesForSizeId(std::vector<uint8_t> &nalUnits, int sizeId);
122 
123 protected:
124     heif_error ParseContent(HeifStreamReader& reader) override;
125     heif_error ParseNalUnitArray(HeifStreamReader& reader, std::vector<std::vector<uint8_t>>& nalUnits);
126 
127 private:
128     HvccConfig config_{};
129     HvccSpsConfig spsConfig_{};
130     uint8_t nalUnitLengthSize_ = 4;
131     std::vector<HvccNalArray> nalArrays_;
132     uint32_t boxBitLength_ = 0;
133     uint32_t pos_ = 0;
134 };
135 } // namespace ImagePlugin
136 } // namespace OHOS
137 
138 #endif // PLUGINS_COMMON_LIBS_IMAGE_LIBEXTPLUGIN_INCLUDE_HEIF_PARSER_ITEM_PROPERTY_HVCC_BOX_H
139