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