3 #include "../exceptions.h" 5 #include <c++utilities/io/binaryreader.h> 6 #include <c++utilities/io/bitreader.h> 7 #include <c++utilities/io/catchiofailure.h> 10 #include <unordered_map> 25 void SpsInfo::parse(BinaryReader &reader, uint32 maxSize)
32 if ((size = reader.readUInt16BE()) > maxSize) {
37 auto buffer = make_unique<char[]>(size);
38 reader.read(buffer.get(), size);
39 BitReader bitReader(buffer.get(), size);
43 bitReader.skipBits(3);
44 if (bitReader.readBits<byte>(5) != 7) {
47 profileIndication = bitReader.readBits<byte>(8);
48 profileConstraints = bitReader.readBits<byte>(8);
49 levelIndication = bitReader.readBits<byte>(8);
50 id = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
53 switch (profileIndication) {
64 if ((chromaFormatIndication = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>()) == 3) {
65 bitReader.skipBits(1);
67 bitReader.readUnsignedExpGolombCodedBits<byte>();
68 bitReader.readUnsignedExpGolombCodedBits<byte>();
69 bitReader.skipBits(1);
70 if (bitReader.readBit()) {
71 for (byte i = 0; i < 8; ++i) {
73 if (bitReader.readBit()) {
75 bitReader.skipBits(16);
77 bitReader.skipBits(64);
84 chromaFormatIndication = 1;
88 log2MaxFrameNum = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>() + 4;
89 switch (pictureOrderCountType = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>()) {
91 log2MaxPictureOrderCountLsb = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>() + 4;
94 deltaPicOrderAlwaysZeroFlag = bitReader.readBit();
95 offsetForNonRefPic = bitReader.readSignedExpGolombCodedBits<
sgolomb>();
96 offsetForTopToBottomField = bitReader.readSignedExpGolombCodedBits<
sgolomb>();
97 numRefFramesInPicOrderCntCycle = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
98 for (byte i = 0; i < numRefFramesInPicOrderCntCycle; ++i) {
99 bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
107 bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
108 bitReader.skipBits(1);
112 mbSize.
setWidth(bitReader.readUnsignedExpGolombCodedBits<uint32>() + 1);
113 mbSize.
setHeight(bitReader.readUnsignedExpGolombCodedBits<uint32>() + 1);
114 if (!(frameMbsOnly = bitReader.readBit())) {
117 bitReader.skipBits(1);
120 if (bitReader.readBit()) {
121 cropping.setLeft(bitReader.readUnsignedExpGolombCodedBits<uint32>());
122 cropping.setRight(bitReader.readUnsignedExpGolombCodedBits<uint32>());
123 cropping.setTop(bitReader.readUnsignedExpGolombCodedBits<uint32>());
124 cropping.setBottom(bitReader.readUnsignedExpGolombCodedBits<uint32>());
128 if (!cropping.isNull()) {
130 ugolomb croppingScaleX, croppingScaleY;
131 switch (chromaFormatIndication) {
134 croppingScaleY = frameMbsOnly ? 2 : 4;
138 croppingScaleY = 2 - frameMbsOnly;
142 croppingScaleY = 2 - frameMbsOnly;
145 pictureSize.setWidth(mbSize.
width() * 16 - croppingScaleX * (cropping.left() + cropping.right()));
146 pictureSize.setHeight((2 - frameMbsOnly) * mbSize.
height() * 16 - croppingScaleY * (cropping.top() + cropping.bottom()));
148 pictureSize.setWidth(mbSize.
width() * 16);
149 pictureSize.setHeight((2 - frameMbsOnly) * mbSize.
height() * 16);
153 if ((vuiPresent = bitReader.readBit())) {
154 if ((bitReader.readBit())) {
155 pixelAspectRatio =
AspectRatio(bitReader.readBits<byte>(8));
156 if (pixelAspectRatio.isExtended()) {
158 pixelAspectRatio.numerator = bitReader.readBits<uint16>(16);
159 pixelAspectRatio.denominator = bitReader.readBits<uint16>(16);
164 if (bitReader.readBit()) {
165 bitReader.skipBits(1);
167 if (bitReader.readBit()) {
168 bitReader.skipBits(4);
169 if (bitReader.readBit()) {
170 bitReader.skipBits(24);
173 if (bitReader.readBit()) {
174 bitReader.readUnsignedExpGolombCodedBits<byte>();
175 bitReader.readUnsignedExpGolombCodedBits<byte>();
179 if ((timingInfo.isPresent = bitReader.readBit())) {
180 timingInfo.unitsInTick = bitReader.readBits<uint32>(32);
181 timingInfo.timeScale = bitReader.readBits<uint32>(32);
182 timingInfo.fixedFrameRate = bitReader.readBit();
186 hrdParametersPresent = 0;
187 if (bitReader.readBit()) {
188 nalHrdParameters.parse(bitReader);
189 hrdParametersPresent = 1;
191 if (bitReader.readBit()) {
192 vclHrdParameters.parse(bitReader);
193 hrdParametersPresent = 1;
195 if (hrdParametersPresent) {
196 bitReader.skipBits(1);
199 pictureStructPresent = bitReader.readBit();
202 if (bitReader.readBit()) {
203 bitReader.skipBits(1);
204 bitReader.readUnsignedExpGolombCodedBits<byte>();
205 bitReader.readUnsignedExpGolombCodedBits<byte>();
206 bitReader.readUnsignedExpGolombCodedBits<byte>();
207 bitReader.readUnsignedExpGolombCodedBits<byte>();
208 bitReader.readUnsignedExpGolombCodedBits<byte>();
209 bitReader.readUnsignedExpGolombCodedBits<byte>();
227 void PpsInfo::parse(BinaryReader &reader, uint32 maxSize)
234 if ((size = reader.readUInt16BE()) > maxSize) {
239 auto buffer = make_unique<char[]>(size);
240 reader.read(buffer.get(), size);
241 BitReader bitReader(buffer.get(), size);
245 bitReader.skipBits(1);
246 if (bitReader.readBits<byte>(5) != 8) {
249 id = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
250 spsId = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
251 bitReader.skipBits(1);
252 picOrderPresent = bitReader.readBit();
268 void HrdParameters::parse(IoUtilities::BitReader &reader)
270 cpbCount = reader.readUnsignedExpGolombCodedBits<
ugolomb>() + 1;
271 bitRateScale = reader.readBits<byte>(4);
272 cpbSizeScale = reader.readBits<byte>(4);
273 for (
ugolomb i = 0; i < cpbCount; ++i) {
275 reader.readUnsignedExpGolombCodedBits<byte>();
276 reader.readUnsignedExpGolombCodedBits<byte>();
279 initialCpbRemovalDelayLength = reader.readBits<byte>(5) + 1;
280 cpbRemovalDelayLength = reader.readBits<byte>(5) + 1;
281 cpbOutputDelayLength = reader.readBits<byte>(5) + 1;
282 timeOffsetLength = reader.readBits<byte>(5);
void setWidth(uint32 value)
Sets the width.
uint32 ugolomb
Type used to store unsigned integer values using golomb coding.
void setHeight(uint32 value)
Sets the height.
The Size class defines the size of a two-dimensional object using integer point precision.
Contains utility classes helping to read and write streams.
constexpr uint32 height() const
Returns the height.
int32 sgolomb
Type used to store signed integer values using golomb coding.
constexpr uint32 width() const
Returns the width.