Home | History | Annotate | Download | only in nuplayer
      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 
     20 #include <inttypes.h>
     21 
     22 #include <utils/Log.h>
     23 
     24 #include "NuPlayer.h"
     25 
     26 #include "HTTPLiveSource.h"
     27 #include "NuPlayerCCDecoder.h"
     28 #include "NuPlayerDecoder.h"
     29 #include "NuPlayerDecoderBase.h"
     30 #include "NuPlayerDecoderPassThrough.h"
     31 #include "NuPlayerDriver.h"
     32 #include "NuPlayerRenderer.h"
     33 #include "NuPlayerSource.h"
     34 #include "RTSPSource.h"
     35 #include "StreamingSource.h"
     36 #include "GenericSource.h"
     37 #include "TextDescriptions.h"
     38 
     39 #include "ATSParser.h"
     40 
     41 #include <cutils/properties.h>
     42 
     43 #include <media/AudioResamplerPublic.h>
     44 #include <media/AVSyncSettings.h>
     45 #include <media/MediaCodecBuffer.h>
     46 
     47 #include <media/stagefright/foundation/hexdump.h>
     48 #include <media/stagefright/foundation/ABuffer.h>
     49 #include <media/stagefright/foundation/ADebug.h>
     50 #include <media/stagefright/foundation/AMessage.h>
     51 #include <media/stagefright/foundation/avc_utils.h>
     52 #include <media/stagefright/MediaBuffer.h>
     53 #include <media/stagefright/MediaClock.h>
     54 #include <media/stagefright/MediaDefs.h>
     55 #include <media/stagefright/MediaErrors.h>
     56 #include <media/stagefright/MetaData.h>
     57 
     58 #include <gui/IGraphicBufferProducer.h>
     59 #include <gui/Surface.h>
     60 
     61 
     62 #include "ESDS.h"
     63 #include <media/stagefright/Utils.h>
     64 
     65 namespace android {
     66 
     67 struct NuPlayer::Action : public RefBase {
     68     Action() {}
     69 
     70     virtual void execute(NuPlayer *player) = 0;
     71 
     72 private:
     73     DISALLOW_EVIL_CONSTRUCTORS(Action);
     74 };
     75 
     76 struct NuPlayer::SeekAction : public Action {
     77     explicit SeekAction(int64_t seekTimeUs, MediaPlayerSeekMode mode)
     78         : mSeekTimeUs(seekTimeUs),
     79           mMode(mode) {
     80     }
     81 
     82     virtual void execute(NuPlayer *player) {
     83         player->performSeek(mSeekTimeUs, mMode);
     84     }
     85 
     86 private:
     87     int64_t mSeekTimeUs;
     88     MediaPlayerSeekMode mMode;
     89 
     90     DISALLOW_EVIL_CONSTRUCTORS(SeekAction);
     91 };
     92 
     93 struct NuPlayer::ResumeDecoderAction : public Action {
     94     explicit ResumeDecoderAction(bool needNotify)
     95         : mNeedNotify(needNotify) {
     96     }
     97 
     98     virtual void execute(NuPlayer *player) {
     99         player->performResumeDecoders(mNeedNotify);
    100     }
    101 
    102 private:
    103     bool mNeedNotify;
    104 
    105     DISALLOW_EVIL_CONSTRUCTORS(ResumeDecoderAction);
    106 };
    107 
    108 struct NuPlayer::SetSurfaceAction : public Action {
    109     explicit SetSurfaceAction(const sp<Surface> &surface)
    110         : mSurface(surface) {
    111     }
    112 
    113     virtual void execute(NuPlayer *player) {
    114         player->performSetSurface(mSurface);
    115     }
    116 
    117 private:
    118     sp<Surface> mSurface;
    119 
    120     DISALLOW_EVIL_CONSTRUCTORS(SetSurfaceAction);
    121 };
    122 
    123 struct NuPlayer::FlushDecoderAction : public Action {
    124     FlushDecoderAction(FlushCommand audio, FlushCommand video)
    125         : mAudio(audio),
    126           mVideo(video) {
    127     }
    128 
    129     virtual void execute(NuPlayer *player) {
    130         player->performDecoderFlush(mAudio, mVideo);
    131     }
    132 
    133 private:
    134     FlushCommand mAudio;
    135     FlushCommand mVideo;
    136 
    137     DISALLOW_EVIL_CONSTRUCTORS(FlushDecoderAction);
    138 };
    139 
    140 struct NuPlayer::PostMessageAction : public Action {
    141     explicit PostMessageAction(const sp<AMessage> &msg)
    142         : mMessage(msg) {
    143     }
    144 
    145     virtual void execute(NuPlayer *) {
    146         mMessage->post();
    147     }
    148 
    149 private:
    150     sp<AMessage> mMessage;
    151 
    152     DISALLOW_EVIL_CONSTRUCTORS(PostMessageAction);
    153 };
    154 
    155 // Use this if there's no state necessary to save in order to execute
    156 // the action.
    157 struct NuPlayer::SimpleAction : public Action {
    158     typedef void (NuPlayer::*ActionFunc)();
    159 
    160     explicit SimpleAction(ActionFunc func)
    161         : mFunc(func) {
    162     }
    163 
    164     virtual void execute(NuPlayer *player) {
    165         (player->*mFunc)();
    166     }
    167 
    168 private:
    169     ActionFunc mFunc;
    170 
    171     DISALLOW_EVIL_CONSTRUCTORS(SimpleAction);
    172 };
    173 
    174 ////////////////////////////////////////////////////////////////////////////////
    175 
    176 NuPlayer::NuPlayer(pid_t pid, const sp<MediaClock> &mediaClock)
    177     : mUIDValid(false),
    178       mPID(pid),
    179       mMediaClock(mediaClock),
    180       mSourceFlags(0),
    181       mOffloadAudio(false),
    182       mAudioDecoderGeneration(0),
    183       mVideoDecoderGeneration(0),
    184       mRendererGeneration(0),
    185       mLastStartedPlayingTimeNs(0),
    186       mLastStartedRebufferingTimeNs(0),
    187       mPreviousSeekTimeUs(0),
    188       mAudioEOS(false),
    189       mVideoEOS(false),
    190       mScanSourcesPending(false),
    191       mScanSourcesGeneration(0),
    192       mPollDurationGeneration(0),
    193       mTimedTextGeneration(0),
    194       mFlushingAudio(NONE),
    195       mFlushingVideo(NONE),
    196       mResumePending(false),
    197       mVideoScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW),
    198       mPlaybackSettings(AUDIO_PLAYBACK_RATE_DEFAULT),
    199       mVideoFpsHint(-1.f),
    200       mStarted(false),
    201       mPrepared(false),
    202       mResetting(false),
    203       mSourceStarted(false),
    204       mAudioDecoderError(false),
    205       mVideoDecoderError(false),
    206       mPaused(false),
    207       mPausedByClient(true),
    208       mPausedForBuffering(false),
    209       mIsDrmProtected(false),
    210       mDataSourceType(DATA_SOURCE_TYPE_NONE) {
    211     CHECK(mediaClock != NULL);
    212     clearFlushComplete();
    213 }
    214 
    215 NuPlayer::~NuPlayer() {
    216 }
    217 
    218 void NuPlayer::setUID(uid_t uid) {
    219     mUIDValid = true;
    220     mUID = uid;
    221 }
    222 
    223 void NuPlayer::init(const wp<NuPlayerDriver> &driver) {
    224     mDriver = driver;
    225 
    226     sp<AMessage> notify = new AMessage(kWhatMediaClockNotify, this);
    227     mMediaClock->setNotificationMessage(notify);
    228 }
    229 
    230 void NuPlayer::setDataSourceAsync(const sp<IStreamSource> &source) {
    231     sp<AMessage> msg = new AMessage(kWhatSetDataSource, this);
    232 
    233     sp<AMessage> notify = new AMessage(kWhatSourceNotify, this);
    234 
    235     msg->setObject("source", new StreamingSource(notify, source));
    236     msg->post();
    237     mDataSourceType = DATA_SOURCE_TYPE_STREAM;
    238 }
    239 
    240 static bool IsHTTPLiveURL(const char *url) {
    241     if (!strncasecmp("http://", url, 7)
    242             || !strncasecmp("https://", url, 8)
    243             || !strncasecmp("file://", url, 7)) {
    244         size_t len = strlen(url);
    245         if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {
    246             return true;
    247         }
    248 
    249         if (strstr(url,"m3u8")) {
    250             return true;
    251         }
    252     }
    253 
    254     return false;
    255 }
    256 
    257 void NuPlayer::setDataSourceAsync(
    258         const sp<IMediaHTTPService> &httpService,
    259         const char *url,
    260         const KeyedVector<String8, String8> *headers) {
    261 
    262     sp<AMessage> msg = new AMessage(kWhatSetDataSource, this);
    263     size_t len = strlen(url);
    264 
    265     sp<AMessage> notify = new AMessage(kWhatSourceNotify, this);
    266 
    267     sp<Source> source;
    268     if (IsHTTPLiveURL(url)) {
    269         source = new HTTPLiveSource(notify, httpService, url, headers);
    270         ALOGV("setDataSourceAsync HTTPLiveSource %s", url);
    271         mDataSourceType = DATA_SOURCE_TYPE_HTTP_LIVE;
    272     } else if (!strncasecmp(url, "rtsp://", 7)) {
    273         source = new RTSPSource(
    274                 notify, httpService, url, headers, mUIDValid, mUID);
    275         ALOGV("setDataSourceAsync RTSPSource %s", url);
    276         mDataSourceType = DATA_SOURCE_TYPE_RTSP;
    277     } else if ((!strncasecmp(url, "http://", 7)
    278                 || !strncasecmp(url, "https://", 8))
    279                     && ((len >= 4 && !strcasecmp(".sdp", &url[len - 4]))
    280                     || strstr(url, ".sdp?"))) {
    281         source = new RTSPSource(
    282                 notify, httpService, url, headers, mUIDValid, mUID, true);
    283         ALOGV("setDataSourceAsync RTSPSource http/https/.sdp %s", url);
    284         mDataSourceType = DATA_SOURCE_TYPE_RTSP;
    285     } else {
    286         ALOGV("setDataSourceAsync GenericSource %s", url);
    287 
    288         sp<GenericSource> genericSource =
    289                 new GenericSource(notify, mUIDValid, mUID, mMediaClock);
    290 
    291         status_t err = genericSource->setDataSource(httpService, url, headers);
    292 
    293         if (err == OK) {
    294             source = genericSource;
    295         } else {
    296             ALOGE("Failed to set data source!");
    297         }
    298 
    299         // regardless of success/failure
    300         mDataSourceType = DATA_SOURCE_TYPE_GENERIC_URL;
    301     }
    302     msg->setObject("source", source);
    303     msg->post();
    304 }
    305 
    306 void NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_t length) {
    307     sp<AMessage> msg = new AMessage(kWhatSetDataSource, this);
    308 
    309     sp<AMessage> notify = new AMessage(kWhatSourceNotify, this);
    310 
    311     sp<GenericSource> source =
    312             new GenericSource(notify, mUIDValid, mUID, mMediaClock);
    313 
    314     ALOGV("setDataSourceAsync fd %d/%lld/%lld source: %p",
    315             fd, (long long)offset, (long long)length, source.get());
    316 
    317     status_t err = source->setDataSource(fd, offset, length);
    318 
    319     if (err != OK) {
    320         ALOGE("Failed to set data source!");
    321         source = NULL;
    322     }
    323 
    324     msg->setObject("source", source);
    325     msg->post();
    326     mDataSourceType = DATA_SOURCE_TYPE_GENERIC_FD;
    327 }
    328 
    329 void NuPlayer::setDataSourceAsync(const sp<DataSource> &dataSource) {
    330     sp<AMessage> msg = new AMessage(kWhatSetDataSource, this);
    331     sp<AMessage> notify = new AMessage(kWhatSourceNotify, this);
    332 
    333     sp<GenericSource> source = new GenericSource(notify, mUIDValid, mUID, mMediaClock);
    334     status_t err = source->setDataSource(dataSource);
    335 
    336     if (err != OK) {
    337         ALOGE("Failed to set data source!");
    338         source = NULL;
    339     }
    340 
    341     msg->setObject("source", source);
    342     msg->post();
    343     mDataSourceType = DATA_SOURCE_TYPE_MEDIA;
    344 }
    345 
    346 status_t NuPlayer::getBufferingSettings(
    347         BufferingSettings *buffering /* nonnull */) {
    348     sp<AMessage> msg = new AMessage(kWhatGetBufferingSettings, this);
    349     sp<AMessage> response;
    350     status_t err = msg->postAndAwaitResponse(&response);
    351     if (err == OK && response != NULL) {
    352         CHECK(response->findInt32("err", &err));
    353         if (err == OK) {
    354             readFromAMessage(response, buffering);
    355         }
    356     }
    357     return err;
    358 }
    359 
    360 status_t NuPlayer::setBufferingSettings(const BufferingSettings& buffering) {
    361     sp<AMessage> msg = new AMessage(kWhatSetBufferingSettings, this);
    362     writeToAMessage(msg, buffering);
    363     sp<AMessage> response;
    364     status_t err = msg->postAndAwaitResponse(&response);
    365     if (err == OK && response != NULL) {
    366         CHECK(response->findInt32("err", &err));
    367     }
    368     return err;
    369 }
    370 
    371 void NuPlayer::prepareAsync() {
    372     ALOGV("prepareAsync");
    373 
    374     (new AMessage(kWhatPrepare, this))->post();
    375 }
    376 
    377 void NuPlayer::setVideoSurfaceTextureAsync(
    378         const sp<IGraphicBufferProducer> &bufferProducer) {
    379     sp<AMessage> msg = new AMessage(kWhatSetVideoSurface, this);
    380 
    381     if (bufferProducer == NULL) {
    382         msg->setObject("surface", NULL);
    383     } else {
    384         msg->setObject("surface", new Surface(bufferProducer, true /* controlledByApp */));
    385     }
    386 
    387     msg->post();
    388 }
    389 
    390 void NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
    391     sp<AMessage> msg = new AMessage(kWhatSetAudioSink, this);
    392     msg->setObject("sink", sink);
    393     msg->post();
    394 }
    395 
    396 void NuPlayer::start() {
    397     (new AMessage(kWhatStart, this))->post();
    398 }
    399 
    400 status_t NuPlayer::setPlaybackSettings(const AudioPlaybackRate &rate) {
    401     // do some cursory validation of the settings here. audio modes are
    402     // only validated when set on the audiosink.
    403      if ((rate.mSpeed != 0.f && rate.mSpeed < AUDIO_TIMESTRETCH_SPEED_MIN)
    404             || rate.mSpeed > AUDIO_TIMESTRETCH_SPEED_MAX
    405             || rate.mPitch < AUDIO_TIMESTRETCH_SPEED_MIN
    406             || rate.mPitch > AUDIO_TIMESTRETCH_SPEED_MAX) {
    407         return BAD_VALUE;
    408     }
    409     sp<AMessage> msg = new AMessage(kWhatConfigPlayback, this);
    410     writeToAMessage(msg, rate);
    411     sp<AMessage> response;
    412     status_t err = msg->postAndAwaitResponse(&response);
    413     if (err == OK && response != NULL) {
    414         CHECK(response->findInt32("err", &err));
    415     }
    416     return err;
    417 }
    418 
    419 status_t NuPlayer::getPlaybackSettings(AudioPlaybackRate *rate /* nonnull */) {
    420     sp<AMessage> msg = new AMessage(kWhatGetPlaybackSettings, this);
    421     sp<AMessage> response;
    422     status_t err = msg->postAndAwaitResponse(&response);
    423     if (err == OK && response != NULL) {
    424         CHECK(response->findInt32("err", &err));
    425         if (err == OK) {
    426             readFromAMessage(response, rate);
    427         }
    428     }
    429     return err;
    430 }
    431 
    432 status_t NuPlayer::setSyncSettings(const AVSyncSettings &sync, float videoFpsHint) {
    433     sp<AMessage> msg = new AMessage(kWhatConfigSync, this);
    434     writeToAMessage(msg, sync, videoFpsHint);
    435     sp<AMessage> response;
    436     status_t err = msg->postAndAwaitResponse(&response);
    437     if (err == OK && response != NULL) {
    438         CHECK(response->findInt32("err", &err));
    439     }
    440     return err;
    441 }
    442 
    443 status_t NuPlayer::getSyncSettings(
    444         AVSyncSettings *sync /* nonnull */, float *videoFps /* nonnull */) {
    445     sp<AMessage> msg = new AMessage(kWhatGetSyncSettings, this);
    446     sp<AMessage> response;
    447     status_t err = msg->postAndAwaitResponse(&response);
    448     if (err == OK && response != NULL) {
    449         CHECK(response->findInt32("err", &err));
    450         if (err == OK) {
    451             readFromAMessage(response, sync, videoFps);
    452         }
    453     }
    454     return err;
    455 }
    456 
    457 void NuPlayer::pause() {
    458     (new AMessage(kWhatPause, this))->post();
    459 }
    460 
    461 void NuPlayer::resetAsync() {
    462     sp<Source> source;
    463     {
    464         Mutex::Autolock autoLock(mSourceLock);
    465         source = mSource;
    466     }
    467 
    468     if (source != NULL) {
    469         // During a reset, the data source might be unresponsive already, we need to
    470         // disconnect explicitly so that reads exit promptly.
    471         // We can't queue the disconnect request to the looper, as it might be
    472         // queued behind a stuck read and never gets processed.
    473         // Doing a disconnect outside the looper to allows the pending reads to exit
    474         // (either successfully or with error).
    475         source->disconnect();
    476     }
    477 
    478     (new AMessage(kWhatReset, this))->post();
    479 }
    480 
    481 status_t NuPlayer::notifyAt(int64_t mediaTimeUs) {
    482     sp<AMessage> notify = new AMessage(kWhatNotifyTime, this);
    483     notify->setInt64("timerUs", mediaTimeUs);
    484     mMediaClock->addTimer(notify, mediaTimeUs);
    485     return OK;
    486 }
    487 
    488 void NuPlayer::seekToAsync(int64_t seekTimeUs, MediaPlayerSeekMode mode, bool needNotify) {
    489     sp<AMessage> msg = new AMessage(kWhatSeek, this);
    490     msg->setInt64("seekTimeUs", seekTimeUs);
    491     msg->setInt32("mode", mode);
    492     msg->setInt32("needNotify", needNotify);
    493     msg->post();
    494 }
    495 
    496 
    497 void NuPlayer::writeTrackInfo(
    498         Parcel* reply, const sp<AMessage>& format) const {
    499     if (format == NULL) {
    500         ALOGE("NULL format");
    501         return;
    502     }
    503     int32_t trackType;
    504     if (!format->findInt32("type", &trackType)) {
    505         ALOGE("no track type");
    506         return;
    507     }
    508 
    509     AString mime;
    510     if (!format->findString("mime", &mime)) {
    511         // Java MediaPlayer only uses mimetype for subtitle and timedtext tracks.
    512         // If we can't find the mimetype here it means that we wouldn't be needing
    513         // the mimetype on the Java end. We still write a placeholder mime to keep the
    514         // (de)serialization logic simple.
    515         if (trackType == MEDIA_TRACK_TYPE_AUDIO) {
    516             mime = "audio/";
    517         } else if (trackType == MEDIA_TRACK_TYPE_VIDEO) {
    518             mime = "video/";
    519         } else {
    520             ALOGE("unknown track type: %d", trackType);
    521             return;
    522         }
    523     }
    524 
    525     AString lang;
    526     if (!format->findString("language", &lang)) {
    527         ALOGE("no language");
    528         return;
    529     }
    530 
    531     reply->writeInt32(2); // write something non-zero
    532     reply->writeInt32(trackType);
    533     reply->writeString16(String16(mime.c_str()));
    534     reply->writeString16(String16(lang.c_str()));
    535 
    536     if (trackType == MEDIA_TRACK_TYPE_SUBTITLE) {
    537         int32_t isAuto, isDefault, isForced;
    538         CHECK(format->findInt32("auto", &isAuto));
    539         CHECK(format->findInt32("default", &isDefault));
    540         CHECK(format->findInt32("forced", &isForced));
    541 
    542         reply->writeInt32(isAuto);
    543         reply->writeInt32(isDefault);
    544         reply->writeInt32(isForced);
    545     }
    546 }
    547 
    548 void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
    549     switch (msg->what()) {
    550         case kWhatSetDataSource:
    551         {
    552             ALOGV("kWhatSetDataSource");
    553 
    554             CHECK(mSource == NULL);
    555 
    556             status_t err = OK;
    557             sp<RefBase> obj;
    558             CHECK(msg->findObject("source", &obj));
    559             if (obj != NULL) {
    560                 Mutex::Autolock autoLock(mSourceLock);
    561                 mSource = static_cast<Source *>(obj.get());
    562             } else {
    563                 err = UNKNOWN_ERROR;
    564             }
    565 
    566             CHECK(mDriver != NULL);
    567             sp<NuPlayerDriver> driver = mDriver.promote();
    568             if (driver != NULL) {
    569                 driver->notifySetDataSourceCompleted(err);
    570             }
    571             break;
    572         }
    573 
    574         case kWhatGetBufferingSettings:
    575         {
    576             sp<AReplyToken> replyID;
    577             CHECK(msg->senderAwaitsResponse(&replyID));
    578 
    579             ALOGV("kWhatGetBufferingSettings");
    580             BufferingSettings buffering;
    581             status_t err = OK;
    582             if (mSource != NULL) {
    583                 err = mSource->getBufferingSettings(&buffering);
    584             } else {
    585                 err = INVALID_OPERATION;
    586             }
    587             sp<AMessage> response = new AMessage;
    588             if (err == OK) {
    589                 writeToAMessage(response, buffering);
    590             }
    591             response->setInt32("err", err);
    592             response->postReply(replyID);
    593             break;
    594         }
    595 
    596         case kWhatSetBufferingSettings:
    597         {
    598             sp<AReplyToken> replyID;
    599             CHECK(msg->senderAwaitsResponse(&replyID));
    600 
    601             ALOGV("kWhatSetBufferingSettings");
    602             BufferingSettings buffering;
    603             readFromAMessage(msg, &buffering);
    604             status_t err = OK;
    605             if (mSource != NULL) {
    606                 err = mSource->setBufferingSettings(buffering);
    607             } else {
    608                 err = INVALID_OPERATION;
    609             }
    610             sp<AMessage> response = new AMessage;
    611             response->setInt32("err", err);
    612             response->postReply(replyID);
    613             break;
    614         }
    615 
    616         case kWhatPrepare:
    617         {
    618             ALOGV("onMessageReceived kWhatPrepare");
    619 
    620             mSource->prepareAsync();
    621             break;
    622         }
    623 
    624         case kWhatGetTrackInfo:
    625         {
    626             sp<AReplyToken> replyID;
    627             CHECK(msg->senderAwaitsResponse(&replyID));
    628 
    629             Parcel* reply;
    630             CHECK(msg->findPointer("reply", (void**)&reply));
    631 
    632             size_t inbandTracks = 0;
    633             if (mSource != NULL) {
    634                 inbandTracks = mSource->getTrackCount();
    635             }
    636 
    637             size_t ccTracks = 0;
    638             if (mCCDecoder != NULL) {
    639                 ccTracks = mCCDecoder->getTrackCount();
    640             }
    641 
    642             // total track count
    643             reply->writeInt32(inbandTracks + ccTracks);
    644 
    645             // write inband tracks
    646             for (size_t i = 0; i < inbandTracks; ++i) {
    647                 writeTrackInfo(reply, mSource->getTrackInfo(i));
    648             }
    649 
    650             // write CC track
    651             for (size_t i = 0; i < ccTracks; ++i) {
    652                 writeTrackInfo(reply, mCCDecoder->getTrackInfo(i));
    653             }
    654 
    655             sp<AMessage> response = new AMessage;
    656             response->postReply(replyID);
    657             break;
    658         }
    659 
    660         case kWhatGetSelectedTrack:
    661         {
    662             int32_t type32;
    663             CHECK(msg->findInt32("type", (int32_t*)&type32));
    664             media_track_type type = (media_track_type)type32;
    665 
    666             size_t inbandTracks = 0;
    667             status_t err = INVALID_OPERATION;
    668             ssize_t selectedTrack = -1;
    669             if (mSource != NULL) {
    670                 err = OK;
    671                 inbandTracks = mSource->getTrackCount();
    672                 selectedTrack = mSource->getSelectedTrack(type);
    673             }
    674 
    675             if (selectedTrack == -1 && mCCDecoder != NULL) {
    676                 err = OK;
    677                 selectedTrack = mCCDecoder->getSelectedTrack(type);
    678                 if (selectedTrack != -1) {
    679                     selectedTrack += inbandTracks;
    680                 }
    681             }
    682 
    683             Parcel* reply;
    684             CHECK(msg->findPointer("reply", (void**)&reply));
    685             reply->writeInt32(selectedTrack);
    686 
    687             sp<AMessage> response = new AMessage;
    688             response->setInt32("err", err);
    689 
    690             sp<AReplyToken> replyID;
    691             CHECK(msg->senderAwaitsResponse(&replyID));
    692             response->postReply(replyID);
    693             break;
    694         }
    695 
    696         case kWhatSelectTrack:
    697         {
    698             sp<AReplyToken> replyID;
    699             CHECK(msg->senderAwaitsResponse(&replyID));
    700 
    701             size_t trackIndex;
    702             int32_t select;
    703             int64_t timeUs;
    704             CHECK(msg->findSize("trackIndex", &trackIndex));
    705             CHECK(msg->findInt32("select", &select));
    706             CHECK(msg->findInt64("timeUs", &timeUs));
    707 
    708             status_t err = INVALID_OPERATION;
    709 
    710             size_t inbandTracks = 0;
    711             if (mSource != NULL) {
    712                 inbandTracks = mSource->getTrackCount();
    713             }
    714             size_t ccTracks = 0;
    715             if (mCCDecoder != NULL) {
    716                 ccTracks = mCCDecoder->getTrackCount();
    717             }
    718 
    719             if (trackIndex < inbandTracks) {
    720                 err = mSource->selectTrack(trackIndex, select, timeUs);
    721 
    722                 if (!select && err == OK) {
    723                     int32_t type;
    724                     sp<AMessage> info = mSource->getTrackInfo(trackIndex);
    725                     if (info != NULL
    726                             && info->findInt32("type", &type)
    727                             && type == MEDIA_TRACK_TYPE_TIMEDTEXT) {
    728                         ++mTimedTextGeneration;
    729                     }
    730                 }
    731             } else {
    732                 trackIndex -= inbandTracks;
    733 
    734                 if (trackIndex < ccTracks) {
    735                     err = mCCDecoder->selectTrack(trackIndex, select);
    736                 }
    737             }
    738 
    739             sp<AMessage> response = new AMessage;
    740             response->setInt32("err", err);
    741 
    742             response->postReply(replyID);
    743             break;
    744         }
    745 
    746         case kWhatPollDuration:
    747         {
    748             int32_t generation;
    749             CHECK(msg->findInt32("generation", &generation));
    750 
    751             if (generation != mPollDurationGeneration) {
    752                 // stale
    753                 break;
    754             }
    755 
    756             int64_t durationUs;
    757             if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
    758                 sp<NuPlayerDriver> driver = mDriver.promote();
    759                 if (driver != NULL) {
    760                     driver->notifyDuration(durationUs);
    761                 }
    762             }
    763 
    764             msg->post(1000000LL);  // poll again in a second.
    765             break;
    766         }
    767 
    768         case kWhatSetVideoSurface:
    769         {
    770 
    771             sp<RefBase> obj;
    772             CHECK(msg->findObject("surface", &obj));
    773             sp<Surface> surface = static_cast<Surface *>(obj.get());
    774 
    775             ALOGD("onSetVideoSurface(%p, %s video decoder)",
    776                     surface.get(),
    777                     (mSource != NULL && mStarted && mSource->getFormat(false /* audio */) != NULL
    778                             && mVideoDecoder != NULL) ? "have" : "no");
    779 
    780             // Need to check mStarted before calling mSource->getFormat because NuPlayer might
    781             // be in preparing state and it could take long time.
    782             // When mStarted is true, mSource must have been set.
    783             if (mSource == NULL || !mStarted || mSource->getFormat(false /* audio */) == NULL
    784                     // NOTE: mVideoDecoder's mSurface is always non-null
    785                     || (mVideoDecoder != NULL && mVideoDecoder->setVideoSurface(surface) == OK)) {
    786                 performSetSurface(surface);
    787                 break;
    788             }
    789 
    790             mDeferredActions.push_back(
    791                     new FlushDecoderAction(
    792                             (obj != NULL ? FLUSH_CMD_FLUSH : FLUSH_CMD_NONE) /* audio */,
    793                                            FLUSH_CMD_SHUTDOWN /* video */));
    794 
    795             mDeferredActions.push_back(new SetSurfaceAction(surface));
    796 
    797             if (obj != NULL) {
    798                 if (mStarted) {
    799                     // Issue a seek to refresh the video screen only if started otherwise
    800                     // the extractor may not yet be started and will assert.
    801                     // If the video decoder is not set (perhaps audio only in this case)
    802                     // do not perform a seek as it is not needed.
    803                     int64_t currentPositionUs = 0;
    804                     if (getCurrentPosition(&currentPositionUs) == OK) {
    805                         mDeferredActions.push_back(
    806                                 new SeekAction(currentPositionUs,
    807                                         MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC /* mode */));
    808                     }
    809                 }
    810 
    811                 // If there is a new surface texture, instantiate decoders
    812                 // again if possible.
    813                 mDeferredActions.push_back(
    814                         new SimpleAction(&NuPlayer::performScanSources));
    815 
    816                 // After a flush without shutdown, decoder is paused.
    817                 // Don't resume it until source seek is done, otherwise it could
    818                 // start pulling stale data too soon.
    819                 mDeferredActions.push_back(
    820                         new ResumeDecoderAction(false /* needNotify */));
    821             }
    822 
    823             processDeferredActions();
    824             break;
    825         }
    826 
    827         case kWhatSetAudioSink:
    828         {
    829             ALOGV("kWhatSetAudioSink");
    830 
    831             sp<RefBase> obj;
    832             CHECK(msg->findObject("sink", &obj));
    833 
    834             mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
    835             break;
    836         }
    837 
    838         case kWhatStart:
    839         {
    840             ALOGV("kWhatStart");
    841             if (mStarted) {
    842                 // do not resume yet if the source is still buffering
    843                 if (!mPausedForBuffering) {
    844                     onResume();
    845                 }
    846             } else {
    847                 onStart();
    848             }
    849             mPausedByClient = false;
    850             break;
    851         }
    852 
    853         case kWhatConfigPlayback:
    854         {
    855             sp<AReplyToken> replyID;
    856             CHECK(msg->senderAwaitsResponse(&replyID));
    857             AudioPlaybackRate rate /* sanitized */;
    858             readFromAMessage(msg, &rate);
    859             status_t err = OK;
    860             if (mRenderer != NULL) {
    861                 // AudioSink allows only 1.f and 0.f for offload mode.
    862                 // For other speed, switch to non-offload mode.
    863                 if (mOffloadAudio && ((rate.mSpeed != 0.f && rate.mSpeed != 1.f)
    864                         || rate.mPitch != 1.f)) {
    865                     int64_t currentPositionUs;
    866                     if (getCurrentPosition(&currentPositionUs) != OK) {
    867                         currentPositionUs = mPreviousSeekTimeUs;
    868                     }
    869 
    870                     // Set mPlaybackSettings so that the new audio decoder can
    871                     // be created correctly.
    872                     mPlaybackSettings = rate;
    873                     if (!mPaused) {
    874                         mRenderer->pause();
    875                     }
    876                     restartAudio(
    877                             currentPositionUs, true /* forceNonOffload */,
    878                             true /* needsToCreateAudioDecoder */);
    879                     if (!mPaused) {
    880                         mRenderer->resume();
    881                     }
    882                 }
    883 
    884                 err = mRenderer->setPlaybackSettings(rate);
    885             }
    886             if (err == OK) {
    887                 if (rate.mSpeed == 0.f) {
    888                     onPause();
    889                     mPausedByClient = true;
    890                     // save all other settings (using non-paused speed)
    891                     // so we can restore them on start
    892                     AudioPlaybackRate newRate = rate;
    893                     newRate.mSpeed = mPlaybackSettings.mSpeed;
    894                     mPlaybackSettings = newRate;
    895                 } else { /* rate.mSpeed != 0.f */
    896                     mPlaybackSettings = rate;
    897                     if (mStarted) {
    898                         // do not resume yet if the source is still buffering
    899                         if (!mPausedForBuffering) {
    900                             onResume();
    901                         }
    902                     } else if (mPrepared) {
    903                         onStart();
    904                     }
    905 
    906                     mPausedByClient = false;
    907                 }
    908             }
    909 
    910             if (mVideoDecoder != NULL) {
    911                 sp<AMessage> params = new AMessage();
    912                 params->setFloat("playback-speed", mPlaybackSettings.mSpeed);
    913                 mVideoDecoder->setParameters(params);
    914             }
    915 
    916             sp<AMessage> response = new AMessage;
    917             response->setInt32("err", err);
    918             response->postReply(replyID);
    919             break;
    920         }
    921 
    922         case kWhatGetPlaybackSettings:
    923         {
    924             sp<AReplyToken> replyID;
    925             CHECK(msg->senderAwaitsResponse(&replyID));
    926             AudioPlaybackRate rate = mPlaybackSettings;
    927             status_t err = OK;
    928             if (mRenderer != NULL) {
    929                 err = mRenderer->getPlaybackSettings(&rate);
    930             }
    931             if (err == OK) {
    932                 // get playback settings used by renderer, as it may be
    933                 // slightly off due to audiosink not taking small changes.
    934                 mPlaybackSettings = rate;
    935                 if (mPaused) {
    936                     rate.mSpeed = 0.f;
    937                 }
    938             }
    939             sp<AMessage> response = new AMessage;
    940             if (err == OK) {
    941                 writeToAMessage(response, rate);
    942             }
    943             response->setInt32("err", err);
    944             response->postReply(replyID);
    945             break;
    946         }
    947 
    948         case kWhatConfigSync:
    949         {
    950             sp<AReplyToken> replyID;
    951             CHECK(msg->senderAwaitsResponse(&replyID));
    952 
    953             ALOGV("kWhatConfigSync");
    954             AVSyncSettings sync;
    955             float videoFpsHint;
    956             readFromAMessage(msg, &sync, &videoFpsHint);
    957             status_t err = OK;
    958             if (mRenderer != NULL) {
    959                 err = mRenderer->setSyncSettings(sync, videoFpsHint);
    960             }
    961             if (err == OK) {
    962                 mSyncSettings = sync;
    963                 mVideoFpsHint = videoFpsHint;
    964             }
    965             sp<AMessage> response = new AMessage;
    966             response->setInt32("err", err);
    967             response->postReply(replyID);
    968             break;
    969         }
    970 
    971         case kWhatGetSyncSettings:
    972         {
    973             sp<AReplyToken> replyID;
    974             CHECK(msg->senderAwaitsResponse(&replyID));
    975             AVSyncSettings sync = mSyncSettings;
    976             float videoFps = mVideoFpsHint;
    977             status_t err = OK;
    978             if (mRenderer != NULL) {
    979                 err = mRenderer->getSyncSettings(&sync, &videoFps);
    980                 if (err == OK) {
    981                     mSyncSettings = sync;
    982                     mVideoFpsHint = videoFps;
    983                 }
    984             }
    985             sp<AMessage> response = new AMessage;
    986             if (err == OK) {
    987                 writeToAMessage(response, sync, videoFps);
    988             }
    989             response->setInt32("err", err);
    990             response->postReply(replyID);
    991             break;
    992         }
    993 
    994         case kWhatScanSources:
    995         {
    996             int32_t generation;
    997             CHECK(msg->findInt32("generation", &generation));
    998             if (generation != mScanSourcesGeneration) {
    999                 // Drop obsolete msg.
   1000                 break;
   1001             }
   1002 
   1003             mScanSourcesPending = false;
   1004 
   1005             ALOGV("scanning sources haveAudio=%d, haveVideo=%d",
   1006                  mAudioDecoder != NULL, mVideoDecoder != NULL);
   1007 
   1008             bool mHadAnySourcesBefore =
   1009                 (mAudioDecoder != NULL) || (mVideoDecoder != NULL);
   1010             bool rescan = false;
   1011 
   1012             // initialize video before audio because successful initialization of
   1013             // video may change deep buffer mode of audio.
   1014             if (mSurface != NULL) {
   1015                 if (instantiateDecoder(false, &mVideoDecoder) == -EWOULDBLOCK) {
   1016                     rescan = true;
   1017                 }
   1018             }
   1019 
   1020             // Don't try to re-open audio sink if there's an existing decoder.
   1021             if (mAudioSink != NULL && mAudioDecoder == NULL) {
   1022                 if (instantiateDecoder(true, &mAudioDecoder) == -EWOULDBLOCK) {
   1023                     rescan = true;
   1024                 }
   1025             }
   1026 
   1027             if (!mHadAnySourcesBefore
   1028                     && (mAudioDecoder != NULL || mVideoDecoder != NULL)) {
   1029                 // This is the first time we've found anything playable.
   1030 
   1031                 if (mSourceFlags & Source::FLAG_DYNAMIC_DURATION) {
   1032                     schedulePollDuration();
   1033                 }
   1034             }
   1035 
   1036             status_t err;
   1037             if ((err = mSource->feedMoreTSData()) != OK) {
   1038                 if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
   1039                     // We're not currently decoding anything (no audio or
   1040                     // video tracks found) and we just ran out of input data.
   1041 
   1042                     if (err == ERROR_END_OF_STREAM) {
   1043                         notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
   1044                     } else {
   1045                         notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
   1046                     }
   1047                 }
   1048                 break;
   1049             }
   1050 
   1051             if (rescan) {
   1052                 msg->post(100000LL);
   1053                 mScanSourcesPending = true;
   1054             }
   1055             break;
   1056         }
   1057 
   1058         case kWhatVideoNotify:
   1059         case kWhatAudioNotify:
   1060         {
   1061             bool audio = msg->what() == kWhatAudioNotify;
   1062 
   1063             int32_t currentDecoderGeneration =
   1064                 (audio? mAudioDecoderGeneration : mVideoDecoderGeneration);
   1065             int32_t requesterGeneration = currentDecoderGeneration - 1;
   1066             CHECK(msg->findInt32("generation", &requesterGeneration));
   1067 
   1068             if (requesterGeneration != currentDecoderGeneration) {
   1069                 ALOGV("got message from old %s decoder, generation(%d:%d)",
   1070                         audio ? "audio" : "video", requesterGeneration,
   1071                         currentDecoderGeneration);
   1072                 sp<AMessage> reply;
   1073                 if (!(msg->findMessage("reply", &reply))) {
   1074                     return;
   1075                 }
   1076 
   1077                 reply->setInt32("err", INFO_DISCONTINUITY);
   1078                 reply->post();
   1079                 return;
   1080             }
   1081 
   1082             int32_t what;
   1083             CHECK(msg->findInt32("what", &what));
   1084 
   1085             if (what == DecoderBase::kWhatInputDiscontinuity) {
   1086                 int32_t formatChange;
   1087                 CHECK(msg->findInt32("formatChange", &formatChange));
   1088 
   1089                 ALOGV("%s discontinuity: formatChange %d",
   1090                         audio ? "audio" : "video", formatChange);
   1091 
   1092                 if (formatChange) {
   1093                     mDeferredActions.push_back(
   1094                             new FlushDecoderAction(
   1095                                 audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE,
   1096                                 audio ? FLUSH_CMD_NONE : FLUSH_CMD_SHUTDOWN));
   1097                 }
   1098 
   1099                 mDeferredActions.push_back(
   1100                         new SimpleAction(
   1101                                 &NuPlayer::performScanSources));
   1102 
   1103                 processDeferredActions();
   1104             } else if (what == DecoderBase::kWhatEOS) {
   1105                 int32_t err;
   1106                 CHECK(msg->findInt32("err", &err));
   1107 
   1108                 if (err == ERROR_END_OF_STREAM) {
   1109                     ALOGV("got %s decoder EOS", audio ? "audio" : "video");
   1110                 } else {
   1111                     ALOGV("got %s decoder EOS w/ error %d",
   1112                          audio ? "audio" : "video",
   1113                          err);
   1114                 }
   1115 
   1116                 mRenderer->queueEOS(audio, err);
   1117             } else if (what == DecoderBase::kWhatFlushCompleted) {
   1118                 ALOGV("decoder %s flush completed", audio ? "audio" : "video");
   1119 
   1120                 handleFlushComplete(audio, true /* isDecoder */);
   1121                 finishFlushIfPossible();
   1122             } else if (what == DecoderBase::kWhatVideoSizeChanged) {
   1123                 sp<AMessage> format;
   1124                 CHECK(msg->findMessage("format", &format));
   1125 
   1126                 sp<AMessage> inputFormat =
   1127                         mSource->getFormat(false /* audio */);
   1128 
   1129                 setVideoScalingMode(mVideoScalingMode);
   1130                 updateVideoSize(inputFormat, format);
   1131             } else if (what == DecoderBase::kWhatShutdownCompleted) {
   1132                 ALOGV("%s shutdown completed", audio ? "audio" : "video");
   1133                 if (audio) {
   1134                     Mutex::Autolock autoLock(mDecoderLock);
   1135                     mAudioDecoder.clear();
   1136                     mAudioDecoderError = false;
   1137                     ++mAudioDecoderGeneration;
   1138 
   1139                     CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
   1140                     mFlushingAudio = SHUT_DOWN;
   1141                 } else {
   1142                     Mutex::Autolock autoLock(mDecoderLock);
   1143                     mVideoDecoder.clear();
   1144                     mVideoDecoderError = false;
   1145                     ++mVideoDecoderGeneration;
   1146 
   1147                     CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
   1148                     mFlushingVideo = SHUT_DOWN;
   1149                 }
   1150 
   1151                 finishFlushIfPossible();
   1152             } else if (what == DecoderBase::kWhatResumeCompleted) {
   1153                 finishResume();
   1154             } else if (what == DecoderBase::kWhatError) {
   1155                 status_t err;
   1156                 if (!msg->findInt32("err", &err) || err == OK) {
   1157                     err = UNKNOWN_ERROR;
   1158                 }
   1159 
   1160                 // Decoder errors can be due to Source (e.g. from streaming),
   1161                 // or from decoding corrupted bitstreams, or from other decoder
   1162                 // MediaCodec operations (e.g. from an ongoing reset or seek).
   1163                 // They may also be due to openAudioSink failure at
   1164                 // decoder start or after a format change.
   1165                 //
   1166                 // We try to gracefully shut down the affected decoder if possible,
   1167                 // rather than trying to force the shutdown with something
   1168                 // similar to performReset(). This method can lead to a hang
   1169                 // if MediaCodec functions block after an error, but they should
   1170                 // typically return INVALID_OPERATION instead of blocking.
   1171 
   1172                 FlushStatus *flushing = audio ? &mFlushingAudio : &mFlushingVideo;
   1173                 ALOGE("received error(%#x) from %s decoder, flushing(%d), now shutting down",
   1174                         err, audio ? "audio" : "video", *flushing);
   1175 
   1176                 switch (*flushing) {
   1177                     case NONE:
   1178                         mDeferredActions.push_back(
   1179                                 new FlushDecoderAction(
   1180                                     audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE,
   1181                                     audio ? FLUSH_CMD_NONE : FLUSH_CMD_SHUTDOWN));
   1182                         processDeferredActions();
   1183                         break;
   1184                     case FLUSHING_DECODER:
   1185                         *flushing = FLUSHING_DECODER_SHUTDOWN; // initiate shutdown after flush.
   1186                         break; // Wait for flush to complete.
   1187                     case FLUSHING_DECODER_SHUTDOWN:
   1188                         break; // Wait for flush to complete.
   1189                     case SHUTTING_DOWN_DECODER:
   1190                         break; // Wait for shutdown to complete.
   1191                     case FLUSHED:
   1192                         getDecoder(audio)->initiateShutdown(); // In the middle of a seek.
   1193                         *flushing = SHUTTING_DOWN_DECODER;     // Shut down.
   1194                         break;
   1195                     case SHUT_DOWN:
   1196                         finishFlushIfPossible();  // Should not occur.
   1197                         break;                    // Finish anyways.
   1198                 }
   1199                 if (mSource != nullptr) {
   1200                     if (audio) {
   1201                         if (mVideoDecoderError || mSource->getFormat(false /* audio */) == NULL
   1202                                 || mSurface == NULL || mVideoDecoder == NULL) {
   1203                             // When both audio and video have error, or this stream has only audio
   1204                             // which has error, notify client of error.
   1205                             notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
   1206                         } else {
   1207                             // Only audio track has error. Video track could be still good to play.
   1208                             notifyListener(MEDIA_INFO, MEDIA_INFO_PLAY_AUDIO_ERROR, err);
   1209                         }
   1210                         mAudioDecoderError = true;
   1211                     } else {
   1212                         if (mAudioDecoderError || mSource->getFormat(true /* audio */) == NULL
   1213                                 || mAudioSink == NULL || mAudioDecoder == NULL) {
   1214                             // When both audio and video have error, or this stream has only video
   1215                             // which has error, notify client of error.
   1216                             notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
   1217                         } else {
   1218                             // Only video track has error. Audio track could be still good to play.
   1219                             notifyListener(MEDIA_INFO, MEDIA_INFO_PLAY_VIDEO_ERROR, err);
   1220                         }
   1221                         mVideoDecoderError = true;
   1222                     }
   1223                 }
   1224             } else {
   1225                 ALOGV("Unhandled decoder notification %d '%c%c%c%c'.",
   1226                       what,
   1227                       what >> 24,
   1228                       (what >> 16) & 0xff,
   1229                       (what >> 8) & 0xff,
   1230                       what & 0xff);
   1231             }
   1232 
   1233             break;
   1234         }
   1235 
   1236         case kWhatRendererNotify:
   1237         {
   1238             int32_t requesterGeneration = mRendererGeneration - 1;
   1239             CHECK(msg->findInt32("generation", &requesterGeneration));
   1240             if (requesterGeneration != mRendererGeneration) {
   1241                 ALOGV("got message from old renderer, generation(%d:%d)",
   1242                         requesterGeneration, mRendererGeneration);
   1243                 return;
   1244             }
   1245 
   1246             int32_t what;
   1247             CHECK(msg->findInt32("what", &what));
   1248 
   1249             if (what == Renderer::kWhatEOS) {
   1250                 int32_t audio;
   1251                 CHECK(msg->findInt32("audio", &audio));
   1252 
   1253                 int32_t finalResult;
   1254                 CHECK(msg->findInt32("finalResult", &finalResult));
   1255 
   1256                 if (audio) {
   1257                     mAudioEOS = true;
   1258                 } else {
   1259                     mVideoEOS = true;
   1260                 }
   1261 
   1262                 if (finalResult == ERROR_END_OF_STREAM) {
   1263                     ALOGV("reached %s EOS", audio ? "audio" : "video");
   1264                 } else {
   1265                     ALOGE("%s track encountered an error (%d)",
   1266                          audio ? "audio" : "video", finalResult);
   1267 
   1268                     notifyListener(
   1269                             MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult);
   1270                 }
   1271 
   1272                 if ((mAudioEOS || mAudioDecoder == NULL)
   1273                         && (mVideoEOS || mVideoDecoder == NULL)) {
   1274                     notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
   1275                 }
   1276             } else if (what == Renderer::kWhatFlushComplete) {
   1277                 int32_t audio;
   1278                 CHECK(msg->findInt32("audio", &audio));
   1279 
   1280                 if (audio) {
   1281                     mAudioEOS = false;
   1282                 } else {
   1283                     mVideoEOS = false;
   1284                 }
   1285 
   1286                 ALOGV("renderer %s flush completed.", audio ? "audio" : "video");
   1287                 if (audio && (mFlushingAudio == NONE || mFlushingAudio == FLUSHED
   1288                         || mFlushingAudio == SHUT_DOWN)) {
   1289                     // Flush has been handled by tear down.
   1290                     break;
   1291                 }
   1292                 handleFlushComplete(audio, false /* isDecoder */);
   1293                 finishFlushIfPossible();
   1294             } else if (what == Renderer::kWhatVideoRenderingStart) {
   1295                 notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0);
   1296             } else if (what == Renderer::kWhatMediaRenderingStart) {
   1297                 ALOGV("media rendering started");
   1298                 notifyListener(MEDIA_STARTED, 0, 0);
   1299             } else if (what == Renderer::kWhatAudioTearDown) {
   1300                 int32_t reason;
   1301                 CHECK(msg->findInt32("reason", &reason));
   1302                 ALOGV("Tear down audio with reason %d.", reason);
   1303                 if (reason == Renderer::kDueToTimeout && !(mPaused && mOffloadAudio)) {
   1304                     // TimeoutWhenPaused is only for offload mode.
   1305                     ALOGW("Received a stale message for teardown, mPaused(%d), mOffloadAudio(%d)",
   1306                           mPaused, mOffloadAudio);
   1307                     break;
   1308                 }
   1309                 int64_t positionUs;
   1310                 if (!msg->findInt64("positionUs", &positionUs)) {
   1311                     positionUs = mPreviousSeekTimeUs;
   1312                 }
   1313 
   1314                 restartAudio(
   1315                         positionUs, reason == Renderer::kForceNonOffload /* forceNonOffload */,
   1316                         reason != Renderer::kDueToTimeout /* needsToCreateAudioDecoder */);
   1317             }
   1318             break;
   1319         }
   1320 
   1321         case kWhatMoreDataQueued:
   1322         {
   1323             break;
   1324         }
   1325 
   1326         case kWhatReset:
   1327         {
   1328             ALOGV("kWhatReset");
   1329 
   1330             mResetting = true;
   1331             updatePlaybackTimer(true /* stopping */, "kWhatReset");
   1332             updateRebufferingTimer(true /* stopping */, true /* exiting */);
   1333 
   1334             mDeferredActions.push_back(
   1335                     new FlushDecoderAction(
   1336                         FLUSH_CMD_SHUTDOWN /* audio */,
   1337                         FLUSH_CMD_SHUTDOWN /* video */));
   1338 
   1339             mDeferredActions.push_back(
   1340                     new SimpleAction(&NuPlayer::performReset));
   1341 
   1342             processDeferredActions();
   1343             break;
   1344         }
   1345 
   1346         case kWhatNotifyTime:
   1347         {
   1348             ALOGV("kWhatNotifyTime");
   1349             int64_t timerUs;
   1350             CHECK(msg->findInt64("timerUs", &timerUs));
   1351 
   1352             notifyListener(MEDIA_NOTIFY_TIME, timerUs, 0);
   1353             break;
   1354         }
   1355 
   1356         case kWhatSeek:
   1357         {
   1358             int64_t seekTimeUs;
   1359             int32_t mode;
   1360             int32_t needNotify;
   1361             CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
   1362             CHECK(msg->findInt32("mode", &mode));
   1363             CHECK(msg->findInt32("needNotify", &needNotify));
   1364 
   1365             ALOGV("kWhatSeek seekTimeUs=%lld us, mode=%d, needNotify=%d",
   1366                     (long long)seekTimeUs, mode, needNotify);
   1367 
   1368             if (!mStarted) {
   1369                 // Seek before the player is started. In order to preview video,
   1370                 // need to start the player and pause it. This branch is called
   1371                 // only once if needed. After the player is started, any seek
   1372                 // operation will go through normal path.
   1373                 // Audio-only cases are handled separately.
   1374                 onStart(seekTimeUs, (MediaPlayerSeekMode)mode);
   1375                 if (mStarted) {
   1376                     onPause();
   1377                     mPausedByClient = true;
   1378                 }
   1379                 if (needNotify) {
   1380                     notifyDriverSeekComplete();
   1381                 }
   1382                 break;
   1383             }
   1384 
   1385             mDeferredActions.push_back(
   1386                     new FlushDecoderAction(FLUSH_CMD_FLUSH /* audio */,
   1387                                            FLUSH_CMD_FLUSH /* video */));
   1388 
   1389             mDeferredActions.push_back(
   1390                     new SeekAction(seekTimeUs, (MediaPlayerSeekMode)mode));
   1391 
   1392             // After a flush without shutdown, decoder is paused.
   1393             // Don't resume it until source seek is done, otherwise it could
   1394             // start pulling stale data too soon.
   1395             mDeferredActions.push_back(
   1396                     new ResumeDecoderAction(needNotify));
   1397 
   1398             processDeferredActions();
   1399             break;
   1400         }
   1401 
   1402         case kWhatPause:
   1403         {
   1404             onPause();
   1405             mPausedByClient = true;
   1406             break;
   1407         }
   1408 
   1409         case kWhatSourceNotify:
   1410         {
   1411             onSourceNotify(msg);
   1412             break;
   1413         }
   1414 
   1415         case kWhatClosedCaptionNotify:
   1416         {
   1417             onClosedCaptionNotify(msg);
   1418             break;
   1419         }
   1420 
   1421         case kWhatPrepareDrm:
   1422         {
   1423             status_t status = onPrepareDrm(msg);
   1424 
   1425             sp<AMessage> response = new AMessage;
   1426             response->setInt32("status", status);
   1427             sp<AReplyToken> replyID;
   1428             CHECK(msg->senderAwaitsResponse(&replyID));
   1429             response->postReply(replyID);
   1430             break;
   1431         }
   1432 
   1433         case kWhatReleaseDrm:
   1434         {
   1435             status_t status = onReleaseDrm();
   1436 
   1437             sp<AMessage> response = new AMessage;
   1438             response->setInt32("status", status);
   1439             sp<AReplyToken> replyID;
   1440             CHECK(msg->senderAwaitsResponse(&replyID));
   1441             response->postReply(replyID);
   1442             break;
   1443         }
   1444 
   1445         case kWhatMediaClockNotify:
   1446         {
   1447             ALOGV("kWhatMediaClockNotify");
   1448             int64_t anchorMediaUs, anchorRealUs;
   1449             float playbackRate;
   1450             CHECK(msg->findInt64("anchor-media-us", &anchorMediaUs));
   1451             CHECK(msg->findInt64("anchor-real-us", &anchorRealUs));
   1452             CHECK(msg->findFloat("playback-rate", &playbackRate));
   1453 
   1454             Parcel in;
   1455             in.writeInt64(anchorMediaUs);
   1456             in.writeInt64(anchorRealUs);
   1457             in.writeFloat(playbackRate);
   1458 
   1459             notifyListener(MEDIA_TIME_DISCONTINUITY, 0, 0, &in);
   1460             break;
   1461         }
   1462 
   1463         default:
   1464             TRESPASS();
   1465             break;
   1466     }
   1467 }
   1468 
   1469 void NuPlayer::onResume() {
   1470     if (!mPaused || mResetting) {
   1471         ALOGD_IF(mResetting, "resetting, onResume discarded");
   1472         return;
   1473     }
   1474     mPaused = false;
   1475     if (mSource != NULL) {
   1476         mSource->resume();
   1477     } else {
   1478         ALOGW("resume called when source is gone or not set");
   1479     }
   1480     // |mAudioDecoder| may have been released due to the pause timeout, so re-create it if
   1481     // needed.
   1482     if (audioDecoderStillNeeded() && mAudioDecoder == NULL) {
   1483         instantiateDecoder(true /* audio */, &mAudioDecoder);
   1484     }
   1485     if (mRenderer != NULL) {
   1486         mRenderer->resume();
   1487     } else {
   1488         ALOGW("resume called when renderer is gone or not set");
   1489     }
   1490 
   1491     startPlaybackTimer("onresume");
   1492 }
   1493 
   1494 status_t NuPlayer::onInstantiateSecureDecoders() {
   1495     status_t err;
   1496     if (!(mSourceFlags & Source::FLAG_SECURE)) {
   1497         return BAD_TYPE;
   1498     }
   1499 
   1500     if (mRenderer != NULL) {
   1501         ALOGE("renderer should not be set when instantiating secure decoders");
   1502         return UNKNOWN_ERROR;
   1503     }
   1504 
   1505     // TRICKY: We rely on mRenderer being null, so that decoder does not start requesting
   1506     // data on instantiation.
   1507     if (mSurface != NULL) {
   1508         err = instantiateDecoder(false, &mVideoDecoder);
   1509         if (err != OK) {
   1510             return err;
   1511         }
   1512     }
   1513 
   1514     if (mAudioSink != NULL) {
   1515         err = instantiateDecoder(true, &mAudioDecoder);
   1516         if (err != OK) {
   1517             return err;
   1518         }
   1519     }
   1520     return OK;
   1521 }
   1522 
   1523 void NuPlayer::onStart(int64_t startPositionUs, MediaPlayerSeekMode mode) {
   1524     ALOGV("onStart: mCrypto: %p (%d)", mCrypto.get(),
   1525             (mCrypto != NULL ? mCrypto->getStrongCount() : 0));
   1526 
   1527     if (!mSourceStarted) {
   1528         mSourceStarted = true;
   1529         mSource->start();
   1530     }
   1531     if (startPositionUs > 0) {
   1532         performSeek(startPositionUs, mode);
   1533         if (mSource->getFormat(false /* audio */) == NULL) {
   1534             return;
   1535         }
   1536     }
   1537 
   1538     mOffloadAudio = false;
   1539     mAudioEOS = false;
   1540     mVideoEOS = false;
   1541     mStarted = true;
   1542     mPaused = false;
   1543 
   1544     uint32_t flags = 0;
   1545 
   1546     if (mSource->isRealTime()) {
   1547         flags |= Renderer::FLAG_REAL_TIME;
   1548     }
   1549 
   1550     bool hasAudio = (mSource->getFormat(true /* audio */) != NULL);
   1551     bool hasVideo = (mSource->getFormat(false /* audio */) != NULL);
   1552     if (!hasAudio && !hasVideo) {
   1553         ALOGE("no metadata for either audio or video source");
   1554         mSource->stop();
   1555         mSourceStarted = false;
   1556         notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_MALFORMED);
   1557         return;
   1558     }
   1559     ALOGV_IF(!hasAudio, "no metadata for audio source");  // video only stream
   1560 
   1561     sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */);
   1562 
   1563     audio_stream_type_t streamType = AUDIO_STREAM_MUSIC;
   1564     if (mAudioSink != NULL) {
   1565         streamType = mAudioSink->getAudioStreamType();
   1566     }
   1567 
   1568     mOffloadAudio =
   1569         canOffloadStream(audioMeta, hasVideo, mSource->isStreaming(), streamType)
   1570                 && (mPlaybackSettings.mSpeed == 1.f && mPlaybackSettings.mPitch == 1.f);
   1571 
   1572     // Modular DRM: Disabling audio offload if the source is protected
   1573     if (mOffloadAudio && mIsDrmProtected) {
   1574         mOffloadAudio = false;
   1575         ALOGV("onStart: Disabling mOffloadAudio now that the source is protected.");
   1576     }
   1577 
   1578     if (mOffloadAudio) {
   1579         flags |= Renderer::FLAG_OFFLOAD_AUDIO;
   1580     }
   1581 
   1582     sp<AMessage> notify = new AMessage(kWhatRendererNotify, this);
   1583     ++mRendererGeneration;
   1584     notify->setInt32("generation", mRendererGeneration);
   1585     mRenderer = new Renderer(mAudioSink, mMediaClock, notify, flags);
   1586     mRendererLooper = new ALooper;
   1587     mRendererLooper->setName("NuPlayerRenderer");
   1588     mRendererLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
   1589     mRendererLooper->registerHandler(mRenderer);
   1590 
   1591     status_t err = mRenderer->setPlaybackSettings(mPlaybackSettings);
   1592     if (err != OK) {
   1593         mSource->stop();
   1594         mSourceStarted = false;
   1595         notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
   1596         return;
   1597     }
   1598 
   1599     float rate = getFrameRate();
   1600     if (rate > 0) {
   1601         mRenderer->setVideoFrameRate(rate);
   1602     }
   1603 
   1604     if (mVideoDecoder != NULL) {
   1605         mVideoDecoder->setRenderer(mRenderer);
   1606     }
   1607     if (mAudioDecoder != NULL) {
   1608         mAudioDecoder->setRenderer(mRenderer);
   1609     }
   1610 
   1611     startPlaybackTimer("onstart");
   1612 
   1613     postScanSources();
   1614 }
   1615 
   1616 void NuPlayer::startPlaybackTimer(const char *where) {
   1617     Mutex::Autolock autoLock(mPlayingTimeLock);
   1618     if (mLastStartedPlayingTimeNs == 0) {
   1619         mLastStartedPlayingTimeNs = systemTime();
   1620         ALOGV("startPlaybackTimer() time %20" PRId64 " (%s)",  mLastStartedPlayingTimeNs, where);
   1621     }
   1622 }
   1623 
   1624 void NuPlayer::updatePlaybackTimer(bool stopping, const char *where) {
   1625     Mutex::Autolock autoLock(mPlayingTimeLock);
   1626 
   1627     ALOGV("updatePlaybackTimer(%s)  time %20" PRId64 " (%s)",
   1628 	  stopping ? "stop" : "snap", mLastStartedPlayingTimeNs, where);
   1629 
   1630     if (mLastStartedPlayingTimeNs != 0) {
   1631         sp<NuPlayerDriver> driver = mDriver.promote();
   1632         int64_t now = systemTime();
   1633         if (driver != NULL) {
   1634             int64_t played = now - mLastStartedPlayingTimeNs;
   1635             ALOGV("updatePlaybackTimer()  log  %20" PRId64 "", played);
   1636 
   1637             if (played > 0) {
   1638                 driver->notifyMorePlayingTimeUs((played+500)/1000);
   1639             }
   1640         }
   1641 	if (stopping) {
   1642             mLastStartedPlayingTimeNs = 0;
   1643 	} else {
   1644             mLastStartedPlayingTimeNs = now;
   1645 	}
   1646     }
   1647 }
   1648 
   1649 void NuPlayer::startRebufferingTimer() {
   1650     Mutex::Autolock autoLock(mPlayingTimeLock);
   1651     if (mLastStartedRebufferingTimeNs == 0) {
   1652         mLastStartedRebufferingTimeNs = systemTime();
   1653         ALOGV("startRebufferingTimer() time %20" PRId64 "",  mLastStartedRebufferingTimeNs);
   1654     }
   1655 }
   1656 
   1657 void NuPlayer::updateRebufferingTimer(bool stopping, bool exitingPlayback) {
   1658     Mutex::Autolock autoLock(mPlayingTimeLock);
   1659 
   1660     ALOGV("updateRebufferingTimer(%s)  time %20" PRId64 " (exiting %d)",
   1661 	  stopping ? "stop" : "snap", mLastStartedRebufferingTimeNs, exitingPlayback);
   1662 
   1663     if (mLastStartedRebufferingTimeNs != 0) {
   1664         sp<NuPlayerDriver> driver = mDriver.promote();
   1665         int64_t now = systemTime();
   1666         if (driver != NULL) {
   1667             int64_t rebuffered = now - mLastStartedRebufferingTimeNs;
   1668             ALOGV("updateRebufferingTimer()  log  %20" PRId64 "", rebuffered);
   1669 
   1670             if (rebuffered > 0) {
   1671                 driver->notifyMoreRebufferingTimeUs((rebuffered+500)/1000);
   1672                 if (exitingPlayback) {
   1673                     driver->notifyRebufferingWhenExit(true);
   1674                 }
   1675             }
   1676         }
   1677 	if (stopping) {
   1678             mLastStartedRebufferingTimeNs = 0;
   1679 	} else {
   1680             mLastStartedRebufferingTimeNs = now;
   1681 	}
   1682     }
   1683 }
   1684 
   1685 void NuPlayer::updateInternalTimers() {
   1686     // update values, but ticking clocks keep ticking
   1687     ALOGV("updateInternalTimers()");
   1688     updatePlaybackTimer(false /* stopping */, "updateInternalTimers");
   1689     updateRebufferingTimer(false /* stopping */, false /* exiting */);
   1690 }
   1691 
   1692 void NuPlayer::onPause() {
   1693 
   1694     updatePlaybackTimer(true /* stopping */, "onPause");
   1695 
   1696     if (mPaused) {
   1697         return;
   1698     }
   1699     mPaused = true;
   1700     if (mSource != NULL) {
   1701         mSource->pause();
   1702     } else {
   1703         ALOGW("pause called when source is gone or not set");
   1704     }
   1705     if (mRenderer != NULL) {
   1706         mRenderer->pause();
   1707     } else {
   1708         ALOGW("pause called when renderer is gone or not set");
   1709     }
   1710 
   1711 }
   1712 
   1713 bool NuPlayer::audioDecoderStillNeeded() {
   1714     // Audio decoder is no longer needed if it's in shut/shutting down status.
   1715     return ((mFlushingAudio != SHUT_DOWN) && (mFlushingAudio != SHUTTING_DOWN_DECODER));
   1716 }
   1717 
   1718 void NuPlayer::handleFlushComplete(bool audio, bool isDecoder) {
   1719     // We wait for both the decoder flush and the renderer flush to complete
   1720     // before entering either the FLUSHED or the SHUTTING_DOWN_DECODER state.
   1721 
   1722     mFlushComplete[audio][isDecoder] = true;
   1723     if (!mFlushComplete[audio][!isDecoder]) {
   1724         return;
   1725     }
   1726 
   1727     FlushStatus *state = audio ? &mFlushingAudio : &mFlushingVideo;
   1728     switch (*state) {
   1729         case FLUSHING_DECODER:
   1730         {
   1731             *state = FLUSHED;
   1732             break;
   1733         }
   1734 
   1735         case FLUSHING_DECODER_SHUTDOWN:
   1736         {
   1737             *state = SHUTTING_DOWN_DECODER;
   1738 
   1739             ALOGV("initiating %s decoder shutdown", audio ? "audio" : "video");
   1740             getDecoder(audio)->initiateShutdown();
   1741             break;
   1742         }
   1743 
   1744         default:
   1745             // decoder flush completes only occur in a flushing state.
   1746             LOG_ALWAYS_FATAL_IF(isDecoder, "decoder flush in invalid state %d", *state);
   1747             break;
   1748     }
   1749 }
   1750 
   1751 void NuPlayer::finishFlushIfPossible() {
   1752     if (mFlushingAudio != NONE && mFlushingAudio != FLUSHED
   1753             && mFlushingAudio != SHUT_DOWN) {
   1754         return;
   1755     }
   1756 
   1757     if (mFlushingVideo != NONE && mFlushingVideo != FLUSHED
   1758             && mFlushingVideo != SHUT_DOWN) {
   1759         return;
   1760     }
   1761 
   1762     ALOGV("both audio and video are flushed now.");
   1763 
   1764     mFlushingAudio = NONE;
   1765     mFlushingVideo = NONE;
   1766 
   1767     clearFlushComplete();
   1768 
   1769     processDeferredActions();
   1770 }
   1771 
   1772 void NuPlayer::postScanSources() {
   1773     if (mScanSourcesPending) {
   1774         return;
   1775     }
   1776 
   1777     sp<AMessage> msg = new AMessage(kWhatScanSources, this);
   1778     msg->setInt32("generation", mScanSourcesGeneration);
   1779     msg->post();
   1780 
   1781     mScanSourcesPending = true;
   1782 }
   1783 
   1784 void NuPlayer::tryOpenAudioSinkForOffload(
   1785         const sp<AMessage> &format, const sp<MetaData> &audioMeta, bool hasVideo) {
   1786     // Note: This is called early in NuPlayer to determine whether offloading
   1787     // is possible; otherwise the decoders call the renderer openAudioSink directly.
   1788 
   1789     status_t err = mRenderer->openAudioSink(
   1790             format, true /* offloadOnly */, hasVideo,
   1791             AUDIO_OUTPUT_FLAG_NONE, &mOffloadAudio, mSource->isStreaming());
   1792     if (err != OK) {
   1793         // Any failure we turn off mOffloadAudio.
   1794         mOffloadAudio = false;
   1795     } else if (mOffloadAudio) {
   1796         sendMetaDataToHal(mAudioSink, audioMeta);
   1797     }
   1798 }
   1799 
   1800 void NuPlayer::closeAudioSink() {
   1801     mRenderer->closeAudioSink();
   1802 }
   1803 
   1804 void NuPlayer::restartAudio(
   1805         int64_t currentPositionUs, bool forceNonOffload, bool needsToCreateAudioDecoder) {
   1806     ALOGD("restartAudio timeUs(%lld), dontOffload(%d), createDecoder(%d)",
   1807           (long long)currentPositionUs, forceNonOffload, needsToCreateAudioDecoder);
   1808     if (mAudioDecoder != NULL) {
   1809         mAudioDecoder->pause();
   1810         Mutex::Autolock autoLock(mDecoderLock);
   1811         mAudioDecoder.clear();
   1812         mAudioDecoderError = false;
   1813         ++mAudioDecoderGeneration;
   1814     }
   1815     if (mFlushingAudio == FLUSHING_DECODER) {
   1816         mFlushComplete[1 /* audio */][1 /* isDecoder */] = true;
   1817         mFlushingAudio = FLUSHED;
   1818         finishFlushIfPossible();
   1819     } else if (mFlushingAudio == FLUSHING_DECODER_SHUTDOWN
   1820             || mFlushingAudio == SHUTTING_DOWN_DECODER) {
   1821         mFlushComplete[1 /* audio */][1 /* isDecoder */] = true;
   1822         mFlushingAudio = SHUT_DOWN;
   1823         finishFlushIfPossible();
   1824         needsToCreateAudioDecoder = false;
   1825     }
   1826     if (mRenderer == NULL) {
   1827         return;
   1828     }
   1829     closeAudioSink();
   1830     mRenderer->flush(true /* audio */, false /* notifyComplete */);
   1831     if (mVideoDecoder != NULL) {
   1832         mDeferredActions.push_back(
   1833                 new FlushDecoderAction(FLUSH_CMD_NONE /* audio */,
   1834                                        FLUSH_CMD_FLUSH /* video */));
   1835         mDeferredActions.push_back(
   1836                 new SeekAction(currentPositionUs,
   1837                 MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC /* mode */));
   1838         // After a flush without shutdown, decoder is paused.
   1839         // Don't resume it until source seek is done, otherwise it could
   1840         // start pulling stale data too soon.
   1841         mDeferredActions.push_back(new ResumeDecoderAction(false));
   1842         processDeferredActions();
   1843     } else {
   1844         performSeek(currentPositionUs, MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC /* mode */);
   1845     }
   1846 
   1847     if (forceNonOffload) {
   1848         mRenderer->signalDisableOffloadAudio();
   1849         mOffloadAudio = false;
   1850     }
   1851     if (needsToCreateAudioDecoder) {
   1852         instantiateDecoder(true /* audio */, &mAudioDecoder, !forceNonOffload);
   1853     }
   1854 }
   1855 
   1856 void NuPlayer::determineAudioModeChange(const sp<AMessage> &audioFormat) {
   1857     if (mSource == NULL || mAudioSink == NULL) {
   1858         return;
   1859     }
   1860 
   1861     if (mRenderer == NULL) {
   1862         ALOGW("No renderer can be used to determine audio mode. Use non-offload for safety.");
   1863         mOffloadAudio = false;
   1864         return;
   1865     }
   1866 
   1867     sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */);
   1868     sp<AMessage> videoFormat = mSource->getFormat(false /* audio */);
   1869     audio_stream_type_t streamType = mAudioSink->getAudioStreamType();
   1870     const bool hasVideo = (videoFormat != NULL);
   1871     bool canOffload = canOffloadStream(
   1872             audioMeta, hasVideo, mSource->isStreaming(), streamType)
   1873                     && (mPlaybackSettings.mSpeed == 1.f && mPlaybackSettings.mPitch == 1.f);
   1874 
   1875     // Modular DRM: Disabling audio offload if the source is protected
   1876     if (canOffload && mIsDrmProtected) {
   1877         canOffload = false;
   1878         ALOGV("determineAudioModeChange: Disabling mOffloadAudio b/c the source is protected.");
   1879     }
   1880 
   1881     if (canOffload) {
   1882         if (!mOffloadAudio) {
   1883             mRenderer->signalEnableOffloadAudio();
   1884         }
   1885         // open audio sink early under offload mode.
   1886         tryOpenAudioSinkForOffload(audioFormat, audioMeta, hasVideo);
   1887     } else {
   1888         if (mOffloadAudio) {
   1889             mRenderer->signalDisableOffloadAudio();
   1890             mOffloadAudio = false;
   1891         }
   1892     }
   1893 }
   1894 
   1895 status_t NuPlayer::instantiateDecoder(
   1896         bool audio, sp<DecoderBase> *decoder, bool checkAudioModeChange) {
   1897     // The audio decoder could be cleared by tear down. If still in shut down
   1898     // process, no need to create a new audio decoder.
   1899     if (*decoder != NULL || (audio && mFlushingAudio == SHUT_DOWN)) {
   1900         return OK;
   1901     }
   1902 
   1903     sp<AMessage> format = mSource->getFormat(audio);
   1904 
   1905     if (format == NULL) {
   1906         return UNKNOWN_ERROR;
   1907     } else {
   1908         status_t err;
   1909         if (format->findInt32("err", &err) && err) {
   1910             return err;
   1911         }
   1912     }
   1913 
   1914     format->setInt32("priority", 0 /* realtime */);
   1915 
   1916     if (!audio) {
   1917         AString mime;
   1918         CHECK(format->findString("mime", &mime));
   1919 
   1920         sp<AMessage> ccNotify = new AMessage(kWhatClosedCaptionNotify, this);
   1921         if (mCCDecoder == NULL) {
   1922             mCCDecoder = new CCDecoder(ccNotify);
   1923         }
   1924 
   1925         if (mSourceFlags & Source::FLAG_SECURE) {
   1926             format->setInt32("secure", true);
   1927         }
   1928 
   1929         if (mSourceFlags & Source::FLAG_PROTECTED) {
   1930             format->setInt32("protected", true);
   1931         }
   1932 
   1933         float rate = getFrameRate();
   1934         if (rate > 0) {
   1935             format->setFloat("operating-rate", rate * mPlaybackSettings.mSpeed);
   1936         }
   1937     }
   1938 
   1939     Mutex::Autolock autoLock(mDecoderLock);
   1940 
   1941     if (audio) {
   1942         sp<AMessage> notify = new AMessage(kWhatAudioNotify, this);
   1943         ++mAudioDecoderGeneration;
   1944         notify->setInt32("generation", mAudioDecoderGeneration);
   1945 
   1946         if (checkAudioModeChange) {
   1947             determineAudioModeChange(format);
   1948         }
   1949         if (mOffloadAudio) {
   1950             mSource->setOffloadAudio(true /* offload */);
   1951 
   1952             const bool hasVideo = (mSource->getFormat(false /*audio */) != NULL);
   1953             format->setInt32("has-video", hasVideo);
   1954             *decoder = new DecoderPassThrough(notify, mSource, mRenderer);
   1955             ALOGV("instantiateDecoder audio DecoderPassThrough  hasVideo: %d", hasVideo);
   1956         } else {
   1957             mSource->setOffloadAudio(false /* offload */);
   1958 
   1959             *decoder = new Decoder(notify, mSource, mPID, mUID, mRenderer);
   1960             ALOGV("instantiateDecoder audio Decoder");
   1961         }
   1962         mAudioDecoderError = false;
   1963     } else {
   1964         sp<AMessage> notify = new AMessage(kWhatVideoNotify, this);
   1965         ++mVideoDecoderGeneration;
   1966         notify->setInt32("generation", mVideoDecoderGeneration);
   1967 
   1968         *decoder = new Decoder(
   1969                 notify, mSource, mPID, mUID, mRenderer, mSurface, mCCDecoder);
   1970         mVideoDecoderError = false;
   1971 
   1972         // enable FRC if high-quality AV sync is requested, even if not
   1973         // directly queuing to display, as this will even improve textureview
   1974         // playback.
   1975         {
   1976             if (property_get_bool("persist.sys.media.avsync", false)) {
   1977                 format->setInt32("auto-frc", 1);
   1978             }
   1979         }
   1980     }
   1981     (*decoder)->init();
   1982 
   1983     // Modular DRM
   1984     if (mIsDrmProtected) {
   1985         format->setPointer("crypto", mCrypto.get());
   1986         ALOGV("instantiateDecoder: mCrypto: %p (%d) isSecure: %d", mCrypto.get(),
   1987                 (mCrypto != NULL ? mCrypto->getStrongCount() : 0),
   1988                 (mSourceFlags & Source::FLAG_SECURE) != 0);
   1989     }
   1990 
   1991     (*decoder)->configure(format);
   1992 
   1993     if (!audio) {
   1994         sp<AMessage> params = new AMessage();
   1995         float rate = getFrameRate();
   1996         if (rate > 0) {
   1997             params->setFloat("frame-rate-total", rate);
   1998         }
   1999 
   2000         sp<MetaData> fileMeta = getFileMeta();
   2001         if (fileMeta != NULL) {
   2002             int32_t videoTemporalLayerCount;
   2003             if (fileMeta->findInt32(kKeyTemporalLayerCount, &videoTemporalLayerCount)
   2004                     && videoTemporalLayerCount > 0) {
   2005                 params->setInt32("temporal-layer-count", videoTemporalLayerCount);
   2006             }
   2007         }
   2008 
   2009         if (params->countEntries() > 0) {
   2010             (*decoder)->setParameters(params);
   2011         }
   2012     }
   2013     return OK;
   2014 }
   2015 
   2016 void NuPlayer::updateVideoSize(
   2017         const sp<AMessage> &inputFormat,
   2018         const sp<AMessage> &outputFormat) {
   2019     if (inputFormat == NULL) {
   2020         ALOGW("Unknown video size, reporting 0x0!");
   2021         notifyListener(MEDIA_SET_VIDEO_SIZE, 0, 0);
   2022         return;
   2023     }
   2024     int32_t err = OK;
   2025     inputFormat->findInt32("err", &err);
   2026     if (err == -EWOULDBLOCK) {
   2027         ALOGW("Video meta is not available yet!");
   2028         return;
   2029     }
   2030     if (err != OK) {
   2031         ALOGW("Something is wrong with video meta!");
   2032         return;
   2033     }
   2034 
   2035     int32_t displayWidth, displayHeight;
   2036     if (outputFormat != NULL) {
   2037         int32_t width, height;
   2038         CHECK(outputFormat->findInt32("width", &width));
   2039         CHECK(outputFormat->findInt32("height", &height));
   2040 
   2041         int32_t cropLeft, cropTop, cropRight, cropBottom;
   2042         CHECK(outputFormat->findRect(
   2043                     "crop",
   2044                     &cropLeft, &cropTop, &cropRight, &cropBottom));
   2045 
   2046         displayWidth = cropRight - cropLeft + 1;
   2047         displayHeight = cropBottom - cropTop + 1;
   2048 
   2049         ALOGV("Video output format changed to %d x %d "
   2050              "(crop: %d x %d @ (%d, %d))",
   2051              width, height,
   2052              displayWidth,
   2053              displayHeight,
   2054              cropLeft, cropTop);
   2055     } else {
   2056         CHECK(inputFormat->findInt32("width", &displayWidth));
   2057         CHECK(inputFormat->findInt32("height", &displayHeight));
   2058 
   2059         ALOGV("Video input format %d x %d", displayWidth, displayHeight);
   2060     }
   2061 
   2062     // Take into account sample aspect ratio if necessary:
   2063     int32_t sarWidth, sarHeight;
   2064     if (inputFormat->findInt32("sar-width", &sarWidth)
   2065             && inputFormat->findInt32("sar-height", &sarHeight)
   2066             && sarWidth > 0 && sarHeight > 0) {
   2067         ALOGV("Sample aspect ratio %d : %d", sarWidth, sarHeight);
   2068 
   2069         displayWidth = (displayWidth * sarWidth) / sarHeight;
   2070 
   2071         ALOGV("display dimensions %d x %d", displayWidth, displayHeight);
   2072     } else {
   2073         int32_t width, height;
   2074         if (inputFormat->findInt32("display-width", &width)
   2075                 && inputFormat->findInt32("display-height", &height)
   2076                 && width > 0 && height > 0
   2077                 && displayWidth > 0 && displayHeight > 0) {
   2078             if (displayHeight * (int64_t)width / height > (int64_t)displayWidth) {
   2079                 displayHeight = (int32_t)(displayWidth * (int64_t)height / width);
   2080             } else {
   2081                 displayWidth = (int32_t)(displayHeight * (int64_t)width / height);
   2082             }
   2083             ALOGV("Video display width and height are overridden to %d x %d",
   2084                  displayWidth, displayHeight);
   2085         }
   2086     }
   2087 
   2088     int32_t rotationDegrees;
   2089     if (!inputFormat->findInt32("rotation-degrees", &rotationDegrees)) {
   2090         rotationDegrees = 0;
   2091     }
   2092 
   2093     if (rotationDegrees == 90 || rotationDegrees == 270) {
   2094         int32_t tmp = displayWidth;
   2095         displayWidth = displayHeight;
   2096         displayHeight = tmp;
   2097     }
   2098 
   2099     notifyListener(
   2100             MEDIA_SET_VIDEO_SIZE,
   2101             displayWidth,
   2102             displayHeight);
   2103 }
   2104 
   2105 void NuPlayer::notifyListener(int msg, int ext1, int ext2, const Parcel *in) {
   2106     if (mDriver == NULL) {
   2107         return;
   2108     }
   2109 
   2110     sp<NuPlayerDriver> driver = mDriver.promote();
   2111 
   2112     if (driver == NULL) {
   2113         return;
   2114     }
   2115 
   2116     driver->notifyListener(msg, ext1, ext2, in);
   2117 }
   2118 
   2119 void NuPlayer::flushDecoder(bool audio, bool needShutdown) {
   2120     ALOGV("[%s] flushDecoder needShutdown=%d",
   2121           audio ? "audio" : "video", needShutdown);
   2122 
   2123     const sp<DecoderBase> &decoder = getDecoder(audio);
   2124     if (decoder == NULL) {
   2125         ALOGI("flushDecoder %s without decoder present",
   2126              audio ? "audio" : "video");
   2127         return;
   2128     }
   2129 
   2130     // Make sure we don't continue to scan sources until we finish flushing.
   2131     ++mScanSourcesGeneration;
   2132     if (mScanSourcesPending) {
   2133         if (!needShutdown) {
   2134             mDeferredActions.push_back(
   2135                     new SimpleAction(&NuPlayer::performScanSources));
   2136         }
   2137         mScanSourcesPending = false;
   2138     }
   2139 
   2140     decoder->signalFlush();
   2141 
   2142     FlushStatus newStatus =
   2143         needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
   2144 
   2145     mFlushComplete[audio][false /* isDecoder */] = (mRenderer == NULL);
   2146     mFlushComplete[audio][true /* isDecoder */] = false;
   2147     if (audio) {
   2148         ALOGE_IF(mFlushingAudio != NONE,
   2149                 "audio flushDecoder() is called in state %d", mFlushingAudio);
   2150         mFlushingAudio = newStatus;
   2151     } else {
   2152         ALOGE_IF(mFlushingVideo != NONE,
   2153                 "video flushDecoder() is called in state %d", mFlushingVideo);
   2154         mFlushingVideo = newStatus;
   2155     }
   2156 }
   2157 
   2158 void NuPlayer::queueDecoderShutdown(
   2159         bool audio, bool video, const sp<AMessage> &reply) {
   2160     ALOGI("queueDecoderShutdown audio=%d, video=%d", audio, video);
   2161 
   2162     mDeferredActions.push_back(
   2163             new FlushDecoderAction(
   2164                 audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE,
   2165                 video ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE));
   2166 
   2167     mDeferredActions.push_back(
   2168             new SimpleAction(&NuPlayer::performScanSources));
   2169 
   2170     mDeferredActions.push_back(new PostMessageAction(reply));
   2171 
   2172     processDeferredActions();
   2173 }
   2174 
   2175 status_t NuPlayer::setVideoScalingMode(int32_t mode) {
   2176     mVideoScalingMode = mode;
   2177     if (mSurface != NULL) {
   2178         status_t ret = native_window_set_scaling_mode(mSurface.get(), mVideoScalingMode);
   2179         if (ret != OK) {
   2180             ALOGE("Failed to set scaling mode (%d): %s",
   2181                 -ret, strerror(-ret));
   2182             return ret;
   2183         }
   2184     }
   2185     return OK;
   2186 }
   2187 
   2188 status_t NuPlayer::getTrackInfo(Parcel* reply) const {
   2189     sp<AMessage> msg = new AMessage(kWhatGetTrackInfo, this);
   2190     msg->setPointer("reply", reply);
   2191 
   2192     sp<AMessage> response;
   2193     status_t err = msg->postAndAwaitResponse(&response);
   2194     return err;
   2195 }
   2196 
   2197 status_t NuPlayer::getSelectedTrack(int32_t type, Parcel* reply) const {
   2198     sp<AMessage> msg = new AMessage(kWhatGetSelectedTrack, this);
   2199     msg->setPointer("reply", reply);
   2200     msg->setInt32("type", type);
   2201 
   2202     sp<AMessage> response;
   2203     status_t err = msg->postAndAwaitResponse(&response);
   2204     if (err == OK && response != NULL) {
   2205         CHECK(response->findInt32("err", &err));
   2206     }
   2207     return err;
   2208 }
   2209 
   2210 status_t NuPlayer::selectTrack(size_t trackIndex, bool select, int64_t timeUs) {
   2211     sp<AMessage> msg = new AMessage(kWhatSelectTrack, this);
   2212     msg->setSize("trackIndex", trackIndex);
   2213     msg->setInt32("select", select);
   2214     msg->setInt64("timeUs", timeUs);
   2215 
   2216     sp<AMessage> response;
   2217     status_t err = msg->postAndAwaitResponse(&response);
   2218 
   2219     if (err != OK) {
   2220         return err;
   2221     }
   2222 
   2223     if (!response->findInt32("err", &err)) {
   2224         err = OK;
   2225     }
   2226 
   2227     return err;
   2228 }
   2229 
   2230 status_t NuPlayer::getCurrentPosition(int64_t *mediaUs) {
   2231     sp<Renderer> renderer = mRenderer;
   2232     if (renderer == NULL) {
   2233         return NO_INIT;
   2234     }
   2235 
   2236     return renderer->getCurrentPosition(mediaUs);
   2237 }
   2238 
   2239 void NuPlayer::getStats(Vector<sp<AMessage> > *trackStats) {
   2240     CHECK(trackStats != NULL);
   2241 
   2242     trackStats->clear();
   2243 
   2244     Mutex::Autolock autoLock(mDecoderLock);
   2245     if (mVideoDecoder != NULL) {
   2246         trackStats->push_back(mVideoDecoder->getStats());
   2247     }
   2248     if (mAudioDecoder != NULL) {
   2249         trackStats->push_back(mAudioDecoder->getStats());
   2250     }
   2251 }
   2252 
   2253 sp<MetaData> NuPlayer::getFileMeta() {
   2254     return mSource->getFileFormatMeta();
   2255 }
   2256 
   2257 float NuPlayer::getFrameRate() {
   2258     sp<MetaData> meta = mSource->getFormatMeta(false /* audio */);
   2259     if (meta == NULL) {
   2260         return 0;
   2261     }
   2262     int32_t rate;
   2263     if (!meta->findInt32(kKeyFrameRate, &rate)) {
   2264         // fall back to try file meta
   2265         sp<MetaData> fileMeta = getFileMeta();
   2266         if (fileMeta == NULL) {
   2267             ALOGW("source has video meta but not file meta");
   2268             return -1;
   2269         }
   2270         int32_t fileMetaRate;
   2271         if (!fileMeta->findInt32(kKeyFrameRate, &fileMetaRate)) {
   2272             return -1;
   2273         }
   2274         return fileMetaRate;
   2275     }
   2276     return rate;
   2277 }
   2278 
   2279 void NuPlayer::schedulePollDuration() {
   2280     sp<AMessage> msg = new AMessage(kWhatPollDuration, this);
   2281     msg->setInt32("generation", mPollDurationGeneration);
   2282     msg->post();
   2283 }
   2284 
   2285 void NuPlayer::cancelPollDuration() {
   2286     ++mPollDurationGeneration;
   2287 }
   2288 
   2289 void NuPlayer::processDeferredActions() {
   2290     while (!mDeferredActions.empty()) {
   2291         // We won't execute any deferred actions until we're no longer in
   2292         // an intermediate state, i.e. one more more decoders are currently
   2293         // flushing or shutting down.
   2294 
   2295         if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
   2296             // We're currently flushing, postpone the reset until that's
   2297             // completed.
   2298 
   2299             ALOGV("postponing action mFlushingAudio=%d, mFlushingVideo=%d",
   2300                   mFlushingAudio, mFlushingVideo);
   2301 
   2302             break;
   2303         }
   2304 
   2305         sp<Action> action = *mDeferredActions.begin();
   2306         mDeferredActions.erase(mDeferredActions.begin());
   2307 
   2308         action->execute(this);
   2309     }
   2310 }
   2311 
   2312 void NuPlayer::performSeek(int64_t seekTimeUs, MediaPlayerSeekMode mode) {
   2313     ALOGV("performSeek seekTimeUs=%lld us (%.2f secs), mode=%d",
   2314           (long long)seekTimeUs, seekTimeUs / 1E6, mode);
   2315 
   2316     if (mSource == NULL) {
   2317         // This happens when reset occurs right before the loop mode
   2318         // asynchronously seeks to the start of the stream.
   2319         LOG_ALWAYS_FATAL_IF(mAudioDecoder != NULL || mVideoDecoder != NULL,
   2320                 "mSource is NULL and decoders not NULL audio(%p) video(%p)",
   2321                 mAudioDecoder.get(), mVideoDecoder.get());
   2322         return;
   2323     }
   2324     mPreviousSeekTimeUs = seekTimeUs;
   2325     mSource->seekTo(seekTimeUs, mode);
   2326     ++mTimedTextGeneration;
   2327 
   2328     // everything's flushed, continue playback.
   2329 }
   2330 
   2331 void NuPlayer::performDecoderFlush(FlushCommand audio, FlushCommand video) {
   2332     ALOGV("performDecoderFlush audio=%d, video=%d", audio, video);
   2333 
   2334     if ((audio == FLUSH_CMD_NONE || mAudioDecoder == NULL)
   2335             && (video == FLUSH_CMD_NONE || mVideoDecoder == NULL)) {
   2336         return;
   2337     }
   2338 
   2339     if (audio != FLUSH_CMD_NONE && mAudioDecoder != NULL) {
   2340         flushDecoder(true /* audio */, (audio == FLUSH_CMD_SHUTDOWN));
   2341     }
   2342 
   2343     if (video != FLUSH_CMD_NONE && mVideoDecoder != NULL) {
   2344         flushDecoder(false /* audio */, (video == FLUSH_CMD_SHUTDOWN));
   2345     }
   2346 }
   2347 
   2348 void NuPlayer::performReset() {
   2349     ALOGV("performReset");
   2350 
   2351     CHECK(mAudioDecoder == NULL);
   2352     CHECK(mVideoDecoder == NULL);
   2353 
   2354     updatePlaybackTimer(true /* stopping */, "performReset");
   2355     updateRebufferingTimer(true /* stopping */, true /* exiting */);
   2356 
   2357     cancelPollDuration();
   2358 
   2359     ++mScanSourcesGeneration;
   2360     mScanSourcesPending = false;
   2361 
   2362     if (mRendererLooper != NULL) {
   2363         if (mRenderer != NULL) {
   2364             mRendererLooper->unregisterHandler(mRenderer->id());
   2365         }
   2366         mRendererLooper->stop();
   2367         mRendererLooper.clear();
   2368     }
   2369     mRenderer.clear();
   2370     ++mRendererGeneration;
   2371 
   2372     if (mSource != NULL) {
   2373         mSource->stop();
   2374 
   2375         Mutex::Autolock autoLock(mSourceLock);
   2376         mSource.clear();
   2377     }
   2378 
   2379     if (mDriver != NULL) {
   2380         sp<NuPlayerDriver> driver = mDriver.promote();
   2381         if (driver != NULL) {
   2382             driver->notifyResetComplete();
   2383         }
   2384     }
   2385 
   2386     mStarted = false;
   2387     mPrepared = false;
   2388     mResetting = false;
   2389     mSourceStarted = false;
   2390 
   2391     // Modular DRM
   2392     if (mCrypto != NULL) {
   2393         // decoders will be flushed before this so their mCrypto would go away on their own
   2394         // TODO change to ALOGV
   2395         ALOGD("performReset mCrypto: %p (%d)", mCrypto.get(),
   2396                 (mCrypto != NULL ? mCrypto->getStrongCount() : 0));
   2397         mCrypto.clear();
   2398     }
   2399     mIsDrmProtected = false;
   2400 }
   2401 
   2402 void NuPlayer::performScanSources() {
   2403     ALOGV("performScanSources");
   2404 
   2405     if (!mStarted) {
   2406         return;
   2407     }
   2408 
   2409     if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
   2410         postScanSources();
   2411     }
   2412 }
   2413 
   2414 void NuPlayer::performSetSurface(const sp<Surface> &surface) {
   2415     ALOGV("performSetSurface");
   2416 
   2417     mSurface = surface;
   2418 
   2419     // XXX - ignore error from setVideoScalingMode for now
   2420     setVideoScalingMode(mVideoScalingMode);
   2421 
   2422     if (mDriver != NULL) {
   2423         sp<NuPlayerDriver> driver = mDriver.promote();
   2424         if (driver != NULL) {
   2425             driver->notifySetSurfaceComplete();
   2426         }
   2427     }
   2428 }
   2429 
   2430 void NuPlayer::performResumeDecoders(bool needNotify) {
   2431     if (needNotify) {
   2432         mResumePending = true;
   2433         if (mVideoDecoder == NULL) {
   2434             // if audio-only, we can notify seek complete now,
   2435             // as the resume operation will be relatively fast.
   2436             finishResume();
   2437         }
   2438     }
   2439 
   2440     if (mVideoDecoder != NULL) {
   2441         // When there is continuous seek, MediaPlayer will cache the seek
   2442         // position, and send down new seek request when previous seek is
   2443         // complete. Let's wait for at least one video output frame before
   2444         // notifying seek complete, so that the video thumbnail gets updated
   2445         // when seekbar is dragged.
   2446         mVideoDecoder->signalResume(needNotify);
   2447     }
   2448 
   2449     if (mAudioDecoder != NULL) {
   2450         mAudioDecoder->signalResume(false /* needNotify */);
   2451     }
   2452 }
   2453 
   2454 void NuPlayer::finishResume() {
   2455     if (mResumePending) {
   2456         mResumePending = false;
   2457         notifyDriverSeekComplete();
   2458     }
   2459 }
   2460 
   2461 void NuPlayer::notifyDriverSeekComplete() {
   2462     if (mDriver != NULL) {
   2463         sp<NuPlayerDriver> driver = mDriver.promote();
   2464         if (driver != NULL) {
   2465             driver->notifySeekComplete();
   2466         }
   2467     }
   2468 }
   2469 
   2470 void NuPlayer::onSourceNotify(const sp<AMessage> &msg) {
   2471     int32_t what;
   2472     CHECK(msg->findInt32("what", &what));
   2473 
   2474     switch (what) {
   2475         case Source::kWhatInstantiateSecureDecoders:
   2476         {
   2477             if (mSource == NULL) {
   2478                 // This is a stale notification from a source that was
   2479                 // asynchronously preparing when the client called reset().
   2480                 // We handled the reset, the source is gone.
   2481                 break;
   2482             }
   2483 
   2484             sp<AMessage> reply;
   2485             CHECK(msg->findMessage("reply", &reply));
   2486             status_t err = onInstantiateSecureDecoders();
   2487             reply->setInt32("err", err);
   2488             reply->post();
   2489             break;
   2490         }
   2491 
   2492         case Source::kWhatPrepared:
   2493         {
   2494             ALOGV("NuPlayer::onSourceNotify Source::kWhatPrepared source: %p", mSource.get());
   2495             if (mSource == NULL) {
   2496                 // This is a stale notification from a source that was
   2497                 // asynchronously preparing when the client called reset().
   2498                 // We handled the reset, the source is gone.
   2499                 break;
   2500             }
   2501 
   2502             int32_t err;
   2503             CHECK(msg->findInt32("err", &err));
   2504 
   2505             if (err != OK) {
   2506                 // shut down potential secure codecs in case client never calls reset
   2507                 mDeferredActions.push_back(
   2508                         new FlushDecoderAction(FLUSH_CMD_SHUTDOWN /* audio */,
   2509                                                FLUSH_CMD_SHUTDOWN /* video */));
   2510                 processDeferredActions();
   2511             } else {
   2512                 mPrepared = true;
   2513             }
   2514 
   2515             sp<NuPlayerDriver> driver = mDriver.promote();
   2516             if (driver != NULL) {
   2517                 // notify duration first, so that it's definitely set when
   2518                 // the app received the "prepare complete" callback.
   2519                 int64_t durationUs;
   2520                 if (mSource->getDuration(&durationUs) == OK) {
   2521                     driver->notifyDuration(durationUs);
   2522                 }
   2523                 driver->notifyPrepareCompleted(err);
   2524             }
   2525 
   2526             break;
   2527         }
   2528 
   2529         // Modular DRM
   2530         case Source::kWhatDrmInfo:
   2531         {
   2532             Parcel parcel;
   2533             sp<ABuffer> drmInfo;
   2534             CHECK(msg->findBuffer("drmInfo", &drmInfo));
   2535             parcel.setData(drmInfo->data(), drmInfo->size());
   2536 
   2537             ALOGV("onSourceNotify() kWhatDrmInfo MEDIA_DRM_INFO drmInfo: %p  parcel size: %zu",
   2538                     drmInfo.get(), parcel.dataSize());
   2539 
   2540             notifyListener(MEDIA_DRM_INFO, 0 /* ext1 */, 0 /* ext2 */, &parcel);
   2541 
   2542             break;
   2543         }
   2544 
   2545         case Source::kWhatFlagsChanged:
   2546         {
   2547             uint32_t flags;
   2548             CHECK(msg->findInt32("flags", (int32_t *)&flags));
   2549 
   2550             sp<NuPlayerDriver> driver = mDriver.promote();
   2551             if (driver != NULL) {
   2552 
   2553                 ALOGV("onSourceNotify() kWhatFlagsChanged  FLAG_CAN_PAUSE: %d  "
   2554                         "FLAG_CAN_SEEK_BACKWARD: %d \n\t\t\t\t FLAG_CAN_SEEK_FORWARD: %d  "
   2555                         "FLAG_CAN_SEEK: %d  FLAG_DYNAMIC_DURATION: %d \n"
   2556                         "\t\t\t\t FLAG_SECURE: %d  FLAG_PROTECTED: %d",
   2557                         (flags & Source::FLAG_CAN_PAUSE) != 0,
   2558                         (flags & Source::FLAG_CAN_SEEK_BACKWARD) != 0,
   2559                         (flags & Source::FLAG_CAN_SEEK_FORWARD) != 0,
   2560                         (flags & Source::FLAG_CAN_SEEK) != 0,
   2561                         (flags & Source::FLAG_DYNAMIC_DURATION) != 0,
   2562                         (flags & Source::FLAG_SECURE) != 0,
   2563                         (flags & Source::FLAG_PROTECTED) != 0);
   2564 
   2565                 if ((flags & NuPlayer::Source::FLAG_CAN_SEEK) == 0) {
   2566                     driver->notifyListener(
   2567                             MEDIA_INFO, MEDIA_INFO_NOT_SEEKABLE, 0);
   2568                 }
   2569                 driver->notifyFlagsChanged(flags);
   2570             }
   2571 
   2572             if ((mSourceFlags & Source::FLAG_DYNAMIC_DURATION)
   2573                     && (!(flags & Source::FLAG_DYNAMIC_DURATION))) {
   2574                 cancelPollDuration();
   2575             } else if (!(mSourceFlags & Source::FLAG_DYNAMIC_DURATION)
   2576                     && (flags & Source::FLAG_DYNAMIC_DURATION)
   2577                     && (mAudioDecoder != NULL || mVideoDecoder != NULL)) {
   2578                 schedulePollDuration();
   2579             }
   2580 
   2581             mSourceFlags = flags;
   2582             break;
   2583         }
   2584 
   2585         case Source::kWhatVideoSizeChanged:
   2586         {
   2587             sp<AMessage> format;
   2588             CHECK(msg->findMessage("format", &format));
   2589 
   2590             updateVideoSize(format);
   2591             break;
   2592         }
   2593 
   2594         case Source::kWhatBufferingUpdate:
   2595         {
   2596             int32_t percentage;
   2597             CHECK(msg->findInt32("percentage", &percentage));
   2598 
   2599             notifyListener(MEDIA_BUFFERING_UPDATE, percentage, 0);
   2600             break;
   2601         }
   2602 
   2603         case Source::kWhatPauseOnBufferingStart:
   2604         {
   2605             // ignore if not playing
   2606             if (mStarted) {
   2607                 ALOGI("buffer low, pausing...");
   2608 
   2609                 startRebufferingTimer();
   2610                 mPausedForBuffering = true;
   2611                 onPause();
   2612             }
   2613             notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_START, 0);
   2614             break;
   2615         }
   2616 
   2617         case Source::kWhatResumeOnBufferingEnd:
   2618         {
   2619             // ignore if not playing
   2620             if (mStarted) {
   2621                 ALOGI("buffer ready, resuming...");
   2622 
   2623                 updateRebufferingTimer(true /* stopping */, false /* exiting */);
   2624                 mPausedForBuffering = false;
   2625 
   2626                 // do not resume yet if client didn't unpause
   2627                 if (!mPausedByClient) {
   2628                     onResume();
   2629                 }
   2630             }
   2631             notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_END, 0);
   2632             break;
   2633         }
   2634 
   2635         case Source::kWhatCacheStats:
   2636         {
   2637             int32_t kbps;
   2638             CHECK(msg->findInt32("bandwidth", &kbps));
   2639 
   2640             notifyListener(MEDIA_INFO, MEDIA_INFO_NETWORK_BANDWIDTH, kbps);
   2641             break;
   2642         }
   2643 
   2644         case Source::kWhatSubtitleData:
   2645         {
   2646             sp<ABuffer> buffer;
   2647             CHECK(msg->findBuffer("buffer", &buffer));
   2648 
   2649             sendSubtitleData(buffer, 0 /* baseIndex */);
   2650             break;
   2651         }
   2652 
   2653         case Source::kWhatTimedMetaData:
   2654         {
   2655             sp<ABuffer> buffer;
   2656             if (!msg->findBuffer("buffer", &buffer)) {
   2657                 notifyListener(MEDIA_INFO, MEDIA_INFO_METADATA_UPDATE, 0);
   2658             } else {
   2659                 sendTimedMetaData(buffer);
   2660             }
   2661             break;
   2662         }
   2663 
   2664         case Source::kWhatTimedTextData:
   2665         {
   2666             int32_t generation;
   2667             if (msg->findInt32("generation", &generation)
   2668                     && generation != mTimedTextGeneration) {
   2669                 break;
   2670             }
   2671 
   2672             sp<ABuffer> buffer;
   2673             CHECK(msg->findBuffer("buffer", &buffer));
   2674 
   2675             sp<NuPlayerDriver> driver = mDriver.promote();
   2676             if (driver == NULL) {
   2677                 break;
   2678             }
   2679 
   2680             int posMs;
   2681             int64_t timeUs, posUs;
   2682             driver->getCurrentPosition(&posMs);
   2683             posUs = (int64_t) posMs * 1000LL;
   2684             CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
   2685 
   2686             if (posUs < timeUs) {
   2687                 if (!msg->findInt32("generation", &generation)) {
   2688                     msg->setInt32("generation", mTimedTextGeneration);
   2689                 }
   2690                 msg->post(timeUs - posUs);
   2691             } else {
   2692                 sendTimedTextData(buffer);
   2693             }
   2694             break;
   2695         }
   2696 
   2697         case Source::kWhatQueueDecoderShutdown:
   2698         {
   2699             int32_t audio, video;
   2700             CHECK(msg->findInt32("audio", &audio));
   2701             CHECK(msg->findInt32("video", &video));
   2702 
   2703             sp<AMessage> reply;
   2704             CHECK(msg->findMessage("reply", &reply));
   2705 
   2706             queueDecoderShutdown(audio, video, reply);
   2707             break;
   2708         }
   2709 
   2710         case Source::kWhatDrmNoLicense:
   2711         {
   2712             notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE);
   2713             break;
   2714         }
   2715 
   2716         default:
   2717             TRESPASS();
   2718     }
   2719 }
   2720 
   2721 void NuPlayer::onClosedCaptionNotify(const sp<AMessage> &msg) {
   2722     int32_t what;
   2723     CHECK(msg->findInt32("what", &what));
   2724 
   2725     switch (what) {
   2726         case NuPlayer::CCDecoder::kWhatClosedCaptionData:
   2727         {
   2728             sp<ABuffer> buffer;
   2729             CHECK(msg->findBuffer("buffer", &buffer));
   2730 
   2731             size_t inbandTracks = 0;
   2732             if (mSource != NULL) {
   2733                 inbandTracks = mSource->getTrackCount();
   2734             }
   2735 
   2736             sendSubtitleData(buffer, inbandTracks);
   2737             break;
   2738         }
   2739 
   2740         case NuPlayer::CCDecoder::kWhatTrackAdded:
   2741         {
   2742             notifyListener(MEDIA_INFO, MEDIA_INFO_METADATA_UPDATE, 0);
   2743 
   2744             break;
   2745         }
   2746 
   2747         default:
   2748             TRESPASS();
   2749     }
   2750 
   2751 
   2752 }
   2753 
   2754 void NuPlayer::sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex) {
   2755     int32_t trackIndex;
   2756     int64_t timeUs, durationUs;
   2757     CHECK(buffer->meta()->findInt32("track-index", &trackIndex));
   2758     CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
   2759     CHECK(buffer->meta()->findInt64("durationUs", &durationUs));
   2760 
   2761     Parcel in;
   2762     in.writeInt32(trackIndex + baseIndex);
   2763     in.writeInt64(timeUs);
   2764     in.writeInt64(durationUs);
   2765     in.writeInt32(buffer->size());
   2766     in.writeInt32(buffer->size());
   2767     in.write(buffer->data(), buffer->size());
   2768 
   2769     notifyListener(MEDIA_SUBTITLE_DATA, 0, 0, &in);
   2770 }
   2771 
   2772 void NuPlayer::sendTimedMetaData(const sp<ABuffer> &buffer) {
   2773     int64_t timeUs;
   2774     CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
   2775 
   2776     Parcel in;
   2777     in.writeInt64(timeUs);
   2778     in.writeInt32(buffer->size());
   2779     in.writeInt32(buffer->size());
   2780     in.write(buffer->data(), buffer->size());
   2781 
   2782     notifyListener(MEDIA_META_DATA, 0, 0, &in);
   2783 }
   2784 
   2785 void NuPlayer::sendTimedTextData(const sp<ABuffer> &buffer) {
   2786     const void *data;
   2787     size_t size = 0;
   2788     int64_t timeUs;
   2789     int32_t flag = TextDescriptions::IN_BAND_TEXT_3GPP;
   2790 
   2791     AString mime;
   2792     CHECK(buffer->meta()->findString("mime", &mime));
   2793     CHECK(strcasecmp(mime.c_str(), MEDIA_MIMETYPE_TEXT_3GPP) == 0);
   2794 
   2795     data = buffer->data();
   2796     size = buffer->size();
   2797 
   2798     Parcel parcel;
   2799     if (size > 0) {
   2800         CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
   2801         int32_t global = 0;
   2802         if (buffer->meta()->findInt32("global", &global) && global) {
   2803             flag |= TextDescriptions::GLOBAL_DESCRIPTIONS;
   2804         } else {
   2805             flag |= TextDescriptions::LOCAL_DESCRIPTIONS;
   2806         }
   2807         TextDescriptions::getParcelOfDescriptions(
   2808                 (const uint8_t *)data, size, flag, timeUs / 1000, &parcel);
   2809     }
   2810 
   2811     if ((parcel.dataSize() > 0)) {
   2812         notifyListener(MEDIA_TIMED_TEXT, 0, 0, &parcel);
   2813     } else {  // send an empty timed text
   2814         notifyListener(MEDIA_TIMED_TEXT, 0, 0);
   2815     }
   2816 }
   2817 
   2818 const char *NuPlayer::getDataSourceType() {
   2819     switch (mDataSourceType) {
   2820         case DATA_SOURCE_TYPE_HTTP_LIVE:
   2821             return "HTTPLive";
   2822 
   2823         case DATA_SOURCE_TYPE_RTSP:
   2824             return "RTSP";
   2825 
   2826         case DATA_SOURCE_TYPE_GENERIC_URL:
   2827             return "GenURL";
   2828 
   2829         case DATA_SOURCE_TYPE_GENERIC_FD:
   2830             return "GenFD";
   2831 
   2832         case DATA_SOURCE_TYPE_MEDIA:
   2833             return "Media";
   2834 
   2835         case DATA_SOURCE_TYPE_STREAM:
   2836             return "Stream";
   2837 
   2838         case DATA_SOURCE_TYPE_NONE:
   2839         default:
   2840             return "None";
   2841     }
   2842  }
   2843 
   2844 // Modular DRM begin
   2845 status_t NuPlayer::prepareDrm(const uint8_t uuid[16], const Vector<uint8_t> &drmSessionId)
   2846 {
   2847     ALOGV("prepareDrm ");
   2848 
   2849     // Passing to the looper anyway; called in a pre-config prepared state so no race on mCrypto
   2850     sp<AMessage> msg = new AMessage(kWhatPrepareDrm, this);
   2851     // synchronous call so just passing the address but with local copies of "const" args
   2852     uint8_t UUID[16];
   2853     memcpy(UUID, uuid, sizeof(UUID));
   2854     Vector<uint8_t> sessionId = drmSessionId;
   2855     msg->setPointer("uuid", (void*)UUID);
   2856     msg->setPointer("drmSessionId", (void*)&sessionId);
   2857 
   2858     sp<AMessage> response;
   2859     status_t status = msg->postAndAwaitResponse(&response);
   2860 
   2861     if (status == OK && response != NULL) {
   2862         CHECK(response->findInt32("status", &status));
   2863         ALOGV("prepareDrm ret: %d ", status);
   2864     } else {
   2865         ALOGE("prepareDrm err: %d", status);
   2866     }
   2867 
   2868     return status;
   2869 }
   2870 
   2871 status_t NuPlayer::releaseDrm()
   2872 {
   2873     ALOGV("releaseDrm ");
   2874 
   2875     sp<AMessage> msg = new AMessage(kWhatReleaseDrm, this);
   2876 
   2877     sp<AMessage> response;
   2878     status_t status = msg->postAndAwaitResponse(&response);
   2879 
   2880     if (status == OK && response != NULL) {
   2881         CHECK(response->findInt32("status", &status));
   2882         ALOGV("releaseDrm ret: %d ", status);
   2883     } else {
   2884         ALOGE("releaseDrm err: %d", status);
   2885     }
   2886 
   2887     return status;
   2888 }
   2889 
   2890 status_t NuPlayer::onPrepareDrm(const sp<AMessage> &msg)
   2891 {
   2892     // TODO change to ALOGV
   2893     ALOGD("onPrepareDrm ");
   2894 
   2895     status_t status = INVALID_OPERATION;
   2896     if (mSource == NULL) {
   2897         ALOGE("onPrepareDrm: No source. onPrepareDrm failed with %d.", status);
   2898         return status;
   2899     }
   2900 
   2901     uint8_t *uuid;
   2902     Vector<uint8_t> *drmSessionId;
   2903     CHECK(msg->findPointer("uuid", (void**)&uuid));
   2904     CHECK(msg->findPointer("drmSessionId", (void**)&drmSessionId));
   2905 
   2906     status = OK;
   2907     sp<ICrypto> crypto = NULL;
   2908 
   2909     status = mSource->prepareDrm(uuid, *drmSessionId, &crypto);
   2910     if (crypto == NULL) {
   2911         ALOGE("onPrepareDrm: mSource->prepareDrm failed. status: %d", status);
   2912         return status;
   2913     }
   2914     ALOGV("onPrepareDrm: mSource->prepareDrm succeeded");
   2915 
   2916     if (mCrypto != NULL) {
   2917         ALOGE("onPrepareDrm: Unexpected. Already having mCrypto: %p (%d)",
   2918                 mCrypto.get(), mCrypto->getStrongCount());
   2919         mCrypto.clear();
   2920     }
   2921 
   2922     mCrypto = crypto;
   2923     mIsDrmProtected = true;
   2924     // TODO change to ALOGV
   2925     ALOGD("onPrepareDrm: mCrypto: %p (%d)", mCrypto.get(),
   2926             (mCrypto != NULL ? mCrypto->getStrongCount() : 0));
   2927 
   2928     return status;
   2929 }
   2930 
   2931 status_t NuPlayer::onReleaseDrm()
   2932 {
   2933     // TODO change to ALOGV
   2934     ALOGD("onReleaseDrm ");
   2935 
   2936     if (!mIsDrmProtected) {
   2937         ALOGW("onReleaseDrm: Unexpected. mIsDrmProtected is already false.");
   2938     }
   2939 
   2940     mIsDrmProtected = false;
   2941 
   2942     status_t status;
   2943     if (mCrypto != NULL) {
   2944         // notifying the source first before removing crypto from codec
   2945         if (mSource != NULL) {
   2946             mSource->releaseDrm();
   2947         }
   2948 
   2949         status=OK;
   2950         // first making sure the codecs have released their crypto reference
   2951         const sp<DecoderBase> &videoDecoder = getDecoder(false/*audio*/);
   2952         if (videoDecoder != NULL) {
   2953             status = videoDecoder->releaseCrypto();
   2954             ALOGV("onReleaseDrm: video decoder ret: %d", status);
   2955         }
   2956 
   2957         const sp<DecoderBase> &audioDecoder = getDecoder(true/*audio*/);
   2958         if (audioDecoder != NULL) {
   2959             status_t status_audio = audioDecoder->releaseCrypto();
   2960             if (status == OK) {   // otherwise, returning the first error
   2961                 status = status_audio;
   2962             }
   2963             ALOGV("onReleaseDrm: audio decoder ret: %d", status_audio);
   2964         }
   2965 
   2966         // TODO change to ALOGV
   2967         ALOGD("onReleaseDrm: mCrypto: %p (%d)", mCrypto.get(),
   2968                 (mCrypto != NULL ? mCrypto->getStrongCount() : 0));
   2969         mCrypto.clear();
   2970     } else {   // mCrypto == NULL
   2971         ALOGE("onReleaseDrm: Unexpected. There is no crypto.");
   2972         status = INVALID_OPERATION;
   2973     }
   2974 
   2975     return status;
   2976 }
   2977 // Modular DRM end
   2978 ////////////////////////////////////////////////////////////////////////////////
   2979 
   2980 sp<AMessage> NuPlayer::Source::getFormat(bool audio) {
   2981     sp<MetaData> meta = getFormatMeta(audio);
   2982 
   2983     if (meta == NULL) {
   2984         return NULL;
   2985     }
   2986 
   2987     sp<AMessage> msg = new AMessage;
   2988 
   2989     if(convertMetaDataToMessage(meta, &msg) == OK) {
   2990         return msg;
   2991     }
   2992     return NULL;
   2993 }
   2994 
   2995 void NuPlayer::Source::notifyFlagsChanged(uint32_t flags) {
   2996     sp<AMessage> notify = dupNotify();
   2997     notify->setInt32("what", kWhatFlagsChanged);
   2998     notify->setInt32("flags", flags);
   2999     notify->post();
   3000 }
   3001 
   3002 void NuPlayer::Source::notifyVideoSizeChanged(const sp<AMessage> &format) {
   3003     sp<AMessage> notify = dupNotify();
   3004     notify->setInt32("what", kWhatVideoSizeChanged);
   3005     notify->setMessage("format", format);
   3006     notify->post();
   3007 }
   3008 
   3009 void NuPlayer::Source::notifyPrepared(status_t err) {
   3010     ALOGV("Source::notifyPrepared %d", err);
   3011     sp<AMessage> notify = dupNotify();
   3012     notify->setInt32("what", kWhatPrepared);
   3013     notify->setInt32("err", err);
   3014     notify->post();
   3015 }
   3016 
   3017 void NuPlayer::Source::notifyDrmInfo(const sp<ABuffer> &drmInfoBuffer)
   3018 {
   3019     ALOGV("Source::notifyDrmInfo");
   3020 
   3021     sp<AMessage> notify = dupNotify();
   3022     notify->setInt32("what", kWhatDrmInfo);
   3023     notify->setBuffer("drmInfo", drmInfoBuffer);
   3024 
   3025     notify->post();
   3026 }
   3027 
   3028 void NuPlayer::Source::notifyInstantiateSecureDecoders(const sp<AMessage> &reply) {
   3029     sp<AMessage> notify = dupNotify();
   3030     notify->setInt32("what", kWhatInstantiateSecureDecoders);
   3031     notify->setMessage("reply", reply);
   3032     notify->post();
   3033 }
   3034 
   3035 void NuPlayer::Source::onMessageReceived(const sp<AMessage> & /* msg */) {
   3036     TRESPASS();
   3037 }
   3038 
   3039 }  // namespace android
   3040