7#include <packager/media/formats/webm/seek_head.h>
15#include <absl/log/check.h>
16#include <common/webmids.h>
17#include <mkvmuxer/mkvmuxertypes.h>
18#include <mkvmuxer/mkvmuxerutil.h>
20using namespace mkvmuxer;
27const size_t kElementIdCount = 4u;
29uint64_t EbmlMasterElementWithPayloadSize(libwebm::MkvId
id,
30 uint64_t payload_size) {
31 return EbmlMasterElementSize(
id, payload_size) + payload_size;
34uint64_t MaxSeekEntrySize() {
35 const uint64_t max_entry_payload_size =
38 static_cast<mkvmuxer::uint64
>(std::numeric_limits<uint32_t>::max())) +
39 EbmlElementSize(libwebm::kMkvSeekPosition,
40 std::numeric_limits<mkvmuxer::uint64>::max());
41 return EbmlMasterElementWithPayloadSize(libwebm::kMkvSeek,
42 max_entry_payload_size);
48 : total_void_size_(EbmlMasterElementWithPayloadSize(
49 libwebm::kMkvSeekHead,
50 kElementIdCount * MaxSeekEntrySize())) {}
52SeekHead::~SeekHead() {}
54bool SeekHead::Write(mkvmuxer::IMkvWriter* writer) {
55 std::vector<SeekElement> seek_elements = CreateSeekElements();
56 if (seek_elements.empty())
59 uint64_t payload_size = 0;
60 for (
const SeekHead::SeekElement& seek_element : seek_elements) {
62 EbmlMasterElementWithPayloadSize(libwebm::kMkvSeek, seek_element.size);
65 const int64_t start_pos = writer->Position();
66 if (!WriteEbmlMasterElement(writer, libwebm::kMkvSeekHead, payload_size))
69 for (
const SeekHead::SeekElement& element : seek_elements) {
70 if (!WriteEbmlMasterElement(writer, libwebm::kMkvSeek, element.size) ||
71 !WriteEbmlElement(writer, libwebm::kMkvSeekID, element.id) ||
72 !WriteEbmlElement(writer, libwebm::kMkvSeekPosition, element.position))
78 const uint64_t extra_void =
79 total_void_size_ - (writer->Position() - start_pos);
80 if (!WriteVoidElement(writer, extra_void))
87bool SeekHead::WriteVoid(mkvmuxer::IMkvWriter* writer) {
88 const uint64_t written = WriteVoidElement(writer, total_void_size_);
95std::vector<SeekHead::SeekElement> SeekHead::CreateSeekElements() {
96 std::vector<SeekHead::SeekElement> seek_elements;
98 seek_elements.emplace_back(libwebm::kMkvInfo, info_pos_);
100 seek_elements.emplace_back(libwebm::kMkvTracks, tracks_pos_);
102 seek_elements.emplace_back(libwebm::kMkvCues, cues_pos_);
103 if (cluster_pos_ != 0)
104 seek_elements.emplace_back(libwebm::kMkvCluster, cluster_pos_);
105 DCHECK_LE(seek_elements.size(), kElementIdCount);
107 std::sort(seek_elements.begin(), seek_elements.end(),
108 [](
const SeekHead::SeekElement& left,
109 const SeekHead::SeekElement& right) {
110 return left.position < right.position;
112 for (SeekHead::SeekElement& element : seek_elements) {
113 element.size = EbmlElementSize(libwebm::kMkvSeekID, element.id) +
114 EbmlElementSize(libwebm::kMkvSeekPosition, element.position);
116 return seek_elements;
All the methods that are virtual are virtual for mocking.