| 1400 | } // QuickTimeVideo::fileTypeDecoder |
| 1401 | |
| 1402 | void QuickTimeVideo::mediaHeaderDecoder(size_t size) { |
| 1403 | DataBuf buf(5); |
| 1404 | std::memset(buf.data(), 0x0, buf.size()); |
| 1405 | buf.data()[4] = '\0'; |
| 1406 | int64_t time_scale = 1; |
| 1407 | |
| 1408 | for (int i = 0; size / 4 != 0; size -= 4, i++) { |
| 1409 | io_->readOrThrow(buf.data(), 4); |
| 1410 | |
| 1411 | switch (i) { |
| 1412 | case MediaHeaderVersion: |
| 1413 | if (currentStream_ == Video) |
| 1414 | xmpData_["Xmp.video.MediaHeaderVersion"] = static_cast<int>(buf.read_uint8(0)); |
| 1415 | else if (currentStream_ == Audio) |
| 1416 | xmpData_["Xmp.audio.MediaHeaderVersion"] = static_cast<int>(buf.read_uint8(0)); |
| 1417 | break; |
| 1418 | case MediaCreateDate: |
| 1419 | // A 32-bit integer that specifies (in seconds since midnight, January 1, 1904) when the movie atom was created. |
| 1420 | if (currentStream_ == Video) |
| 1421 | xmpData_["Xmp.video.MediaCreateDate"] = buf.read_uint32(0, bigEndian); |
| 1422 | else if (currentStream_ == Audio) |
| 1423 | xmpData_["Xmp.audio.MediaCreateDate"] = buf.read_uint32(0, bigEndian); |
| 1424 | break; |
| 1425 | case MediaModifyDate: |
| 1426 | // A 32-bit integer that specifies (in seconds since midnight, January 1, 1904) when the movie atom was created. |
| 1427 | if (currentStream_ == Video) |
| 1428 | xmpData_["Xmp.video.MediaModifyDate"] = buf.read_uint32(0, bigEndian); |
| 1429 | else if (currentStream_ == Audio) |
| 1430 | xmpData_["Xmp.audio.MediaModifyDate"] = buf.read_uint32(0, bigEndian); |
| 1431 | break; |
| 1432 | case MediaTimeScale: |
| 1433 | if (currentStream_ == Video) |
| 1434 | xmpData_["Xmp.video.MediaTimeScale"] = buf.read_uint32(0, bigEndian); |
| 1435 | else if (currentStream_ == Audio) |
| 1436 | xmpData_["Xmp.audio.MediaTimeScale"] = buf.read_uint32(0, bigEndian); |
| 1437 | time_scale = buf.read_uint32(0, bigEndian); |
| 1438 | if (time_scale <= 0) |
| 1439 | time_scale = 1; |
| 1440 | mdhdTimeScale_ = time_scale; |
| 1441 | break; |
| 1442 | case MediaDuration: |
| 1443 | if (currentStream_ == Video) |
| 1444 | xmpData_["Xmp.video.MediaDuration"] = time_scale ? buf.read_uint32(0, bigEndian) / time_scale : 0; |
| 1445 | else if (currentStream_ == Audio) |
| 1446 | xmpData_["Xmp.audio.MediaDuration"] = time_scale ? buf.read_uint32(0, bigEndian) / time_scale : 0; |
| 1447 | break; |
| 1448 | case MediaLanguageCode: |
| 1449 | if (currentStream_ == Video) |
| 1450 | xmpData_["Xmp.video.MediaLangCode"] = buf.read_uint16(0, bigEndian); |
| 1451 | else if (currentStream_ == Audio) |
| 1452 | xmpData_["Xmp.audio.MediaLangCode"] = buf.read_uint16(0, bigEndian); |
| 1453 | break; |
| 1454 | |
| 1455 | default: |
| 1456 | break; |
| 1457 | } |
| 1458 | } |
| 1459 | io_->readOrThrow(buf.data(), size % 4); |
nothing calls this directly
no test coverage detected