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