3 #include "../exceptions.h"
5 #include <c++utilities/io/binaryreader.h>
6 #include <c++utilities/io/bitreader.h>
9 #include <unordered_map>
24 void SpsInfo::parse(BinaryReader &reader, std::uint32_t maxSize)
27 if ((maxSize < minSize) || (size = reader.readUInt16BE()) > (maxSize - minSize)) {
32 auto buffer = make_unique<char[]>(size);
33 reader.read(buffer.get(), size);
34 BitReader bitReader(buffer.get(), size);
38 bitReader.skipBits(3);
39 if (bitReader.readBits<std::uint8_t>(5) != 7) {
42 profileIndication = bitReader.readBits<std::uint8_t>(8);
43 profileConstraints = bitReader.readBits<std::uint8_t>(8);
44 levelIndication = bitReader.readBits<std::uint8_t>(8);
45 id = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
48 switch (profileIndication) {
59 if ((chromaFormatIndication = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>()) == 3) {
60 bitReader.skipBits(1);
62 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
63 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
64 bitReader.skipBits(1);
65 if (bitReader.readBit()) {
66 for (std::uint8_t i = 0; i < 8; ++i) {
68 if (bitReader.readBit()) {
70 bitReader.skipBits(16);
72 bitReader.skipBits(64);
79 chromaFormatIndication = 1;
83 log2MaxFrameNum = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>() + 4;
84 switch (pictureOrderCountType = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>()) {
86 log2MaxPictureOrderCountLsb = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>() + 4;
89 deltaPicOrderAlwaysZeroFlag = bitReader.readBit();
90 offsetForNonRefPic = bitReader.readSignedExpGolombCodedBits<
sgolomb>();
91 offsetForTopToBottomField = bitReader.readSignedExpGolombCodedBits<
sgolomb>();
92 numRefFramesInPicOrderCntCycle = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
93 for (std::uint8_t i = 0; i < numRefFramesInPicOrderCntCycle; ++i) {
94 bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
102 bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
103 bitReader.skipBits(1);
107 mbSize.
setWidth(bitReader.readUnsignedExpGolombCodedBits<std::uint32_t>() + 1);
108 mbSize.
setHeight(bitReader.readUnsignedExpGolombCodedBits<std::uint32_t>() + 1);
109 if (!(frameMbsOnly = bitReader.readBit())) {
112 bitReader.skipBits(1);
115 if (bitReader.readBit()) {
116 cropping.setLeft(bitReader.readUnsignedExpGolombCodedBits<std::uint32_t>());
117 cropping.setRight(bitReader.readUnsignedExpGolombCodedBits<std::uint32_t>());
118 cropping.setTop(bitReader.readUnsignedExpGolombCodedBits<std::uint32_t>());
119 cropping.setBottom(bitReader.readUnsignedExpGolombCodedBits<std::uint32_t>());
123 if (!cropping.isNull()) {
125 ugolomb croppingScaleX, croppingScaleY;
126 switch (chromaFormatIndication) {
129 croppingScaleY = frameMbsOnly ? 2 : 4;
133 croppingScaleY = 2 - frameMbsOnly;
137 croppingScaleY = 2 - frameMbsOnly;
140 pictureSize.setWidth(mbSize.
width() * 16 - croppingScaleX * (cropping.left() + cropping.right()));
141 pictureSize.setHeight((2 - frameMbsOnly) * mbSize.
height() * 16 - croppingScaleY * (cropping.top() + cropping.bottom()));
143 pictureSize.setWidth(mbSize.
width() * 16);
144 pictureSize.setHeight((2 - frameMbsOnly) * mbSize.
height() * 16);
148 if ((vuiPresent = bitReader.readBit())) {
149 if ((bitReader.readBit())) {
150 pixelAspectRatio =
AspectRatio(bitReader.readBits<std::uint8_t>(8));
151 if (pixelAspectRatio.isExtended()) {
153 pixelAspectRatio.numerator = bitReader.readBits<std::uint16_t>(16);
154 pixelAspectRatio.denominator = bitReader.readBits<std::uint16_t>(16);
159 if (bitReader.readBit()) {
160 bitReader.skipBits(1);
162 if (bitReader.readBit()) {
163 bitReader.skipBits(4);
164 if (bitReader.readBit()) {
165 bitReader.skipBits(24);
168 if (bitReader.readBit()) {
169 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
170 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
174 if ((timingInfo.isPresent = bitReader.readBit())) {
175 timingInfo.unitsInTick = bitReader.readBits<std::uint32_t>(32);
176 timingInfo.timeScale = bitReader.readBits<std::uint32_t>(32);
177 timingInfo.fixedFrameRate = bitReader.readBit();
181 hrdParametersPresent = 0;
182 if (bitReader.readBit()) {
183 nalHrdParameters.parse(bitReader);
184 hrdParametersPresent = 1;
186 if (bitReader.readBit()) {
187 vclHrdParameters.parse(bitReader);
188 hrdParametersPresent = 1;
190 if (hrdParametersPresent) {
191 bitReader.skipBits(1);
194 pictureStructPresent = bitReader.readBit();
197 if (bitReader.readBit()) {
198 bitReader.skipBits(1);
199 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
200 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
201 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
202 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
203 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
204 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
208 }
catch (
const std::ios_base::failure &) {
221 void PpsInfo::parse(BinaryReader &reader, std::uint32_t maxSize)
224 if ((maxSize < minSize) || (size = reader.readUInt16BE()) > (maxSize - minSize)) {
229 auto buffer = make_unique<char[]>(size);
230 reader.read(buffer.get(), size);
231 BitReader bitReader(buffer.get(), size);
235 bitReader.skipBits(1);
236 if (bitReader.readBits<std::uint8_t>(5) != 8) {
239 id = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
240 spsId = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
241 bitReader.skipBits(1);
242 picOrderPresent = bitReader.readBit();
243 }
catch (
const std::ios_base::failure &) {
257 void HrdParameters::parse(CppUtilities::BitReader &reader)
259 cpbCount = reader.readUnsignedExpGolombCodedBits<
ugolomb>() + 1;
260 bitRateScale = reader.readBits<std::uint8_t>(4);
261 cpbSizeScale = reader.readBits<std::uint8_t>(4);
262 for (
ugolomb i = 0; i < cpbCount; ++i) {
264 reader.readUnsignedExpGolombCodedBits<std::uint8_t>();
265 reader.readUnsignedExpGolombCodedBits<std::uint8_t>();
268 initialCpbRemovalDelayLength = reader.readBits<std::uint8_t>(5) + 1;
269 cpbRemovalDelayLength = reader.readBits<std::uint8_t>(5) + 1;
270 cpbOutputDelayLength = reader.readBits<std::uint8_t>(5) + 1;
271 timeOffsetLength = reader.readBits<std::uint8_t>(5);