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