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