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