32 : mutex_(
"MseMediaPlayer"),
34 std::placeholders::_1),
36 &util::Clock::Instance),
40 std::placeholders::_1),
41 &util::Clock::Instance, &pipeline_manager_),
46 video_renderer_(video_renderer),
47 audio_renderer_(audio_renderer),
54 auto printr = [](
const char* prefix,
55 const std::vector<BufferedRange>& ranges) {
57 for (
auto& range : ranges)
58 printf(
"%.1f-%.1f ", range.start, range.end);
61 auto print_stream = [&printr](
const char*
name, Source* stream) {
62 printf(
" %s:\n", name);
63 printr(
" Buffered: ", stream->GetBuffered());
65 stream->GetDecodedStream()->GetBufferedRanges());
73 printf(
" Duration: %.1f\n",
Duration());
78 print_stream(
"Audio", &audio_);
79 print_stream(
"Video", &video_);
93 std::unique_lock<SharedMutex> lock(mutex_);
94 video_.SetDecoder(video_decoder);
95 audio_.SetDecoder(audio_decoder);
110 auto* decoder = video_.GetDecoder();
114 auto new_config = config;
116 ret = ret & decoder->DecodingInfo(new_config);
119 auto* decoder = audio_.GetDecoder();
123 auto new_config = config;
125 ret = ret & decoder->DecodingInfo(new_config);
145 std::vector<std::vector<BufferedRange>> ranges;
146 for (
auto* ptr : {&video_, &audio_}) {
147 if (ptr->IsAttached())
148 ranges.emplace_back(ptr->GetBuffered());
164 LOG(FATAL) <<
"Not implemented";
170 LOG(FATAL) <<
"Not implemented";
175 LOG(FATAL) <<
"Not implemented";
181 LOG(FATAL) <<
"Not implemented";
186 LOG(FATAL) <<
"Not implemented";
192 LOG(FATAL) <<
"Not implemented";
196 TextTrackKind kind,
const std::string& label,
const std::string& language) {
198 LOG(FATAL) <<
"Not implemented";
210 auto frame = video_.GetFrame(time);
211 return frame ?
frame->stream_info->height : 0;
218 auto frame = video_.GetFrame(time);
223 return audio_renderer_->
Volume();
231 return audio_renderer_->
Muted();
239 pipeline_manager_.
Play();
243 pipeline_manager_.
Pause();
279 std::unique_lock<SharedMutex> lock(mutex_);
284 pipeline_manager_.
Reset();
285 pipeline_monitor_.
Start();
293 std::unique_lock<SharedMutex> lock(mutex_);
295 video_.Attach(stream);
297 audio_.Attach(stream);
302 video_renderer_->
Attach(video_.GetDecodedStream());
304 audio_renderer_->
Attach(audio_.GetDecodedStream());
309 if (std::isfinite(duration) && !std::isfinite(
Duration()))
320 for (
auto* ptr : {&video_, &audio_}) {
321 if (ptr->IsAttached()) {
322 auto buffered = ptr->GetBuffered();
323 if (!buffered.empty())
324 duration = std::max(duration, buffered.back().end);
333 std::unique_lock<SharedMutex> lock(mutex_);
334 video_.SetCdm(implementation);
335 audio_.SetCdm(implementation);
341 audio_renderer_->
Detach();
342 video_renderer_->
Detach();
343 pipeline_monitor_.
Stop();
346 std::unique_lock<SharedMutex> lock(mutex_);
358 std::unique_lock<SharedMutex> lock(mutex_);
359 old_state = old_state_;
363 if (state == old_state)
389 std::unique_lock<SharedMutex> lock(mutex_);
391 ready_state_ = state;
397 void MseMediaPlayer::OnSeek() {
401 std::unique_lock<SharedMutex> lock(mutex_);
406 void MseMediaPlayer::OnError(
const std::string& error) {
411 void MseMediaPlayer::OnWaitingForKey() {
415 std::vector<BufferedRange> MseMediaPlayer::GetDecoded()
const {
417 std::vector<std::vector<BufferedRange>> ranges;
418 for (
auto* ptr : {&video_, &audio_}) {
419 if (ptr->IsAttached())
420 ranges.emplace_back(ptr->GetDecodedStream()->GetBufferedRanges());
428 decoder_thread_(player, &decoded_frames_),
431 decoder_thread_.SetDecoder(GetDecoder());
434 MseMediaPlayer::Source::~Source() {}
436 const DecodedStream* MseMediaPlayer::Source::GetDecodedStream()
const {
437 return &decoded_frames_;
440 Decoder* MseMediaPlayer::Source::GetDecoder()
const {
441 return decoder_ ? decoder_ : default_decoder_.get();
444 void MseMediaPlayer::Source::SetDecoder(
Decoder* decoder) {
446 decoder_thread_.SetDecoder(GetDecoder());
449 std::vector<BufferedRange> MseMediaPlayer::Source::GetBuffered()
const {
450 return input_ ? input_->GetBufferedRanges() : std::vector<BufferedRange>{};
453 std::shared_ptr<DecodedFrame> MseMediaPlayer::Source::GetFrame(
458 bool MseMediaPlayer::Source::IsAttached()
const {
463 DCHECK(!IsAttached());
464 decoded_frames_.Clear();
465 decoder_thread_.Attach(stream);
469 void MseMediaPlayer::Source::Detach() {
470 decoder_thread_.Detach();
474 void MseMediaPlayer::Source::OnSeek() {
475 decoder_thread_.OnSeek();
479 decoder_thread_.SetCdm(cdm);
std::shared_ptr< shaka::media::DecodedFrame > frame
static const Clock Instance
virtual void SleepSeconds(double seconds) const