7#include <packager/media/chunking/sync_point_queue.h>
14#include <absl/log/check.h>
15#include <absl/synchronization/mutex.h>
17#include <packager/ad_cue_generator_params.h>
18#include <packager/media/base/media_handler.h>
23SyncPointQueue::SyncPointQueue(
const AdCueGeneratorParams& params) {
24 for (
const Cuepoint& point : params.cue_points) {
25 std::shared_ptr<CueEvent>
event = std::make_shared<CueEvent>();
26 event->time_in_seconds = point.start_time_in_seconds;
27 unpromoted_[point.start_time_in_seconds] = std::move(event);
32 absl::MutexLock lock(mutex_);
38 absl::MutexLock lock(mutex_);
41 sync_condition_.SignalAll();
45 absl::MutexLock lock(mutex_);
47 auto iter = promoted_.upper_bound(time_in_seconds);
48 if (iter != promoted_.end())
51 iter = unpromoted_.upper_bound(time_in_seconds);
52 if (iter != unpromoted_.end())
57 return std::numeric_limits<double>::max();
61 double hint_in_seconds) {
62 absl::MutexLock lock(mutex_);
66 auto iter = promoted_.lower_bound(hint_in_seconds);
67 if (iter != promoted_.end()) {
72 if (waiting_thread_count_ + 1 == thread_count_) {
73 std::shared_ptr<const CueEvent> cue = PromoteAtNoLocking(hint_in_seconds);
78 waiting_thread_count_++;
84 sync_condition_.Wait(&mutex_);
85 waiting_thread_count_--;
91 double time_in_seconds) {
92 absl::MutexLock lock(mutex_);
93 return PromoteAtNoLocking(time_in_seconds);
97 return hint_in_seconds < std::numeric_limits<double>::max();
100std::shared_ptr<const CueEvent> SyncPointQueue::PromoteAtNoLocking(
101 double time_in_seconds) {
105 auto iter = promoted_.find(time_in_seconds);
106 if (iter != promoted_.end())
113 iter = unpromoted_.upper_bound(time_in_seconds);
117 if (iter == unpromoted_.begin())
119 auto prev_iter = std::prev(iter);
120 DCHECK(prev_iter != unpromoted_.end());
122 std::shared_ptr<CueEvent> cue = prev_iter->second;
123 cue->time_in_seconds = time_in_seconds;
125 promoted_[time_in_seconds] = cue;
129 unpromoted_.erase(unpromoted_.begin(), iter);
132 sync_condition_.SignalAll();
All the methods that are virtual are virtual for mocking.