1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 //#define LOG_NDEBUG 0 18 #define LOG_TAG "NuPlayer" 19 #include <utils/Log.h> 20 21 #include "NuPlayer.h" 22 23 #include "HTTPLiveSource.h" 24 #include "NuPlayerCCDecoder.h" 25 #include "NuPlayerDecoder.h" 26 #include "NuPlayerDecoderBase.h" 27 #include "NuPlayerDecoderPassThrough.h" 28 #include "NuPlayerDriver.h" 29 #include "NuPlayerRenderer.h" 30 #include "NuPlayerSource.h" 31 #include "RTSPSource.h" 32 #include "StreamingSource.h" 33 #include "GenericSource.h" 34 #include "TextDescriptions.h" 35 36 #include "ATSParser.h" 37 38 #include <cutils/properties.h> 39 40 #include <media/AudioResamplerPublic.h> 41 #include <media/AVSyncSettings.h> 42 43 #include <media/stagefright/foundation/hexdump.h> 44 #include <media/stagefright/foundation/ABuffer.h> 45 #include <media/stagefright/foundation/ADebug.h> 46 #include <media/stagefright/foundation/AMessage.h> 47 #include <media/stagefright/MediaBuffer.h> 48 #include <media/stagefright/MediaDefs.h> 49 #include <media/stagefright/MediaErrors.h> 50 #include <media/stagefright/MetaData.h> 51 52 #include <gui/IGraphicBufferProducer.h> 53 #include <gui/Surface.h> 54 55 #include "avc_utils.h" 56 57 #include "ESDS.h" 58 #include <media/stagefright/Utils.h> 59 60 namespace android { 61 62 struct NuPlayer::Action : public RefBase { 63 Action() {} 64 65 virtual void execute(NuPlayer *player) = 0; 66 67 private: 68 DISALLOW_EVIL_CONSTRUCTORS(Action); 69 }; 70 71 struct NuPlayer::SeekAction : public Action { 72 SeekAction(int64_t seekTimeUs) 73 : mSeekTimeUs(seekTimeUs) { 74 } 75 76 virtual void execute(NuPlayer *player) { 77 player->performSeek(mSeekTimeUs); 78 } 79 80 private: 81 int64_t mSeekTimeUs; 82 83 DISALLOW_EVIL_CONSTRUCTORS(SeekAction); 84 }; 85 86 struct NuPlayer::ResumeDecoderAction : public Action { 87 ResumeDecoderAction(bool needNotify) 88 : mNeedNotify(needNotify) { 89 } 90 91 virtual void execute(NuPlayer *player) { 92 player->performResumeDecoders(mNeedNotify); 93 } 94 95 private: 96 bool mNeedNotify; 97 98 DISALLOW_EVIL_CONSTRUCTORS(ResumeDecoderAction); 99 }; 100 101 struct NuPlayer::SetSurfaceAction : public Action { 102 SetSurfaceAction(const sp<Surface> &surface) 103 : mSurface(surface) { 104 } 105 106 virtual void execute(NuPlayer *player) { 107 player->performSetSurface(mSurface); 108 } 109 110 private: 111 sp<Surface> mSurface; 112 113 DISALLOW_EVIL_CONSTRUCTORS(SetSurfaceAction); 114 }; 115 116 struct NuPlayer::FlushDecoderAction : public Action { 117 FlushDecoderAction(FlushCommand audio, FlushCommand video) 118 : mAudio(audio), 119 mVideo(video) { 120 } 121 122 virtual void execute(NuPlayer *player) { 123 player->performDecoderFlush(mAudio, mVideo); 124 } 125 126 private: 127 FlushCommand mAudio; 128 FlushCommand mVideo; 129 130 DISALLOW_EVIL_CONSTRUCTORS(FlushDecoderAction); 131 }; 132 133 struct NuPlayer::PostMessageAction : public Action { 134 PostMessageAction(const sp<AMessage> &msg) 135 : mMessage(msg) { 136 } 137 138 virtual void execute(NuPlayer *) { 139 mMessage->post(); 140 } 141 142 private: 143 sp<AMessage> mMessage; 144 145 DISALLOW_EVIL_CONSTRUCTORS(PostMessageAction); 146 }; 147 148 // Use this if there's no state necessary to save in order to execute 149 // the action. 150 struct NuPlayer::SimpleAction : public Action { 151 typedef void (NuPlayer::*ActionFunc)(); 152 153 SimpleAction(ActionFunc func) 154 : mFunc(func) { 155 } 156 157 virtual void execute(NuPlayer *player) { 158 (player->*mFunc)(); 159 } 160 161 private: 162 ActionFunc mFunc; 163 164 DISALLOW_EVIL_CONSTRUCTORS(SimpleAction); 165 }; 166 167 //////////////////////////////////////////////////////////////////////////////// 168 169 NuPlayer::NuPlayer(pid_t pid) 170 : mUIDValid(false), 171 mPID(pid), 172 mSourceFlags(0), 173 mOffloadAudio(false), 174 mAudioDecoderGeneration(0), 175 mVideoDecoderGeneration(0), 176 mRendererGeneration(0), 177 mPreviousSeekTimeUs(0), 178 mAudioEOS(false), 179 mVideoEOS(false), 180 mScanSourcesPending(false), 181 mScanSourcesGeneration(0), 182 mPollDurationGeneration(0), 183 mTimedTextGeneration(0), 184 mFlushingAudio(NONE), 185 mFlushingVideo(NONE), 186 mResumePending(false), 187 mVideoScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW), 188 mPlaybackSettings(AUDIO_PLAYBACK_RATE_DEFAULT), 189 mVideoFpsHint(-1.f), 190 mStarted(false), 191 mPrepared(false), 192 mResetting(false), 193 mSourceStarted(false), 194 mPaused(false), 195 mPausedByClient(true), 196 mPausedForBuffering(false) { 197 clearFlushComplete(); 198 } 199 200 NuPlayer::~NuPlayer() { 201 } 202 203 void NuPlayer::setUID(uid_t uid) { 204 mUIDValid = true; 205 mUID = uid; 206 } 207 208 void NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 209 mDriver = driver; 210 } 211 212 void NuPlayer::setDataSourceAsync(const sp<IStreamSource> &source) { 213 sp<AMessage> msg = new AMessage(kWhatSetDataSource, this); 214 215 sp<AMessage> notify = new AMessage(kWhatSourceNotify, this); 216 217 msg->setObject("source", new StreamingSource(notify, source)); 218 msg->post(); 219 } 220 221 static bool IsHTTPLiveURL(const char *url) { 222 if (!strncasecmp("http://", url, 7) 223 || !strncasecmp("https://", url, 8) 224 || !strncasecmp("file://", url, 7)) { 225 size_t len = strlen(url); 226 if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) { 227 return true; 228 } 229 230 if (strstr(url,"m3u8")) { 231 return true; 232 } 233 } 234 235 return false; 236 } 237 238 void NuPlayer::setDataSourceAsync( 239 const sp<IMediaHTTPService> &httpService, 240 const char *url, 241 const KeyedVector<String8, String8> *headers) { 242 243 sp<AMessage> msg = new AMessage(kWhatSetDataSource, this); 244 size_t len = strlen(url); 245 246 sp<AMessage> notify = new AMessage(kWhatSourceNotify, this); 247 248 sp<Source> source; 249 if (IsHTTPLiveURL(url)) { 250 source = new HTTPLiveSource(notify, httpService, url, headers); 251 } else if (!strncasecmp(url, "rtsp://", 7)) { 252 source = new RTSPSource( 253 notify, httpService, url, headers, mUIDValid, mUID); 254 } else if ((!strncasecmp(url, "http://", 7) 255 || !strncasecmp(url, "https://", 8)) 256 && ((len >= 4 && !strcasecmp(".sdp", &url[len - 4])) 257 || strstr(url, ".sdp?"))) { 258 source = new RTSPSource( 259 notify, httpService, url, headers, mUIDValid, mUID, true); 260 } else { 261 sp<GenericSource> genericSource = 262 new GenericSource(notify, mUIDValid, mUID); 263 // Don't set FLAG_SECURE on mSourceFlags here for widevine. 264 // The correct flags will be updated in Source::kWhatFlagsChanged 265 // handler when GenericSource is prepared. 266 267 status_t err = genericSource->setDataSource(httpService, url, headers); 268 269 if (err == OK) { 270 source = genericSource; 271 } else { 272 ALOGE("Failed to set data source!"); 273 } 274 } 275 msg->setObject("source", source); 276 msg->post(); 277 } 278 279 void NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_t length) { 280 sp<AMessage> msg = new AMessage(kWhatSetDataSource, this); 281 282 sp<AMessage> notify = new AMessage(kWhatSourceNotify, this); 283 284 sp<GenericSource> source = 285 new GenericSource(notify, mUIDValid, mUID); 286 287 status_t err = source->setDataSource(fd, offset, length); 288 289 if (err != OK) { 290 ALOGE("Failed to set data source!"); 291 source = NULL; 292 } 293 294 msg->setObject("source", source); 295 msg->post(); 296 } 297 298 void NuPlayer::setDataSourceAsync(const sp<DataSource> &dataSource) { 299 sp<AMessage> msg = new AMessage(kWhatSetDataSource, this); 300 sp<AMessage> notify = new AMessage(kWhatSourceNotify, this); 301 302 sp<GenericSource> source = new GenericSource(notify, mUIDValid, mUID); 303 status_t err = source->setDataSource(dataSource); 304 305 if (err != OK) { 306 ALOGE("Failed to set data source!"); 307 source = NULL; 308 } 309 310 msg->setObject("source", source); 311 msg->post(); 312 } 313 314 void NuPlayer::prepareAsync() { 315 (new AMessage(kWhatPrepare, this))->post(); 316 } 317 318 void NuPlayer::setVideoSurfaceTextureAsync( 319 const sp<IGraphicBufferProducer> &bufferProducer) { 320 sp<AMessage> msg = new AMessage(kWhatSetVideoSurface, this); 321 322 if (bufferProducer == NULL) { 323 msg->setObject("surface", NULL); 324 } else { 325 msg->setObject("surface", new Surface(bufferProducer, true /* controlledByApp */)); 326 } 327 328 msg->post(); 329 } 330 331 void NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 332 sp<AMessage> msg = new AMessage(kWhatSetAudioSink, this); 333 msg->setObject("sink", sink); 334 msg->post(); 335 } 336 337 void NuPlayer::start() { 338 (new AMessage(kWhatStart, this))->post(); 339 } 340 341 status_t NuPlayer::setPlaybackSettings(const AudioPlaybackRate &rate) { 342 // do some cursory validation of the settings here. audio modes are 343 // only validated when set on the audiosink. 344 if ((rate.mSpeed != 0.f && rate.mSpeed < AUDIO_TIMESTRETCH_SPEED_MIN) 345 || rate.mSpeed > AUDIO_TIMESTRETCH_SPEED_MAX 346 || rate.mPitch < AUDIO_TIMESTRETCH_SPEED_MIN 347 || rate.mPitch > AUDIO_TIMESTRETCH_SPEED_MAX) { 348 return BAD_VALUE; 349 } 350 sp<AMessage> msg = new AMessage(kWhatConfigPlayback, this); 351 writeToAMessage(msg, rate); 352 sp<AMessage> response; 353 status_t err = msg->postAndAwaitResponse(&response); 354 if (err == OK && response != NULL) { 355 CHECK(response->findInt32("err", &err)); 356 } 357 return err; 358 } 359 360 status_t NuPlayer::getPlaybackSettings(AudioPlaybackRate *rate /* nonnull */) { 361 sp<AMessage> msg = new AMessage(kWhatGetPlaybackSettings, this); 362 sp<AMessage> response; 363 status_t err = msg->postAndAwaitResponse(&response); 364 if (err == OK && response != NULL) { 365 CHECK(response->findInt32("err", &err)); 366 if (err == OK) { 367 readFromAMessage(response, rate); 368 } 369 } 370 return err; 371 } 372 373 status_t NuPlayer::setSyncSettings(const AVSyncSettings &sync, float videoFpsHint) { 374 sp<AMessage> msg = new AMessage(kWhatConfigSync, this); 375 writeToAMessage(msg, sync, videoFpsHint); 376 sp<AMessage> response; 377 status_t err = msg->postAndAwaitResponse(&response); 378 if (err == OK && response != NULL) { 379 CHECK(response->findInt32("err", &err)); 380 } 381 return err; 382 } 383 384 status_t NuPlayer::getSyncSettings( 385 AVSyncSettings *sync /* nonnull */, float *videoFps /* nonnull */) { 386 sp<AMessage> msg = new AMessage(kWhatGetSyncSettings, this); 387 sp<AMessage> response; 388 status_t err = msg->postAndAwaitResponse(&response); 389 if (err == OK && response != NULL) { 390 CHECK(response->findInt32("err", &err)); 391 if (err == OK) { 392 readFromAMessage(response, sync, videoFps); 393 } 394 } 395 return err; 396 } 397 398 void NuPlayer::pause() { 399 (new AMessage(kWhatPause, this))->post(); 400 } 401 402 void NuPlayer::resetAsync() { 403 sp<Source> source; 404 { 405 Mutex::Autolock autoLock(mSourceLock); 406 source = mSource; 407 } 408 409 if (source != NULL) { 410 // During a reset, the data source might be unresponsive already, we need to 411 // disconnect explicitly so that reads exit promptly. 412 // We can't queue the disconnect request to the looper, as it might be 413 // queued behind a stuck read and never gets processed. 414 // Doing a disconnect outside the looper to allows the pending reads to exit 415 // (either successfully or with error). 416 source->disconnect(); 417 } 418 419 (new AMessage(kWhatReset, this))->post(); 420 } 421 422 void NuPlayer::seekToAsync(int64_t seekTimeUs, bool needNotify) { 423 sp<AMessage> msg = new AMessage(kWhatSeek, this); 424 msg->setInt64("seekTimeUs", seekTimeUs); 425 msg->setInt32("needNotify", needNotify); 426 msg->post(); 427 } 428 429 430 void NuPlayer::writeTrackInfo( 431 Parcel* reply, const sp<AMessage> format) const { 432 if (format == NULL) { 433 ALOGE("NULL format"); 434 return; 435 } 436 int32_t trackType; 437 if (!format->findInt32("type", &trackType)) { 438 ALOGE("no track type"); 439 return; 440 } 441 442 AString mime; 443 if (!format->findString("mime", &mime)) { 444 // Java MediaPlayer only uses mimetype for subtitle and timedtext tracks. 445 // If we can't find the mimetype here it means that we wouldn't be needing 446 // the mimetype on the Java end. We still write a placeholder mime to keep the 447 // (de)serialization logic simple. 448 if (trackType == MEDIA_TRACK_TYPE_AUDIO) { 449 mime = "audio/"; 450 } else if (trackType == MEDIA_TRACK_TYPE_VIDEO) { 451 mime = "video/"; 452 } else { 453 ALOGE("unknown track type: %d", trackType); 454 return; 455 } 456 } 457 458 AString lang; 459 if (!format->findString("language", &lang)) { 460 ALOGE("no language"); 461 return; 462 } 463 464 reply->writeInt32(2); // write something non-zero 465 reply->writeInt32(trackType); 466 reply->writeString16(String16(mime.c_str())); 467 reply->writeString16(String16(lang.c_str())); 468 469 if (trackType == MEDIA_TRACK_TYPE_SUBTITLE) { 470 int32_t isAuto, isDefault, isForced; 471 CHECK(format->findInt32("auto", &isAuto)); 472 CHECK(format->findInt32("default", &isDefault)); 473 CHECK(format->findInt32("forced", &isForced)); 474 475 reply->writeInt32(isAuto); 476 reply->writeInt32(isDefault); 477 reply->writeInt32(isForced); 478 } 479 } 480 481 void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 482 switch (msg->what()) { 483 case kWhatSetDataSource: 484 { 485 ALOGV("kWhatSetDataSource"); 486 487 CHECK(mSource == NULL); 488 489 status_t err = OK; 490 sp<RefBase> obj; 491 CHECK(msg->findObject("source", &obj)); 492 if (obj != NULL) { 493 Mutex::Autolock autoLock(mSourceLock); 494 mSource = static_cast<Source *>(obj.get()); 495 } else { 496 err = UNKNOWN_ERROR; 497 } 498 499 CHECK(mDriver != NULL); 500 sp<NuPlayerDriver> driver = mDriver.promote(); 501 if (driver != NULL) { 502 driver->notifySetDataSourceCompleted(err); 503 } 504 break; 505 } 506 507 case kWhatPrepare: 508 { 509 mSource->prepareAsync(); 510 break; 511 } 512 513 case kWhatGetTrackInfo: 514 { 515 sp<AReplyToken> replyID; 516 CHECK(msg->senderAwaitsResponse(&replyID)); 517 518 Parcel* reply; 519 CHECK(msg->findPointer("reply", (void**)&reply)); 520 521 size_t inbandTracks = 0; 522 if (mSource != NULL) { 523 inbandTracks = mSource->getTrackCount(); 524 } 525 526 size_t ccTracks = 0; 527 if (mCCDecoder != NULL) { 528 ccTracks = mCCDecoder->getTrackCount(); 529 } 530 531 // total track count 532 reply->writeInt32(inbandTracks + ccTracks); 533 534 // write inband tracks 535 for (size_t i = 0; i < inbandTracks; ++i) { 536 writeTrackInfo(reply, mSource->getTrackInfo(i)); 537 } 538 539 // write CC track 540 for (size_t i = 0; i < ccTracks; ++i) { 541 writeTrackInfo(reply, mCCDecoder->getTrackInfo(i)); 542 } 543 544 sp<AMessage> response = new AMessage; 545 response->postReply(replyID); 546 break; 547 } 548 549 case kWhatGetSelectedTrack: 550 { 551 status_t err = INVALID_OPERATION; 552 if (mSource != NULL) { 553 err = OK; 554 555 int32_t type32; 556 CHECK(msg->findInt32("type", (int32_t*)&type32)); 557 media_track_type type = (media_track_type)type32; 558 ssize_t selectedTrack = mSource->getSelectedTrack(type); 559 560 Parcel* reply; 561 CHECK(msg->findPointer("reply", (void**)&reply)); 562 reply->writeInt32(selectedTrack); 563 } 564 565 sp<AMessage> response = new AMessage; 566 response->setInt32("err", err); 567 568 sp<AReplyToken> replyID; 569 CHECK(msg->senderAwaitsResponse(&replyID)); 570 response->postReply(replyID); 571 break; 572 } 573 574 case kWhatSelectTrack: 575 { 576 sp<AReplyToken> replyID; 577 CHECK(msg->senderAwaitsResponse(&replyID)); 578 579 size_t trackIndex; 580 int32_t select; 581 int64_t timeUs; 582 CHECK(msg->findSize("trackIndex", &trackIndex)); 583 CHECK(msg->findInt32("select", &select)); 584 CHECK(msg->findInt64("timeUs", &timeUs)); 585 586 status_t err = INVALID_OPERATION; 587 588 size_t inbandTracks = 0; 589 if (mSource != NULL) { 590 inbandTracks = mSource->getTrackCount(); 591 } 592 size_t ccTracks = 0; 593 if (mCCDecoder != NULL) { 594 ccTracks = mCCDecoder->getTrackCount(); 595 } 596 597 if (trackIndex < inbandTracks) { 598 err = mSource->selectTrack(trackIndex, select, timeUs); 599 600 if (!select && err == OK) { 601 int32_t type; 602 sp<AMessage> info = mSource->getTrackInfo(trackIndex); 603 if (info != NULL 604 && info->findInt32("type", &type) 605 && type == MEDIA_TRACK_TYPE_TIMEDTEXT) { 606 ++mTimedTextGeneration; 607 } 608 } 609 } else { 610 trackIndex -= inbandTracks; 611 612 if (trackIndex < ccTracks) { 613 err = mCCDecoder->selectTrack(trackIndex, select); 614 } 615 } 616 617 sp<AMessage> response = new AMessage; 618 response->setInt32("err", err); 619 620 response->postReply(replyID); 621 break; 622 } 623 624 case kWhatPollDuration: 625 { 626 int32_t generation; 627 CHECK(msg->findInt32("generation", &generation)); 628 629 if (generation != mPollDurationGeneration) { 630 // stale 631 break; 632 } 633 634 int64_t durationUs; 635 if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 636 sp<NuPlayerDriver> driver = mDriver.promote(); 637 if (driver != NULL) { 638 driver->notifyDuration(durationUs); 639 } 640 } 641 642 msg->post(1000000ll); // poll again in a second. 643 break; 644 } 645 646 case kWhatSetVideoSurface: 647 { 648 649 sp<RefBase> obj; 650 CHECK(msg->findObject("surface", &obj)); 651 sp<Surface> surface = static_cast<Surface *>(obj.get()); 652 653 ALOGD("onSetVideoSurface(%p, %s video decoder)", 654 surface.get(), 655 (mSource != NULL && mStarted && mSource->getFormat(false /* audio */) != NULL 656 && mVideoDecoder != NULL) ? "have" : "no"); 657 658 // Need to check mStarted before calling mSource->getFormat because NuPlayer might 659 // be in preparing state and it could take long time. 660 // When mStarted is true, mSource must have been set. 661 if (mSource == NULL || !mStarted || mSource->getFormat(false /* audio */) == NULL 662 // NOTE: mVideoDecoder's mSurface is always non-null 663 || (mVideoDecoder != NULL && mVideoDecoder->setVideoSurface(surface) == OK)) { 664 performSetSurface(surface); 665 break; 666 } 667 668 mDeferredActions.push_back( 669 new FlushDecoderAction(FLUSH_CMD_FLUSH /* audio */, 670 FLUSH_CMD_SHUTDOWN /* video */)); 671 672 mDeferredActions.push_back(new SetSurfaceAction(surface)); 673 674 if (obj != NULL || mAudioDecoder != NULL) { 675 if (mStarted) { 676 // Issue a seek to refresh the video screen only if started otherwise 677 // the extractor may not yet be started and will assert. 678 // If the video decoder is not set (perhaps audio only in this case) 679 // do not perform a seek as it is not needed. 680 int64_t currentPositionUs = 0; 681 if (getCurrentPosition(¤tPositionUs) == OK) { 682 mDeferredActions.push_back( 683 new SeekAction(currentPositionUs)); 684 } 685 } 686 687 // If there is a new surface texture, instantiate decoders 688 // again if possible. 689 mDeferredActions.push_back( 690 new SimpleAction(&NuPlayer::performScanSources)); 691 } 692 693 // After a flush without shutdown, decoder is paused. 694 // Don't resume it until source seek is done, otherwise it could 695 // start pulling stale data too soon. 696 mDeferredActions.push_back( 697 new ResumeDecoderAction(false /* needNotify */)); 698 699 processDeferredActions(); 700 break; 701 } 702 703 case kWhatSetAudioSink: 704 { 705 ALOGV("kWhatSetAudioSink"); 706 707 sp<RefBase> obj; 708 CHECK(msg->findObject("sink", &obj)); 709 710 mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 711 break; 712 } 713 714 case kWhatStart: 715 { 716 ALOGV("kWhatStart"); 717 if (mStarted) { 718 // do not resume yet if the source is still buffering 719 if (!mPausedForBuffering) { 720 onResume(); 721 } 722 } else { 723 onStart(); 724 } 725 mPausedByClient = false; 726 break; 727 } 728 729 case kWhatConfigPlayback: 730 { 731 sp<AReplyToken> replyID; 732 CHECK(msg->senderAwaitsResponse(&replyID)); 733 AudioPlaybackRate rate /* sanitized */; 734 readFromAMessage(msg, &rate); 735 status_t err = OK; 736 if (mRenderer != NULL) { 737 // AudioSink allows only 1.f and 0.f for offload mode. 738 // For other speed, switch to non-offload mode. 739 if (mOffloadAudio && ((rate.mSpeed != 0.f && rate.mSpeed != 1.f) 740 || rate.mPitch != 1.f)) { 741 int64_t currentPositionUs; 742 if (getCurrentPosition(¤tPositionUs) != OK) { 743 currentPositionUs = mPreviousSeekTimeUs; 744 } 745 746 // Set mPlaybackSettings so that the new audio decoder can 747 // be created correctly. 748 mPlaybackSettings = rate; 749 if (!mPaused) { 750 mRenderer->pause(); 751 } 752 restartAudio( 753 currentPositionUs, true /* forceNonOffload */, 754 true /* needsToCreateAudioDecoder */); 755 if (!mPaused) { 756 mRenderer->resume(); 757 } 758 } 759 760 err = mRenderer->setPlaybackSettings(rate); 761 } 762 if (err == OK) { 763 if (rate.mSpeed == 0.f) { 764 onPause(); 765 mPausedByClient = true; 766 // save all other settings (using non-paused speed) 767 // so we can restore them on start 768 AudioPlaybackRate newRate = rate; 769 newRate.mSpeed = mPlaybackSettings.mSpeed; 770 mPlaybackSettings = newRate; 771 } else { /* rate.mSpeed != 0.f */ 772 mPlaybackSettings = rate; 773 if (mStarted) { 774 // do not resume yet if the source is still buffering 775 if (!mPausedForBuffering) { 776 onResume(); 777 } 778 } else if (mPrepared) { 779 onStart(); 780 } 781 782 mPausedByClient = false; 783 } 784 } 785 786 if (mVideoDecoder != NULL) { 787 sp<AMessage> params = new AMessage(); 788 params->setFloat("playback-speed", mPlaybackSettings.mSpeed); 789 mVideoDecoder->setParameters(params); 790 } 791 792 sp<AMessage> response = new AMessage; 793 response->setInt32("err", err); 794 response->postReply(replyID); 795 break; 796 } 797 798 case kWhatGetPlaybackSettings: 799 { 800 sp<AReplyToken> replyID; 801 CHECK(msg->senderAwaitsResponse(&replyID)); 802 AudioPlaybackRate rate = mPlaybackSettings; 803 status_t err = OK; 804 if (mRenderer != NULL) { 805 err = mRenderer->getPlaybackSettings(&rate); 806 } 807 if (err == OK) { 808 // get playback settings used by renderer, as it may be 809 // slightly off due to audiosink not taking small changes. 810 mPlaybackSettings = rate; 811 if (mPaused) { 812 rate.mSpeed = 0.f; 813 } 814 } 815 sp<AMessage> response = new AMessage; 816 if (err == OK) { 817 writeToAMessage(response, rate); 818 } 819 response->setInt32("err", err); 820 response->postReply(replyID); 821 break; 822 } 823 824 case kWhatConfigSync: 825 { 826 sp<AReplyToken> replyID; 827 CHECK(msg->senderAwaitsResponse(&replyID)); 828 829 ALOGV("kWhatConfigSync"); 830 AVSyncSettings sync; 831 float videoFpsHint; 832 readFromAMessage(msg, &sync, &videoFpsHint); 833 status_t err = OK; 834 if (mRenderer != NULL) { 835 err = mRenderer->setSyncSettings(sync, videoFpsHint); 836 } 837 if (err == OK) { 838 mSyncSettings = sync; 839 mVideoFpsHint = videoFpsHint; 840 } 841 sp<AMessage> response = new AMessage; 842 response->setInt32("err", err); 843 response->postReply(replyID); 844 break; 845 } 846 847 case kWhatGetSyncSettings: 848 { 849 sp<AReplyToken> replyID; 850 CHECK(msg->senderAwaitsResponse(&replyID)); 851 AVSyncSettings sync = mSyncSettings; 852 float videoFps = mVideoFpsHint; 853 status_t err = OK; 854 if (mRenderer != NULL) { 855 err = mRenderer->getSyncSettings(&sync, &videoFps); 856 if (err == OK) { 857 mSyncSettings = sync; 858 mVideoFpsHint = videoFps; 859 } 860 } 861 sp<AMessage> response = new AMessage; 862 if (err == OK) { 863 writeToAMessage(response, sync, videoFps); 864 } 865 response->setInt32("err", err); 866 response->postReply(replyID); 867 break; 868 } 869 870 case kWhatScanSources: 871 { 872 int32_t generation; 873 CHECK(msg->findInt32("generation", &generation)); 874 if (generation != mScanSourcesGeneration) { 875 // Drop obsolete msg. 876 break; 877 } 878 879 mScanSourcesPending = false; 880 881 ALOGV("scanning sources haveAudio=%d, haveVideo=%d", 882 mAudioDecoder != NULL, mVideoDecoder != NULL); 883 884 bool mHadAnySourcesBefore = 885 (mAudioDecoder != NULL) || (mVideoDecoder != NULL); 886 bool rescan = false; 887 888 // initialize video before audio because successful initialization of 889 // video may change deep buffer mode of audio. 890 if (mSurface != NULL) { 891 if (instantiateDecoder(false, &mVideoDecoder) == -EWOULDBLOCK) { 892 rescan = true; 893 } 894 } 895 896 // Don't try to re-open audio sink if there's an existing decoder. 897 if (mAudioSink != NULL && mAudioDecoder == NULL) { 898 if (instantiateDecoder(true, &mAudioDecoder) == -EWOULDBLOCK) { 899 rescan = true; 900 } 901 } 902 903 if (!mHadAnySourcesBefore 904 && (mAudioDecoder != NULL || mVideoDecoder != NULL)) { 905 // This is the first time we've found anything playable. 906 907 if (mSourceFlags & Source::FLAG_DYNAMIC_DURATION) { 908 schedulePollDuration(); 909 } 910 } 911 912 status_t err; 913 if ((err = mSource->feedMoreTSData()) != OK) { 914 if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 915 // We're not currently decoding anything (no audio or 916 // video tracks found) and we just ran out of input data. 917 918 if (err == ERROR_END_OF_STREAM) { 919 notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 920 } else { 921 notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 922 } 923 } 924 break; 925 } 926 927 if (rescan) { 928 msg->post(100000ll); 929 mScanSourcesPending = true; 930 } 931 break; 932 } 933 934 case kWhatVideoNotify: 935 case kWhatAudioNotify: 936 { 937 bool audio = msg->what() == kWhatAudioNotify; 938 939 int32_t currentDecoderGeneration = 940 (audio? mAudioDecoderGeneration : mVideoDecoderGeneration); 941 int32_t requesterGeneration = currentDecoderGeneration - 1; 942 CHECK(msg->findInt32("generation", &requesterGeneration)); 943 944 if (requesterGeneration != currentDecoderGeneration) { 945 ALOGV("got message from old %s decoder, generation(%d:%d)", 946 audio ? "audio" : "video", requesterGeneration, 947 currentDecoderGeneration); 948 sp<AMessage> reply; 949 if (!(msg->findMessage("reply", &reply))) { 950 return; 951 } 952 953 reply->setInt32("err", INFO_DISCONTINUITY); 954 reply->post(); 955 return; 956 } 957 958 int32_t what; 959 CHECK(msg->findInt32("what", &what)); 960 961 if (what == DecoderBase::kWhatInputDiscontinuity) { 962 int32_t formatChange; 963 CHECK(msg->findInt32("formatChange", &formatChange)); 964 965 ALOGV("%s discontinuity: formatChange %d", 966 audio ? "audio" : "video", formatChange); 967 968 if (formatChange) { 969 mDeferredActions.push_back( 970 new FlushDecoderAction( 971 audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE, 972 audio ? FLUSH_CMD_NONE : FLUSH_CMD_SHUTDOWN)); 973 } 974 975 mDeferredActions.push_back( 976 new SimpleAction( 977 &NuPlayer::performScanSources)); 978 979 processDeferredActions(); 980 } else if (what == DecoderBase::kWhatEOS) { 981 int32_t err; 982 CHECK(msg->findInt32("err", &err)); 983 984 if (err == ERROR_END_OF_STREAM) { 985 ALOGV("got %s decoder EOS", audio ? "audio" : "video"); 986 } else { 987 ALOGV("got %s decoder EOS w/ error %d", 988 audio ? "audio" : "video", 989 err); 990 } 991 992 mRenderer->queueEOS(audio, err); 993 } else if (what == DecoderBase::kWhatFlushCompleted) { 994 ALOGV("decoder %s flush completed", audio ? "audio" : "video"); 995 996 handleFlushComplete(audio, true /* isDecoder */); 997 finishFlushIfPossible(); 998 } else if (what == DecoderBase::kWhatVideoSizeChanged) { 999 sp<AMessage> format; 1000 CHECK(msg->findMessage("format", &format)); 1001 1002 sp<AMessage> inputFormat = 1003 mSource->getFormat(false /* audio */); 1004 1005 setVideoScalingMode(mVideoScalingMode); 1006 updateVideoSize(inputFormat, format); 1007 } else if (what == DecoderBase::kWhatShutdownCompleted) { 1008 ALOGV("%s shutdown completed", audio ? "audio" : "video"); 1009 if (audio) { 1010 mAudioDecoder.clear(); 1011 ++mAudioDecoderGeneration; 1012 1013 CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 1014 mFlushingAudio = SHUT_DOWN; 1015 } else { 1016 mVideoDecoder.clear(); 1017 ++mVideoDecoderGeneration; 1018 1019 CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 1020 mFlushingVideo = SHUT_DOWN; 1021 } 1022 1023 finishFlushIfPossible(); 1024 } else if (what == DecoderBase::kWhatResumeCompleted) { 1025 finishResume(); 1026 } else if (what == DecoderBase::kWhatError) { 1027 status_t err; 1028 if (!msg->findInt32("err", &err) || err == OK) { 1029 err = UNKNOWN_ERROR; 1030 } 1031 1032 // Decoder errors can be due to Source (e.g. from streaming), 1033 // or from decoding corrupted bitstreams, or from other decoder 1034 // MediaCodec operations (e.g. from an ongoing reset or seek). 1035 // They may also be due to openAudioSink failure at 1036 // decoder start or after a format change. 1037 // 1038 // We try to gracefully shut down the affected decoder if possible, 1039 // rather than trying to force the shutdown with something 1040 // similar to performReset(). This method can lead to a hang 1041 // if MediaCodec functions block after an error, but they should 1042 // typically return INVALID_OPERATION instead of blocking. 1043 1044 FlushStatus *flushing = audio ? &mFlushingAudio : &mFlushingVideo; 1045 ALOGE("received error(%#x) from %s decoder, flushing(%d), now shutting down", 1046 err, audio ? "audio" : "video", *flushing); 1047 1048 switch (*flushing) { 1049 case NONE: 1050 mDeferredActions.push_back( 1051 new FlushDecoderAction( 1052 audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE, 1053 audio ? FLUSH_CMD_NONE : FLUSH_CMD_SHUTDOWN)); 1054 processDeferredActions(); 1055 break; 1056 case FLUSHING_DECODER: 1057 *flushing = FLUSHING_DECODER_SHUTDOWN; // initiate shutdown after flush. 1058 break; // Wait for flush to complete. 1059 case FLUSHING_DECODER_SHUTDOWN: 1060 break; // Wait for flush to complete. 1061 case SHUTTING_DOWN_DECODER: 1062 break; // Wait for shutdown to complete. 1063 case FLUSHED: 1064 // Widevine source reads must stop before releasing the video decoder. 1065 if (!audio && mSource != NULL && mSourceFlags & Source::FLAG_SECURE) { 1066 mSource->stop(); 1067 mSourceStarted = false; 1068 } 1069 getDecoder(audio)->initiateShutdown(); // In the middle of a seek. 1070 *flushing = SHUTTING_DOWN_DECODER; // Shut down. 1071 break; 1072 case SHUT_DOWN: 1073 finishFlushIfPossible(); // Should not occur. 1074 break; // Finish anyways. 1075 } 1076 notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 1077 } else { 1078 ALOGV("Unhandled decoder notification %d '%c%c%c%c'.", 1079 what, 1080 what >> 24, 1081 (what >> 16) & 0xff, 1082 (what >> 8) & 0xff, 1083 what & 0xff); 1084 } 1085 1086 break; 1087 } 1088 1089 case kWhatRendererNotify: 1090 { 1091 int32_t requesterGeneration = mRendererGeneration - 1; 1092 CHECK(msg->findInt32("generation", &requesterGeneration)); 1093 if (requesterGeneration != mRendererGeneration) { 1094 ALOGV("got message from old renderer, generation(%d:%d)", 1095 requesterGeneration, mRendererGeneration); 1096 return; 1097 } 1098 1099 int32_t what; 1100 CHECK(msg->findInt32("what", &what)); 1101 1102 if (what == Renderer::kWhatEOS) { 1103 int32_t audio; 1104 CHECK(msg->findInt32("audio", &audio)); 1105 1106 int32_t finalResult; 1107 CHECK(msg->findInt32("finalResult", &finalResult)); 1108 1109 if (audio) { 1110 mAudioEOS = true; 1111 } else { 1112 mVideoEOS = true; 1113 } 1114 1115 if (finalResult == ERROR_END_OF_STREAM) { 1116 ALOGV("reached %s EOS", audio ? "audio" : "video"); 1117 } else { 1118 ALOGE("%s track encountered an error (%d)", 1119 audio ? "audio" : "video", finalResult); 1120 1121 notifyListener( 1122 MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult); 1123 } 1124 1125 if ((mAudioEOS || mAudioDecoder == NULL) 1126 && (mVideoEOS || mVideoDecoder == NULL)) { 1127 notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 1128 } 1129 } else if (what == Renderer::kWhatFlushComplete) { 1130 int32_t audio; 1131 CHECK(msg->findInt32("audio", &audio)); 1132 1133 if (audio) { 1134 mAudioEOS = false; 1135 } else { 1136 mVideoEOS = false; 1137 } 1138 1139 ALOGV("renderer %s flush completed.", audio ? "audio" : "video"); 1140 if (audio && (mFlushingAudio == NONE || mFlushingAudio == FLUSHED 1141 || mFlushingAudio == SHUT_DOWN)) { 1142 // Flush has been handled by tear down. 1143 break; 1144 } 1145 handleFlushComplete(audio, false /* isDecoder */); 1146 finishFlushIfPossible(); 1147 } else if (what == Renderer::kWhatVideoRenderingStart) { 1148 notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0); 1149 } else if (what == Renderer::kWhatMediaRenderingStart) { 1150 ALOGV("media rendering started"); 1151 notifyListener(MEDIA_STARTED, 0, 0); 1152 } else if (what == Renderer::kWhatAudioTearDown) { 1153 int32_t reason; 1154 CHECK(msg->findInt32("reason", &reason)); 1155 ALOGV("Tear down audio with reason %d.", reason); 1156 if (reason == Renderer::kDueToTimeout && !(mPaused && mOffloadAudio)) { 1157 // TimeoutWhenPaused is only for offload mode. 1158 ALOGW("Receive a stale message for teardown."); 1159 break; 1160 } 1161 int64_t positionUs; 1162 if (!msg->findInt64("positionUs", &positionUs)) { 1163 positionUs = mPreviousSeekTimeUs; 1164 } 1165 1166 restartAudio( 1167 positionUs, reason == Renderer::kForceNonOffload /* forceNonOffload */, 1168 reason != Renderer::kDueToTimeout /* needsToCreateAudioDecoder */); 1169 } 1170 break; 1171 } 1172 1173 case kWhatMoreDataQueued: 1174 { 1175 break; 1176 } 1177 1178 case kWhatReset: 1179 { 1180 ALOGV("kWhatReset"); 1181 1182 mResetting = true; 1183 1184 mDeferredActions.push_back( 1185 new FlushDecoderAction( 1186 FLUSH_CMD_SHUTDOWN /* audio */, 1187 FLUSH_CMD_SHUTDOWN /* video */)); 1188 1189 mDeferredActions.push_back( 1190 new SimpleAction(&NuPlayer::performReset)); 1191 1192 processDeferredActions(); 1193 break; 1194 } 1195 1196 case kWhatSeek: 1197 { 1198 int64_t seekTimeUs; 1199 int32_t needNotify; 1200 CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 1201 CHECK(msg->findInt32("needNotify", &needNotify)); 1202 1203 ALOGV("kWhatSeek seekTimeUs=%lld us, needNotify=%d", 1204 (long long)seekTimeUs, needNotify); 1205 1206 if (!mStarted) { 1207 // Seek before the player is started. In order to preview video, 1208 // need to start the player and pause it. This branch is called 1209 // only once if needed. After the player is started, any seek 1210 // operation will go through normal path. 1211 // Audio-only cases are handled separately. 1212 onStart(seekTimeUs); 1213 if (mStarted) { 1214 onPause(); 1215 mPausedByClient = true; 1216 } 1217 if (needNotify) { 1218 notifyDriverSeekComplete(); 1219 } 1220 break; 1221 } 1222 1223 mDeferredActions.push_back( 1224 new FlushDecoderAction(FLUSH_CMD_FLUSH /* audio */, 1225 FLUSH_CMD_FLUSH /* video */)); 1226 1227 mDeferredActions.push_back( 1228 new SeekAction(seekTimeUs)); 1229 1230 // After a flush without shutdown, decoder is paused. 1231 // Don't resume it until source seek is done, otherwise it could 1232 // start pulling stale data too soon. 1233 mDeferredActions.push_back( 1234 new ResumeDecoderAction(needNotify)); 1235 1236 processDeferredActions(); 1237 break; 1238 } 1239 1240 case kWhatPause: 1241 { 1242 onPause(); 1243 mPausedByClient = true; 1244 break; 1245 } 1246 1247 case kWhatSourceNotify: 1248 { 1249 onSourceNotify(msg); 1250 break; 1251 } 1252 1253 case kWhatClosedCaptionNotify: 1254 { 1255 onClosedCaptionNotify(msg); 1256 break; 1257 } 1258 1259 default: 1260 TRESPASS(); 1261 break; 1262 } 1263 } 1264 1265 void NuPlayer::onResume() { 1266 if (!mPaused || mResetting) { 1267 ALOGD_IF(mResetting, "resetting, onResume discarded"); 1268 return; 1269 } 1270 mPaused = false; 1271 if (mSource != NULL) { 1272 mSource->resume(); 1273 } else { 1274 ALOGW("resume called when source is gone or not set"); 1275 } 1276 // |mAudioDecoder| may have been released due to the pause timeout, so re-create it if 1277 // needed. 1278 if (audioDecoderStillNeeded() && mAudioDecoder == NULL) { 1279 instantiateDecoder(true /* audio */, &mAudioDecoder); 1280 } 1281 if (mRenderer != NULL) { 1282 mRenderer->resume(); 1283 } else { 1284 ALOGW("resume called when renderer is gone or not set"); 1285 } 1286 } 1287 1288 status_t NuPlayer::onInstantiateSecureDecoders() { 1289 status_t err; 1290 if (!(mSourceFlags & Source::FLAG_SECURE)) { 1291 return BAD_TYPE; 1292 } 1293 1294 if (mRenderer != NULL) { 1295 ALOGE("renderer should not be set when instantiating secure decoders"); 1296 return UNKNOWN_ERROR; 1297 } 1298 1299 // TRICKY: We rely on mRenderer being null, so that decoder does not start requesting 1300 // data on instantiation. 1301 if (mSurface != NULL) { 1302 err = instantiateDecoder(false, &mVideoDecoder); 1303 if (err != OK) { 1304 return err; 1305 } 1306 } 1307 1308 if (mAudioSink != NULL) { 1309 err = instantiateDecoder(true, &mAudioDecoder); 1310 if (err != OK) { 1311 return err; 1312 } 1313 } 1314 return OK; 1315 } 1316 1317 void NuPlayer::onStart(int64_t startPositionUs) { 1318 if (!mSourceStarted) { 1319 mSourceStarted = true; 1320 mSource->start(); 1321 } 1322 if (startPositionUs > 0) { 1323 performSeek(startPositionUs); 1324 if (mSource->getFormat(false /* audio */) == NULL) { 1325 return; 1326 } 1327 } 1328 1329 mOffloadAudio = false; 1330 mAudioEOS = false; 1331 mVideoEOS = false; 1332 mStarted = true; 1333 mPaused = false; 1334 1335 uint32_t flags = 0; 1336 1337 if (mSource->isRealTime()) { 1338 flags |= Renderer::FLAG_REAL_TIME; 1339 } 1340 1341 sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */); 1342 ALOGV_IF(audioMeta == NULL, "no metadata for audio source"); // video only stream 1343 audio_stream_type_t streamType = AUDIO_STREAM_MUSIC; 1344 if (mAudioSink != NULL) { 1345 streamType = mAudioSink->getAudioStreamType(); 1346 } 1347 1348 sp<AMessage> videoFormat = mSource->getFormat(false /* audio */); 1349 1350 mOffloadAudio = 1351 canOffloadStream(audioMeta, (videoFormat != NULL), mSource->isStreaming(), streamType) 1352 && (mPlaybackSettings.mSpeed == 1.f && mPlaybackSettings.mPitch == 1.f); 1353 if (mOffloadAudio) { 1354 flags |= Renderer::FLAG_OFFLOAD_AUDIO; 1355 } 1356 1357 sp<AMessage> notify = new AMessage(kWhatRendererNotify, this); 1358 ++mRendererGeneration; 1359 notify->setInt32("generation", mRendererGeneration); 1360 mRenderer = new Renderer(mAudioSink, notify, flags); 1361 mRendererLooper = new ALooper; 1362 mRendererLooper->setName("NuPlayerRenderer"); 1363 mRendererLooper->start(false, false, ANDROID_PRIORITY_AUDIO); 1364 mRendererLooper->registerHandler(mRenderer); 1365 1366 status_t err = mRenderer->setPlaybackSettings(mPlaybackSettings); 1367 if (err != OK) { 1368 mSource->stop(); 1369 mSourceStarted = false; 1370 notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 1371 return; 1372 } 1373 1374 float rate = getFrameRate(); 1375 if (rate > 0) { 1376 mRenderer->setVideoFrameRate(rate); 1377 } 1378 1379 if (mVideoDecoder != NULL) { 1380 mVideoDecoder->setRenderer(mRenderer); 1381 } 1382 if (mAudioDecoder != NULL) { 1383 mAudioDecoder->setRenderer(mRenderer); 1384 } 1385 1386 postScanSources(); 1387 } 1388 1389 void NuPlayer::onPause() { 1390 if (mPaused) { 1391 return; 1392 } 1393 mPaused = true; 1394 if (mSource != NULL) { 1395 mSource->pause(); 1396 } else { 1397 ALOGW("pause called when source is gone or not set"); 1398 } 1399 if (mRenderer != NULL) { 1400 mRenderer->pause(); 1401 } else { 1402 ALOGW("pause called when renderer is gone or not set"); 1403 } 1404 } 1405 1406 bool NuPlayer::audioDecoderStillNeeded() { 1407 // Audio decoder is no longer needed if it's in shut/shutting down status. 1408 return ((mFlushingAudio != SHUT_DOWN) && (mFlushingAudio != SHUTTING_DOWN_DECODER)); 1409 } 1410 1411 void NuPlayer::handleFlushComplete(bool audio, bool isDecoder) { 1412 // We wait for both the decoder flush and the renderer flush to complete 1413 // before entering either the FLUSHED or the SHUTTING_DOWN_DECODER state. 1414 1415 mFlushComplete[audio][isDecoder] = true; 1416 if (!mFlushComplete[audio][!isDecoder]) { 1417 return; 1418 } 1419 1420 FlushStatus *state = audio ? &mFlushingAudio : &mFlushingVideo; 1421 switch (*state) { 1422 case FLUSHING_DECODER: 1423 { 1424 *state = FLUSHED; 1425 break; 1426 } 1427 1428 case FLUSHING_DECODER_SHUTDOWN: 1429 { 1430 *state = SHUTTING_DOWN_DECODER; 1431 1432 ALOGV("initiating %s decoder shutdown", audio ? "audio" : "video"); 1433 if (!audio) { 1434 // Widevine source reads must stop before releasing the video decoder. 1435 if (mSource != NULL && mSourceFlags & Source::FLAG_SECURE) { 1436 mSource->stop(); 1437 mSourceStarted = false; 1438 } 1439 } 1440 getDecoder(audio)->initiateShutdown(); 1441 break; 1442 } 1443 1444 default: 1445 // decoder flush completes only occur in a flushing state. 1446 LOG_ALWAYS_FATAL_IF(isDecoder, "decoder flush in invalid state %d", *state); 1447 break; 1448 } 1449 } 1450 1451 void NuPlayer::finishFlushIfPossible() { 1452 if (mFlushingAudio != NONE && mFlushingAudio != FLUSHED 1453 && mFlushingAudio != SHUT_DOWN) { 1454 return; 1455 } 1456 1457 if (mFlushingVideo != NONE && mFlushingVideo != FLUSHED 1458 && mFlushingVideo != SHUT_DOWN) { 1459 return; 1460 } 1461 1462 ALOGV("both audio and video are flushed now."); 1463 1464 mFlushingAudio = NONE; 1465 mFlushingVideo = NONE; 1466 1467 clearFlushComplete(); 1468 1469 processDeferredActions(); 1470 } 1471 1472 void NuPlayer::postScanSources() { 1473 if (mScanSourcesPending) { 1474 return; 1475 } 1476 1477 sp<AMessage> msg = new AMessage(kWhatScanSources, this); 1478 msg->setInt32("generation", mScanSourcesGeneration); 1479 msg->post(); 1480 1481 mScanSourcesPending = true; 1482 } 1483 1484 void NuPlayer::tryOpenAudioSinkForOffload( 1485 const sp<AMessage> &format, const sp<MetaData> &audioMeta, bool hasVideo) { 1486 // Note: This is called early in NuPlayer to determine whether offloading 1487 // is possible; otherwise the decoders call the renderer openAudioSink directly. 1488 1489 status_t err = mRenderer->openAudioSink( 1490 format, true /* offloadOnly */, hasVideo, AUDIO_OUTPUT_FLAG_NONE, &mOffloadAudio); 1491 if (err != OK) { 1492 // Any failure we turn off mOffloadAudio. 1493 mOffloadAudio = false; 1494 } else if (mOffloadAudio) { 1495 sendMetaDataToHal(mAudioSink, audioMeta); 1496 } 1497 } 1498 1499 void NuPlayer::closeAudioSink() { 1500 mRenderer->closeAudioSink(); 1501 } 1502 1503 void NuPlayer::restartAudio( 1504 int64_t currentPositionUs, bool forceNonOffload, bool needsToCreateAudioDecoder) { 1505 if (mAudioDecoder != NULL) { 1506 mAudioDecoder->pause(); 1507 mAudioDecoder.clear(); 1508 ++mAudioDecoderGeneration; 1509 } 1510 if (mFlushingAudio == FLUSHING_DECODER) { 1511 mFlushComplete[1 /* audio */][1 /* isDecoder */] = true; 1512 mFlushingAudio = FLUSHED; 1513 finishFlushIfPossible(); 1514 } else if (mFlushingAudio == FLUSHING_DECODER_SHUTDOWN 1515 || mFlushingAudio == SHUTTING_DOWN_DECODER) { 1516 mFlushComplete[1 /* audio */][1 /* isDecoder */] = true; 1517 mFlushingAudio = SHUT_DOWN; 1518 finishFlushIfPossible(); 1519 needsToCreateAudioDecoder = false; 1520 } 1521 if (mRenderer == NULL) { 1522 return; 1523 } 1524 closeAudioSink(); 1525 mRenderer->flush(true /* audio */, false /* notifyComplete */); 1526 if (mVideoDecoder != NULL) { 1527 mRenderer->flush(false /* audio */, false /* notifyComplete */); 1528 } 1529 1530 performSeek(currentPositionUs); 1531 1532 if (forceNonOffload) { 1533 mRenderer->signalDisableOffloadAudio(); 1534 mOffloadAudio = false; 1535 } 1536 if (needsToCreateAudioDecoder) { 1537 instantiateDecoder(true /* audio */, &mAudioDecoder, !forceNonOffload); 1538 } 1539 } 1540 1541 void NuPlayer::determineAudioModeChange(const sp<AMessage> &audioFormat) { 1542 if (mSource == NULL || mAudioSink == NULL) { 1543 return; 1544 } 1545 1546 if (mRenderer == NULL) { 1547 ALOGW("No renderer can be used to determine audio mode. Use non-offload for safety."); 1548 mOffloadAudio = false; 1549 return; 1550 } 1551 1552 sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */); 1553 sp<AMessage> videoFormat = mSource->getFormat(false /* audio */); 1554 audio_stream_type_t streamType = mAudioSink->getAudioStreamType(); 1555 const bool hasVideo = (videoFormat != NULL); 1556 const bool canOffload = canOffloadStream( 1557 audioMeta, hasVideo, mSource->isStreaming(), streamType) 1558 && (mPlaybackSettings.mSpeed == 1.f && mPlaybackSettings.mPitch == 1.f); 1559 if (canOffload) { 1560 if (!mOffloadAudio) { 1561 mRenderer->signalEnableOffloadAudio(); 1562 } 1563 // open audio sink early under offload mode. 1564 tryOpenAudioSinkForOffload(audioFormat, audioMeta, hasVideo); 1565 } else { 1566 if (mOffloadAudio) { 1567 mRenderer->signalDisableOffloadAudio(); 1568 mOffloadAudio = false; 1569 } 1570 } 1571 } 1572 1573 status_t NuPlayer::instantiateDecoder( 1574 bool audio, sp<DecoderBase> *decoder, bool checkAudioModeChange) { 1575 // The audio decoder could be cleared by tear down. If still in shut down 1576 // process, no need to create a new audio decoder. 1577 if (*decoder != NULL || (audio && mFlushingAudio == SHUT_DOWN)) { 1578 return OK; 1579 } 1580 1581 sp<AMessage> format = mSource->getFormat(audio); 1582 1583 if (format == NULL) { 1584 return UNKNOWN_ERROR; 1585 } else { 1586 status_t err; 1587 if (format->findInt32("err", &err) && err) { 1588 return err; 1589 } 1590 } 1591 1592 format->setInt32("priority", 0 /* realtime */); 1593 1594 if (!audio) { 1595 AString mime; 1596 CHECK(format->findString("mime", &mime)); 1597 1598 sp<AMessage> ccNotify = new AMessage(kWhatClosedCaptionNotify, this); 1599 if (mCCDecoder == NULL) { 1600 mCCDecoder = new CCDecoder(ccNotify); 1601 } 1602 1603 if (mSourceFlags & Source::FLAG_SECURE) { 1604 format->setInt32("secure", true); 1605 } 1606 1607 if (mSourceFlags & Source::FLAG_PROTECTED) { 1608 format->setInt32("protected", true); 1609 } 1610 1611 float rate = getFrameRate(); 1612 if (rate > 0) { 1613 format->setFloat("operating-rate", rate * mPlaybackSettings.mSpeed); 1614 } 1615 } 1616 1617 if (audio) { 1618 sp<AMessage> notify = new AMessage(kWhatAudioNotify, this); 1619 ++mAudioDecoderGeneration; 1620 notify->setInt32("generation", mAudioDecoderGeneration); 1621 1622 if (checkAudioModeChange) { 1623 determineAudioModeChange(format); 1624 } 1625 if (mOffloadAudio) { 1626 mSource->setOffloadAudio(true /* offload */); 1627 1628 const bool hasVideo = (mSource->getFormat(false /*audio */) != NULL); 1629 format->setInt32("has-video", hasVideo); 1630 *decoder = new DecoderPassThrough(notify, mSource, mRenderer); 1631 } else { 1632 mSource->setOffloadAudio(false /* offload */); 1633 1634 *decoder = new Decoder(notify, mSource, mPID, mRenderer); 1635 } 1636 } else { 1637 sp<AMessage> notify = new AMessage(kWhatVideoNotify, this); 1638 ++mVideoDecoderGeneration; 1639 notify->setInt32("generation", mVideoDecoderGeneration); 1640 1641 *decoder = new Decoder( 1642 notify, mSource, mPID, mRenderer, mSurface, mCCDecoder); 1643 1644 // enable FRC if high-quality AV sync is requested, even if not 1645 // directly queuing to display, as this will even improve textureview 1646 // playback. 1647 { 1648 char value[PROPERTY_VALUE_MAX]; 1649 if (property_get("persist.sys.media.avsync", value, NULL) && 1650 (!strcmp("1", value) || !strcasecmp("true", value))) { 1651 format->setInt32("auto-frc", 1); 1652 } 1653 } 1654 } 1655 (*decoder)->init(); 1656 (*decoder)->configure(format); 1657 1658 // allocate buffers to decrypt widevine source buffers 1659 if (!audio && (mSourceFlags & Source::FLAG_SECURE)) { 1660 Vector<sp<ABuffer> > inputBufs; 1661 CHECK_EQ((*decoder)->getInputBuffers(&inputBufs), (status_t)OK); 1662 1663 Vector<MediaBuffer *> mediaBufs; 1664 for (size_t i = 0; i < inputBufs.size(); i++) { 1665 const sp<ABuffer> &buffer = inputBufs[i]; 1666 MediaBuffer *mbuf = new MediaBuffer(buffer->data(), buffer->size()); 1667 mediaBufs.push(mbuf); 1668 } 1669 1670 status_t err = mSource->setBuffers(audio, mediaBufs); 1671 if (err != OK) { 1672 for (size_t i = 0; i < mediaBufs.size(); ++i) { 1673 mediaBufs[i]->release(); 1674 } 1675 mediaBufs.clear(); 1676 ALOGE("Secure source didn't support secure mediaBufs."); 1677 return err; 1678 } 1679 } 1680 1681 if (!audio) { 1682 sp<AMessage> params = new AMessage(); 1683 float rate = getFrameRate(); 1684 if (rate > 0) { 1685 params->setFloat("frame-rate-total", rate); 1686 } 1687 1688 sp<MetaData> fileMeta = getFileMeta(); 1689 if (fileMeta != NULL) { 1690 int32_t videoTemporalLayerCount; 1691 if (fileMeta->findInt32(kKeyTemporalLayerCount, &videoTemporalLayerCount) 1692 && videoTemporalLayerCount > 0) { 1693 params->setInt32("temporal-layer-count", videoTemporalLayerCount); 1694 } 1695 } 1696 1697 if (params->countEntries() > 0) { 1698 (*decoder)->setParameters(params); 1699 } 1700 } 1701 return OK; 1702 } 1703 1704 void NuPlayer::updateVideoSize( 1705 const sp<AMessage> &inputFormat, 1706 const sp<AMessage> &outputFormat) { 1707 if (inputFormat == NULL) { 1708 ALOGW("Unknown video size, reporting 0x0!"); 1709 notifyListener(MEDIA_SET_VIDEO_SIZE, 0, 0); 1710 return; 1711 } 1712 1713 int32_t displayWidth, displayHeight; 1714 if (outputFormat != NULL) { 1715 int32_t width, height; 1716 CHECK(outputFormat->findInt32("width", &width)); 1717 CHECK(outputFormat->findInt32("height", &height)); 1718 1719 int32_t cropLeft, cropTop, cropRight, cropBottom; 1720 CHECK(outputFormat->findRect( 1721 "crop", 1722 &cropLeft, &cropTop, &cropRight, &cropBottom)); 1723 1724 displayWidth = cropRight - cropLeft + 1; 1725 displayHeight = cropBottom - cropTop + 1; 1726 1727 ALOGV("Video output format changed to %d x %d " 1728 "(crop: %d x %d @ (%d, %d))", 1729 width, height, 1730 displayWidth, 1731 displayHeight, 1732 cropLeft, cropTop); 1733 } else { 1734 CHECK(inputFormat->findInt32("width", &displayWidth)); 1735 CHECK(inputFormat->findInt32("height", &displayHeight)); 1736 1737 ALOGV("Video input format %d x %d", displayWidth, displayHeight); 1738 } 1739 1740 // Take into account sample aspect ratio if necessary: 1741 int32_t sarWidth, sarHeight; 1742 if (inputFormat->findInt32("sar-width", &sarWidth) 1743 && inputFormat->findInt32("sar-height", &sarHeight)) { 1744 ALOGV("Sample aspect ratio %d : %d", sarWidth, sarHeight); 1745 1746 displayWidth = (displayWidth * sarWidth) / sarHeight; 1747 1748 ALOGV("display dimensions %d x %d", displayWidth, displayHeight); 1749 } 1750 1751 int32_t rotationDegrees; 1752 if (!inputFormat->findInt32("rotation-degrees", &rotationDegrees)) { 1753 rotationDegrees = 0; 1754 } 1755 1756 if (rotationDegrees == 90 || rotationDegrees == 270) { 1757 int32_t tmp = displayWidth; 1758 displayWidth = displayHeight; 1759 displayHeight = tmp; 1760 } 1761 1762 notifyListener( 1763 MEDIA_SET_VIDEO_SIZE, 1764 displayWidth, 1765 displayHeight); 1766 } 1767 1768 void NuPlayer::notifyListener(int msg, int ext1, int ext2, const Parcel *in) { 1769 if (mDriver == NULL) { 1770 return; 1771 } 1772 1773 sp<NuPlayerDriver> driver = mDriver.promote(); 1774 1775 if (driver == NULL) { 1776 return; 1777 } 1778 1779 driver->notifyListener(msg, ext1, ext2, in); 1780 } 1781 1782 void NuPlayer::flushDecoder(bool audio, bool needShutdown) { 1783 ALOGV("[%s] flushDecoder needShutdown=%d", 1784 audio ? "audio" : "video", needShutdown); 1785 1786 const sp<DecoderBase> &decoder = getDecoder(audio); 1787 if (decoder == NULL) { 1788 ALOGI("flushDecoder %s without decoder present", 1789 audio ? "audio" : "video"); 1790 return; 1791 } 1792 1793 // Make sure we don't continue to scan sources until we finish flushing. 1794 ++mScanSourcesGeneration; 1795 if (mScanSourcesPending) { 1796 mDeferredActions.push_back( 1797 new SimpleAction(&NuPlayer::performScanSources)); 1798 mScanSourcesPending = false; 1799 } 1800 1801 decoder->signalFlush(); 1802 1803 FlushStatus newStatus = 1804 needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 1805 1806 mFlushComplete[audio][false /* isDecoder */] = (mRenderer == NULL); 1807 mFlushComplete[audio][true /* isDecoder */] = false; 1808 if (audio) { 1809 ALOGE_IF(mFlushingAudio != NONE, 1810 "audio flushDecoder() is called in state %d", mFlushingAudio); 1811 mFlushingAudio = newStatus; 1812 } else { 1813 ALOGE_IF(mFlushingVideo != NONE, 1814 "video flushDecoder() is called in state %d", mFlushingVideo); 1815 mFlushingVideo = newStatus; 1816 } 1817 } 1818 1819 void NuPlayer::queueDecoderShutdown( 1820 bool audio, bool video, const sp<AMessage> &reply) { 1821 ALOGI("queueDecoderShutdown audio=%d, video=%d", audio, video); 1822 1823 mDeferredActions.push_back( 1824 new FlushDecoderAction( 1825 audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE, 1826 video ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE)); 1827 1828 mDeferredActions.push_back( 1829 new SimpleAction(&NuPlayer::performScanSources)); 1830 1831 mDeferredActions.push_back(new PostMessageAction(reply)); 1832 1833 processDeferredActions(); 1834 } 1835 1836 status_t NuPlayer::setVideoScalingMode(int32_t mode) { 1837 mVideoScalingMode = mode; 1838 if (mSurface != NULL) { 1839 status_t ret = native_window_set_scaling_mode(mSurface.get(), mVideoScalingMode); 1840 if (ret != OK) { 1841 ALOGE("Failed to set scaling mode (%d): %s", 1842 -ret, strerror(-ret)); 1843 return ret; 1844 } 1845 } 1846 return OK; 1847 } 1848 1849 status_t NuPlayer::getTrackInfo(Parcel* reply) const { 1850 sp<AMessage> msg = new AMessage(kWhatGetTrackInfo, this); 1851 msg->setPointer("reply", reply); 1852 1853 sp<AMessage> response; 1854 status_t err = msg->postAndAwaitResponse(&response); 1855 return err; 1856 } 1857 1858 status_t NuPlayer::getSelectedTrack(int32_t type, Parcel* reply) const { 1859 sp<AMessage> msg = new AMessage(kWhatGetSelectedTrack, this); 1860 msg->setPointer("reply", reply); 1861 msg->setInt32("type", type); 1862 1863 sp<AMessage> response; 1864 status_t err = msg->postAndAwaitResponse(&response); 1865 if (err == OK && response != NULL) { 1866 CHECK(response->findInt32("err", &err)); 1867 } 1868 return err; 1869 } 1870 1871 status_t NuPlayer::selectTrack(size_t trackIndex, bool select, int64_t timeUs) { 1872 sp<AMessage> msg = new AMessage(kWhatSelectTrack, this); 1873 msg->setSize("trackIndex", trackIndex); 1874 msg->setInt32("select", select); 1875 msg->setInt64("timeUs", timeUs); 1876 1877 sp<AMessage> response; 1878 status_t err = msg->postAndAwaitResponse(&response); 1879 1880 if (err != OK) { 1881 return err; 1882 } 1883 1884 if (!response->findInt32("err", &err)) { 1885 err = OK; 1886 } 1887 1888 return err; 1889 } 1890 1891 status_t NuPlayer::getCurrentPosition(int64_t *mediaUs) { 1892 sp<Renderer> renderer = mRenderer; 1893 if (renderer == NULL) { 1894 return NO_INIT; 1895 } 1896 1897 return renderer->getCurrentPosition(mediaUs); 1898 } 1899 1900 void NuPlayer::getStats(Vector<sp<AMessage> > *mTrackStats) { 1901 CHECK(mTrackStats != NULL); 1902 1903 mTrackStats->clear(); 1904 if (mVideoDecoder != NULL) { 1905 mTrackStats->push_back(mVideoDecoder->getStats()); 1906 } 1907 if (mAudioDecoder != NULL) { 1908 mTrackStats->push_back(mAudioDecoder->getStats()); 1909 } 1910 } 1911 1912 sp<MetaData> NuPlayer::getFileMeta() { 1913 return mSource->getFileFormatMeta(); 1914 } 1915 1916 float NuPlayer::getFrameRate() { 1917 sp<MetaData> meta = mSource->getFormatMeta(false /* audio */); 1918 if (meta == NULL) { 1919 return 0; 1920 } 1921 int32_t rate; 1922 if (!meta->findInt32(kKeyFrameRate, &rate)) { 1923 // fall back to try file meta 1924 sp<MetaData> fileMeta = getFileMeta(); 1925 if (fileMeta == NULL) { 1926 ALOGW("source has video meta but not file meta"); 1927 return -1; 1928 } 1929 int32_t fileMetaRate; 1930 if (!fileMeta->findInt32(kKeyFrameRate, &fileMetaRate)) { 1931 return -1; 1932 } 1933 return fileMetaRate; 1934 } 1935 return rate; 1936 } 1937 1938 void NuPlayer::schedulePollDuration() { 1939 sp<AMessage> msg = new AMessage(kWhatPollDuration, this); 1940 msg->setInt32("generation", mPollDurationGeneration); 1941 msg->post(); 1942 } 1943 1944 void NuPlayer::cancelPollDuration() { 1945 ++mPollDurationGeneration; 1946 } 1947 1948 void NuPlayer::processDeferredActions() { 1949 while (!mDeferredActions.empty()) { 1950 // We won't execute any deferred actions until we're no longer in 1951 // an intermediate state, i.e. one more more decoders are currently 1952 // flushing or shutting down. 1953 1954 if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 1955 // We're currently flushing, postpone the reset until that's 1956 // completed. 1957 1958 ALOGV("postponing action mFlushingAudio=%d, mFlushingVideo=%d", 1959 mFlushingAudio, mFlushingVideo); 1960 1961 break; 1962 } 1963 1964 sp<Action> action = *mDeferredActions.begin(); 1965 mDeferredActions.erase(mDeferredActions.begin()); 1966 1967 action->execute(this); 1968 } 1969 } 1970 1971 void NuPlayer::performSeek(int64_t seekTimeUs) { 1972 ALOGV("performSeek seekTimeUs=%lld us (%.2f secs)", 1973 (long long)seekTimeUs, 1974 seekTimeUs / 1E6); 1975 1976 if (mSource == NULL) { 1977 // This happens when reset occurs right before the loop mode 1978 // asynchronously seeks to the start of the stream. 1979 LOG_ALWAYS_FATAL_IF(mAudioDecoder != NULL || mVideoDecoder != NULL, 1980 "mSource is NULL and decoders not NULL audio(%p) video(%p)", 1981 mAudioDecoder.get(), mVideoDecoder.get()); 1982 return; 1983 } 1984 mPreviousSeekTimeUs = seekTimeUs; 1985 mSource->seekTo(seekTimeUs); 1986 ++mTimedTextGeneration; 1987 1988 // everything's flushed, continue playback. 1989 } 1990 1991 void NuPlayer::performDecoderFlush(FlushCommand audio, FlushCommand video) { 1992 ALOGV("performDecoderFlush audio=%d, video=%d", audio, video); 1993 1994 if ((audio == FLUSH_CMD_NONE || mAudioDecoder == NULL) 1995 && (video == FLUSH_CMD_NONE || mVideoDecoder == NULL)) { 1996 return; 1997 } 1998 1999 if (audio != FLUSH_CMD_NONE && mAudioDecoder != NULL) { 2000 flushDecoder(true /* audio */, (audio == FLUSH_CMD_SHUTDOWN)); 2001 } 2002 2003 if (video != FLUSH_CMD_NONE && mVideoDecoder != NULL) { 2004 flushDecoder(false /* audio */, (video == FLUSH_CMD_SHUTDOWN)); 2005 } 2006 } 2007 2008 void NuPlayer::performReset() { 2009 ALOGV("performReset"); 2010 2011 CHECK(mAudioDecoder == NULL); 2012 CHECK(mVideoDecoder == NULL); 2013 2014 cancelPollDuration(); 2015 2016 ++mScanSourcesGeneration; 2017 mScanSourcesPending = false; 2018 2019 if (mRendererLooper != NULL) { 2020 if (mRenderer != NULL) { 2021 mRendererLooper->unregisterHandler(mRenderer->id()); 2022 } 2023 mRendererLooper->stop(); 2024 mRendererLooper.clear(); 2025 } 2026 mRenderer.clear(); 2027 ++mRendererGeneration; 2028 2029 if (mSource != NULL) { 2030 mSource->stop(); 2031 2032 Mutex::Autolock autoLock(mSourceLock); 2033 mSource.clear(); 2034 } 2035 2036 if (mDriver != NULL) { 2037 sp<NuPlayerDriver> driver = mDriver.promote(); 2038 if (driver != NULL) { 2039 driver->notifyResetComplete(); 2040 } 2041 } 2042 2043 mStarted = false; 2044 mPrepared = false; 2045 mResetting = false; 2046 mSourceStarted = false; 2047 } 2048 2049 void NuPlayer::performScanSources() { 2050 ALOGV("performScanSources"); 2051 2052 if (!mStarted) { 2053 return; 2054 } 2055 2056 if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 2057 postScanSources(); 2058 } 2059 } 2060 2061 void NuPlayer::performSetSurface(const sp<Surface> &surface) { 2062 ALOGV("performSetSurface"); 2063 2064 mSurface = surface; 2065 2066 // XXX - ignore error from setVideoScalingMode for now 2067 setVideoScalingMode(mVideoScalingMode); 2068 2069 if (mDriver != NULL) { 2070 sp<NuPlayerDriver> driver = mDriver.promote(); 2071 if (driver != NULL) { 2072 driver->notifySetSurfaceComplete(); 2073 } 2074 } 2075 } 2076 2077 void NuPlayer::performResumeDecoders(bool needNotify) { 2078 if (needNotify) { 2079 mResumePending = true; 2080 if (mVideoDecoder == NULL) { 2081 // if audio-only, we can notify seek complete now, 2082 // as the resume operation will be relatively fast. 2083 finishResume(); 2084 } 2085 } 2086 2087 if (mVideoDecoder != NULL) { 2088 // When there is continuous seek, MediaPlayer will cache the seek 2089 // position, and send down new seek request when previous seek is 2090 // complete. Let's wait for at least one video output frame before 2091 // notifying seek complete, so that the video thumbnail gets updated 2092 // when seekbar is dragged. 2093 mVideoDecoder->signalResume(needNotify); 2094 } 2095 2096 if (mAudioDecoder != NULL) { 2097 mAudioDecoder->signalResume(false /* needNotify */); 2098 } 2099 } 2100 2101 void NuPlayer::finishResume() { 2102 if (mResumePending) { 2103 mResumePending = false; 2104 notifyDriverSeekComplete(); 2105 } 2106 } 2107 2108 void NuPlayer::notifyDriverSeekComplete() { 2109 if (mDriver != NULL) { 2110 sp<NuPlayerDriver> driver = mDriver.promote(); 2111 if (driver != NULL) { 2112 driver->notifySeekComplete(); 2113 } 2114 } 2115 } 2116 2117 void NuPlayer::onSourceNotify(const sp<AMessage> &msg) { 2118 int32_t what; 2119 CHECK(msg->findInt32("what", &what)); 2120 2121 switch (what) { 2122 case Source::kWhatInstantiateSecureDecoders: 2123 { 2124 if (mSource == NULL) { 2125 // This is a stale notification from a source that was 2126 // asynchronously preparing when the client called reset(). 2127 // We handled the reset, the source is gone. 2128 break; 2129 } 2130 2131 sp<AMessage> reply; 2132 CHECK(msg->findMessage("reply", &reply)); 2133 status_t err = onInstantiateSecureDecoders(); 2134 reply->setInt32("err", err); 2135 reply->post(); 2136 break; 2137 } 2138 2139 case Source::kWhatPrepared: 2140 { 2141 if (mSource == NULL) { 2142 // This is a stale notification from a source that was 2143 // asynchronously preparing when the client called reset(). 2144 // We handled the reset, the source is gone. 2145 break; 2146 } 2147 2148 int32_t err; 2149 CHECK(msg->findInt32("err", &err)); 2150 2151 if (err != OK) { 2152 // shut down potential secure codecs in case client never calls reset 2153 mDeferredActions.push_back( 2154 new FlushDecoderAction(FLUSH_CMD_SHUTDOWN /* audio */, 2155 FLUSH_CMD_SHUTDOWN /* video */)); 2156 processDeferredActions(); 2157 } else { 2158 mPrepared = true; 2159 } 2160 2161 sp<NuPlayerDriver> driver = mDriver.promote(); 2162 if (driver != NULL) { 2163 // notify duration first, so that it's definitely set when 2164 // the app received the "prepare complete" callback. 2165 int64_t durationUs; 2166 if (mSource->getDuration(&durationUs) == OK) { 2167 driver->notifyDuration(durationUs); 2168 } 2169 driver->notifyPrepareCompleted(err); 2170 } 2171 2172 break; 2173 } 2174 2175 case Source::kWhatFlagsChanged: 2176 { 2177 uint32_t flags; 2178 CHECK(msg->findInt32("flags", (int32_t *)&flags)); 2179 2180 sp<NuPlayerDriver> driver = mDriver.promote(); 2181 if (driver != NULL) { 2182 if ((flags & NuPlayer::Source::FLAG_CAN_SEEK) == 0) { 2183 driver->notifyListener( 2184 MEDIA_INFO, MEDIA_INFO_NOT_SEEKABLE, 0); 2185 } 2186 driver->notifyFlagsChanged(flags); 2187 } 2188 2189 if ((mSourceFlags & Source::FLAG_DYNAMIC_DURATION) 2190 && (!(flags & Source::FLAG_DYNAMIC_DURATION))) { 2191 cancelPollDuration(); 2192 } else if (!(mSourceFlags & Source::FLAG_DYNAMIC_DURATION) 2193 && (flags & Source::FLAG_DYNAMIC_DURATION) 2194 && (mAudioDecoder != NULL || mVideoDecoder != NULL)) { 2195 schedulePollDuration(); 2196 } 2197 2198 mSourceFlags = flags; 2199 break; 2200 } 2201 2202 case Source::kWhatVideoSizeChanged: 2203 { 2204 sp<AMessage> format; 2205 CHECK(msg->findMessage("format", &format)); 2206 2207 updateVideoSize(format); 2208 break; 2209 } 2210 2211 case Source::kWhatBufferingUpdate: 2212 { 2213 int32_t percentage; 2214 CHECK(msg->findInt32("percentage", &percentage)); 2215 2216 notifyListener(MEDIA_BUFFERING_UPDATE, percentage, 0); 2217 break; 2218 } 2219 2220 case Source::kWhatPauseOnBufferingStart: 2221 { 2222 // ignore if not playing 2223 if (mStarted) { 2224 ALOGI("buffer low, pausing..."); 2225 2226 mPausedForBuffering = true; 2227 onPause(); 2228 } 2229 notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_START, 0); 2230 break; 2231 } 2232 2233 case Source::kWhatResumeOnBufferingEnd: 2234 { 2235 // ignore if not playing 2236 if (mStarted) { 2237 ALOGI("buffer ready, resuming..."); 2238 2239 mPausedForBuffering = false; 2240 2241 // do not resume yet if client didn't unpause 2242 if (!mPausedByClient) { 2243 onResume(); 2244 } 2245 } 2246 notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_END, 0); 2247 break; 2248 } 2249 2250 case Source::kWhatCacheStats: 2251 { 2252 int32_t kbps; 2253 CHECK(msg->findInt32("bandwidth", &kbps)); 2254 2255 notifyListener(MEDIA_INFO, MEDIA_INFO_NETWORK_BANDWIDTH, kbps); 2256 break; 2257 } 2258 2259 case Source::kWhatSubtitleData: 2260 { 2261 sp<ABuffer> buffer; 2262 CHECK(msg->findBuffer("buffer", &buffer)); 2263 2264 sendSubtitleData(buffer, 0 /* baseIndex */); 2265 break; 2266 } 2267 2268 case Source::kWhatTimedMetaData: 2269 { 2270 sp<ABuffer> buffer; 2271 if (!msg->findBuffer("buffer", &buffer)) { 2272 notifyListener(MEDIA_INFO, MEDIA_INFO_METADATA_UPDATE, 0); 2273 } else { 2274 sendTimedMetaData(buffer); 2275 } 2276 break; 2277 } 2278 2279 case Source::kWhatTimedTextData: 2280 { 2281 int32_t generation; 2282 if (msg->findInt32("generation", &generation) 2283 && generation != mTimedTextGeneration) { 2284 break; 2285 } 2286 2287 sp<ABuffer> buffer; 2288 CHECK(msg->findBuffer("buffer", &buffer)); 2289 2290 sp<NuPlayerDriver> driver = mDriver.promote(); 2291 if (driver == NULL) { 2292 break; 2293 } 2294 2295 int posMs; 2296 int64_t timeUs, posUs; 2297 driver->getCurrentPosition(&posMs); 2298 posUs = (int64_t) posMs * 1000ll; 2299 CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 2300 2301 if (posUs < timeUs) { 2302 if (!msg->findInt32("generation", &generation)) { 2303 msg->setInt32("generation", mTimedTextGeneration); 2304 } 2305 msg->post(timeUs - posUs); 2306 } else { 2307 sendTimedTextData(buffer); 2308 } 2309 break; 2310 } 2311 2312 case Source::kWhatQueueDecoderShutdown: 2313 { 2314 int32_t audio, video; 2315 CHECK(msg->findInt32("audio", &audio)); 2316 CHECK(msg->findInt32("video", &video)); 2317 2318 sp<AMessage> reply; 2319 CHECK(msg->findMessage("reply", &reply)); 2320 2321 queueDecoderShutdown(audio, video, reply); 2322 break; 2323 } 2324 2325 case Source::kWhatDrmNoLicense: 2326 { 2327 notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE); 2328 break; 2329 } 2330 2331 default: 2332 TRESPASS(); 2333 } 2334 } 2335 2336 void NuPlayer::onClosedCaptionNotify(const sp<AMessage> &msg) { 2337 int32_t what; 2338 CHECK(msg->findInt32("what", &what)); 2339 2340 switch (what) { 2341 case NuPlayer::CCDecoder::kWhatClosedCaptionData: 2342 { 2343 sp<ABuffer> buffer; 2344 CHECK(msg->findBuffer("buffer", &buffer)); 2345 2346 size_t inbandTracks = 0; 2347 if (mSource != NULL) { 2348 inbandTracks = mSource->getTrackCount(); 2349 } 2350 2351 sendSubtitleData(buffer, inbandTracks); 2352 break; 2353 } 2354 2355 case NuPlayer::CCDecoder::kWhatTrackAdded: 2356 { 2357 notifyListener(MEDIA_INFO, MEDIA_INFO_METADATA_UPDATE, 0); 2358 2359 break; 2360 } 2361 2362 default: 2363 TRESPASS(); 2364 } 2365 2366 2367 } 2368 2369 void NuPlayer::sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex) { 2370 int32_t trackIndex; 2371 int64_t timeUs, durationUs; 2372 CHECK(buffer->meta()->findInt32("trackIndex", &trackIndex)); 2373 CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 2374 CHECK(buffer->meta()->findInt64("durationUs", &durationUs)); 2375 2376 Parcel in; 2377 in.writeInt32(trackIndex + baseIndex); 2378 in.writeInt64(timeUs); 2379 in.writeInt64(durationUs); 2380 in.writeInt32(buffer->size()); 2381 in.writeInt32(buffer->size()); 2382 in.write(buffer->data(), buffer->size()); 2383 2384 notifyListener(MEDIA_SUBTITLE_DATA, 0, 0, &in); 2385 } 2386 2387 void NuPlayer::sendTimedMetaData(const sp<ABuffer> &buffer) { 2388 int64_t timeUs; 2389 CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 2390 2391 Parcel in; 2392 in.writeInt64(timeUs); 2393 in.writeInt32(buffer->size()); 2394 in.writeInt32(buffer->size()); 2395 in.write(buffer->data(), buffer->size()); 2396 2397 notifyListener(MEDIA_META_DATA, 0, 0, &in); 2398 } 2399 2400 void NuPlayer::sendTimedTextData(const sp<ABuffer> &buffer) { 2401 const void *data; 2402 size_t size = 0; 2403 int64_t timeUs; 2404 int32_t flag = TextDescriptions::IN_BAND_TEXT_3GPP; 2405 2406 AString mime; 2407 CHECK(buffer->meta()->findString("mime", &mime)); 2408 CHECK(strcasecmp(mime.c_str(), MEDIA_MIMETYPE_TEXT_3GPP) == 0); 2409 2410 data = buffer->data(); 2411 size = buffer->size(); 2412 2413 Parcel parcel; 2414 if (size > 0) { 2415 CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 2416 int32_t global = 0; 2417 if (buffer->meta()->findInt32("global", &global) && global) { 2418 flag |= TextDescriptions::GLOBAL_DESCRIPTIONS; 2419 } else { 2420 flag |= TextDescriptions::LOCAL_DESCRIPTIONS; 2421 } 2422 TextDescriptions::getParcelOfDescriptions( 2423 (const uint8_t *)data, size, flag, timeUs / 1000, &parcel); 2424 } 2425 2426 if ((parcel.dataSize() > 0)) { 2427 notifyListener(MEDIA_TIMED_TEXT, 0, 0, &parcel); 2428 } else { // send an empty timed text 2429 notifyListener(MEDIA_TIMED_TEXT, 0, 0); 2430 } 2431 } 2432 //////////////////////////////////////////////////////////////////////////////// 2433 2434 sp<AMessage> NuPlayer::Source::getFormat(bool audio) { 2435 sp<MetaData> meta = getFormatMeta(audio); 2436 2437 if (meta == NULL) { 2438 return NULL; 2439 } 2440 2441 sp<AMessage> msg = new AMessage; 2442 2443 if(convertMetaDataToMessage(meta, &msg) == OK) { 2444 return msg; 2445 } 2446 return NULL; 2447 } 2448 2449 void NuPlayer::Source::notifyFlagsChanged(uint32_t flags) { 2450 sp<AMessage> notify = dupNotify(); 2451 notify->setInt32("what", kWhatFlagsChanged); 2452 notify->setInt32("flags", flags); 2453 notify->post(); 2454 } 2455 2456 void NuPlayer::Source::notifyVideoSizeChanged(const sp<AMessage> &format) { 2457 sp<AMessage> notify = dupNotify(); 2458 notify->setInt32("what", kWhatVideoSizeChanged); 2459 notify->setMessage("format", format); 2460 notify->post(); 2461 } 2462 2463 void NuPlayer::Source::notifyPrepared(status_t err) { 2464 sp<AMessage> notify = dupNotify(); 2465 notify->setInt32("what", kWhatPrepared); 2466 notify->setInt32("err", err); 2467 notify->post(); 2468 } 2469 2470 void NuPlayer::Source::notifyInstantiateSecureDecoders(const sp<AMessage> &reply) { 2471 sp<AMessage> notify = dupNotify(); 2472 notify->setInt32("what", kWhatInstantiateSecureDecoders); 2473 notify->setMessage("reply", reply); 2474 notify->post(); 2475 } 2476 2477 void NuPlayer::Source::onMessageReceived(const sp<AMessage> & /* msg */) { 2478 TRESPASS(); 2479 } 2480 2481 } // namespace android 2482