• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 RefPicSet {
74     uint8_t interRefPicSetPredictionFlag;
75     uint8_t deltaIdxMinus1;
76     uint8_t deltaRpsSign;
77     uint8_t absDeltaRpsMinus1;
78     std::vector<uint8_t> usedByCurrPicFlag;
79     std::vector<uint8_t> usedDeltaFlag;
80     std::vector<uint8_t> deltaPoc;
81     uint32_t numNegativePics;
82     uint32_t numPositivePics;
83     std::vector<uint8_t> deltaPocS0Minus1;
84     std::vector<uint8_t> usedBycurrPicS0Flag;
85     std::vector<uint8_t> deltaPocS1Minus1;
86     std::vector<uint8_t> usedBycurrPicS1Flag;
87 };
88 
89 struct HvccNalArray {
90     uint8_t arrayCompleteness;
91     uint8_t nalUnitType;
92     std::vector<std::vector<uint8_t>> nalUnits;
93 };
94 
95 class HeifHvccBox : public HeifBox {
96 public:
HeifHvccBox()97     HeifHvccBox() : HeifBox(BOX_TYPE_HVCC) {}
98 
99     bool GetHeaders(std::vector<uint8_t>* outData) const;
100 
SetConfig(const HvccConfig & config)101     void SetConfig(const HvccConfig& config) { config_ = config; }
102 
GetConfig()103     const HvccConfig& GetConfig() const { return config_; }
104 
105     void AppendNalData(const std::vector<uint8_t>& nalData);
106 
107     heif_error Write(HeifStreamWriter& writer) const override;
108 
GetSpsConfig()109     const HvccSpsConfig& GetSpsConfig() const { return spsConfig_; }
110 
111     uint32_t GetWord(const std::vector<uint8_t>& nalu, uint32_t length);
112 
113     uint32_t GetGolombCode(const std::vector<uint8_t> &nalu);
114 
115     uint32_t GetNaluTypeId(std::vector<uint8_t>& nalu);
116 
117     bool ParserHvccColorRangeFlag(const std::vector<HvccNalArray> &nalArrays);
118 
GetNalArrays()119     std::vector<HvccNalArray> GetNalArrays() const { return nalArrays_; };
120 
121     std::vector<uint8_t> GetNaluData(const std::vector<HvccNalArray>& nalArrays, uint8_t naluId);
122 
123     void ProcessBoxData(std::vector<uint8_t>& nalu);
124 
125     void ProfileTierLevel(std::vector<uint8_t>& SPSBox, uint32_t profilePresentFlag, uint32_t maxNumSubLayersMinus1);
126 
127     bool ParseNalUnitAnalysisSps(std::vector<uint8_t>& nalUnits);
128 
129     bool ParseSpsSyntax(std::vector<uint8_t> &nalUnits);
130 
131     bool ParseSpsSyntaxScalingList(std::vector<uint8_t>& nalUnits);
132 
133     void ParseSpsScallListData(std::vector<uint8_t> &nalUnits);
134 
135     bool ParseSpsVuiParameter(std::vector<uint8_t> &nalUnits);
136 
137     void ReadGolombCodesForSizeId(std::vector<uint8_t> &nalUnits, uint32_t sizeId);
138 
139     void ParseStRefPicSet(std::vector<uint8_t> &nalUnits, uint32_t stRpsIdx, uint32_t numShortTermResPicSets);
140 
141 protected:
142     heif_error ParseContent(HeifStreamReader& reader) override;
143     heif_error ParseNalUnitArray(HeifStreamReader& reader, std::vector<std::vector<uint8_t>>& nalUnits);
144 
145 private:
146     HvccConfig config_{};
147     HvccSpsConfig spsConfig_{};
148     uint8_t nalUnitLengthSize_ = 4;
149     std::vector<HvccNalArray> nalArrays_;
150     uint32_t boxBitLength_ = 0;
151     uint32_t pos_ = 0;
152 };
153 } // namespace ImagePlugin
154 } // namespace OHOS
155 
156 #endif // PLUGINS_COMMON_LIBS_IMAGE_LIBEXTPLUGIN_INCLUDE_HEIF_PARSER_ITEM_PROPERTY_HVCC_BOX_H
157