35 demuxer_(mime, media_source.
get(), &frames_),
36 media_source_(media_source),
38 append_window_start_(0),
39 append_window_end_(HUGE_VAL ) {
48 SourceBuffer::~SourceBuffer() {}
53 tracer->
Trace(&append_buffer_);
54 tracer->
Trace(&media_source_);
64 media_source_ =
nullptr;
74 "Already performing an update.");
79 media_source_->ScheduleEvent<
events::Event>(EventType::SourceOpen);
82 append_buffer_ = std::move(data);
84 timestamp_offset_, append_window_start_, append_window_end_,
85 append_buffer_.data(), append_buffer_.size(),
86 std::bind(&SourceBuffer::OnAppendComplete,
this, std::placeholders::_1));
103 "Already performing an update.");
107 frames_.
Remove(start, end);
109 ScheduleEvent<events::Event>(EventType::UpdateEnd);
118 if (!media_source_) {
121 "SourceBuffer is detached from the <video> element.");
127 return timestamp_offset_;
131 if (!std::isfinite(offset)) {
135 if (!media_source_) {
138 "SourceBuffer is detached from the <video> element.");
142 "Already performing an update.");
145 timestamp_offset_ = offset;
150 return append_window_start_;
154 if (!std::isfinite(window_start)) {
156 "appendWindowStart cannot be NaN or +/-Infinity.");
159 if (!media_source_) {
162 "SourceBuffer is detached from the <video> element.");
166 "Already performing an update.");
168 if (window_start < 0) {
171 if (window_start >= append_window_end_) {
173 "appendWindowStart cannot be greater than appendWindowEnd.");
176 append_window_start_ = window_start;
181 return append_window_end_;
185 if (!media_source_) {
188 "SourceBuffer is detached from the <video> element.");
192 "Already performing an update.");
194 if (std::isnan(window_end)) {
197 if (window_end <= append_window_start_) {
199 "appendWindowEnd cannot be less than appendWindowStart.");
202 append_window_end_ = window_end;
206 void SourceBuffer::OnAppendComplete(
bool success) {
207 VLOG(1) <<
"Finish appending media segment: " 208 << (success ?
"success" :
"error");
210 append_buffer_.
Clear();
213 ScheduleEvent<events::Event>(EventType::Error);
215 ScheduleEvent<events::Event>(EventType::UpdateEnd);
242 NotImplemented(
"audioTracks");
243 NotImplemented(
"videoTracks");
244 NotImplemented(
"textTracks");
SourceBuffer(const std::string &mime, RefPtr< MediaSource > media_source)
ExceptionOr< void > SetTimestampOffset(double offset)
ExceptionOr< void > SetAppendWindowEnd(double window_end)
double AppendWindowStart() const
void Trace(memory::HeapTracer *tracer) const override
bool Attach(const std::string &mime, media::MediaPlayer *player, bool is_video)
void Trace(const Traceable *ptr)
ExceptionOr< void > Remove(double start, double end)
double TimestampOffset() const
media::BufferedRanges GetBufferedRanges() const
impl::get_const_reference_at_t< I, Choices... > get(const variant< Choices... > &variant)
double AppendWindowEnd() const
void Trace(memory::HeapTracer *tracer) const override
ExceptionOr< void > SetAppendWindowStart(double window_start)
ExceptionOr< void > AppendBuffer(ByteBuffer data)
static JsError TypeError(const std::string &message)
static JsError DOMException(ExceptionCode code)
ExceptionOr< RefPtr< TimeRanges > > GetBuffered() const
void AddListenerField(EventType type, Listener *on_field)