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