| 1535 | } // QuickTimeVideo::trackHeaderDecoder |
| 1536 | |
| 1537 | void 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); |
nothing calls this directly
no test coverage detected