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