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);
The exception that is thrown when the data to be parsed or to be made seems invalid and therefore can...
This exception is thrown when the an operation is invoked that has not been implemented yet.
The Size class defines the size of a two-dimensional object using integer point precision.
constexpr std::uint32_t height() const
Returns the height.
void setWidth(std::uint32_t value)
Sets the width.
constexpr std::uint32_t width() const
Returns the width.
void setHeight(std::uint32_t value)
Sets the height.
The exception that is thrown when the data to be parsed is truncated and therefore can not be parsed ...
Contains all classes and functions of the TagInfo library.
std::int32_t sgolomb
Type used to store signed integer values using golomb coding.
std::uint32_t ugolomb
Type used to store unsigned integer values using golomb coding.
The AspectRatio struct defines an aspect ratio.