1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "media/base/android/media_source_player.h" 6 7 #include "base/android/jni_android.h" 8 #include "base/android/jni_string.h" 9 #include "base/basictypes.h" 10 #include "base/bind.h" 11 #include "base/lazy_instance.h" 12 #include "base/logging.h" 13 #include "base/message_loop/message_loop.h" 14 #include "base/threading/thread.h" 15 #include "media/base/android/media_codec_bridge.h" 16 #include "media/base/android/media_drm_bridge.h" 17 #include "media/base/android/media_player_manager.h" 18 #include "media/base/audio_timestamp_helper.h" 19 20 namespace { 21 22 // Timeout value for media codec operations. Because the first 23 // DequeInputBuffer() can take about 150 milliseconds, use 250 milliseconds 24 // here. See b/9357571. 25 const int kMediaCodecTimeoutInMilliseconds = 250; 26 27 // Use 16bit PCM for audio output. Keep this value in sync with the output 28 // format we passed to AudioTrack in MediaCodecBridge. 29 const int kBytesPerAudioOutputSample = 2; 30 31 class DecoderThread : public base::Thread { 32 public: 33 virtual ~DecoderThread() {} 34 protected: 35 DecoderThread(const char* name) : base::Thread(name) { Start(); } 36 }; 37 38 class AudioDecoderThread : public DecoderThread { 39 public: 40 AudioDecoderThread() : DecoderThread("MediaSource_AudioDecoderThread") {} 41 }; 42 43 class VideoDecoderThread : public DecoderThread { 44 public: 45 VideoDecoderThread() : DecoderThread("MediaSource_VideoDecoderThread") {} 46 }; 47 48 // TODO(qinmin): Check if it is tolerable to use worker pool to handle all the 49 // decoding tasks so that we don't need the global threads here. 50 // http://crbug.com/245750 51 base::LazyInstance<AudioDecoderThread>::Leaky 52 g_audio_decoder_thread = LAZY_INSTANCE_INITIALIZER; 53 54 base::LazyInstance<VideoDecoderThread>::Leaky 55 g_video_decoder_thread = LAZY_INSTANCE_INITIALIZER; 56 57 } 58 59 namespace media { 60 61 MediaDecoderJob::MediaDecoderJob( 62 const scoped_refptr<base::MessageLoopProxy>& decoder_loop, 63 MediaCodecBridge* media_codec_bridge, 64 bool is_audio) 65 : ui_loop_(base::MessageLoopProxy::current()), 66 decoder_loop_(decoder_loop), 67 media_codec_bridge_(media_codec_bridge), 68 needs_flush_(false), 69 is_audio_(is_audio), 70 input_eos_encountered_(false), 71 weak_this_(this), 72 is_decoding_(false) { 73 } 74 75 MediaDecoderJob::~MediaDecoderJob() {} 76 77 // Class for managing audio decoding jobs. 78 class AudioDecoderJob : public MediaDecoderJob { 79 public: 80 virtual ~AudioDecoderJob() {} 81 82 static AudioDecoderJob* Create( 83 const AudioCodec audio_codec, int sample_rate, int channel_count, 84 const uint8* extra_data, size_t extra_data_size, jobject media_crypto); 85 86 void SetVolume(double volume); 87 88 private: 89 AudioDecoderJob(MediaCodecBridge* media_codec_bridge); 90 }; 91 92 // Class for managing video decoding jobs. 93 class VideoDecoderJob : public MediaDecoderJob { 94 public: 95 virtual ~VideoDecoderJob() {} 96 97 static VideoDecoderJob* Create( 98 const VideoCodec video_codec, const gfx::Size& size, jobject surface, 99 jobject media_crypto); 100 101 private: 102 VideoDecoderJob(MediaCodecBridge* media_codec_bridge); 103 }; 104 105 void MediaDecoderJob::Decode( 106 const AccessUnit& unit, 107 const base::TimeTicks& start_time_ticks, 108 const base::TimeDelta& start_presentation_timestamp, 109 const MediaDecoderJob::DecoderCallback& callback) { 110 DCHECK(!is_decoding_); 111 DCHECK(ui_loop_->BelongsToCurrentThread()); 112 is_decoding_ = true; 113 decoder_loop_->PostTask(FROM_HERE, base::Bind( 114 &MediaDecoderJob::DecodeInternal, base::Unretained(this), unit, 115 start_time_ticks, start_presentation_timestamp, needs_flush_, 116 callback)); 117 needs_flush_ = false; 118 } 119 120 MediaDecoderJob::DecodeStatus MediaDecoderJob::QueueInputBuffer( 121 const AccessUnit& unit) { 122 base::TimeDelta timeout = base::TimeDelta::FromMilliseconds( 123 kMediaCodecTimeoutInMilliseconds); 124 int input_buf_index = media_codec_bridge_->DequeueInputBuffer(timeout); 125 if (input_buf_index == MediaCodecBridge::INFO_MEDIA_CODEC_ERROR) 126 return DECODE_FAILED; 127 if (input_buf_index == MediaCodecBridge::INFO_TRY_AGAIN_LATER) 128 return DECODE_TRY_ENQUEUE_INPUT_AGAIN_LATER; 129 130 // TODO(qinmin): skip frames if video is falling far behind. 131 DCHECK(input_buf_index >= 0); 132 if (unit.end_of_stream || unit.data.empty()) { 133 media_codec_bridge_->QueueEOS(input_buf_index); 134 return DECODE_INPUT_END_OF_STREAM; 135 } 136 if (unit.key_id.empty()) { 137 media_codec_bridge_->QueueInputBuffer( 138 input_buf_index, &unit.data[0], unit.data.size(), unit.timestamp); 139 } else { 140 if (unit.iv.empty() || unit.subsamples.empty()) { 141 LOG(ERROR) << "The access unit doesn't have iv or subsamples while it " 142 << "has key IDs!"; 143 return DECODE_FAILED; 144 } 145 media_codec_bridge_->QueueSecureInputBuffer( 146 input_buf_index, &unit.data[0], unit.data.size(), 147 reinterpret_cast<const uint8*>(&unit.key_id[0]), unit.key_id.size(), 148 reinterpret_cast<const uint8*>(&unit.iv[0]), unit.iv.size(), 149 &unit.subsamples[0], unit.subsamples.size(), unit.timestamp); 150 } 151 152 return DECODE_SUCCEEDED; 153 } 154 155 void MediaDecoderJob::DecodeInternal( 156 const AccessUnit& unit, 157 const base::TimeTicks& start_time_ticks, 158 const base::TimeDelta& start_presentation_timestamp, 159 bool needs_flush, 160 const MediaDecoderJob::DecoderCallback& callback) { 161 if (needs_flush) { 162 DVLOG(1) << "DecodeInternal needs flush."; 163 input_eos_encountered_ = false; 164 int reset_status = media_codec_bridge_->Reset(); 165 if (0 != reset_status) { 166 ui_loop_->PostTask(FROM_HERE, base::Bind( 167 callback, DECODE_FAILED, start_presentation_timestamp, 0)); 168 return; 169 } 170 } 171 172 DecodeStatus decode_status = DECODE_INPUT_END_OF_STREAM; 173 if (!input_eos_encountered_) { 174 decode_status = QueueInputBuffer(unit); 175 if (decode_status == DECODE_INPUT_END_OF_STREAM) { 176 input_eos_encountered_ = true; 177 } else if (decode_status != DECODE_SUCCEEDED) { 178 ui_loop_->PostTask(FROM_HERE, 179 base::Bind(callback, decode_status, 180 start_presentation_timestamp, 0)); 181 return; 182 } 183 } 184 185 size_t offset = 0; 186 size_t size = 0; 187 base::TimeDelta presentation_timestamp; 188 bool end_of_stream = false; 189 190 base::TimeDelta timeout = base::TimeDelta::FromMilliseconds( 191 kMediaCodecTimeoutInMilliseconds); 192 int outputBufferIndex = media_codec_bridge_->DequeueOutputBuffer( 193 timeout, &offset, &size, &presentation_timestamp, &end_of_stream); 194 195 if (end_of_stream) 196 decode_status = DECODE_OUTPUT_END_OF_STREAM; 197 switch (outputBufferIndex) { 198 case MediaCodecBridge::INFO_OUTPUT_BUFFERS_CHANGED: 199 DCHECK(decode_status != DECODE_INPUT_END_OF_STREAM); 200 media_codec_bridge_->GetOutputBuffers(); 201 break; 202 case MediaCodecBridge::INFO_OUTPUT_FORMAT_CHANGED: 203 DCHECK(decode_status != DECODE_INPUT_END_OF_STREAM); 204 // TODO(qinmin): figure out what we should do if format changes. 205 decode_status = DECODE_FORMAT_CHANGED; 206 break; 207 case MediaCodecBridge::INFO_TRY_AGAIN_LATER: 208 decode_status = DECODE_TRY_DEQUEUE_OUTPUT_AGAIN_LATER; 209 break; 210 case MediaCodecBridge::INFO_MEDIA_CODEC_ERROR: 211 decode_status = DECODE_FAILED; 212 break; 213 default: 214 DCHECK_LE(0, outputBufferIndex); 215 base::TimeDelta time_to_render; 216 DCHECK(!start_time_ticks.is_null()); 217 if (!is_audio_) { 218 time_to_render = presentation_timestamp - (base::TimeTicks::Now() - 219 start_time_ticks + start_presentation_timestamp); 220 } 221 if (time_to_render >= base::TimeDelta()) { 222 base::MessageLoop::current()->PostDelayedTask( 223 FROM_HERE, 224 base::Bind(&MediaDecoderJob::ReleaseOutputBuffer, 225 weak_this_.GetWeakPtr(), outputBufferIndex, size, 226 presentation_timestamp, callback, decode_status), 227 time_to_render); 228 } else { 229 // TODO(qinmin): The codec is lagging behind, need to recalculate the 230 // |start_presentation_timestamp_| and |start_time_ticks_|. 231 DVLOG(1) << (is_audio_ ? "audio " : "video ") 232 << "codec is lagging behind :" << time_to_render.InMicroseconds(); 233 ReleaseOutputBuffer(outputBufferIndex, size, presentation_timestamp, 234 callback, decode_status); 235 } 236 return; 237 } 238 ui_loop_->PostTask(FROM_HERE, base::Bind( 239 callback, decode_status, start_presentation_timestamp, 0)); 240 } 241 242 void MediaDecoderJob::ReleaseOutputBuffer( 243 int outputBufferIndex, size_t size, 244 const base::TimeDelta& presentation_timestamp, 245 const MediaDecoderJob::DecoderCallback& callback, DecodeStatus status) { 246 // TODO(qinmin): Refactor this function. Maybe AudioDecoderJob should provide 247 // its own ReleaseOutputBuffer(). 248 if (is_audio_) { 249 static_cast<AudioCodecBridge*>(media_codec_bridge_.get())->PlayOutputBuffer( 250 outputBufferIndex, size); 251 } 252 if (status != DECODE_OUTPUT_END_OF_STREAM || size != 0u) 253 media_codec_bridge_->ReleaseOutputBuffer(outputBufferIndex, !is_audio_); 254 ui_loop_->PostTask(FROM_HERE, base::Bind( 255 callback, status, presentation_timestamp, is_audio_ ? size : 0)); 256 } 257 258 void MediaDecoderJob::OnDecodeCompleted() { 259 DCHECK(ui_loop_->BelongsToCurrentThread()); 260 is_decoding_ = false; 261 } 262 263 void MediaDecoderJob::Flush() { 264 // Do nothing, flush when the next Decode() happens. 265 needs_flush_ = true; 266 } 267 268 void MediaDecoderJob::Release() { 269 // If |decoding_| is false, there is nothing running on the decoder thread. 270 // So it is safe to delete the MediaDecoderJob on the UI thread. However, 271 // if we post a task to the decoder thread to delete object, then we cannot 272 // immediately pass the surface to a new MediaDecoderJob instance because 273 // the java surface is still owned by the old object. New decoder creation 274 // will be blocked on the UI thread until the previous decoder gets deleted. 275 // This introduces extra latency during config changes, and makes the logic in 276 // MediaSourcePlayer more complicated. 277 // 278 // TODO(qinmin): Figure out the logic to passing the surface to a new 279 // MediaDecoderJob instance after the previous one gets deleted on the decoder 280 // thread. 281 if (is_decoding_ && !decoder_loop_->BelongsToCurrentThread()) { 282 DCHECK(ui_loop_->BelongsToCurrentThread()); 283 decoder_loop_->DeleteSoon(FROM_HERE, this); 284 } else { 285 delete this; 286 } 287 } 288 289 VideoDecoderJob* VideoDecoderJob::Create( 290 const VideoCodec video_codec, const gfx::Size& size, jobject surface, 291 jobject media_crypto) { 292 scoped_ptr<VideoCodecBridge> codec(VideoCodecBridge::Create(video_codec)); 293 if (codec && codec->Start(video_codec, size, surface, media_crypto)) 294 return new VideoDecoderJob(codec.release()); 295 return NULL; 296 } 297 298 VideoDecoderJob::VideoDecoderJob(MediaCodecBridge* media_codec_bridge) 299 : MediaDecoderJob(g_video_decoder_thread.Pointer()->message_loop_proxy(), 300 media_codec_bridge, 301 false) {} 302 303 AudioDecoderJob* AudioDecoderJob::Create( 304 const AudioCodec audio_codec, 305 int sample_rate, 306 int channel_count, 307 const uint8* extra_data, 308 size_t extra_data_size, 309 jobject media_crypto) { 310 scoped_ptr<AudioCodecBridge> codec(AudioCodecBridge::Create(audio_codec)); 311 if (codec && codec->Start(audio_codec, sample_rate, channel_count, extra_data, 312 extra_data_size, true, media_crypto)) { 313 return new AudioDecoderJob(codec.release()); 314 } 315 return NULL; 316 } 317 318 AudioDecoderJob::AudioDecoderJob(MediaCodecBridge* media_codec_bridge) 319 : MediaDecoderJob(g_audio_decoder_thread.Pointer()->message_loop_proxy(), 320 media_codec_bridge, 321 true) {} 322 323 void AudioDecoderJob::SetVolume(double volume) { 324 static_cast<AudioCodecBridge*>(media_codec_bridge_.get())->SetVolume(volume); 325 } 326 327 MediaSourcePlayer::MediaSourcePlayer( 328 int player_id, 329 MediaPlayerManager* manager) 330 : MediaPlayerAndroid(player_id, manager), 331 pending_event_(NO_EVENT_PENDING), 332 seek_request_id_(0), 333 width_(0), 334 height_(0), 335 audio_codec_(kUnknownAudioCodec), 336 video_codec_(kUnknownVideoCodec), 337 num_channels_(0), 338 sampling_rate_(0), 339 audio_finished_(true), 340 video_finished_(true), 341 playing_(false), 342 is_audio_encrypted_(false), 343 is_video_encrypted_(false), 344 volume_(-1.0), 345 clock_(&default_tick_clock_), 346 reconfig_audio_decoder_(false), 347 reconfig_video_decoder_(false), 348 audio_access_unit_index_(0), 349 video_access_unit_index_(0), 350 waiting_for_audio_data_(false), 351 waiting_for_video_data_(false), 352 sync_decoder_jobs_(true), 353 weak_this_(this), 354 drm_bridge_(NULL) { 355 } 356 357 MediaSourcePlayer::~MediaSourcePlayer() { 358 Release(); 359 } 360 361 void MediaSourcePlayer::SetVideoSurface(gfx::ScopedJavaSurface surface) { 362 // Ignore non-empty surface that is unprotected if |is_video_encrypted_| is 363 // true. 364 if (is_video_encrypted_ && !surface.IsEmpty() && !surface.is_protected()) 365 return; 366 367 surface_ = surface.Pass(); 368 pending_event_ |= SURFACE_CHANGE_EVENT_PENDING; 369 if (pending_event_ & SEEK_EVENT_PENDING) { 370 // Waiting for the seek to finish. 371 return; 372 } 373 // Setting a new surface will require a new MediaCodec to be created. 374 // Request a seek so that the new decoder will decode an I-frame first. 375 // Or otherwise, the new MediaCodec might crash. See b/8950387. 376 pending_event_ |= SEEK_EVENT_PENDING; 377 ProcessPendingEvents(); 378 } 379 380 bool MediaSourcePlayer::Seekable() { 381 // If the duration TimeDelta, converted to milliseconds from microseconds, 382 // is >= 2^31, then the media is assumed to be unbounded and unseekable. 383 // 2^31 is the bound due to java player using 32-bit integer for time 384 // values at millisecond resolution. 385 return duration_ < 386 base::TimeDelta::FromMilliseconds(std::numeric_limits<int32>::max()); 387 } 388 389 void MediaSourcePlayer::Start() { 390 playing_ = true; 391 392 if (is_video_encrypted_) 393 manager()->OnProtectedSurfaceRequested(player_id()); 394 395 StartInternal(); 396 } 397 398 void MediaSourcePlayer::Pause() { 399 // Since decoder jobs have their own thread, decoding is not fully paused 400 // until all the decoder jobs call MediaDecoderCallback(). It is possible 401 // that Start() is called while the player is waiting for 402 // MediaDecoderCallback(). In that case, decoding will continue when 403 // MediaDecoderCallback() is called. 404 playing_ = false; 405 start_time_ticks_ = base::TimeTicks(); 406 } 407 408 bool MediaSourcePlayer::IsPlaying() { 409 return playing_; 410 } 411 412 int MediaSourcePlayer::GetVideoWidth() { 413 return width_; 414 } 415 416 int MediaSourcePlayer::GetVideoHeight() { 417 return height_; 418 } 419 420 void MediaSourcePlayer::SeekTo(base::TimeDelta timestamp) { 421 clock_.SetTime(timestamp, timestamp); 422 if (audio_timestamp_helper_) 423 audio_timestamp_helper_->SetBaseTimestamp(timestamp); 424 pending_event_ |= SEEK_EVENT_PENDING; 425 ProcessPendingEvents(); 426 } 427 428 base::TimeDelta MediaSourcePlayer::GetCurrentTime() { 429 return clock_.Elapsed(); 430 } 431 432 base::TimeDelta MediaSourcePlayer::GetDuration() { 433 return duration_; 434 } 435 436 void MediaSourcePlayer::Release() { 437 ClearDecodingData(); 438 audio_decoder_job_.reset(); 439 video_decoder_job_.reset(); 440 reconfig_audio_decoder_ = false; 441 reconfig_video_decoder_ = false; 442 playing_ = false; 443 pending_event_ = NO_EVENT_PENDING; 444 surface_ = gfx::ScopedJavaSurface(); 445 ReleaseMediaResourcesFromManager(); 446 } 447 448 void MediaSourcePlayer::SetVolume(double volume) { 449 volume_ = volume; 450 SetVolumeInternal(); 451 } 452 453 bool MediaSourcePlayer::CanPause() { 454 return Seekable(); 455 } 456 457 bool MediaSourcePlayer::CanSeekForward() { 458 return Seekable(); 459 } 460 461 bool MediaSourcePlayer::CanSeekBackward() { 462 return Seekable(); 463 } 464 465 bool MediaSourcePlayer::IsPlayerReady() { 466 return audio_decoder_job_ || video_decoder_job_; 467 } 468 469 void MediaSourcePlayer::StartInternal() { 470 // If there are pending events, wait for them finish. 471 if (pending_event_ != NO_EVENT_PENDING) 472 return; 473 474 // Create decoder jobs if they are not created 475 ConfigureAudioDecoderJob(); 476 ConfigureVideoDecoderJob(); 477 478 479 // If one of the decoder job is not ready, do nothing. 480 if ((HasAudio() && !audio_decoder_job_) || 481 (HasVideo() && !video_decoder_job_)) { 482 return; 483 } 484 485 audio_finished_ = false; 486 video_finished_ = false; 487 sync_decoder_jobs_ = true; 488 SyncAndStartDecoderJobs(); 489 } 490 491 void MediaSourcePlayer::DemuxerReady( 492 const MediaPlayerHostMsg_DemuxerReady_Params& params) { 493 duration_ = base::TimeDelta::FromMilliseconds(params.duration_ms); 494 clock_.SetDuration(duration_); 495 496 audio_codec_ = params.audio_codec; 497 num_channels_ = params.audio_channels; 498 sampling_rate_ = params.audio_sampling_rate; 499 is_audio_encrypted_ = params.is_audio_encrypted; 500 audio_extra_data_ = params.audio_extra_data; 501 if (HasAudio()) { 502 DCHECK_GT(num_channels_, 0); 503 audio_timestamp_helper_.reset(new AudioTimestampHelper(sampling_rate_)); 504 audio_timestamp_helper_->SetBaseTimestamp(GetCurrentTime()); 505 } else { 506 audio_timestamp_helper_.reset(); 507 } 508 509 video_codec_ = params.video_codec; 510 width_ = params.video_size.width(); 511 height_ = params.video_size.height(); 512 is_video_encrypted_ = params.is_video_encrypted; 513 514 OnMediaMetadataChanged(duration_, width_, height_, true); 515 516 if (pending_event_ & CONFIG_CHANGE_EVENT_PENDING) { 517 if (reconfig_audio_decoder_) 518 ConfigureAudioDecoderJob(); 519 520 // If there is a pending surface change, we can merge it with the config 521 // change. 522 if (reconfig_video_decoder_) { 523 pending_event_ &= ~SURFACE_CHANGE_EVENT_PENDING; 524 ConfigureVideoDecoderJob(); 525 } 526 pending_event_ &= ~CONFIG_CHANGE_EVENT_PENDING; 527 if (playing_) 528 StartInternal(); 529 } 530 } 531 532 void MediaSourcePlayer::ReadFromDemuxerAck( 533 const MediaPlayerHostMsg_ReadFromDemuxerAck_Params& params) { 534 DCHECK_LT(0u, params.access_units.size()); 535 if (params.type == DemuxerStream::AUDIO) 536 waiting_for_audio_data_ = false; 537 else 538 waiting_for_video_data_ = false; 539 540 // If there is a pending seek request, ignore the data from the chunk demuxer. 541 // The data will be requested later when OnSeekRequestAck() is called. 542 if (pending_event_ & SEEK_EVENT_PENDING) 543 return; 544 545 if (params.type == DemuxerStream::AUDIO) { 546 DCHECK_EQ(0u, audio_access_unit_index_); 547 received_audio_ = params; 548 } else { 549 DCHECK_EQ(0u, video_access_unit_index_); 550 received_video_ = params; 551 } 552 553 if (pending_event_ != NO_EVENT_PENDING || !playing_) 554 return; 555 556 if (sync_decoder_jobs_) { 557 SyncAndStartDecoderJobs(); 558 return; 559 } 560 561 if (params.type == DemuxerStream::AUDIO) 562 DecodeMoreAudio(); 563 else 564 DecodeMoreVideo(); 565 } 566 567 void MediaSourcePlayer::DurationChanged(const base::TimeDelta& duration) { 568 duration_ = duration; 569 clock_.SetDuration(duration_); 570 } 571 572 void MediaSourcePlayer::SetDrmBridge(MediaDrmBridge* drm_bridge) { 573 // Currently we don't support DRM change during the middle of playback, even 574 // if the player is paused. 575 // TODO(qinmin): support DRM change after playback has started. 576 // http://crbug.com/253792. 577 if (GetCurrentTime() > base::TimeDelta()) { 578 LOG(INFO) << "Setting DRM bridge after play back has started. " 579 << "This is not well supported!"; 580 } 581 582 drm_bridge_ = drm_bridge; 583 584 if (playing_) 585 StartInternal(); 586 } 587 588 void MediaSourcePlayer::OnSeekRequestAck(unsigned seek_request_id) { 589 DVLOG(1) << "OnSeekRequestAck(" << seek_request_id << ")"; 590 // Do nothing until the most recent seek request is processed. 591 if (seek_request_id_ != seek_request_id) 592 return; 593 pending_event_ &= ~SEEK_EVENT_PENDING; 594 OnSeekComplete(); 595 ProcessPendingEvents(); 596 } 597 598 void MediaSourcePlayer::UpdateTimestamps( 599 const base::TimeDelta& presentation_timestamp, size_t audio_output_bytes) { 600 if (audio_output_bytes > 0) { 601 audio_timestamp_helper_->AddFrames( 602 audio_output_bytes / (kBytesPerAudioOutputSample * num_channels_)); 603 clock_.SetMaxTime(audio_timestamp_helper_->GetTimestamp()); 604 } else { 605 clock_.SetMaxTime(presentation_timestamp); 606 } 607 608 OnTimeUpdated(); 609 } 610 611 void MediaSourcePlayer::ProcessPendingEvents() { 612 // Wait for all the decoding jobs to finish before processing pending tasks. 613 if ((audio_decoder_job_ && audio_decoder_job_->is_decoding()) || 614 (video_decoder_job_ && video_decoder_job_->is_decoding())) { 615 return; 616 } 617 618 if (pending_event_ & SEEK_EVENT_PENDING) { 619 ClearDecodingData(); 620 manager()->OnMediaSeekRequest( 621 player_id(), GetCurrentTime(), ++seek_request_id_); 622 return; 623 } 624 625 start_time_ticks_ = base::TimeTicks(); 626 if (pending_event_ & CONFIG_CHANGE_EVENT_PENDING) { 627 DCHECK(reconfig_audio_decoder_ || reconfig_video_decoder_); 628 manager()->OnMediaConfigRequest(player_id()); 629 return; 630 } 631 632 if (pending_event_ & SURFACE_CHANGE_EVENT_PENDING) { 633 video_decoder_job_.reset(); 634 ConfigureVideoDecoderJob(); 635 pending_event_ &= ~SURFACE_CHANGE_EVENT_PENDING; 636 } 637 638 if (playing_) 639 StartInternal(); 640 } 641 642 void MediaSourcePlayer::MediaDecoderCallback( 643 bool is_audio, MediaDecoderJob::DecodeStatus decode_status, 644 const base::TimeDelta& presentation_timestamp, size_t audio_output_bytes) { 645 if (is_audio && audio_decoder_job_) 646 audio_decoder_job_->OnDecodeCompleted(); 647 if (!is_audio && video_decoder_job_) 648 video_decoder_job_->OnDecodeCompleted(); 649 650 if (is_audio) 651 decoder_starvation_callback_.Cancel(); 652 653 if (decode_status == MediaDecoderJob::DECODE_FAILED) { 654 Release(); 655 OnMediaError(MEDIA_ERROR_DECODE); 656 return; 657 } 658 659 // If the input reaches input EOS, there is no need to request new data. 660 if (decode_status != MediaDecoderJob::DECODE_TRY_ENQUEUE_INPUT_AGAIN_LATER && 661 decode_status != MediaDecoderJob::DECODE_INPUT_END_OF_STREAM) { 662 if (is_audio) 663 audio_access_unit_index_++; 664 else 665 video_access_unit_index_++; 666 } 667 668 if (pending_event_ != NO_EVENT_PENDING) { 669 ProcessPendingEvents(); 670 return; 671 } 672 673 if (decode_status == MediaDecoderJob::DECODE_SUCCEEDED && 674 (is_audio || !HasAudio())) { 675 UpdateTimestamps(presentation_timestamp, audio_output_bytes); 676 } 677 678 if (decode_status == MediaDecoderJob::DECODE_OUTPUT_END_OF_STREAM) { 679 PlaybackCompleted(is_audio); 680 return; 681 } 682 683 if (!playing_) { 684 if (is_audio || !HasAudio()) 685 clock_.Pause(); 686 return; 687 } 688 689 if (sync_decoder_jobs_) { 690 SyncAndStartDecoderJobs(); 691 return; 692 } 693 694 base::TimeDelta current_timestamp = GetCurrentTime(); 695 if (is_audio) { 696 if (decode_status == MediaDecoderJob::DECODE_SUCCEEDED) { 697 base::TimeDelta timeout = 698 audio_timestamp_helper_->GetTimestamp() - current_timestamp; 699 StartStarvationCallback(timeout); 700 } 701 if (!HasAudioData()) 702 RequestAudioData(); 703 else 704 DecodeMoreAudio(); 705 return; 706 } 707 708 if (!HasAudio() && decode_status == MediaDecoderJob::DECODE_SUCCEEDED) { 709 DCHECK(current_timestamp <= presentation_timestamp); 710 // For video only streams, fps can be estimated from the difference 711 // between the previous and current presentation timestamps. The 712 // previous presentation timestamp is equal to current_timestamp. 713 // TODO(qinmin): determine whether 2 is a good coefficient for estimating 714 // video frame timeout. 715 StartStarvationCallback(2 * (presentation_timestamp - current_timestamp)); 716 } 717 if (!HasVideoData()) 718 RequestVideoData(); 719 else 720 DecodeMoreVideo(); 721 } 722 723 void MediaSourcePlayer::DecodeMoreAudio() { 724 DCHECK(!audio_decoder_job_->is_decoding()); 725 DCHECK(HasAudioData()); 726 727 if (DemuxerStream::kConfigChanged == 728 received_audio_.access_units[audio_access_unit_index_].status) { 729 // Wait for demuxer ready message. 730 reconfig_audio_decoder_ = true; 731 pending_event_ |= CONFIG_CHANGE_EVENT_PENDING; 732 received_audio_ = MediaPlayerHostMsg_ReadFromDemuxerAck_Params(); 733 audio_access_unit_index_ = 0; 734 ProcessPendingEvents(); 735 return; 736 } 737 738 audio_decoder_job_->Decode( 739 received_audio_.access_units[audio_access_unit_index_], 740 start_time_ticks_, start_presentation_timestamp_, 741 base::Bind(&MediaSourcePlayer::MediaDecoderCallback, 742 weak_this_.GetWeakPtr(), true)); 743 } 744 745 void MediaSourcePlayer::DecodeMoreVideo() { 746 DVLOG(1) << "DecodeMoreVideo()"; 747 DCHECK(!video_decoder_job_->is_decoding()); 748 DCHECK(HasVideoData()); 749 750 if (DemuxerStream::kConfigChanged == 751 received_video_.access_units[video_access_unit_index_].status) { 752 // Wait for demuxer ready message. 753 reconfig_video_decoder_ = true; 754 pending_event_ |= CONFIG_CHANGE_EVENT_PENDING; 755 received_video_ = MediaPlayerHostMsg_ReadFromDemuxerAck_Params(); 756 video_access_unit_index_ = 0; 757 ProcessPendingEvents(); 758 return; 759 } 760 761 DVLOG(3) << "VideoDecoderJob::Decode(" << video_access_unit_index_ << ", " 762 << start_time_ticks_.ToInternalValue() << ", " 763 << start_presentation_timestamp_.InMilliseconds() << ")"; 764 video_decoder_job_->Decode( 765 received_video_.access_units[video_access_unit_index_], 766 start_time_ticks_, start_presentation_timestamp_, 767 base::Bind(&MediaSourcePlayer::MediaDecoderCallback, 768 weak_this_.GetWeakPtr(), false)); 769 } 770 771 void MediaSourcePlayer::PlaybackCompleted(bool is_audio) { 772 if (is_audio) 773 audio_finished_ = true; 774 else 775 video_finished_ = true; 776 777 if ((!HasAudio() || audio_finished_) && (!HasVideo() || video_finished_)) { 778 playing_ = false; 779 clock_.Pause(); 780 start_time_ticks_ = base::TimeTicks(); 781 OnPlaybackComplete(); 782 } 783 } 784 785 void MediaSourcePlayer::ClearDecodingData() { 786 DVLOG(1) << "ClearDecodingData()"; 787 if (audio_decoder_job_) 788 audio_decoder_job_->Flush(); 789 if (video_decoder_job_) 790 video_decoder_job_->Flush(); 791 start_time_ticks_ = base::TimeTicks(); 792 received_audio_ = MediaPlayerHostMsg_ReadFromDemuxerAck_Params(); 793 received_video_ = MediaPlayerHostMsg_ReadFromDemuxerAck_Params(); 794 audio_access_unit_index_ = 0; 795 video_access_unit_index_ = 0; 796 waiting_for_audio_data_ = false; 797 waiting_for_video_data_ = false; 798 } 799 800 bool MediaSourcePlayer::HasVideo() { 801 return kUnknownVideoCodec != video_codec_; 802 } 803 804 bool MediaSourcePlayer::HasAudio() { 805 return kUnknownAudioCodec != audio_codec_; 806 } 807 808 void MediaSourcePlayer::ConfigureAudioDecoderJob() { 809 if (!HasAudio()) { 810 audio_decoder_job_.reset(); 811 return; 812 } 813 814 // Create audio decoder job only if config changes. 815 if (audio_decoder_job_ && !reconfig_audio_decoder_) 816 return; 817 818 base::android::ScopedJavaLocalRef<jobject> media_codec; 819 if (is_audio_encrypted_) { 820 if (drm_bridge_) { 821 media_codec = drm_bridge_->GetMediaCrypto(); 822 // TODO(qinmin): currently we assume MediaCrypto is available whenever 823 // MediaDrmBridge is constructed. This will change if we want to support 824 // more general uses cases of EME. 825 DCHECK(!media_codec.is_null()); 826 } else { 827 // Don't create the decoder job if |drm_bridge_| is not set, 828 // so StartInternal() will not proceed. 829 LOG(INFO) << "MediaDrmBridge is not available when creating decoder " 830 << "for encrypted audio stream."; 831 return; 832 } 833 } 834 835 audio_decoder_job_.reset(AudioDecoderJob::Create( 836 audio_codec_, sampling_rate_, num_channels_, &audio_extra_data_[0], 837 audio_extra_data_.size(), media_codec.obj())); 838 839 if (audio_decoder_job_) { 840 SetVolumeInternal(); 841 reconfig_audio_decoder_ = false; 842 } 843 } 844 845 void MediaSourcePlayer::ConfigureVideoDecoderJob() { 846 if (!HasVideo() || surface_.IsEmpty()) { 847 video_decoder_job_.reset(); 848 return; 849 } 850 851 // Create video decoder job only if config changes. 852 if (video_decoder_job_ && !reconfig_video_decoder_) 853 return; 854 855 base::android::ScopedJavaLocalRef<jobject> media_codec; 856 if (is_video_encrypted_) { 857 if (drm_bridge_) { 858 media_codec = drm_bridge_->GetMediaCrypto(); 859 DCHECK(!media_codec.is_null()); 860 } else { 861 LOG(INFO) << "MediaDrmBridge is not available when creating decoder " 862 << "for encrypted video stream."; 863 return; 864 } 865 } 866 867 // Release the old VideoDecoderJob first so the surface can get released. 868 // Android does not allow 2 MediaCodec instances use the same surface. 869 video_decoder_job_.reset(); 870 // Create the new VideoDecoderJob. 871 video_decoder_job_.reset(VideoDecoderJob::Create( 872 video_codec_, gfx::Size(width_, height_), surface_.j_surface().obj(), 873 media_codec.obj())); 874 if (video_decoder_job_) 875 reconfig_video_decoder_ = false; 876 877 // Inform the fullscreen view the player is ready. 878 // TODO(qinmin): refactor MediaPlayerBridge so that we have a better way 879 // to inform ContentVideoView. 880 OnMediaMetadataChanged(duration_, width_, height_, true); 881 } 882 883 void MediaSourcePlayer::OnDecoderStarved() { 884 sync_decoder_jobs_ = true; 885 } 886 887 void MediaSourcePlayer::StartStarvationCallback( 888 const base::TimeDelta& timeout) { 889 decoder_starvation_callback_.Reset( 890 base::Bind(&MediaSourcePlayer::OnDecoderStarved, 891 weak_this_.GetWeakPtr())); 892 base::MessageLoop::current()->PostDelayedTask( 893 FROM_HERE, decoder_starvation_callback_.callback(), timeout); 894 } 895 896 void MediaSourcePlayer::SyncAndStartDecoderJobs() { 897 // For streams with both audio and video, send the request for video too. 898 // However, don't wait for the response so that we won't have lots of 899 // noticeable pauses in the audio. Video will sync with audio by itself. 900 if (HasVideo() && !HasVideoData()) { 901 RequestVideoData(); 902 if (!HasAudio()) 903 return; 904 } 905 if (HasAudio() && !HasAudioData()) { 906 RequestAudioData(); 907 return; 908 } 909 start_time_ticks_ = base::TimeTicks::Now(); 910 start_presentation_timestamp_ = GetCurrentTime(); 911 if (!clock_.IsPlaying()) 912 clock_.Play(); 913 if (HasAudioData() && !audio_decoder_job_->is_decoding()) 914 DecodeMoreAudio(); 915 if (HasVideoData() && !video_decoder_job_->is_decoding()) 916 DecodeMoreVideo(); 917 sync_decoder_jobs_ = false; 918 } 919 920 void MediaSourcePlayer::RequestAudioData() { 921 DVLOG(2) << "RequestAudioData()"; 922 DCHECK(HasAudio()); 923 924 if (waiting_for_audio_data_) 925 return; 926 927 manager()->OnReadFromDemuxer(player_id(), DemuxerStream::AUDIO); 928 received_audio_ = MediaPlayerHostMsg_ReadFromDemuxerAck_Params(); 929 audio_access_unit_index_ = 0; 930 waiting_for_audio_data_ = true; 931 } 932 933 void MediaSourcePlayer::RequestVideoData() { 934 DVLOG(2) << "RequestVideoData()"; 935 DCHECK(HasVideo()); 936 if (waiting_for_video_data_) 937 return; 938 939 manager()->OnReadFromDemuxer(player_id(), DemuxerStream::VIDEO); 940 received_video_ = MediaPlayerHostMsg_ReadFromDemuxerAck_Params(); 941 video_access_unit_index_ = 0; 942 waiting_for_video_data_ = true; 943 } 944 945 bool MediaSourcePlayer::HasAudioData() const { 946 return audio_access_unit_index_ < received_audio_.access_units.size(); 947 } 948 949 bool MediaSourcePlayer::HasVideoData() const { 950 return video_access_unit_index_ < received_video_.access_units.size(); 951 } 952 953 void MediaSourcePlayer::SetVolumeInternal() { 954 if (audio_decoder_job_ && volume_ >= 0) 955 audio_decoder_job_.get()->SetVolume(volume_); 956 } 957 958 } // namespace media 959