| 138 | } |
| 139 | |
| 140 | bool ParserAVFormat::parseExtradata_AVC(ByteVector &extradata) |
| 141 | { |
| 142 | if (extradata.empty() || !packetModel->rootItem) |
| 143 | return true; |
| 144 | |
| 145 | if (extradata.at(0) == 1 && extradata.size() >= 7) |
| 146 | { |
| 147 | SubByteReaderLogging reader(extradata, packetModel->rootItem, "Extradata (Raw AVC NAL units)"); |
| 148 | reader.disableEmulationPrevention(); |
| 149 | |
| 150 | reader.readBits("Version", 8); |
| 151 | |
| 152 | // The extradata uses the avcc format (see avc.c in libavformat) |
| 153 | reader.readBits("profile", 8); |
| 154 | reader.readBits("profile_compat", 8); |
| 155 | reader.readBits("level", 8); |
| 156 | reader.readBits("reserved_6_one_bits", 6); |
| 157 | reader.readBits("nal_size_length_minus1", 2); |
| 158 | reader.readBits("reserved_3_one_bits", 3); |
| 159 | auto number_of_sps = reader.readBits("number_of_sps", 5); |
| 160 | |
| 161 | unsigned nalID = 0; |
| 162 | for (unsigned i = 0; i < number_of_sps; i++) |
| 163 | { |
| 164 | SubByteReaderLoggingSubLevel spsSubLevel(reader, "SPS " + std::to_string(i)); |
| 165 | auto sps_size = reader.readBits("sps_size", 16); |
| 166 | auto spsData = reader.readBytes("", sps_size, Options().withLoggingDisabled()); |
| 167 | auto parseResult = this->annexBParser->parseAndAddNALUnit( |
| 168 | nalID++, spsData, {}, {}, reader.getCurrentItemTree()); |
| 169 | if (parseResult.success && parseResult.bitrateEntry) |
| 170 | this->bitratePlotModel->addBitratePoint(this->videoStreamIndex, *parseResult.bitrateEntry); |
| 171 | } |
| 172 | |
| 173 | auto number_of_pps = reader.readBits("number_of_pps", 8); |
| 174 | for (unsigned i = 0; i < number_of_pps; i++) |
| 175 | { |
| 176 | SubByteReaderLoggingSubLevel ppsSubLevel(reader, "PPS " + std::to_string(i)); |
| 177 | auto pps_size = reader.readBits("pps_size", 16); |
| 178 | auto pspsData = reader.readBytes("", pps_size, Options().withLoggingDisabled()); |
| 179 | auto parseResult = this->annexBParser->parseAndAddNALUnit( |
| 180 | nalID++, pspsData, {}, {}, reader.getCurrentItemTree()); |
| 181 | if (parseResult.success && parseResult.bitrateEntry) |
| 182 | this->bitratePlotModel->addBitratePoint(this->videoStreamIndex, *parseResult.bitrateEntry); |
| 183 | } |
| 184 | } |
| 185 | |
| 186 | return true; |
| 187 | } |
| 188 | |
| 189 | bool ParserAVFormat::parseExtradata_hevc(ByteVector &extradata) |
| 190 | { |
no test coverage detected