MCPcopy Create free account
hub / github.com/Exiv2/exiv2 / movieHeaderDecoder

Method movieHeaderDecoder

src/quicktimevideo.cpp:1537–1601  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1535} // QuickTimeVideo::trackHeaderDecoder
1536
1537void QuickTimeVideo::movieHeaderDecoder(size_t size) {
1538 DataBuf buf(5);
1539 std::memset(buf.data(), 0x0, buf.size());
1540 buf.data()[4] = '\0';
1541
1542 for (int i = 0; size / 4 != 0; size -= 4, i++) {
1543 io_->readOrThrow(buf.data(), 4);
1544
1545 switch (i) {
1546 case MovieHeaderVersion:
1547 xmpData_["Xmp.video.MovieHeaderVersion"] = static_cast<int>(buf.read_uint8(0));
1548 break;
1549 case CreateDate:
1550 // A 32-bit integer that specifies (in seconds since midnight, January 1, 1904) when the movie atom was created.
1551 xmpData_["Xmp.video.DateUTC"] = buf.read_uint32(0, bigEndian);
1552 break;
1553 case ModifyDate:
1554 // A 32-bit integer that specifies (in seconds since midnight, January 1, 1904) when the movie atom was created.
1555 xmpData_["Xmp.video.ModificationDate"] = buf.read_uint32(0, bigEndian);
1556 break;
1557 case TimeScale:
1558 xmpData_["Xmp.video.TimeScale"] = buf.read_uint32(0, bigEndian);
1559 mvhdTimeScale_ = buf.read_uint32(0, bigEndian);
1560 if (mvhdTimeScale_ <= 0)
1561 mvhdTimeScale_ = 1;
1562 break;
1563 case Duration:
1564 if (mvhdTimeScale_ != 0) { // To prevent division by zero
1565 xmpData_["Xmp.video.Duration"] = buf.read_uint32(0, bigEndian) * 1000 / mvhdTimeScale_;
1566 }
1567 break;
1568 case PreferredRate:
1569 xmpData_["Xmp.video.PreferredRate"] =
1570 buf.read_uint16(0, bigEndian) + ((buf.data()[2] * 256 + buf.data()[3]) * 0.01);
1571 break;
1572 case PreferredVolume:
1573 xmpData_["Xmp.video.PreferredVolume"] = (static_cast<int>(buf.read_uint8(0)) + (buf.data()[2] * 0.1)) * 100;
1574 break;
1575 case PreviewTime:
1576 xmpData_["Xmp.video.PreviewTime"] = buf.read_uint32(0, bigEndian);
1577 break;
1578 case PreviewDuration:
1579 xmpData_["Xmp.video.PreviewDuration"] = buf.read_uint32(0, bigEndian);
1580 break;
1581 case PosterTime:
1582 xmpData_["Xmp.video.PosterTime"] = buf.read_uint32(0, bigEndian);
1583 break;
1584 case SelectionTime:
1585 xmpData_["Xmp.video.SelectionTime"] = buf.read_uint32(0, bigEndian);
1586 break;
1587 case SelectionDuration:
1588 xmpData_["Xmp.video.SelectionDuration"] = buf.read_uint32(0, bigEndian);
1589 break;
1590 case CurrentTime:
1591 xmpData_["Xmp.video.CurrentTime"] = buf.read_uint32(0, bigEndian);
1592 break;
1593 case NextTrackID:
1594 xmpData_["Xmp.video.NextTrackID"] = buf.read_uint32(0, bigEndian);

Callers

nothing calls this directly

Calls 6

dataMethod · 0.80
readOrThrowMethod · 0.80
read_uint8Method · 0.80
read_uint32Method · 0.80
read_uint16Method · 0.80
sizeMethod · 0.45

Tested by

no test coverage detected