NuPlayer.cpp revision e964d4e421e2d1ca937227a580c0c837091a11e3
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 explicit 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 explicit 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 explicit 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 explicit 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 explicit 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 sp<AMessage> params = new AMessage(); 788 params->setFloat("playback-speed", mPlaybackSettings.mSpeed); 789 mVideoDecoder->setParameters(params); 790 } 791 792 sp<AMessage> response = new AMessage; 793 response->setInt32("err", err); 794 response->postReply(replyID); 795 break; 796 } 797 798 case kWhatGetPlaybackSettings: 799 { 800 sp<AReplyToken> replyID; 801 CHECK(msg->senderAwaitsResponse(&replyID)); 802 AudioPlaybackRate rate = mPlaybackSettings; 803 status_t err = OK; 804 if (mRenderer != NULL) { 805 err = mRenderer->getPlaybackSettings(&rate); 806 } 807 if (err == OK) { 808 // get playback settings used by renderer, as it may be 809 // slightly off due to audiosink not taking small changes. 810 mPlaybackSettings = rate; 811 if (mPaused) { 812 rate.mSpeed = 0.f; 813 } 814 } 815 sp<AMessage> response = new AMessage; 816 if (err == OK) { 817 writeToAMessage(response, rate); 818 } 819 response->setInt32("err", err); 820 response->postReply(replyID); 821 break; 822 } 823 824 case kWhatConfigSync: 825 { 826 sp<AReplyToken> replyID; 827 CHECK(msg->senderAwaitsResponse(&replyID)); 828 829 ALOGV("kWhatConfigSync"); 830 AVSyncSettings sync; 831 float videoFpsHint; 832 readFromAMessage(msg, &sync, &videoFpsHint); 833 status_t err = OK; 834 if (mRenderer != NULL) { 835 err = mRenderer->setSyncSettings(sync, videoFpsHint); 836 } 837 if (err == OK) { 838 mSyncSettings = sync; 839 mVideoFpsHint = videoFpsHint; 840 } 841 sp<AMessage> response = new AMessage; 842 response->setInt32("err", err); 843 response->postReply(replyID); 844 break; 845 } 846 847 case kWhatGetSyncSettings: 848 { 849 sp<AReplyToken> replyID; 850 CHECK(msg->senderAwaitsResponse(&replyID)); 851 AVSyncSettings sync = mSyncSettings; 852 float videoFps = mVideoFpsHint; 853 status_t err = OK; 854 if (mRenderer != NULL) { 855 err = mRenderer->getSyncSettings(&sync, &videoFps); 856 if (err == OK) { 857 mSyncSettings = sync; 858 mVideoFpsHint = videoFps; 859 } 860 } 861 sp<AMessage> response = new AMessage; 862 if (err == OK) { 863 writeToAMessage(response, sync, videoFps); 864 } 865 response->setInt32("err", err); 866 response->postReply(replyID); 867 break; 868 } 869 870 case kWhatScanSources: 871 { 872 int32_t generation; 873 CHECK(msg->findInt32("generation", &generation)); 874 if (generation != mScanSourcesGeneration) { 875 // Drop obsolete msg. 876 break; 877 } 878 879 mScanSourcesPending = false; 880 881 ALOGV("scanning sources haveAudio=%d, haveVideo=%d", 882 mAudioDecoder != NULL, mVideoDecoder != NULL); 883 884 bool mHadAnySourcesBefore = 885 (mAudioDecoder != NULL) || (mVideoDecoder != NULL); 886 bool rescan = false; 887 888 // initialize video before audio because successful initialization of 889 // video may change deep buffer mode of audio. 890 if (mSurface != NULL) { 891 if (instantiateDecoder(false, &mVideoDecoder) == -EWOULDBLOCK) { 892 rescan = true; 893 } 894 } 895 896 // Don't try to re-open audio sink if there's an existing decoder. 897 if (mAudioSink != NULL && mAudioDecoder == NULL) { 898 if (instantiateDecoder(true, &mAudioDecoder) == -EWOULDBLOCK) { 899 rescan = true; 900 } 901 } 902 903 if (!mHadAnySourcesBefore 904 && (mAudioDecoder != NULL || mVideoDecoder != NULL)) { 905 // This is the first time we've found anything playable. 906 907 if (mSourceFlags & Source::FLAG_DYNAMIC_DURATION) { 908 schedulePollDuration(); 909 } 910 } 911 912 status_t err; 913 if ((err = mSource->feedMoreTSData()) != OK) { 914 if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 915 // We're not currently decoding anything (no audio or 916 // video tracks found) and we just ran out of input data. 917 918 if (err == ERROR_END_OF_STREAM) { 919 notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 920 } else { 921 notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 922 } 923 } 924 break; 925 } 926 927 if (rescan) { 928 msg->post(100000ll); 929 mScanSourcesPending = true; 930 } 931 break; 932 } 933 934 case kWhatVideoNotify: 935 case kWhatAudioNotify: 936 { 937 bool audio = msg->what() == kWhatAudioNotify; 938 939 int32_t currentDecoderGeneration = 940 (audio? mAudioDecoderGeneration : mVideoDecoderGeneration); 941 int32_t requesterGeneration = currentDecoderGeneration - 1; 942 CHECK(msg->findInt32("generation", &requesterGeneration)); 943 944 if (requesterGeneration != currentDecoderGeneration) { 945 ALOGV("got message from old %s decoder, generation(%d:%d)", 946 audio ? "audio" : "video", requesterGeneration, 947 currentDecoderGeneration); 948 sp<AMessage> reply; 949 if (!(msg->findMessage("reply", &reply))) { 950 return; 951 } 952 953 reply->setInt32("err", INFO_DISCONTINUITY); 954 reply->post(); 955 return; 956 } 957 958 int32_t what; 959 CHECK(msg->findInt32("what", &what)); 960 961 if (what == DecoderBase::kWhatInputDiscontinuity) { 962 int32_t formatChange; 963 CHECK(msg->findInt32("formatChange", &formatChange)); 964 965 ALOGV("%s discontinuity: formatChange %d", 966 audio ? "audio" : "video", formatChange); 967 968 if (formatChange) { 969 mDeferredActions.push_back( 970 new FlushDecoderAction( 971 audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE, 972 audio ? FLUSH_CMD_NONE : FLUSH_CMD_SHUTDOWN)); 973 } 974 975 mDeferredActions.push_back( 976 new SimpleAction( 977 &NuPlayer::performScanSources)); 978 979 processDeferredActions(); 980 } else if (what == DecoderBase::kWhatEOS) { 981 int32_t err; 982 CHECK(msg->findInt32("err", &err)); 983 984 if (err == ERROR_END_OF_STREAM) { 985 ALOGV("got %s decoder EOS", audio ? "audio" : "video"); 986 } else { 987 ALOGV("got %s decoder EOS w/ error %d", 988 audio ? "audio" : "video", 989 err); 990 } 991 992 mRenderer->queueEOS(audio, err); 993 } else if (what == DecoderBase::kWhatFlushCompleted) { 994 ALOGV("decoder %s flush completed", audio ? "audio" : "video"); 995 996 handleFlushComplete(audio, true /* isDecoder */); 997 finishFlushIfPossible(); 998 } else if (what == DecoderBase::kWhatVideoSizeChanged) { 999 sp<AMessage> format; 1000 CHECK(msg->findMessage("format", &format)); 1001 1002 sp<AMessage> inputFormat = 1003 mSource->getFormat(false /* audio */); 1004 1005 setVideoScalingMode(mVideoScalingMode); 1006 updateVideoSize(inputFormat, format); 1007 } else if (what == DecoderBase::kWhatShutdownCompleted) { 1008 ALOGV("%s shutdown completed", audio ? "audio" : "video"); 1009 if (audio) { 1010 mAudioDecoder.clear(); 1011 ++mAudioDecoderGeneration; 1012 1013 CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 1014 mFlushingAudio = SHUT_DOWN; 1015 } else { 1016 mVideoDecoder.clear(); 1017 ++mVideoDecoderGeneration; 1018 1019 CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 1020 mFlushingVideo = SHUT_DOWN; 1021 } 1022 1023 finishFlushIfPossible(); 1024 } else if (what == DecoderBase::kWhatResumeCompleted) { 1025 finishResume(); 1026 } else if (what == DecoderBase::kWhatError) { 1027 status_t err; 1028 if (!msg->findInt32("err", &err) || err == OK) { 1029 err = UNKNOWN_ERROR; 1030 } 1031 1032 // Decoder errors can be due to Source (e.g. from streaming), 1033 // or from decoding corrupted bitstreams, or from other decoder 1034 // MediaCodec operations (e.g. from an ongoing reset or seek). 1035 // They may also be due to openAudioSink failure at 1036 // decoder start or after a format change. 1037 // 1038 // We try to gracefully shut down the affected decoder if possible, 1039 // rather than trying to force the shutdown with something 1040 // similar to performReset(). This method can lead to a hang 1041 // if MediaCodec functions block after an error, but they should 1042 // typically return INVALID_OPERATION instead of blocking. 1043 1044 FlushStatus *flushing = audio ? &mFlushingAudio : &mFlushingVideo; 1045 ALOGE("received error(%#x) from %s decoder, flushing(%d), now shutting down", 1046 err, audio ? "audio" : "video", *flushing); 1047 1048 switch (*flushing) { 1049 case NONE: 1050 mDeferredActions.push_back( 1051 new FlushDecoderAction( 1052 audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE, 1053 audio ? FLUSH_CMD_NONE : FLUSH_CMD_SHUTDOWN)); 1054 processDeferredActions(); 1055 break; 1056 case FLUSHING_DECODER: 1057 *flushing = FLUSHING_DECODER_SHUTDOWN; // initiate shutdown after flush. 1058 break; // Wait for flush to complete. 1059 case FLUSHING_DECODER_SHUTDOWN: 1060 break; // Wait for flush to complete. 1061 case SHUTTING_DOWN_DECODER: 1062 break; // Wait for shutdown to complete. 1063 case FLUSHED: 1064 // Widevine source reads must stop before releasing the video decoder. 1065 if (!audio && mSource != NULL && mSourceFlags & Source::FLAG_SECURE) { 1066 mSource->stop(); 1067 mSourceStarted = false; 1068 } 1069 getDecoder(audio)->initiateShutdown(); // In the middle of a seek. 1070 *flushing = SHUTTING_DOWN_DECODER; // Shut down. 1071 break; 1072 case SHUT_DOWN: 1073 finishFlushIfPossible(); // Should not occur. 1074 break; // Finish anyways. 1075 } 1076 notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 1077 } else { 1078 ALOGV("Unhandled decoder notification %d '%c%c%c%c'.", 1079 what, 1080 what >> 24, 1081 (what >> 16) & 0xff, 1082 (what >> 8) & 0xff, 1083 what & 0xff); 1084 } 1085 1086 break; 1087 } 1088 1089 case kWhatRendererNotify: 1090 { 1091 int32_t requesterGeneration = mRendererGeneration - 1; 1092 CHECK(msg->findInt32("generation", &requesterGeneration)); 1093 if (requesterGeneration != mRendererGeneration) { 1094 ALOGV("got message from old renderer, generation(%d:%d)", 1095 requesterGeneration, mRendererGeneration); 1096 return; 1097 } 1098 1099 int32_t what; 1100 CHECK(msg->findInt32("what", &what)); 1101 1102 if (what == Renderer::kWhatEOS) { 1103 int32_t audio; 1104 CHECK(msg->findInt32("audio", &audio)); 1105 1106 int32_t finalResult; 1107 CHECK(msg->findInt32("finalResult", &finalResult)); 1108 1109 if (audio) { 1110 mAudioEOS = true; 1111 } else { 1112 mVideoEOS = true; 1113 } 1114 1115 if (finalResult == ERROR_END_OF_STREAM) { 1116 ALOGV("reached %s EOS", audio ? "audio" : "video"); 1117 } else { 1118 ALOGE("%s track encountered an error (%d)", 1119 audio ? "audio" : "video", finalResult); 1120 1121 notifyListener( 1122 MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult); 1123 } 1124 1125 if ((mAudioEOS || mAudioDecoder == NULL) 1126 && (mVideoEOS || mVideoDecoder == NULL)) { 1127 notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 1128 } 1129 } else if (what == Renderer::kWhatFlushComplete) { 1130 int32_t audio; 1131 CHECK(msg->findInt32("audio", &audio)); 1132 1133 if (audio) { 1134 mAudioEOS = false; 1135 } else { 1136 mVideoEOS = false; 1137 } 1138 1139 ALOGV("renderer %s flush completed.", audio ? "audio" : "video"); 1140 if (audio && (mFlushingAudio == NONE || mFlushingAudio == FLUSHED 1141 || mFlushingAudio == SHUT_DOWN)) { 1142 // Flush has been handled by tear down. 1143 break; 1144 } 1145 handleFlushComplete(audio, false /* isDecoder */); 1146 finishFlushIfPossible(); 1147 } else if (what == Renderer::kWhatVideoRenderingStart) { 1148 notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0); 1149 } else if (what == Renderer::kWhatMediaRenderingStart) { 1150 ALOGV("media rendering started"); 1151 notifyListener(MEDIA_STARTED, 0, 0); 1152 } else if (what == Renderer::kWhatAudioTearDown) { 1153 int32_t reason; 1154 CHECK(msg->findInt32("reason", &reason)); 1155 ALOGV("Tear down audio with reason %d.", reason); 1156 if (reason == Renderer::kDueToTimeout && !(mPaused && mOffloadAudio)) { 1157 // TimeoutWhenPaused is only for offload mode. 1158 ALOGW("Receive a stale message for teardown."); 1159 break; 1160 } 1161 int64_t positionUs; 1162 if (!msg->findInt64("positionUs", &positionUs)) { 1163 positionUs = mPreviousSeekTimeUs; 1164 } 1165 1166 restartAudio( 1167 positionUs, reason == Renderer::kForceNonOffload /* forceNonOffload */, 1168 reason != Renderer::kDueToTimeout /* needsToCreateAudioDecoder */); 1169 } 1170 break; 1171 } 1172 1173 case kWhatMoreDataQueued: 1174 { 1175 break; 1176 } 1177 1178 case kWhatReset: 1179 { 1180 ALOGV("kWhatReset"); 1181 1182 mResetting = true; 1183 1184 mDeferredActions.push_back( 1185 new FlushDecoderAction( 1186 FLUSH_CMD_SHUTDOWN /* audio */, 1187 FLUSH_CMD_SHUTDOWN /* video */)); 1188 1189 mDeferredActions.push_back( 1190 new SimpleAction(&NuPlayer::performReset)); 1191 1192 processDeferredActions(); 1193 break; 1194 } 1195 1196 case kWhatSeek: 1197 { 1198 int64_t seekTimeUs; 1199 int32_t needNotify; 1200 CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 1201 CHECK(msg->findInt32("needNotify", &needNotify)); 1202 1203 ALOGV("kWhatSeek seekTimeUs=%lld us, needNotify=%d", 1204 (long long)seekTimeUs, needNotify); 1205 1206 if (!mStarted) { 1207 // Seek before the player is started. In order to preview video, 1208 // need to start the player and pause it. This branch is called 1209 // only once if needed. After the player is started, any seek 1210 // operation will go through normal path. 1211 // Audio-only cases are handled separately. 1212 onStart(seekTimeUs); 1213 if (mStarted) { 1214 onPause(); 1215 mPausedByClient = true; 1216 } 1217 if (needNotify) { 1218 notifyDriverSeekComplete(); 1219 } 1220 break; 1221 } 1222 1223 mDeferredActions.push_back( 1224 new FlushDecoderAction(FLUSH_CMD_FLUSH /* audio */, 1225 FLUSH_CMD_FLUSH /* video */)); 1226 1227 mDeferredActions.push_back( 1228 new SeekAction(seekTimeUs)); 1229 1230 // After a flush without shutdown, decoder is paused. 1231 // Don't resume it until source seek is done, otherwise it could 1232 // start pulling stale data too soon. 1233 mDeferredActions.push_back( 1234 new ResumeDecoderAction(needNotify)); 1235 1236 processDeferredActions(); 1237 break; 1238 } 1239 1240 case kWhatPause: 1241 { 1242 onPause(); 1243 mPausedByClient = true; 1244 break; 1245 } 1246 1247 case kWhatSourceNotify: 1248 { 1249 onSourceNotify(msg); 1250 break; 1251 } 1252 1253 case kWhatClosedCaptionNotify: 1254 { 1255 onClosedCaptionNotify(msg); 1256 break; 1257 } 1258 1259 default: 1260 TRESPASS(); 1261 break; 1262 } 1263} 1264 1265void NuPlayer::onResume() { 1266 if (!mPaused || mResetting) { 1267 ALOGD_IF(mResetting, "resetting, onResume discarded"); 1268 return; 1269 } 1270 mPaused = false; 1271 if (mSource != NULL) { 1272 mSource->resume(); 1273 } else { 1274 ALOGW("resume called when source is gone or not set"); 1275 } 1276 // |mAudioDecoder| may have been released due to the pause timeout, so re-create it if 1277 // needed. 1278 if (audioDecoderStillNeeded() && mAudioDecoder == NULL) { 1279 instantiateDecoder(true /* audio */, &mAudioDecoder); 1280 } 1281 if (mRenderer != NULL) { 1282 mRenderer->resume(); 1283 } else { 1284 ALOGW("resume called when renderer is gone or not set"); 1285 } 1286} 1287 1288status_t NuPlayer::onInstantiateSecureDecoders() { 1289 status_t err; 1290 if (!(mSourceFlags & Source::FLAG_SECURE)) { 1291 return BAD_TYPE; 1292 } 1293 1294 if (mRenderer != NULL) { 1295 ALOGE("renderer should not be set when instantiating secure decoders"); 1296 return UNKNOWN_ERROR; 1297 } 1298 1299 // TRICKY: We rely on mRenderer being null, so that decoder does not start requesting 1300 // data on instantiation. 1301 if (mSurface != NULL) { 1302 err = instantiateDecoder(false, &mVideoDecoder); 1303 if (err != OK) { 1304 return err; 1305 } 1306 } 1307 1308 if (mAudioSink != NULL) { 1309 err = instantiateDecoder(true, &mAudioDecoder); 1310 if (err != OK) { 1311 return err; 1312 } 1313 } 1314 return OK; 1315} 1316 1317void NuPlayer::onStart(int64_t startPositionUs) { 1318 if (!mSourceStarted) { 1319 mSourceStarted = true; 1320 mSource->start(); 1321 } 1322 if (startPositionUs > 0) { 1323 performSeek(startPositionUs); 1324 if (mSource->getFormat(false /* audio */) == NULL) { 1325 return; 1326 } 1327 } 1328 1329 mOffloadAudio = false; 1330 mAudioEOS = false; 1331 mVideoEOS = false; 1332 mStarted = true; 1333 mPaused = false; 1334 1335 uint32_t flags = 0; 1336 1337 if (mSource->isRealTime()) { 1338 flags |= Renderer::FLAG_REAL_TIME; 1339 } 1340 1341 sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */); 1342 ALOGV_IF(audioMeta == NULL, "no metadata for audio source"); // video only stream 1343 audio_stream_type_t streamType = AUDIO_STREAM_MUSIC; 1344 if (mAudioSink != NULL) { 1345 streamType = mAudioSink->getAudioStreamType(); 1346 } 1347 1348 sp<AMessage> videoFormat = mSource->getFormat(false /* audio */); 1349 1350 mOffloadAudio = 1351 canOffloadStream(audioMeta, (videoFormat != NULL), mSource->isStreaming(), streamType) 1352 && (mPlaybackSettings.mSpeed == 1.f && mPlaybackSettings.mPitch == 1.f); 1353 if (mOffloadAudio) { 1354 flags |= Renderer::FLAG_OFFLOAD_AUDIO; 1355 } 1356 1357 sp<AMessage> notify = new AMessage(kWhatRendererNotify, this); 1358 ++mRendererGeneration; 1359 notify->setInt32("generation", mRendererGeneration); 1360 mRenderer = new Renderer(mAudioSink, notify, flags); 1361 mRendererLooper = new ALooper; 1362 mRendererLooper->setName("NuPlayerRenderer"); 1363 mRendererLooper->start(false, false, ANDROID_PRIORITY_AUDIO); 1364 mRendererLooper->registerHandler(mRenderer); 1365 1366 status_t err = mRenderer->setPlaybackSettings(mPlaybackSettings); 1367 if (err != OK) { 1368 mSource->stop(); 1369 mSourceStarted = false; 1370 notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 1371 return; 1372 } 1373 1374 float rate = getFrameRate(); 1375 if (rate > 0) { 1376 mRenderer->setVideoFrameRate(rate); 1377 } 1378 1379 if (mVideoDecoder != NULL) { 1380 mVideoDecoder->setRenderer(mRenderer); 1381 } 1382 if (mAudioDecoder != NULL) { 1383 mAudioDecoder->setRenderer(mRenderer); 1384 } 1385 1386 postScanSources(); 1387} 1388 1389void NuPlayer::onPause() { 1390 if (mPaused) { 1391 return; 1392 } 1393 mPaused = true; 1394 if (mSource != NULL) { 1395 mSource->pause(); 1396 } else { 1397 ALOGW("pause called when source is gone or not set"); 1398 } 1399 if (mRenderer != NULL) { 1400 mRenderer->pause(); 1401 } else { 1402 ALOGW("pause called when renderer is gone or not set"); 1403 } 1404} 1405 1406bool NuPlayer::audioDecoderStillNeeded() { 1407 // Audio decoder is no longer needed if it's in shut/shutting down status. 1408 return ((mFlushingAudio != SHUT_DOWN) && (mFlushingAudio != SHUTTING_DOWN_DECODER)); 1409} 1410 1411void NuPlayer::handleFlushComplete(bool audio, bool isDecoder) { 1412 // We wait for both the decoder flush and the renderer flush to complete 1413 // before entering either the FLUSHED or the SHUTTING_DOWN_DECODER state. 1414 1415 mFlushComplete[audio][isDecoder] = true; 1416 if (!mFlushComplete[audio][!isDecoder]) { 1417 return; 1418 } 1419 1420 FlushStatus *state = audio ? &mFlushingAudio : &mFlushingVideo; 1421 switch (*state) { 1422 case FLUSHING_DECODER: 1423 { 1424 *state = FLUSHED; 1425 break; 1426 } 1427 1428 case FLUSHING_DECODER_SHUTDOWN: 1429 { 1430 *state = SHUTTING_DOWN_DECODER; 1431 1432 ALOGV("initiating %s decoder shutdown", audio ? "audio" : "video"); 1433 if (!audio) { 1434 // Widevine source reads must stop before releasing the video decoder. 1435 if (mSource != NULL && mSourceFlags & Source::FLAG_SECURE) { 1436 mSource->stop(); 1437 mSourceStarted = false; 1438 } 1439 } 1440 getDecoder(audio)->initiateShutdown(); 1441 break; 1442 } 1443 1444 default: 1445 // decoder flush completes only occur in a flushing state. 1446 LOG_ALWAYS_FATAL_IF(isDecoder, "decoder flush in invalid state %d", *state); 1447 break; 1448 } 1449} 1450 1451void NuPlayer::finishFlushIfPossible() { 1452 if (mFlushingAudio != NONE && mFlushingAudio != FLUSHED 1453 && mFlushingAudio != SHUT_DOWN) { 1454 return; 1455 } 1456 1457 if (mFlushingVideo != NONE && mFlushingVideo != FLUSHED 1458 && mFlushingVideo != SHUT_DOWN) { 1459 return; 1460 } 1461 1462 ALOGV("both audio and video are flushed now."); 1463 1464 mFlushingAudio = NONE; 1465 mFlushingVideo = NONE; 1466 1467 clearFlushComplete(); 1468 1469 processDeferredActions(); 1470} 1471 1472void NuPlayer::postScanSources() { 1473 if (mScanSourcesPending) { 1474 return; 1475 } 1476 1477 sp<AMessage> msg = new AMessage(kWhatScanSources, this); 1478 msg->setInt32("generation", mScanSourcesGeneration); 1479 msg->post(); 1480 1481 mScanSourcesPending = true; 1482} 1483 1484void NuPlayer::tryOpenAudioSinkForOffload( 1485 const sp<AMessage> &format, const sp<MetaData> &audioMeta, bool hasVideo) { 1486 // Note: This is called early in NuPlayer to determine whether offloading 1487 // is possible; otherwise the decoders call the renderer openAudioSink directly. 1488 1489 status_t err = mRenderer->openAudioSink( 1490 format, true /* offloadOnly */, hasVideo, AUDIO_OUTPUT_FLAG_NONE, &mOffloadAudio); 1491 if (err != OK) { 1492 // Any failure we turn off mOffloadAudio. 1493 mOffloadAudio = false; 1494 } else if (mOffloadAudio) { 1495 sendMetaDataToHal(mAudioSink, audioMeta); 1496 } 1497} 1498 1499void NuPlayer::closeAudioSink() { 1500 mRenderer->closeAudioSink(); 1501} 1502 1503void NuPlayer::restartAudio( 1504 int64_t currentPositionUs, bool forceNonOffload, bool needsToCreateAudioDecoder) { 1505 if (mAudioDecoder != NULL) { 1506 mAudioDecoder->pause(); 1507 mAudioDecoder.clear(); 1508 ++mAudioDecoderGeneration; 1509 } 1510 if (mFlushingAudio == FLUSHING_DECODER) { 1511 mFlushComplete[1 /* audio */][1 /* isDecoder */] = true; 1512 mFlushingAudio = FLUSHED; 1513 finishFlushIfPossible(); 1514 } else if (mFlushingAudio == FLUSHING_DECODER_SHUTDOWN 1515 || mFlushingAudio == SHUTTING_DOWN_DECODER) { 1516 mFlushComplete[1 /* audio */][1 /* isDecoder */] = true; 1517 mFlushingAudio = SHUT_DOWN; 1518 finishFlushIfPossible(); 1519 needsToCreateAudioDecoder = false; 1520 } 1521 if (mRenderer == NULL) { 1522 return; 1523 } 1524 closeAudioSink(); 1525 mRenderer->flush(true /* audio */, false /* notifyComplete */); 1526 if (mVideoDecoder != NULL) { 1527 mRenderer->flush(false /* audio */, false /* notifyComplete */); 1528 } 1529 1530 performSeek(currentPositionUs); 1531 1532 if (forceNonOffload) { 1533 mRenderer->signalDisableOffloadAudio(); 1534 mOffloadAudio = false; 1535 } 1536 if (needsToCreateAudioDecoder) { 1537 instantiateDecoder(true /* audio */, &mAudioDecoder, !forceNonOffload); 1538 } 1539} 1540 1541void NuPlayer::determineAudioModeChange(const sp<AMessage> &audioFormat) { 1542 if (mSource == NULL || mAudioSink == NULL) { 1543 return; 1544 } 1545 1546 if (mRenderer == NULL) { 1547 ALOGW("No renderer can be used to determine audio mode. Use non-offload for safety."); 1548 mOffloadAudio = false; 1549 return; 1550 } 1551 1552 sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */); 1553 sp<AMessage> videoFormat = mSource->getFormat(false /* audio */); 1554 audio_stream_type_t streamType = mAudioSink->getAudioStreamType(); 1555 const bool hasVideo = (videoFormat != NULL); 1556 const bool canOffload = canOffloadStream( 1557 audioMeta, hasVideo, mSource->isStreaming(), streamType) 1558 && (mPlaybackSettings.mSpeed == 1.f && mPlaybackSettings.mPitch == 1.f); 1559 if (canOffload) { 1560 if (!mOffloadAudio) { 1561 mRenderer->signalEnableOffloadAudio(); 1562 } 1563 // open audio sink early under offload mode. 1564 tryOpenAudioSinkForOffload(audioFormat, audioMeta, hasVideo); 1565 } else { 1566 if (mOffloadAudio) { 1567 mRenderer->signalDisableOffloadAudio(); 1568 mOffloadAudio = false; 1569 } 1570 } 1571} 1572 1573status_t NuPlayer::instantiateDecoder( 1574 bool audio, sp<DecoderBase> *decoder, bool checkAudioModeChange) { 1575 // The audio decoder could be cleared by tear down. If still in shut down 1576 // process, no need to create a new audio decoder. 1577 if (*decoder != NULL || (audio && mFlushingAudio == SHUT_DOWN)) { 1578 return OK; 1579 } 1580 1581 sp<AMessage> format = mSource->getFormat(audio); 1582 1583 if (format == NULL) { 1584 return UNKNOWN_ERROR; 1585 } else { 1586 status_t err; 1587 if (format->findInt32("err", &err) && err) { 1588 return err; 1589 } 1590 } 1591 1592 format->setInt32("priority", 0 /* realtime */); 1593 1594 if (!audio) { 1595 AString mime; 1596 CHECK(format->findString("mime", &mime)); 1597 1598 sp<AMessage> ccNotify = new AMessage(kWhatClosedCaptionNotify, this); 1599 if (mCCDecoder == NULL) { 1600 mCCDecoder = new CCDecoder(ccNotify); 1601 } 1602 1603 if (mSourceFlags & Source::FLAG_SECURE) { 1604 format->setInt32("secure", true); 1605 } 1606 1607 if (mSourceFlags & Source::FLAG_PROTECTED) { 1608 format->setInt32("protected", true); 1609 } 1610 1611 float rate = getFrameRate(); 1612 if (rate > 0) { 1613 format->setFloat("operating-rate", rate * mPlaybackSettings.mSpeed); 1614 } 1615 } 1616 1617 if (audio) { 1618 sp<AMessage> notify = new AMessage(kWhatAudioNotify, this); 1619 ++mAudioDecoderGeneration; 1620 notify->setInt32("generation", mAudioDecoderGeneration); 1621 1622 if (checkAudioModeChange) { 1623 determineAudioModeChange(format); 1624 } 1625 if (mOffloadAudio) { 1626 mSource->setOffloadAudio(true /* offload */); 1627 1628 const bool hasVideo = (mSource->getFormat(false /*audio */) != NULL); 1629 format->setInt32("has-video", hasVideo); 1630 *decoder = new DecoderPassThrough(notify, mSource, mRenderer); 1631 } else { 1632 mSource->setOffloadAudio(false /* offload */); 1633 1634 *decoder = new Decoder(notify, mSource, mPID, mRenderer); 1635 } 1636 } else { 1637 sp<AMessage> notify = new AMessage(kWhatVideoNotify, this); 1638 ++mVideoDecoderGeneration; 1639 notify->setInt32("generation", mVideoDecoderGeneration); 1640 1641 *decoder = new Decoder( 1642 notify, mSource, mPID, mRenderer, mSurface, mCCDecoder); 1643 1644 // enable FRC if high-quality AV sync is requested, even if not 1645 // directly queuing to display, as this will even improve textureview 1646 // playback. 1647 { 1648 char value[PROPERTY_VALUE_MAX]; 1649 if (property_get("persist.sys.media.avsync", value, NULL) && 1650 (!strcmp("1", value) || !strcasecmp("true", value))) { 1651 format->setInt32("auto-frc", 1); 1652 } 1653 } 1654 } 1655 (*decoder)->init(); 1656 (*decoder)->configure(format); 1657 1658 // allocate buffers to decrypt widevine source buffers 1659 if (!audio && (mSourceFlags & Source::FLAG_SECURE)) { 1660 Vector<sp<ABuffer> > inputBufs; 1661 CHECK_EQ((*decoder)->getInputBuffers(&inputBufs), (status_t)OK); 1662 1663 Vector<MediaBuffer *> mediaBufs; 1664 for (size_t i = 0; i < inputBufs.size(); i++) { 1665 const sp<ABuffer> &buffer = inputBufs[i]; 1666 MediaBuffer *mbuf = new MediaBuffer(buffer->data(), buffer->size()); 1667 mediaBufs.push(mbuf); 1668 } 1669 1670 status_t err = mSource->setBuffers(audio, mediaBufs); 1671 if (err != OK) { 1672 for (size_t i = 0; i < mediaBufs.size(); ++i) { 1673 mediaBufs[i]->release(); 1674 } 1675 mediaBufs.clear(); 1676 ALOGE("Secure source didn't support secure mediaBufs."); 1677 return err; 1678 } 1679 } 1680 1681 if (!audio) { 1682 sp<AMessage> params = new AMessage(); 1683 float rate = getFrameRate(); 1684 if (rate > 0) { 1685 params->setFloat("frame-rate-total", rate); 1686 } 1687 1688 sp<MetaData> fileMeta = getFileMeta(); 1689 if (fileMeta != NULL) { 1690 int32_t videoTemporalLayerCount; 1691 if (fileMeta->findInt32(kKeyTemporalLayerCount, &videoTemporalLayerCount) 1692 && videoTemporalLayerCount > 0) { 1693 params->setInt32("temporal-layer-count", videoTemporalLayerCount); 1694 } 1695 } 1696 1697 if (params->countEntries() > 0) { 1698 (*decoder)->setParameters(params); 1699 } 1700 } 1701 return OK; 1702} 1703 1704void NuPlayer::updateVideoSize( 1705 const sp<AMessage> &inputFormat, 1706 const sp<AMessage> &outputFormat) { 1707 if (inputFormat == NULL) { 1708 ALOGW("Unknown video size, reporting 0x0!"); 1709 notifyListener(MEDIA_SET_VIDEO_SIZE, 0, 0); 1710 return; 1711 } 1712 1713 int32_t displayWidth, displayHeight; 1714 if (outputFormat != NULL) { 1715 int32_t width, height; 1716 CHECK(outputFormat->findInt32("width", &width)); 1717 CHECK(outputFormat->findInt32("height", &height)); 1718 1719 int32_t cropLeft, cropTop, cropRight, cropBottom; 1720 CHECK(outputFormat->findRect( 1721 "crop", 1722 &cropLeft, &cropTop, &cropRight, &cropBottom)); 1723 1724 displayWidth = cropRight - cropLeft + 1; 1725 displayHeight = cropBottom - cropTop + 1; 1726 1727 ALOGV("Video output format changed to %d x %d " 1728 "(crop: %d x %d @ (%d, %d))", 1729 width, height, 1730 displayWidth, 1731 displayHeight, 1732 cropLeft, cropTop); 1733 } else { 1734 CHECK(inputFormat->findInt32("width", &displayWidth)); 1735 CHECK(inputFormat->findInt32("height", &displayHeight)); 1736 1737 ALOGV("Video input format %d x %d", displayWidth, displayHeight); 1738 } 1739 1740 // Take into account sample aspect ratio if necessary: 1741 int32_t sarWidth, sarHeight; 1742 if (inputFormat->findInt32("sar-width", &sarWidth) 1743 && inputFormat->findInt32("sar-height", &sarHeight)) { 1744 ALOGV("Sample aspect ratio %d : %d", sarWidth, sarHeight); 1745 1746 displayWidth = (displayWidth * sarWidth) / sarHeight; 1747 1748 ALOGV("display dimensions %d x %d", displayWidth, displayHeight); 1749 } 1750 1751 int32_t rotationDegrees; 1752 if (!inputFormat->findInt32("rotation-degrees", &rotationDegrees)) { 1753 rotationDegrees = 0; 1754 } 1755 1756 if (rotationDegrees == 90 || rotationDegrees == 270) { 1757 int32_t tmp = displayWidth; 1758 displayWidth = displayHeight; 1759 displayHeight = tmp; 1760 } 1761 1762 notifyListener( 1763 MEDIA_SET_VIDEO_SIZE, 1764 displayWidth, 1765 displayHeight); 1766} 1767 1768void NuPlayer::notifyListener(int msg, int ext1, int ext2, const Parcel *in) { 1769 if (mDriver == NULL) { 1770 return; 1771 } 1772 1773 sp<NuPlayerDriver> driver = mDriver.promote(); 1774 1775 if (driver == NULL) { 1776 return; 1777 } 1778 1779 driver->notifyListener(msg, ext1, ext2, in); 1780} 1781 1782void NuPlayer::flushDecoder(bool audio, bool needShutdown) { 1783 ALOGV("[%s] flushDecoder needShutdown=%d", 1784 audio ? "audio" : "video", needShutdown); 1785 1786 const sp<DecoderBase> &decoder = getDecoder(audio); 1787 if (decoder == NULL) { 1788 ALOGI("flushDecoder %s without decoder present", 1789 audio ? "audio" : "video"); 1790 return; 1791 } 1792 1793 // Make sure we don't continue to scan sources until we finish flushing. 1794 ++mScanSourcesGeneration; 1795 if (mScanSourcesPending) { 1796 if (!needShutdown) { 1797 mDeferredActions.push_back( 1798 new SimpleAction(&NuPlayer::performScanSources)); 1799 } 1800 mScanSourcesPending = false; 1801 } 1802 1803 decoder->signalFlush(); 1804 1805 FlushStatus newStatus = 1806 needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 1807 1808 mFlushComplete[audio][false /* isDecoder */] = (mRenderer == NULL); 1809 mFlushComplete[audio][true /* isDecoder */] = false; 1810 if (audio) { 1811 ALOGE_IF(mFlushingAudio != NONE, 1812 "audio flushDecoder() is called in state %d", mFlushingAudio); 1813 mFlushingAudio = newStatus; 1814 } else { 1815 ALOGE_IF(mFlushingVideo != NONE, 1816 "video flushDecoder() is called in state %d", mFlushingVideo); 1817 mFlushingVideo = newStatus; 1818 } 1819} 1820 1821void NuPlayer::queueDecoderShutdown( 1822 bool audio, bool video, const sp<AMessage> &reply) { 1823 ALOGI("queueDecoderShutdown audio=%d, video=%d", audio, video); 1824 1825 mDeferredActions.push_back( 1826 new FlushDecoderAction( 1827 audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE, 1828 video ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE)); 1829 1830 mDeferredActions.push_back( 1831 new SimpleAction(&NuPlayer::performScanSources)); 1832 1833 mDeferredActions.push_back(new PostMessageAction(reply)); 1834 1835 processDeferredActions(); 1836} 1837 1838status_t NuPlayer::setVideoScalingMode(int32_t mode) { 1839 mVideoScalingMode = mode; 1840 if (mSurface != NULL) { 1841 status_t ret = native_window_set_scaling_mode(mSurface.get(), mVideoScalingMode); 1842 if (ret != OK) { 1843 ALOGE("Failed to set scaling mode (%d): %s", 1844 -ret, strerror(-ret)); 1845 return ret; 1846 } 1847 } 1848 return OK; 1849} 1850 1851status_t NuPlayer::getTrackInfo(Parcel* reply) const { 1852 sp<AMessage> msg = new AMessage(kWhatGetTrackInfo, this); 1853 msg->setPointer("reply", reply); 1854 1855 sp<AMessage> response; 1856 status_t err = msg->postAndAwaitResponse(&response); 1857 return err; 1858} 1859 1860status_t NuPlayer::getSelectedTrack(int32_t type, Parcel* reply) const { 1861 sp<AMessage> msg = new AMessage(kWhatGetSelectedTrack, this); 1862 msg->setPointer("reply", reply); 1863 msg->setInt32("type", type); 1864 1865 sp<AMessage> response; 1866 status_t err = msg->postAndAwaitResponse(&response); 1867 if (err == OK && response != NULL) { 1868 CHECK(response->findInt32("err", &err)); 1869 } 1870 return err; 1871} 1872 1873status_t NuPlayer::selectTrack(size_t trackIndex, bool select, int64_t timeUs) { 1874 sp<AMessage> msg = new AMessage(kWhatSelectTrack, this); 1875 msg->setSize("trackIndex", trackIndex); 1876 msg->setInt32("select", select); 1877 msg->setInt64("timeUs", timeUs); 1878 1879 sp<AMessage> response; 1880 status_t err = msg->postAndAwaitResponse(&response); 1881 1882 if (err != OK) { 1883 return err; 1884 } 1885 1886 if (!response->findInt32("err", &err)) { 1887 err = OK; 1888 } 1889 1890 return err; 1891} 1892 1893status_t NuPlayer::getCurrentPosition(int64_t *mediaUs) { 1894 sp<Renderer> renderer = mRenderer; 1895 if (renderer == NULL) { 1896 return NO_INIT; 1897 } 1898 1899 return renderer->getCurrentPosition(mediaUs); 1900} 1901 1902void NuPlayer::getStats(Vector<sp<AMessage> > *mTrackStats) { 1903 CHECK(mTrackStats != NULL); 1904 1905 mTrackStats->clear(); 1906 if (mVideoDecoder != NULL) { 1907 mTrackStats->push_back(mVideoDecoder->getStats()); 1908 } 1909 if (mAudioDecoder != NULL) { 1910 mTrackStats->push_back(mAudioDecoder->getStats()); 1911 } 1912} 1913 1914sp<MetaData> NuPlayer::getFileMeta() { 1915 return mSource->getFileFormatMeta(); 1916} 1917 1918float NuPlayer::getFrameRate() { 1919 sp<MetaData> meta = mSource->getFormatMeta(false /* audio */); 1920 if (meta == NULL) { 1921 return 0; 1922 } 1923 int32_t rate; 1924 if (!meta->findInt32(kKeyFrameRate, &rate)) { 1925 // fall back to try file meta 1926 sp<MetaData> fileMeta = getFileMeta(); 1927 if (fileMeta == NULL) { 1928 ALOGW("source has video meta but not file meta"); 1929 return -1; 1930 } 1931 int32_t fileMetaRate; 1932 if (!fileMeta->findInt32(kKeyFrameRate, &fileMetaRate)) { 1933 return -1; 1934 } 1935 return fileMetaRate; 1936 } 1937 return rate; 1938} 1939 1940void NuPlayer::schedulePollDuration() { 1941 sp<AMessage> msg = new AMessage(kWhatPollDuration, this); 1942 msg->setInt32("generation", mPollDurationGeneration); 1943 msg->post(); 1944} 1945 1946void NuPlayer::cancelPollDuration() { 1947 ++mPollDurationGeneration; 1948} 1949 1950void NuPlayer::processDeferredActions() { 1951 while (!mDeferredActions.empty()) { 1952 // We won't execute any deferred actions until we're no longer in 1953 // an intermediate state, i.e. one more more decoders are currently 1954 // flushing or shutting down. 1955 1956 if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 1957 // We're currently flushing, postpone the reset until that's 1958 // completed. 1959 1960 ALOGV("postponing action mFlushingAudio=%d, mFlushingVideo=%d", 1961 mFlushingAudio, mFlushingVideo); 1962 1963 break; 1964 } 1965 1966 sp<Action> action = *mDeferredActions.begin(); 1967 mDeferredActions.erase(mDeferredActions.begin()); 1968 1969 action->execute(this); 1970 } 1971} 1972 1973void NuPlayer::performSeek(int64_t seekTimeUs) { 1974 ALOGV("performSeek seekTimeUs=%lld us (%.2f secs)", 1975 (long long)seekTimeUs, 1976 seekTimeUs / 1E6); 1977 1978 if (mSource == NULL) { 1979 // This happens when reset occurs right before the loop mode 1980 // asynchronously seeks to the start of the stream. 1981 LOG_ALWAYS_FATAL_IF(mAudioDecoder != NULL || mVideoDecoder != NULL, 1982 "mSource is NULL and decoders not NULL audio(%p) video(%p)", 1983 mAudioDecoder.get(), mVideoDecoder.get()); 1984 return; 1985 } 1986 mPreviousSeekTimeUs = seekTimeUs; 1987 mSource->seekTo(seekTimeUs); 1988 ++mTimedTextGeneration; 1989 1990 // everything's flushed, continue playback. 1991} 1992 1993void NuPlayer::performDecoderFlush(FlushCommand audio, FlushCommand video) { 1994 ALOGV("performDecoderFlush audio=%d, video=%d", audio, video); 1995 1996 if ((audio == FLUSH_CMD_NONE || mAudioDecoder == NULL) 1997 && (video == FLUSH_CMD_NONE || mVideoDecoder == NULL)) { 1998 return; 1999 } 2000 2001 if (audio != FLUSH_CMD_NONE && mAudioDecoder != NULL) { 2002 flushDecoder(true /* audio */, (audio == FLUSH_CMD_SHUTDOWN)); 2003 } 2004 2005 if (video != FLUSH_CMD_NONE && mVideoDecoder != NULL) { 2006 flushDecoder(false /* audio */, (video == FLUSH_CMD_SHUTDOWN)); 2007 } 2008} 2009 2010void NuPlayer::performReset() { 2011 ALOGV("performReset"); 2012 2013 CHECK(mAudioDecoder == NULL); 2014 CHECK(mVideoDecoder == NULL); 2015 2016 cancelPollDuration(); 2017 2018 ++mScanSourcesGeneration; 2019 mScanSourcesPending = false; 2020 2021 if (mRendererLooper != NULL) { 2022 if (mRenderer != NULL) { 2023 mRendererLooper->unregisterHandler(mRenderer->id()); 2024 } 2025 mRendererLooper->stop(); 2026 mRendererLooper.clear(); 2027 } 2028 mRenderer.clear(); 2029 ++mRendererGeneration; 2030 2031 if (mSource != NULL) { 2032 mSource->stop(); 2033 2034 Mutex::Autolock autoLock(mSourceLock); 2035 mSource.clear(); 2036 } 2037 2038 if (mDriver != NULL) { 2039 sp<NuPlayerDriver> driver = mDriver.promote(); 2040 if (driver != NULL) { 2041 driver->notifyResetComplete(); 2042 } 2043 } 2044 2045 mStarted = false; 2046 mPrepared = false; 2047 mResetting = false; 2048 mSourceStarted = false; 2049} 2050 2051void NuPlayer::performScanSources() { 2052 ALOGV("performScanSources"); 2053 2054 if (!mStarted) { 2055 return; 2056 } 2057 2058 if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 2059 postScanSources(); 2060 } 2061} 2062 2063void NuPlayer::performSetSurface(const sp<Surface> &surface) { 2064 ALOGV("performSetSurface"); 2065 2066 mSurface = surface; 2067 2068 // XXX - ignore error from setVideoScalingMode for now 2069 setVideoScalingMode(mVideoScalingMode); 2070 2071 if (mDriver != NULL) { 2072 sp<NuPlayerDriver> driver = mDriver.promote(); 2073 if (driver != NULL) { 2074 driver->notifySetSurfaceComplete(); 2075 } 2076 } 2077} 2078 2079void NuPlayer::performResumeDecoders(bool needNotify) { 2080 if (needNotify) { 2081 mResumePending = true; 2082 if (mVideoDecoder == NULL) { 2083 // if audio-only, we can notify seek complete now, 2084 // as the resume operation will be relatively fast. 2085 finishResume(); 2086 } 2087 } 2088 2089 if (mVideoDecoder != NULL) { 2090 // When there is continuous seek, MediaPlayer will cache the seek 2091 // position, and send down new seek request when previous seek is 2092 // complete. Let's wait for at least one video output frame before 2093 // notifying seek complete, so that the video thumbnail gets updated 2094 // when seekbar is dragged. 2095 mVideoDecoder->signalResume(needNotify); 2096 } 2097 2098 if (mAudioDecoder != NULL) { 2099 mAudioDecoder->signalResume(false /* needNotify */); 2100 } 2101} 2102 2103void NuPlayer::finishResume() { 2104 if (mResumePending) { 2105 mResumePending = false; 2106 notifyDriverSeekComplete(); 2107 } 2108} 2109 2110void NuPlayer::notifyDriverSeekComplete() { 2111 if (mDriver != NULL) { 2112 sp<NuPlayerDriver> driver = mDriver.promote(); 2113 if (driver != NULL) { 2114 driver->notifySeekComplete(); 2115 } 2116 } 2117} 2118 2119void NuPlayer::onSourceNotify(const sp<AMessage> &msg) { 2120 int32_t what; 2121 CHECK(msg->findInt32("what", &what)); 2122 2123 switch (what) { 2124 case Source::kWhatInstantiateSecureDecoders: 2125 { 2126 if (mSource == NULL) { 2127 // This is a stale notification from a source that was 2128 // asynchronously preparing when the client called reset(). 2129 // We handled the reset, the source is gone. 2130 break; 2131 } 2132 2133 sp<AMessage> reply; 2134 CHECK(msg->findMessage("reply", &reply)); 2135 status_t err = onInstantiateSecureDecoders(); 2136 reply->setInt32("err", err); 2137 reply->post(); 2138 break; 2139 } 2140 2141 case Source::kWhatPrepared: 2142 { 2143 if (mSource == NULL) { 2144 // This is a stale notification from a source that was 2145 // asynchronously preparing when the client called reset(). 2146 // We handled the reset, the source is gone. 2147 break; 2148 } 2149 2150 int32_t err; 2151 CHECK(msg->findInt32("err", &err)); 2152 2153 if (err != OK) { 2154 // shut down potential secure codecs in case client never calls reset 2155 mDeferredActions.push_back( 2156 new FlushDecoderAction(FLUSH_CMD_SHUTDOWN /* audio */, 2157 FLUSH_CMD_SHUTDOWN /* video */)); 2158 processDeferredActions(); 2159 } else { 2160 mPrepared = true; 2161 } 2162 2163 sp<NuPlayerDriver> driver = mDriver.promote(); 2164 if (driver != NULL) { 2165 // notify duration first, so that it's definitely set when 2166 // the app received the "prepare complete" callback. 2167 int64_t durationUs; 2168 if (mSource->getDuration(&durationUs) == OK) { 2169 driver->notifyDuration(durationUs); 2170 } 2171 driver->notifyPrepareCompleted(err); 2172 } 2173 2174 break; 2175 } 2176 2177 case Source::kWhatFlagsChanged: 2178 { 2179 uint32_t flags; 2180 CHECK(msg->findInt32("flags", (int32_t *)&flags)); 2181 2182 sp<NuPlayerDriver> driver = mDriver.promote(); 2183 if (driver != NULL) { 2184 if ((flags & NuPlayer::Source::FLAG_CAN_SEEK) == 0) { 2185 driver->notifyListener( 2186 MEDIA_INFO, MEDIA_INFO_NOT_SEEKABLE, 0); 2187 } 2188 driver->notifyFlagsChanged(flags); 2189 } 2190 2191 if ((mSourceFlags & Source::FLAG_DYNAMIC_DURATION) 2192 && (!(flags & Source::FLAG_DYNAMIC_DURATION))) { 2193 cancelPollDuration(); 2194 } else if (!(mSourceFlags & Source::FLAG_DYNAMIC_DURATION) 2195 && (flags & Source::FLAG_DYNAMIC_DURATION) 2196 && (mAudioDecoder != NULL || mVideoDecoder != NULL)) { 2197 schedulePollDuration(); 2198 } 2199 2200 mSourceFlags = flags; 2201 break; 2202 } 2203 2204 case Source::kWhatVideoSizeChanged: 2205 { 2206 sp<AMessage> format; 2207 CHECK(msg->findMessage("format", &format)); 2208 2209 updateVideoSize(format); 2210 break; 2211 } 2212 2213 case Source::kWhatBufferingUpdate: 2214 { 2215 int32_t percentage; 2216 CHECK(msg->findInt32("percentage", &percentage)); 2217 2218 notifyListener(MEDIA_BUFFERING_UPDATE, percentage, 0); 2219 break; 2220 } 2221 2222 case Source::kWhatPauseOnBufferingStart: 2223 { 2224 // ignore if not playing 2225 if (mStarted) { 2226 ALOGI("buffer low, pausing..."); 2227 2228 mPausedForBuffering = true; 2229 onPause(); 2230 } 2231 notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_START, 0); 2232 break; 2233 } 2234 2235 case Source::kWhatResumeOnBufferingEnd: 2236 { 2237 // ignore if not playing 2238 if (mStarted) { 2239 ALOGI("buffer ready, resuming..."); 2240 2241 mPausedForBuffering = false; 2242 2243 // do not resume yet if client didn't unpause 2244 if (!mPausedByClient) { 2245 onResume(); 2246 } 2247 } 2248 notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_END, 0); 2249 break; 2250 } 2251 2252 case Source::kWhatCacheStats: 2253 { 2254 int32_t kbps; 2255 CHECK(msg->findInt32("bandwidth", &kbps)); 2256 2257 notifyListener(MEDIA_INFO, MEDIA_INFO_NETWORK_BANDWIDTH, kbps); 2258 break; 2259 } 2260 2261 case Source::kWhatSubtitleData: 2262 { 2263 sp<ABuffer> buffer; 2264 CHECK(msg->findBuffer("buffer", &buffer)); 2265 2266 sendSubtitleData(buffer, 0 /* baseIndex */); 2267 break; 2268 } 2269 2270 case Source::kWhatTimedMetaData: 2271 { 2272 sp<ABuffer> buffer; 2273 if (!msg->findBuffer("buffer", &buffer)) { 2274 notifyListener(MEDIA_INFO, MEDIA_INFO_METADATA_UPDATE, 0); 2275 } else { 2276 sendTimedMetaData(buffer); 2277 } 2278 break; 2279 } 2280 2281 case Source::kWhatTimedTextData: 2282 { 2283 int32_t generation; 2284 if (msg->findInt32("generation", &generation) 2285 && generation != mTimedTextGeneration) { 2286 break; 2287 } 2288 2289 sp<ABuffer> buffer; 2290 CHECK(msg->findBuffer("buffer", &buffer)); 2291 2292 sp<NuPlayerDriver> driver = mDriver.promote(); 2293 if (driver == NULL) { 2294 break; 2295 } 2296 2297 int posMs; 2298 int64_t timeUs, posUs; 2299 driver->getCurrentPosition(&posMs); 2300 posUs = (int64_t) posMs * 1000ll; 2301 CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 2302 2303 if (posUs < timeUs) { 2304 if (!msg->findInt32("generation", &generation)) { 2305 msg->setInt32("generation", mTimedTextGeneration); 2306 } 2307 msg->post(timeUs - posUs); 2308 } else { 2309 sendTimedTextData(buffer); 2310 } 2311 break; 2312 } 2313 2314 case Source::kWhatQueueDecoderShutdown: 2315 { 2316 int32_t audio, video; 2317 CHECK(msg->findInt32("audio", &audio)); 2318 CHECK(msg->findInt32("video", &video)); 2319 2320 sp<AMessage> reply; 2321 CHECK(msg->findMessage("reply", &reply)); 2322 2323 queueDecoderShutdown(audio, video, reply); 2324 break; 2325 } 2326 2327 case Source::kWhatDrmNoLicense: 2328 { 2329 notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE); 2330 break; 2331 } 2332 2333 default: 2334 TRESPASS(); 2335 } 2336} 2337 2338void NuPlayer::onClosedCaptionNotify(const sp<AMessage> &msg) { 2339 int32_t what; 2340 CHECK(msg->findInt32("what", &what)); 2341 2342 switch (what) { 2343 case NuPlayer::CCDecoder::kWhatClosedCaptionData: 2344 { 2345 sp<ABuffer> buffer; 2346 CHECK(msg->findBuffer("buffer", &buffer)); 2347 2348 size_t inbandTracks = 0; 2349 if (mSource != NULL) { 2350 inbandTracks = mSource->getTrackCount(); 2351 } 2352 2353 sendSubtitleData(buffer, inbandTracks); 2354 break; 2355 } 2356 2357 case NuPlayer::CCDecoder::kWhatTrackAdded: 2358 { 2359 notifyListener(MEDIA_INFO, MEDIA_INFO_METADATA_UPDATE, 0); 2360 2361 break; 2362 } 2363 2364 default: 2365 TRESPASS(); 2366 } 2367 2368 2369} 2370 2371void NuPlayer::sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex) { 2372 int32_t trackIndex; 2373 int64_t timeUs, durationUs; 2374 CHECK(buffer->meta()->findInt32("trackIndex", &trackIndex)); 2375 CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 2376 CHECK(buffer->meta()->findInt64("durationUs", &durationUs)); 2377 2378 Parcel in; 2379 in.writeInt32(trackIndex + baseIndex); 2380 in.writeInt64(timeUs); 2381 in.writeInt64(durationUs); 2382 in.writeInt32(buffer->size()); 2383 in.writeInt32(buffer->size()); 2384 in.write(buffer->data(), buffer->size()); 2385 2386 notifyListener(MEDIA_SUBTITLE_DATA, 0, 0, &in); 2387} 2388 2389void NuPlayer::sendTimedMetaData(const sp<ABuffer> &buffer) { 2390 int64_t timeUs; 2391 CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 2392 2393 Parcel in; 2394 in.writeInt64(timeUs); 2395 in.writeInt32(buffer->size()); 2396 in.writeInt32(buffer->size()); 2397 in.write(buffer->data(), buffer->size()); 2398 2399 notifyListener(MEDIA_META_DATA, 0, 0, &in); 2400} 2401 2402void NuPlayer::sendTimedTextData(const sp<ABuffer> &buffer) { 2403 const void *data; 2404 size_t size = 0; 2405 int64_t timeUs; 2406 int32_t flag = TextDescriptions::IN_BAND_TEXT_3GPP; 2407 2408 AString mime; 2409 CHECK(buffer->meta()->findString("mime", &mime)); 2410 CHECK(strcasecmp(mime.c_str(), MEDIA_MIMETYPE_TEXT_3GPP) == 0); 2411 2412 data = buffer->data(); 2413 size = buffer->size(); 2414 2415 Parcel parcel; 2416 if (size > 0) { 2417 CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 2418 int32_t global = 0; 2419 if (buffer->meta()->findInt32("global", &global) && global) { 2420 flag |= TextDescriptions::GLOBAL_DESCRIPTIONS; 2421 } else { 2422 flag |= TextDescriptions::LOCAL_DESCRIPTIONS; 2423 } 2424 TextDescriptions::getParcelOfDescriptions( 2425 (const uint8_t *)data, size, flag, timeUs / 1000, &parcel); 2426 } 2427 2428 if ((parcel.dataSize() > 0)) { 2429 notifyListener(MEDIA_TIMED_TEXT, 0, 0, &parcel); 2430 } else { // send an empty timed text 2431 notifyListener(MEDIA_TIMED_TEXT, 0, 0); 2432 } 2433} 2434//////////////////////////////////////////////////////////////////////////////// 2435 2436sp<AMessage> NuPlayer::Source::getFormat(bool audio) { 2437 sp<MetaData> meta = getFormatMeta(audio); 2438 2439 if (meta == NULL) { 2440 return NULL; 2441 } 2442 2443 sp<AMessage> msg = new AMessage; 2444 2445 if(convertMetaDataToMessage(meta, &msg) == OK) { 2446 return msg; 2447 } 2448 return NULL; 2449} 2450 2451void NuPlayer::Source::notifyFlagsChanged(uint32_t flags) { 2452 sp<AMessage> notify = dupNotify(); 2453 notify->setInt32("what", kWhatFlagsChanged); 2454 notify->setInt32("flags", flags); 2455 notify->post(); 2456} 2457 2458void NuPlayer::Source::notifyVideoSizeChanged(const sp<AMessage> &format) { 2459 sp<AMessage> notify = dupNotify(); 2460 notify->setInt32("what", kWhatVideoSizeChanged); 2461 notify->setMessage("format", format); 2462 notify->post(); 2463} 2464 2465void NuPlayer::Source::notifyPrepared(status_t err) { 2466 sp<AMessage> notify = dupNotify(); 2467 notify->setInt32("what", kWhatPrepared); 2468 notify->setInt32("err", err); 2469 notify->post(); 2470} 2471 2472void NuPlayer::Source::notifyInstantiateSecureDecoders(const sp<AMessage> &reply) { 2473 sp<AMessage> notify = dupNotify(); 2474 notify->setInt32("what", kWhatInstantiateSecureDecoders); 2475 notify->setMessage("reply", reply); 2476 notify->post(); 2477} 2478 2479void NuPlayer::Source::onMessageReceived(const sp<AMessage> & /* msg */) { 2480 TRESPASS(); 2481} 2482 2483} // namespace android 2484