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