COMMON: FORMATS: Implement pInf atom parsing for QuickTime movies

This commit implements pInf (Panorama Information) atom parsing for QuickTime movies.
It contains information about panoramic nodes (ID, timestamp) and the default node's zoom level.
This commit is contained in:
Krish 2024-06-18 15:21:01 +05:30 committed by Eugene Sandulenko
parent 4a180f94f5
commit fc34902998
2 changed files with 36 additions and 0 deletions

View File

@ -171,6 +171,8 @@ void QuickTimeParser::initParseTable() {
{ &QuickTimeParser::readSMI, MKTAG('S', 'M', 'I', ' ') }, { &QuickTimeParser::readSMI, MKTAG('S', 'M', 'I', ' ') },
{ &QuickTimeParser::readDefault, MKTAG('g', 'm', 'h', 'd') }, { &QuickTimeParser::readDefault, MKTAG('g', 'm', 'h', 'd') },
{ &QuickTimeParser::readLeaf, MKTAG('g', 'm', 'i', 'n') }, { &QuickTimeParser::readLeaf, MKTAG('g', 'm', 'i', 'n') },
{ &QuickTimeParser::readDefault, MKTAG('S', 'T', 'p', 'n') },
{ &QuickTimeParser::readPINF, MKTAG('p', 'I', 'n', 'f') },
{ nullptr, 0 } { nullptr, 0 }
}; };
@ -853,6 +855,25 @@ int QuickTimeParser::readNAVG(Atom atom) {
return 0; return 0;
} }
int QuickTimeParser::readPINF(Atom atom) {
Track *track = _tracks.back();
track->panoInfo.name = _fd->readPascalString();
_fd->seek((int64)atom.offset + 32);
track->panoInfo.defNodeID = _fd->readUint32BE();
track->panoInfo.defZoom = readAppleFloatField(_fd);
_fd->readUint32BE(); // reserved
_fd->readSint16BE(); // padding
int16 numEntries = _fd->readSint16BE();
track->panoInfo.nodes.resize(numEntries);
for (int16 i = 0; i < numEntries; i++) {
track->panoInfo.nodes[i].nodeID = _fd->readUint32BE();
track->panoInfo.nodes[i].timestamp = _fd->readUint32BE();
}
return 0;
}
int QuickTimeParser::readDREF(Atom atom) { int QuickTimeParser::readDREF(Atom atom) {
if (atom.size > 1) { if (atom.size > 1) {
Track *track = _tracks.back(); Track *track = _tracks.back();

View File

@ -144,6 +144,18 @@ protected:
CODEC_TYPE_MIDI CODEC_TYPE_MIDI
}; };
struct PanoramaNode {
uint32 nodeID;
uint32 timestamp;
};
struct PanoramaInformation {
String name;
uint32 defNodeID;
float defZoom;
Array<PanoramaNode> nodes;
};
struct Track { struct Track {
Track(); Track();
~Track(); ~Track();
@ -181,6 +193,8 @@ protected:
Common::String directory; Common::String directory;
int16 nlvlFrom; int16 nlvlFrom;
int16 nlvlTo; int16 nlvlTo;
PanoramaInformation panoInfo;
}; };
enum class MovieType { enum class MovieType {
@ -269,6 +283,7 @@ private:
int readSMI(Atom atom); int readSMI(Atom atom);
int readCTYP(Atom atom); int readCTYP(Atom atom);
int readNAVG(Atom atom); int readNAVG(Atom atom);
int readPINF(Atom atom);
}; };
/** @} */ /** @} */