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