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)
31 if ((size = reader.readUInt16BE()) > maxSize) {
36 auto buffer = make_unique<char[]>(size);
37 reader.read(buffer.get(), size);
38 BitReader bitReader(buffer.get(), size);
42 bitReader.skipBits(3);
43 if (bitReader.readBits<std::uint8_t>(5) != 7) {
46 profileIndication = bitReader.readBits<std::uint8_t>(8);
47 profileConstraints = bitReader.readBits<std::uint8_t>(8);
48 levelIndication = bitReader.readBits<std::uint8_t>(8);
49 id = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
52 switch (profileIndication) {
63 if ((chromaFormatIndication = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>()) == 3) {
64 bitReader.skipBits(1);
66 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
67 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
68 bitReader.skipBits(1);
69 if (bitReader.readBit()) {
70 for (std::uint8_t i = 0; i < 8; ++i) {
72 if (bitReader.readBit()) {
74 bitReader.skipBits(16);
76 bitReader.skipBits(64);
83 chromaFormatIndication = 1;
87 log2MaxFrameNum = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>() + 4;
88 switch (pictureOrderCountType = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>()) {
90 log2MaxPictureOrderCountLsb = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>() + 4;
93 deltaPicOrderAlwaysZeroFlag = bitReader.readBit();
94 offsetForNonRefPic = bitReader.readSignedExpGolombCodedBits<
sgolomb>();
95 offsetForTopToBottomField = bitReader.readSignedExpGolombCodedBits<
sgolomb>();
96 numRefFramesInPicOrderCntCycle = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
97 for (std::uint8_t i = 0; i < numRefFramesInPicOrderCntCycle; ++i) {
98 bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
106 bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
107 bitReader.skipBits(1);
111 mbSize.
setWidth(bitReader.readUnsignedExpGolombCodedBits<std::uint32_t>() + 1);
112 mbSize.
setHeight(bitReader.readUnsignedExpGolombCodedBits<std::uint32_t>() + 1);
113 if (!(frameMbsOnly = bitReader.readBit())) {
116 bitReader.skipBits(1);
119 if (bitReader.readBit()) {
120 cropping.setLeft(bitReader.readUnsignedExpGolombCodedBits<std::uint32_t>());
121 cropping.setRight(bitReader.readUnsignedExpGolombCodedBits<std::uint32_t>());
122 cropping.setTop(bitReader.readUnsignedExpGolombCodedBits<std::uint32_t>());
123 cropping.setBottom(bitReader.readUnsignedExpGolombCodedBits<std::uint32_t>());
127 if (!cropping.isNull()) {
129 ugolomb croppingScaleX, croppingScaleY;
130 switch (chromaFormatIndication) {
133 croppingScaleY = frameMbsOnly ? 2 : 4;
137 croppingScaleY = 2 - frameMbsOnly;
141 croppingScaleY = 2 - frameMbsOnly;
144 pictureSize.setWidth(mbSize.
width() * 16 - croppingScaleX * (cropping.left() + cropping.right()));
145 pictureSize.setHeight((2 - frameMbsOnly) * mbSize.
height() * 16 - croppingScaleY * (cropping.top() + cropping.bottom()));
147 pictureSize.setWidth(mbSize.
width() * 16);
148 pictureSize.setHeight((2 - frameMbsOnly) * mbSize.
height() * 16);
152 if ((vuiPresent = bitReader.readBit())) {
153 if ((bitReader.readBit())) {
154 pixelAspectRatio =
AspectRatio(bitReader.readBits<std::uint8_t>(8));
155 if (pixelAspectRatio.isExtended()) {
157 pixelAspectRatio.numerator = bitReader.readBits<std::uint16_t>(16);
158 pixelAspectRatio.denominator = bitReader.readBits<std::uint16_t>(16);
163 if (bitReader.readBit()) {
164 bitReader.skipBits(1);
166 if (bitReader.readBit()) {
167 bitReader.skipBits(4);
168 if (bitReader.readBit()) {
169 bitReader.skipBits(24);
172 if (bitReader.readBit()) {
173 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
174 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
178 if ((timingInfo.isPresent = bitReader.readBit())) {
179 timingInfo.unitsInTick = bitReader.readBits<std::uint32_t>(32);
180 timingInfo.timeScale = bitReader.readBits<std::uint32_t>(32);
181 timingInfo.fixedFrameRate = bitReader.readBit();
185 hrdParametersPresent = 0;
186 if (bitReader.readBit()) {
187 nalHrdParameters.parse(bitReader);
188 hrdParametersPresent = 1;
190 if (bitReader.readBit()) {
191 vclHrdParameters.parse(bitReader);
192 hrdParametersPresent = 1;
194 if (hrdParametersPresent) {
195 bitReader.skipBits(1);
198 pictureStructPresent = bitReader.readBit();
201 if (bitReader.readBit()) {
202 bitReader.skipBits(1);
203 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
204 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
205 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
206 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
207 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
208 bitReader.readUnsignedExpGolombCodedBits<std::uint8_t>();
212 }
catch (
const std::ios_base::failure &) {
225 void PpsInfo::parse(BinaryReader &reader, std::uint32_t maxSize)
232 if ((size = reader.readUInt16BE()) > maxSize) {
237 auto buffer = make_unique<char[]>(size);
238 reader.read(buffer.get(), size);
239 BitReader bitReader(buffer.get(), size);
243 bitReader.skipBits(1);
244 if (bitReader.readBits<std::uint8_t>(5) != 8) {
247 id = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
248 spsId = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
249 bitReader.skipBits(1);
250 picOrderPresent = bitReader.readBit();
251 }
catch (
const std::ios_base::failure &) {
265 void HrdParameters::parse(CppUtilities::BitReader &reader)
267 cpbCount = reader.readUnsignedExpGolombCodedBits<
ugolomb>() + 1;
268 bitRateScale = reader.readBits<std::uint8_t>(4);
269 cpbSizeScale = reader.readBits<std::uint8_t>(4);
270 for (
ugolomb i = 0; i < cpbCount; ++i) {
272 reader.readUnsignedExpGolombCodedBits<std::uint8_t>();
273 reader.readUnsignedExpGolombCodedBits<std::uint8_t>();
276 initialCpbRemovalDelayLength = reader.readBits<std::uint8_t>(5) + 1;
277 cpbRemovalDelayLength = reader.readBits<std::uint8_t>(5) + 1;
278 cpbOutputDelayLength = reader.readBits<std::uint8_t>(5) + 1;
279 timeOffsetLength = reader.readBits<std::uint8_t>(5);