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