void HevcSampleEntry::parseBox(BitStream& bitstr) { VisualSampleEntryBox::parseBox(bitstr); while (bitstr.numBytesLeft() > 0) { // Extract contained box bitstream and type std::string boxType; BitStream subBitStream = bitstr.readSubBoxBitStream(boxType); // Handle this box based on the type if (boxType == "hvcC") { mHevcConfigurationBox.parseBox(subBitStream); } else if (boxType == "ccst") { mCodingConstraintsBox.parseBox(subBitStream); mIsCodingConstraintsPresent = true; } else { logWarning() << "Skipping unknown box of type '" << boxType << "' inside HevcSampleEntry" << std::endl; } } }
void ItemPropertiesBox::parseBox(BitStream& input) { parseBoxHeader(input); std::string subBoxType; BitStream subBitStream = input.readSubBoxBitStream(subBoxType); mContainer.parseBox(subBitStream); subBitStream = input.readSubBoxBitStream(subBoxType); if (subBoxType != "ipma") { throw std::runtime_error("ItemPropertiesBox includes a box which is not ipma"); } // There could be several ItemPropertyAssociation boxes, but currently only one is supported. mAssociations.parseBox(subBitStream); if (input.numBytesLeft() > 0) { logWarning() << "ItemPropertiesBox::parseBox() supports currently only one ipma box, but there seems to be more." << std::endl; } }
void SampleTableBox::parseBox(BitStream& bitstr) { // First parse the box header parseBoxHeader(bitstr); // if there a data available in the file while (bitstr.numBytesLeft() > 0) { // Extract contained box bitstream and type std::string boxType; BitStream subBitstr = bitstr.readSubBoxBitStream(boxType); // Handle this box based on the type if (boxType == "stsd") { mSampleDescriptionBox.parseBox(subBitstr); } else if (boxType == "stco" || boxType == "co64") // 'co64' is the 64-bit version { mChunkOffsetBox.parseBox(subBitstr); } else if (boxType == "stsz") { mSampleSizeBox.parseBox(subBitstr); } else if (boxType == "stts") { mTimeToSampleBox.parseBox(subBitstr); } else if (boxType == "stsc") { mSampleToChunkBox.parseBox(subBitstr); } else if (boxType == "stss") { mSyncSampleBox = std::make_shared<SyncSampleBox>(); mSyncSampleBox->parseBox(subBitstr); } else if (boxType == "sgpd") { auto sgdb = new SampleGroupDescriptionBox; sgdb->parseBox(subBitstr); mSampleGroupDescriptionBox.reset(sgdb); } else if (boxType == "sbgp") { SampleToGroupBox sampleToGroupBox; sampleToGroupBox.parseBox(subBitstr); mSampleToGroupBox.push_back(move(sampleToGroupBox)); } else if (boxType == "cslg") { mCompositionToDecodeBox = std::make_shared<CompositionToDecodeBox>(); mCompositionToDecodeBox->parseBox(subBitstr); } else if (boxType == "ctts") { mCompositionOffsetBox = std::make_shared<CompositionOffsetBox>(); mCompositionOffsetBox->parseBox(subBitstr); } else { logWarning() << "Skipping unknown box of type '" << boxType << "' inside SampleTableBox" << endl; } } // We need to update stsc decoded presentation of chunk entries. mSampleToChunkBox.decodeEntries(mChunkOffsetBox.getChunkOffsets().size()); }