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> 9 #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) {
54 case 44:
case 83:
case 86:
case 100:
case 110:
55 case 118:
case 122:
case 128:
case 244:
57 if((chromaFormatIndication = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>()) == 3) {
58 bitReader.skipBits(1);
60 bitReader.readUnsignedExpGolombCodedBits<byte>();
61 bitReader.readUnsignedExpGolombCodedBits<byte>();
62 bitReader.skipBits(1);
63 if(bitReader.readBit()) {
64 for(byte i = 0; i < 8; ++i) {
66 if(bitReader.readBit()) {
68 bitReader.skipBits(16);
70 bitReader.skipBits(64);
77 chromaFormatIndication = 1;
81 log2MaxFrameNum = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>() + 4;
82 switch(pictureOrderCountType = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>()) {
84 log2MaxPictureOrderCountLsb = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>() + 4;
87 deltaPicOrderAlwaysZeroFlag = bitReader.readBit();
88 offsetForNonRefPic = bitReader.readSignedExpGolombCodedBits<
sgolomb>();
89 offsetForTopToBottomField = bitReader.readSignedExpGolombCodedBits<
sgolomb>();
90 numRefFramesInPicOrderCntCycle = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
91 for(byte i = 0; i < numRefFramesInPicOrderCntCycle; ++i) {
92 bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
100 bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
101 bitReader.skipBits(1);
105 mbSize.
setWidth(bitReader.readUnsignedExpGolombCodedBits<uint32>() + 1);
106 mbSize.
setHeight(bitReader.readUnsignedExpGolombCodedBits<uint32>() + 1);
107 if(!(frameMbsOnly = bitReader.readBit())) {
110 bitReader.skipBits(1);
113 if(bitReader.readBit()) {
114 cropping.setLeft(bitReader.readUnsignedExpGolombCodedBits<uint32>());
115 cropping.setRight(bitReader.readUnsignedExpGolombCodedBits<uint32>());
116 cropping.setTop(bitReader.readUnsignedExpGolombCodedBits<uint32>());
117 cropping.setBottom(bitReader.readUnsignedExpGolombCodedBits<uint32>());
121 if(!cropping.isNull()) {
123 ugolomb croppingScaleX, croppingScaleY;
124 switch(chromaFormatIndication) {
127 croppingScaleY = frameMbsOnly ? 2 : 4;
131 croppingScaleY = 2 - frameMbsOnly;
135 croppingScaleY = 2 - frameMbsOnly;
138 pictureSize.setWidth(mbSize.
width() * 16 - croppingScaleX * (cropping.left() + cropping.right()));
139 pictureSize.setHeight((2 - frameMbsOnly) * mbSize.
height() * 16 - croppingScaleY * (cropping.top() + cropping.bottom()));
141 pictureSize.setWidth(mbSize.
width() * 16);
142 pictureSize.setHeight((2 - frameMbsOnly) * mbSize.
height() * 16);
146 if((vuiPresent = bitReader.readBit())) {
147 if((bitReader.readBit())) {
148 pixelAspectRatio =
AspectRatio(bitReader.readBits<byte>(8));
149 if(pixelAspectRatio.isExtended()) {
151 pixelAspectRatio.numerator = bitReader.readBits<uint16>(16);
152 pixelAspectRatio.denominator = bitReader.readBits<uint16>(16);
157 if(bitReader.readBit()) {
158 bitReader.skipBits(1);
160 if(bitReader.readBit()) {
161 bitReader.skipBits(4);
162 if(bitReader.readBit()) {
163 bitReader.skipBits(24);
166 if(bitReader.readBit()) {
167 bitReader.readUnsignedExpGolombCodedBits<byte>();
168 bitReader.readUnsignedExpGolombCodedBits<byte>();
172 if((timingInfo.isPresent = bitReader.readBit())) {
173 timingInfo.unitsInTick = bitReader.readBits<uint32>(32);
174 timingInfo.timeScale = bitReader.readBits<uint32>(32);
175 timingInfo.fixedFrameRate = bitReader.readBit();
179 hrdParametersPresent = 0;
180 if(bitReader.readBit()) {
181 nalHrdParameters.parse(bitReader);
182 hrdParametersPresent = 1;
184 if(bitReader.readBit()) {
185 vclHrdParameters.parse(bitReader);
186 hrdParametersPresent = 1;
188 if(hrdParametersPresent) {
189 bitReader.skipBits(1);
192 pictureStructPresent = bitReader.readBit();
195 if(bitReader.readBit()) {
196 bitReader.skipBits(1);
197 bitReader.readUnsignedExpGolombCodedBits<byte>();
198 bitReader.readUnsignedExpGolombCodedBits<byte>();
199 bitReader.readUnsignedExpGolombCodedBits<byte>();
200 bitReader.readUnsignedExpGolombCodedBits<byte>();
201 bitReader.readUnsignedExpGolombCodedBits<byte>();
202 bitReader.readUnsignedExpGolombCodedBits<byte>();
220 void PpsInfo::parse(BinaryReader &reader, uint32 maxSize)
227 if((size = reader.readUInt16BE()) > maxSize) {
232 auto buffer = make_unique<char[]>(size);
233 reader.read(buffer.get(), size);
234 BitReader bitReader(buffer.get(), size);
238 bitReader.skipBits(1);
239 if(bitReader.readBits<byte>(5) != 8) {
242 id = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
243 spsId = bitReader.readUnsignedExpGolombCodedBits<
ugolomb>();
244 bitReader.skipBits(1);
245 picOrderPresent = bitReader.readBit();
261 void HrdParameters::parse(IoUtilities::BitReader &reader)
263 cpbCount = reader.readUnsignedExpGolombCodedBits<
ugolomb>() + 1;
264 bitRateScale = reader.readBits<byte>(4);
265 cpbSizeScale = reader.readBits<byte>(4);
266 for(
ugolomb i = 0; i < cpbCount; ++i) {
268 reader.readUnsignedExpGolombCodedBits<byte>();
269 reader.readUnsignedExpGolombCodedBits<byte>();
272 initialCpbRemovalDelayLength = reader.readBits<byte>(5) + 1;
273 cpbRemovalDelayLength = reader.readBits<byte>(5) + 1;
274 cpbOutputDelayLength = reader.readBits<byte>(5) + 1;
275 timeOffsetLength = reader.readBits<byte>(5);
Contains utility classes helping to read and write streams.