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