NuPlayer.cpp revision 674649bcb5d3e5fd6e527906c7b166f96d35ec16
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                if (audio) {
1080                    mAudioEOS = false;
1081                } else {
1082                    mVideoEOS = false;
1083                }
1084
1085                ALOGV("renderer %s flush completed.", audio ? "audio" : "video");
1086                if (audio && (mFlushingAudio == NONE || mFlushingAudio == FLUSHED
1087                        || mFlushingAudio == SHUT_DOWN)) {
1088                    // Flush has been handled by tear down.
1089                    break;
1090                }
1091                handleFlushComplete(audio, false /* isDecoder */);
1092                finishFlushIfPossible();
1093            } else if (what == Renderer::kWhatVideoRenderingStart) {
1094                notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0);
1095            } else if (what == Renderer::kWhatMediaRenderingStart) {
1096                ALOGV("media rendering started");
1097                notifyListener(MEDIA_STARTED, 0, 0);
1098            } else if (what == Renderer::kWhatAudioTearDown) {
1099                int32_t reason;
1100                CHECK(msg->findInt32("reason", &reason));
1101                ALOGV("Tear down audio with reason %d.", reason);
1102                mAudioDecoder->pause();
1103                mAudioDecoder.clear();
1104                ++mAudioDecoderGeneration;
1105                bool needsToCreateAudioDecoder = true;
1106                if (mFlushingAudio == FLUSHING_DECODER) {
1107                    mFlushComplete[1 /* audio */][1 /* isDecoder */] = true;
1108                    mFlushingAudio = FLUSHED;
1109                    finishFlushIfPossible();
1110                } else if (mFlushingAudio == FLUSHING_DECODER_SHUTDOWN
1111                        || mFlushingAudio == SHUTTING_DOWN_DECODER) {
1112                    mFlushComplete[1 /* audio */][1 /* isDecoder */] = true;
1113                    mFlushingAudio = SHUT_DOWN;
1114                    finishFlushIfPossible();
1115                    needsToCreateAudioDecoder = false;
1116                }
1117                if (mRenderer == NULL) {
1118                    break;
1119                }
1120                closeAudioSink();
1121                mRenderer->flush(
1122                        true /* audio */, false /* notifyComplete */);
1123                if (mVideoDecoder != NULL) {
1124                    mRenderer->flush(
1125                            false /* audio */, false /* notifyComplete */);
1126                }
1127
1128                int64_t positionUs;
1129                if (!msg->findInt64("positionUs", &positionUs)) {
1130                    positionUs = mPreviousSeekTimeUs;
1131                }
1132                performSeek(positionUs);
1133
1134                if (reason == Renderer::kDueToError && needsToCreateAudioDecoder) {
1135                    instantiateDecoder(true /* audio */, &mAudioDecoder);
1136                }
1137            }
1138            break;
1139        }
1140
1141        case kWhatMoreDataQueued:
1142        {
1143            break;
1144        }
1145
1146        case kWhatReset:
1147        {
1148            ALOGV("kWhatReset");
1149
1150            mResetting = true;
1151
1152            mDeferredActions.push_back(
1153                    new FlushDecoderAction(
1154                        FLUSH_CMD_SHUTDOWN /* audio */,
1155                        FLUSH_CMD_SHUTDOWN /* video */));
1156
1157            mDeferredActions.push_back(
1158                    new SimpleAction(&NuPlayer::performReset));
1159
1160            processDeferredActions();
1161            break;
1162        }
1163
1164        case kWhatSeek:
1165        {
1166            int64_t seekTimeUs;
1167            int32_t needNotify;
1168            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
1169            CHECK(msg->findInt32("needNotify", &needNotify));
1170
1171            ALOGV("kWhatSeek seekTimeUs=%lld us, needNotify=%d",
1172                    (long long)seekTimeUs, needNotify);
1173
1174            if (!mStarted) {
1175                // Seek before the player is started. In order to preview video,
1176                // need to start the player and pause it. This branch is called
1177                // only once if needed. After the player is started, any seek
1178                // operation will go through normal path.
1179                // Audio-only cases are handled separately.
1180                onStart(seekTimeUs);
1181                if (mStarted) {
1182                    onPause();
1183                    mPausedByClient = true;
1184                }
1185                if (needNotify) {
1186                    notifyDriverSeekComplete();
1187                }
1188                break;
1189            }
1190
1191            mDeferredActions.push_back(
1192                    new FlushDecoderAction(FLUSH_CMD_FLUSH /* audio */,
1193                                           FLUSH_CMD_FLUSH /* video */));
1194
1195            mDeferredActions.push_back(
1196                    new SeekAction(seekTimeUs));
1197
1198            // After a flush without shutdown, decoder is paused.
1199            // Don't resume it until source seek is done, otherwise it could
1200            // start pulling stale data too soon.
1201            mDeferredActions.push_back(
1202                    new ResumeDecoderAction(needNotify));
1203
1204            processDeferredActions();
1205            break;
1206        }
1207
1208        case kWhatPause:
1209        {
1210            onPause();
1211            mPausedByClient = true;
1212            break;
1213        }
1214
1215        case kWhatSourceNotify:
1216        {
1217            onSourceNotify(msg);
1218            break;
1219        }
1220
1221        case kWhatClosedCaptionNotify:
1222        {
1223            onClosedCaptionNotify(msg);
1224            break;
1225        }
1226
1227        default:
1228            TRESPASS();
1229            break;
1230    }
1231}
1232
1233void NuPlayer::onResume() {
1234    if (!mPaused || mResetting) {
1235        ALOGD_IF(mResetting, "resetting, onResume discarded");
1236        return;
1237    }
1238    mPaused = false;
1239    if (mSource != NULL) {
1240        mSource->resume();
1241    } else {
1242        ALOGW("resume called when source is gone or not set");
1243    }
1244    // |mAudioDecoder| may have been released due to the pause timeout, so re-create it if
1245    // needed.
1246    if (audioDecoderStillNeeded() && mAudioDecoder == NULL) {
1247        instantiateDecoder(true /* audio */, &mAudioDecoder);
1248    }
1249    if (mRenderer != NULL) {
1250        mRenderer->resume();
1251    } else {
1252        ALOGW("resume called when renderer is gone or not set");
1253    }
1254}
1255
1256status_t NuPlayer::onInstantiateSecureDecoders() {
1257    status_t err;
1258    if (!(mSourceFlags & Source::FLAG_SECURE)) {
1259        return BAD_TYPE;
1260    }
1261
1262    if (mRenderer != NULL) {
1263        ALOGE("renderer should not be set when instantiating secure decoders");
1264        return UNKNOWN_ERROR;
1265    }
1266
1267    // TRICKY: We rely on mRenderer being null, so that decoder does not start requesting
1268    // data on instantiation.
1269    if (mSurface != NULL) {
1270        err = instantiateDecoder(false, &mVideoDecoder);
1271        if (err != OK) {
1272            return err;
1273        }
1274    }
1275
1276    if (mAudioSink != NULL) {
1277        err = instantiateDecoder(true, &mAudioDecoder);
1278        if (err != OK) {
1279            return err;
1280        }
1281    }
1282    return OK;
1283}
1284
1285void NuPlayer::onStart(int64_t startPositionUs) {
1286    if (!mSourceStarted) {
1287        mSourceStarted = true;
1288        mSource->start();
1289    }
1290    if (startPositionUs > 0) {
1291        performSeek(startPositionUs);
1292        if (mSource->getFormat(false /* audio */) == NULL) {
1293            return;
1294        }
1295    }
1296
1297    mOffloadAudio = false;
1298    mAudioEOS = false;
1299    mVideoEOS = false;
1300    mStarted = true;
1301
1302    uint32_t flags = 0;
1303
1304    if (mSource->isRealTime()) {
1305        flags |= Renderer::FLAG_REAL_TIME;
1306    }
1307
1308    sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */);
1309    audio_stream_type_t streamType = AUDIO_STREAM_MUSIC;
1310    if (mAudioSink != NULL) {
1311        streamType = mAudioSink->getAudioStreamType();
1312    }
1313
1314    sp<AMessage> videoFormat = mSource->getFormat(false /* audio */);
1315
1316    mOffloadAudio =
1317        canOffloadStream(audioMeta, (videoFormat != NULL), mSource->isStreaming(), streamType);
1318    if (mOffloadAudio) {
1319        flags |= Renderer::FLAG_OFFLOAD_AUDIO;
1320    }
1321
1322    sp<AMessage> notify = new AMessage(kWhatRendererNotify, this);
1323    ++mRendererGeneration;
1324    notify->setInt32("generation", mRendererGeneration);
1325    mRenderer = new Renderer(mAudioSink, notify, flags);
1326    mRendererLooper = new ALooper;
1327    mRendererLooper->setName("NuPlayerRenderer");
1328    mRendererLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
1329    mRendererLooper->registerHandler(mRenderer);
1330
1331    status_t err = mRenderer->setPlaybackSettings(mPlaybackSettings);
1332    if (err != OK) {
1333        mSource->stop();
1334        mSourceStarted = false;
1335        notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
1336        return;
1337    }
1338
1339    float rate = getFrameRate();
1340    if (rate > 0) {
1341        mRenderer->setVideoFrameRate(rate);
1342    }
1343
1344    if (mVideoDecoder != NULL) {
1345        mVideoDecoder->setRenderer(mRenderer);
1346    }
1347    if (mAudioDecoder != NULL) {
1348        mAudioDecoder->setRenderer(mRenderer);
1349    }
1350
1351    postScanSources();
1352}
1353
1354void NuPlayer::onPause() {
1355    if (mPaused) {
1356        return;
1357    }
1358    mPaused = true;
1359    if (mSource != NULL) {
1360        mSource->pause();
1361    } else {
1362        ALOGW("pause called when source is gone or not set");
1363    }
1364    if (mRenderer != NULL) {
1365        mRenderer->pause();
1366    } else {
1367        ALOGW("pause called when renderer is gone or not set");
1368    }
1369}
1370
1371bool NuPlayer::audioDecoderStillNeeded() {
1372    // Audio decoder is no longer needed if it's in shut/shutting down status.
1373    return ((mFlushingAudio != SHUT_DOWN) && (mFlushingAudio != SHUTTING_DOWN_DECODER));
1374}
1375
1376void NuPlayer::handleFlushComplete(bool audio, bool isDecoder) {
1377    // We wait for both the decoder flush and the renderer flush to complete
1378    // before entering either the FLUSHED or the SHUTTING_DOWN_DECODER state.
1379
1380    mFlushComplete[audio][isDecoder] = true;
1381    if (!mFlushComplete[audio][!isDecoder]) {
1382        return;
1383    }
1384
1385    FlushStatus *state = audio ? &mFlushingAudio : &mFlushingVideo;
1386    switch (*state) {
1387        case FLUSHING_DECODER:
1388        {
1389            *state = FLUSHED;
1390            break;
1391        }
1392
1393        case FLUSHING_DECODER_SHUTDOWN:
1394        {
1395            *state = SHUTTING_DOWN_DECODER;
1396
1397            ALOGV("initiating %s decoder shutdown", audio ? "audio" : "video");
1398            if (!audio) {
1399                // Widevine source reads must stop before releasing the video decoder.
1400                if (mSource != NULL && mSourceFlags & Source::FLAG_SECURE) {
1401                    mSource->stop();
1402                    mSourceStarted = false;
1403                }
1404            }
1405            getDecoder(audio)->initiateShutdown();
1406            break;
1407        }
1408
1409        default:
1410            // decoder flush completes only occur in a flushing state.
1411            LOG_ALWAYS_FATAL_IF(isDecoder, "decoder flush in invalid state %d", *state);
1412            break;
1413    }
1414}
1415
1416void NuPlayer::finishFlushIfPossible() {
1417    if (mFlushingAudio != NONE && mFlushingAudio != FLUSHED
1418            && mFlushingAudio != SHUT_DOWN) {
1419        return;
1420    }
1421
1422    if (mFlushingVideo != NONE && mFlushingVideo != FLUSHED
1423            && mFlushingVideo != SHUT_DOWN) {
1424        return;
1425    }
1426
1427    ALOGV("both audio and video are flushed now.");
1428
1429    mFlushingAudio = NONE;
1430    mFlushingVideo = NONE;
1431
1432    clearFlushComplete();
1433
1434    processDeferredActions();
1435}
1436
1437void NuPlayer::postScanSources() {
1438    if (mScanSourcesPending) {
1439        return;
1440    }
1441
1442    sp<AMessage> msg = new AMessage(kWhatScanSources, this);
1443    msg->setInt32("generation", mScanSourcesGeneration);
1444    msg->post();
1445
1446    mScanSourcesPending = true;
1447}
1448
1449void NuPlayer::tryOpenAudioSinkForOffload(const sp<AMessage> &format, bool hasVideo) {
1450    // Note: This is called early in NuPlayer to determine whether offloading
1451    // is possible; otherwise the decoders call the renderer openAudioSink directly.
1452
1453    status_t err = mRenderer->openAudioSink(
1454            format, true /* offloadOnly */, hasVideo, AUDIO_OUTPUT_FLAG_NONE, &mOffloadAudio);
1455    if (err != OK) {
1456        // Any failure we turn off mOffloadAudio.
1457        mOffloadAudio = false;
1458    } else if (mOffloadAudio) {
1459        sp<MetaData> audioMeta =
1460                mSource->getFormatMeta(true /* audio */);
1461        sendMetaDataToHal(mAudioSink, audioMeta);
1462    }
1463}
1464
1465void NuPlayer::closeAudioSink() {
1466    mRenderer->closeAudioSink();
1467}
1468
1469void NuPlayer::determineAudioModeChange() {
1470    if (mSource == NULL || mAudioSink == NULL) {
1471        return;
1472    }
1473
1474    if (mRenderer == NULL) {
1475        ALOGW("No renderer can be used to determine audio mode. Use non-offload for safety.");
1476        mOffloadAudio = false;
1477        return;
1478    }
1479
1480    sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */);
1481    sp<AMessage> videoFormat = mSource->getFormat(false /* audio */);
1482    audio_stream_type_t streamType = mAudioSink->getAudioStreamType();
1483    const bool hasVideo = (videoFormat != NULL);
1484    const bool canOffload = canOffloadStream(
1485            audioMeta, hasVideo, mSource->isStreaming(), streamType);
1486    if (canOffload) {
1487        if (!mOffloadAudio) {
1488            mRenderer->signalEnableOffloadAudio();
1489        }
1490        // open audio sink early under offload mode.
1491        sp<AMessage> format = mSource->getFormat(true /*audio*/);
1492        tryOpenAudioSinkForOffload(format, hasVideo);
1493    } else {
1494        if (mOffloadAudio) {
1495            mRenderer->signalDisableOffloadAudio();
1496            mOffloadAudio = false;
1497        }
1498    }
1499}
1500
1501status_t NuPlayer::instantiateDecoder(bool audio, sp<DecoderBase> *decoder) {
1502    // The audio decoder could be cleared by tear down. If still in shut down
1503    // process, no need to create a new audio decoder.
1504    if (*decoder != NULL || (audio && mFlushingAudio == SHUT_DOWN)) {
1505        return OK;
1506    }
1507
1508    sp<AMessage> format = mSource->getFormat(audio);
1509
1510    if (format == NULL) {
1511        return -EWOULDBLOCK;
1512    }
1513
1514    format->setInt32("priority", 0 /* realtime */);
1515
1516    if (!audio) {
1517        AString mime;
1518        CHECK(format->findString("mime", &mime));
1519
1520        sp<AMessage> ccNotify = new AMessage(kWhatClosedCaptionNotify, this);
1521        if (mCCDecoder == NULL) {
1522            mCCDecoder = new CCDecoder(ccNotify);
1523        }
1524
1525        if (mSourceFlags & Source::FLAG_SECURE) {
1526            format->setInt32("secure", true);
1527        }
1528
1529        if (mSourceFlags & Source::FLAG_PROTECTED) {
1530            format->setInt32("protected", true);
1531        }
1532
1533        float rate = getFrameRate();
1534        if (rate > 0) {
1535            format->setFloat("operating-rate", rate * mPlaybackSettings.mSpeed);
1536        }
1537    }
1538
1539    if (audio) {
1540        sp<AMessage> notify = new AMessage(kWhatAudioNotify, this);
1541        ++mAudioDecoderGeneration;
1542        notify->setInt32("generation", mAudioDecoderGeneration);
1543
1544        determineAudioModeChange();
1545        if (mOffloadAudio) {
1546            const bool hasVideo = (mSource->getFormat(false /*audio */) != NULL);
1547            format->setInt32("has-video", hasVideo);
1548            *decoder = new DecoderPassThrough(notify, mSource, mRenderer);
1549        } else {
1550            *decoder = new Decoder(notify, mSource, mPID, mRenderer);
1551        }
1552    } else {
1553        sp<AMessage> notify = new AMessage(kWhatVideoNotify, this);
1554        ++mVideoDecoderGeneration;
1555        notify->setInt32("generation", mVideoDecoderGeneration);
1556
1557        *decoder = new Decoder(
1558                notify, mSource, mPID, mRenderer, mSurface, mCCDecoder);
1559
1560        // enable FRC if high-quality AV sync is requested, even if not
1561        // directly queuing to display, as this will even improve textureview
1562        // playback.
1563        {
1564            char value[PROPERTY_VALUE_MAX];
1565            if (property_get("persist.sys.media.avsync", value, NULL) &&
1566                    (!strcmp("1", value) || !strcasecmp("true", value))) {
1567                format->setInt32("auto-frc", 1);
1568            }
1569        }
1570    }
1571    (*decoder)->init();
1572    (*decoder)->configure(format);
1573
1574    // allocate buffers to decrypt widevine source buffers
1575    if (!audio && (mSourceFlags & Source::FLAG_SECURE)) {
1576        Vector<sp<ABuffer> > inputBufs;
1577        CHECK_EQ((*decoder)->getInputBuffers(&inputBufs), (status_t)OK);
1578
1579        Vector<MediaBuffer *> mediaBufs;
1580        for (size_t i = 0; i < inputBufs.size(); i++) {
1581            const sp<ABuffer> &buffer = inputBufs[i];
1582            MediaBuffer *mbuf = new MediaBuffer(buffer->data(), buffer->size());
1583            mediaBufs.push(mbuf);
1584        }
1585
1586        status_t err = mSource->setBuffers(audio, mediaBufs);
1587        if (err != OK) {
1588            for (size_t i = 0; i < mediaBufs.size(); ++i) {
1589                mediaBufs[i]->release();
1590            }
1591            mediaBufs.clear();
1592            ALOGE("Secure source didn't support secure mediaBufs.");
1593            return err;
1594        }
1595    }
1596    return OK;
1597}
1598
1599void NuPlayer::updateVideoSize(
1600        const sp<AMessage> &inputFormat,
1601        const sp<AMessage> &outputFormat) {
1602    if (inputFormat == NULL) {
1603        ALOGW("Unknown video size, reporting 0x0!");
1604        notifyListener(MEDIA_SET_VIDEO_SIZE, 0, 0);
1605        return;
1606    }
1607
1608    int32_t displayWidth, displayHeight;
1609    if (outputFormat != NULL) {
1610        int32_t width, height;
1611        CHECK(outputFormat->findInt32("width", &width));
1612        CHECK(outputFormat->findInt32("height", &height));
1613
1614        int32_t cropLeft, cropTop, cropRight, cropBottom;
1615        CHECK(outputFormat->findRect(
1616                    "crop",
1617                    &cropLeft, &cropTop, &cropRight, &cropBottom));
1618
1619        displayWidth = cropRight - cropLeft + 1;
1620        displayHeight = cropBottom - cropTop + 1;
1621
1622        ALOGV("Video output format changed to %d x %d "
1623             "(crop: %d x %d @ (%d, %d))",
1624             width, height,
1625             displayWidth,
1626             displayHeight,
1627             cropLeft, cropTop);
1628    } else {
1629        CHECK(inputFormat->findInt32("width", &displayWidth));
1630        CHECK(inputFormat->findInt32("height", &displayHeight));
1631
1632        ALOGV("Video input format %d x %d", displayWidth, displayHeight);
1633    }
1634
1635    // Take into account sample aspect ratio if necessary:
1636    int32_t sarWidth, sarHeight;
1637    if (inputFormat->findInt32("sar-width", &sarWidth)
1638            && inputFormat->findInt32("sar-height", &sarHeight)) {
1639        ALOGV("Sample aspect ratio %d : %d", sarWidth, sarHeight);
1640
1641        displayWidth = (displayWidth * sarWidth) / sarHeight;
1642
1643        ALOGV("display dimensions %d x %d", displayWidth, displayHeight);
1644    }
1645
1646    int32_t rotationDegrees;
1647    if (!inputFormat->findInt32("rotation-degrees", &rotationDegrees)) {
1648        rotationDegrees = 0;
1649    }
1650
1651    if (rotationDegrees == 90 || rotationDegrees == 270) {
1652        int32_t tmp = displayWidth;
1653        displayWidth = displayHeight;
1654        displayHeight = tmp;
1655    }
1656
1657    notifyListener(
1658            MEDIA_SET_VIDEO_SIZE,
1659            displayWidth,
1660            displayHeight);
1661}
1662
1663void NuPlayer::notifyListener(int msg, int ext1, int ext2, const Parcel *in) {
1664    if (mDriver == NULL) {
1665        return;
1666    }
1667
1668    sp<NuPlayerDriver> driver = mDriver.promote();
1669
1670    if (driver == NULL) {
1671        return;
1672    }
1673
1674    driver->notifyListener(msg, ext1, ext2, in);
1675}
1676
1677void NuPlayer::flushDecoder(bool audio, bool needShutdown) {
1678    ALOGV("[%s] flushDecoder needShutdown=%d",
1679          audio ? "audio" : "video", needShutdown);
1680
1681    const sp<DecoderBase> &decoder = getDecoder(audio);
1682    if (decoder == NULL) {
1683        ALOGI("flushDecoder %s without decoder present",
1684             audio ? "audio" : "video");
1685        return;
1686    }
1687
1688    // Make sure we don't continue to scan sources until we finish flushing.
1689    ++mScanSourcesGeneration;
1690    if (mScanSourcesPending) {
1691        mDeferredActions.push_back(
1692                new SimpleAction(&NuPlayer::performScanSources));
1693        mScanSourcesPending = false;
1694    }
1695
1696    decoder->signalFlush();
1697
1698    FlushStatus newStatus =
1699        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
1700
1701    mFlushComplete[audio][false /* isDecoder */] = (mRenderer == NULL);
1702    mFlushComplete[audio][true /* isDecoder */] = false;
1703    if (audio) {
1704        ALOGE_IF(mFlushingAudio != NONE,
1705                "audio flushDecoder() is called in state %d", mFlushingAudio);
1706        mFlushingAudio = newStatus;
1707    } else {
1708        ALOGE_IF(mFlushingVideo != NONE,
1709                "video flushDecoder() is called in state %d", mFlushingVideo);
1710        mFlushingVideo = newStatus;
1711    }
1712}
1713
1714void NuPlayer::queueDecoderShutdown(
1715        bool audio, bool video, const sp<AMessage> &reply) {
1716    ALOGI("queueDecoderShutdown audio=%d, video=%d", audio, video);
1717
1718    mDeferredActions.push_back(
1719            new FlushDecoderAction(
1720                audio ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE,
1721                video ? FLUSH_CMD_SHUTDOWN : FLUSH_CMD_NONE));
1722
1723    mDeferredActions.push_back(
1724            new SimpleAction(&NuPlayer::performScanSources));
1725
1726    mDeferredActions.push_back(new PostMessageAction(reply));
1727
1728    processDeferredActions();
1729}
1730
1731status_t NuPlayer::setVideoScalingMode(int32_t mode) {
1732    mVideoScalingMode = mode;
1733    if (mSurface != NULL) {
1734        status_t ret = native_window_set_scaling_mode(mSurface.get(), mVideoScalingMode);
1735        if (ret != OK) {
1736            ALOGE("Failed to set scaling mode (%d): %s",
1737                -ret, strerror(-ret));
1738            return ret;
1739        }
1740    }
1741    return OK;
1742}
1743
1744status_t NuPlayer::getTrackInfo(Parcel* reply) const {
1745    sp<AMessage> msg = new AMessage(kWhatGetTrackInfo, this);
1746    msg->setPointer("reply", reply);
1747
1748    sp<AMessage> response;
1749    status_t err = msg->postAndAwaitResponse(&response);
1750    return err;
1751}
1752
1753status_t NuPlayer::getSelectedTrack(int32_t type, Parcel* reply) const {
1754    sp<AMessage> msg = new AMessage(kWhatGetSelectedTrack, this);
1755    msg->setPointer("reply", reply);
1756    msg->setInt32("type", type);
1757
1758    sp<AMessage> response;
1759    status_t err = msg->postAndAwaitResponse(&response);
1760    if (err == OK && response != NULL) {
1761        CHECK(response->findInt32("err", &err));
1762    }
1763    return err;
1764}
1765
1766status_t NuPlayer::selectTrack(size_t trackIndex, bool select, int64_t timeUs) {
1767    sp<AMessage> msg = new AMessage(kWhatSelectTrack, this);
1768    msg->setSize("trackIndex", trackIndex);
1769    msg->setInt32("select", select);
1770    msg->setInt64("timeUs", timeUs);
1771
1772    sp<AMessage> response;
1773    status_t err = msg->postAndAwaitResponse(&response);
1774
1775    if (err != OK) {
1776        return err;
1777    }
1778
1779    if (!response->findInt32("err", &err)) {
1780        err = OK;
1781    }
1782
1783    return err;
1784}
1785
1786status_t NuPlayer::getCurrentPosition(int64_t *mediaUs) {
1787    sp<Renderer> renderer = mRenderer;
1788    if (renderer == NULL) {
1789        return NO_INIT;
1790    }
1791
1792    return renderer->getCurrentPosition(mediaUs);
1793}
1794
1795void NuPlayer::getStats(Vector<sp<AMessage> > *mTrackStats) {
1796    CHECK(mTrackStats != NULL);
1797
1798    mTrackStats->clear();
1799    if (mVideoDecoder != NULL) {
1800        mTrackStats->push_back(mVideoDecoder->getStats());
1801    }
1802    if (mAudioDecoder != NULL) {
1803        mTrackStats->push_back(mAudioDecoder->getStats());
1804    }
1805}
1806
1807sp<MetaData> NuPlayer::getFileMeta() {
1808    return mSource->getFileFormatMeta();
1809}
1810
1811float NuPlayer::getFrameRate() {
1812    sp<MetaData> meta = mSource->getFormatMeta(false /* audio */);
1813    if (meta == NULL) {
1814        return 0;
1815    }
1816    int32_t rate;
1817    if (!meta->findInt32(kKeyFrameRate, &rate)) {
1818        // fall back to try file meta
1819        sp<MetaData> fileMeta = getFileMeta();
1820        if (fileMeta == NULL) {
1821            ALOGW("source has video meta but not file meta");
1822            return -1;
1823        }
1824        int32_t fileMetaRate;
1825        if (!fileMeta->findInt32(kKeyFrameRate, &fileMetaRate)) {
1826            return -1;
1827        }
1828        return fileMetaRate;
1829    }
1830    return rate;
1831}
1832
1833void NuPlayer::schedulePollDuration() {
1834    sp<AMessage> msg = new AMessage(kWhatPollDuration, this);
1835    msg->setInt32("generation", mPollDurationGeneration);
1836    msg->post();
1837}
1838
1839void NuPlayer::cancelPollDuration() {
1840    ++mPollDurationGeneration;
1841}
1842
1843void NuPlayer::processDeferredActions() {
1844    while (!mDeferredActions.empty()) {
1845        // We won't execute any deferred actions until we're no longer in
1846        // an intermediate state, i.e. one more more decoders are currently
1847        // flushing or shutting down.
1848
1849        if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
1850            // We're currently flushing, postpone the reset until that's
1851            // completed.
1852
1853            ALOGV("postponing action mFlushingAudio=%d, mFlushingVideo=%d",
1854                  mFlushingAudio, mFlushingVideo);
1855
1856            break;
1857        }
1858
1859        sp<Action> action = *mDeferredActions.begin();
1860        mDeferredActions.erase(mDeferredActions.begin());
1861
1862        action->execute(this);
1863    }
1864}
1865
1866void NuPlayer::performSeek(int64_t seekTimeUs) {
1867    ALOGV("performSeek seekTimeUs=%lld us (%.2f secs)",
1868          (long long)seekTimeUs,
1869          seekTimeUs / 1E6);
1870
1871    if (mSource == NULL) {
1872        // This happens when reset occurs right before the loop mode
1873        // asynchronously seeks to the start of the stream.
1874        LOG_ALWAYS_FATAL_IF(mAudioDecoder != NULL || mVideoDecoder != NULL,
1875                "mSource is NULL and decoders not NULL audio(%p) video(%p)",
1876                mAudioDecoder.get(), mVideoDecoder.get());
1877        return;
1878    }
1879    mPreviousSeekTimeUs = seekTimeUs;
1880    mSource->seekTo(seekTimeUs);
1881    ++mTimedTextGeneration;
1882
1883    // everything's flushed, continue playback.
1884}
1885
1886void NuPlayer::performDecoderFlush(FlushCommand audio, FlushCommand video) {
1887    ALOGV("performDecoderFlush audio=%d, video=%d", audio, video);
1888
1889    if ((audio == FLUSH_CMD_NONE || mAudioDecoder == NULL)
1890            && (video == FLUSH_CMD_NONE || mVideoDecoder == NULL)) {
1891        return;
1892    }
1893
1894    if (audio != FLUSH_CMD_NONE && mAudioDecoder != NULL) {
1895        flushDecoder(true /* audio */, (audio == FLUSH_CMD_SHUTDOWN));
1896    }
1897
1898    if (video != FLUSH_CMD_NONE && mVideoDecoder != NULL) {
1899        flushDecoder(false /* audio */, (video == FLUSH_CMD_SHUTDOWN));
1900    }
1901}
1902
1903void NuPlayer::performReset() {
1904    ALOGV("performReset");
1905
1906    CHECK(mAudioDecoder == NULL);
1907    CHECK(mVideoDecoder == NULL);
1908
1909    cancelPollDuration();
1910
1911    ++mScanSourcesGeneration;
1912    mScanSourcesPending = false;
1913
1914    if (mRendererLooper != NULL) {
1915        if (mRenderer != NULL) {
1916            mRendererLooper->unregisterHandler(mRenderer->id());
1917        }
1918        mRendererLooper->stop();
1919        mRendererLooper.clear();
1920    }
1921    mRenderer.clear();
1922    ++mRendererGeneration;
1923
1924    if (mSource != NULL) {
1925        mSource->stop();
1926
1927        mSource.clear();
1928    }
1929
1930    if (mDriver != NULL) {
1931        sp<NuPlayerDriver> driver = mDriver.promote();
1932        if (driver != NULL) {
1933            driver->notifyResetComplete();
1934        }
1935    }
1936
1937    mStarted = false;
1938    mResetting = false;
1939    mSourceStarted = false;
1940}
1941
1942void NuPlayer::performScanSources() {
1943    ALOGV("performScanSources");
1944
1945    if (!mStarted) {
1946        return;
1947    }
1948
1949    if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
1950        postScanSources();
1951    }
1952}
1953
1954void NuPlayer::performSetSurface(const sp<Surface> &surface) {
1955    ALOGV("performSetSurface");
1956
1957    mSurface = surface;
1958
1959    // XXX - ignore error from setVideoScalingMode for now
1960    setVideoScalingMode(mVideoScalingMode);
1961
1962    if (mDriver != NULL) {
1963        sp<NuPlayerDriver> driver = mDriver.promote();
1964        if (driver != NULL) {
1965            driver->notifySetSurfaceComplete();
1966        }
1967    }
1968}
1969
1970void NuPlayer::performResumeDecoders(bool needNotify) {
1971    if (needNotify) {
1972        mResumePending = true;
1973        if (mVideoDecoder == NULL) {
1974            // if audio-only, we can notify seek complete now,
1975            // as the resume operation will be relatively fast.
1976            finishResume();
1977        }
1978    }
1979
1980    if (mVideoDecoder != NULL) {
1981        // When there is continuous seek, MediaPlayer will cache the seek
1982        // position, and send down new seek request when previous seek is
1983        // complete. Let's wait for at least one video output frame before
1984        // notifying seek complete, so that the video thumbnail gets updated
1985        // when seekbar is dragged.
1986        mVideoDecoder->signalResume(needNotify);
1987    }
1988
1989    if (mAudioDecoder != NULL) {
1990        mAudioDecoder->signalResume(false /* needNotify */);
1991    }
1992}
1993
1994void NuPlayer::finishResume() {
1995    if (mResumePending) {
1996        mResumePending = false;
1997        notifyDriverSeekComplete();
1998    }
1999}
2000
2001void NuPlayer::notifyDriverSeekComplete() {
2002    if (mDriver != NULL) {
2003        sp<NuPlayerDriver> driver = mDriver.promote();
2004        if (driver != NULL) {
2005            driver->notifySeekComplete();
2006        }
2007    }
2008}
2009
2010void NuPlayer::onSourceNotify(const sp<AMessage> &msg) {
2011    int32_t what;
2012    CHECK(msg->findInt32("what", &what));
2013
2014    switch (what) {
2015        case Source::kWhatInstantiateSecureDecoders:
2016        {
2017            if (mSource == NULL) {
2018                // This is a stale notification from a source that was
2019                // asynchronously preparing when the client called reset().
2020                // We handled the reset, the source is gone.
2021                break;
2022            }
2023
2024            sp<AMessage> reply;
2025            CHECK(msg->findMessage("reply", &reply));
2026            status_t err = onInstantiateSecureDecoders();
2027            reply->setInt32("err", err);
2028            reply->post();
2029            break;
2030        }
2031
2032        case Source::kWhatPrepared:
2033        {
2034            if (mSource == NULL) {
2035                // This is a stale notification from a source that was
2036                // asynchronously preparing when the client called reset().
2037                // We handled the reset, the source is gone.
2038                break;
2039            }
2040
2041            int32_t err;
2042            CHECK(msg->findInt32("err", &err));
2043
2044            if (err != OK) {
2045                // shut down potential secure codecs in case client never calls reset
2046                mDeferredActions.push_back(
2047                        new FlushDecoderAction(FLUSH_CMD_SHUTDOWN /* audio */,
2048                                               FLUSH_CMD_SHUTDOWN /* video */));
2049                processDeferredActions();
2050            }
2051
2052            sp<NuPlayerDriver> driver = mDriver.promote();
2053            if (driver != NULL) {
2054                // notify duration first, so that it's definitely set when
2055                // the app received the "prepare complete" callback.
2056                int64_t durationUs;
2057                if (mSource->getDuration(&durationUs) == OK) {
2058                    driver->notifyDuration(durationUs);
2059                }
2060                driver->notifyPrepareCompleted(err);
2061            }
2062
2063            break;
2064        }
2065
2066        case Source::kWhatFlagsChanged:
2067        {
2068            uint32_t flags;
2069            CHECK(msg->findInt32("flags", (int32_t *)&flags));
2070
2071            sp<NuPlayerDriver> driver = mDriver.promote();
2072            if (driver != NULL) {
2073                if ((flags & NuPlayer::Source::FLAG_CAN_SEEK) == 0) {
2074                    driver->notifyListener(
2075                            MEDIA_INFO, MEDIA_INFO_NOT_SEEKABLE, 0);
2076                }
2077                driver->notifyFlagsChanged(flags);
2078            }
2079
2080            if ((mSourceFlags & Source::FLAG_DYNAMIC_DURATION)
2081                    && (!(flags & Source::FLAG_DYNAMIC_DURATION))) {
2082                cancelPollDuration();
2083            } else if (!(mSourceFlags & Source::FLAG_DYNAMIC_DURATION)
2084                    && (flags & Source::FLAG_DYNAMIC_DURATION)
2085                    && (mAudioDecoder != NULL || mVideoDecoder != NULL)) {
2086                schedulePollDuration();
2087            }
2088
2089            mSourceFlags = flags;
2090            break;
2091        }
2092
2093        case Source::kWhatVideoSizeChanged:
2094        {
2095            sp<AMessage> format;
2096            CHECK(msg->findMessage("format", &format));
2097
2098            updateVideoSize(format);
2099            break;
2100        }
2101
2102        case Source::kWhatBufferingUpdate:
2103        {
2104            int32_t percentage;
2105            CHECK(msg->findInt32("percentage", &percentage));
2106
2107            notifyListener(MEDIA_BUFFERING_UPDATE, percentage, 0);
2108            break;
2109        }
2110
2111        case Source::kWhatPauseOnBufferingStart:
2112        {
2113            // ignore if not playing
2114            if (mStarted) {
2115                ALOGI("buffer low, pausing...");
2116
2117                mPausedForBuffering = true;
2118                onPause();
2119            }
2120            // fall-thru
2121        }
2122
2123        case Source::kWhatBufferingStart:
2124        {
2125            notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_START, 0);
2126            break;
2127        }
2128
2129        case Source::kWhatResumeOnBufferingEnd:
2130        {
2131            // ignore if not playing
2132            if (mStarted) {
2133                ALOGI("buffer ready, resuming...");
2134
2135                mPausedForBuffering = false;
2136
2137                // do not resume yet if client didn't unpause
2138                if (!mPausedByClient) {
2139                    onResume();
2140                }
2141            }
2142            // fall-thru
2143        }
2144
2145        case Source::kWhatBufferingEnd:
2146        {
2147            notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_END, 0);
2148            break;
2149        }
2150
2151        case Source::kWhatCacheStats:
2152        {
2153            int32_t kbps;
2154            CHECK(msg->findInt32("bandwidth", &kbps));
2155
2156            notifyListener(MEDIA_INFO, MEDIA_INFO_NETWORK_BANDWIDTH, kbps);
2157            break;
2158        }
2159
2160        case Source::kWhatSubtitleData:
2161        {
2162            sp<ABuffer> buffer;
2163            CHECK(msg->findBuffer("buffer", &buffer));
2164
2165            sendSubtitleData(buffer, 0 /* baseIndex */);
2166            break;
2167        }
2168
2169        case Source::kWhatTimedMetaData:
2170        {
2171            sp<ABuffer> buffer;
2172            if (!msg->findBuffer("buffer", &buffer)) {
2173                notifyListener(MEDIA_INFO, MEDIA_INFO_METADATA_UPDATE, 0);
2174            } else {
2175                sendTimedMetaData(buffer);
2176            }
2177            break;
2178        }
2179
2180        case Source::kWhatTimedTextData:
2181        {
2182            int32_t generation;
2183            if (msg->findInt32("generation", &generation)
2184                    && generation != mTimedTextGeneration) {
2185                break;
2186            }
2187
2188            sp<ABuffer> buffer;
2189            CHECK(msg->findBuffer("buffer", &buffer));
2190
2191            sp<NuPlayerDriver> driver = mDriver.promote();
2192            if (driver == NULL) {
2193                break;
2194            }
2195
2196            int posMs;
2197            int64_t timeUs, posUs;
2198            driver->getCurrentPosition(&posMs);
2199            posUs = (int64_t) posMs * 1000ll;
2200            CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
2201
2202            if (posUs < timeUs) {
2203                if (!msg->findInt32("generation", &generation)) {
2204                    msg->setInt32("generation", mTimedTextGeneration);
2205                }
2206                msg->post(timeUs - posUs);
2207            } else {
2208                sendTimedTextData(buffer);
2209            }
2210            break;
2211        }
2212
2213        case Source::kWhatQueueDecoderShutdown:
2214        {
2215            int32_t audio, video;
2216            CHECK(msg->findInt32("audio", &audio));
2217            CHECK(msg->findInt32("video", &video));
2218
2219            sp<AMessage> reply;
2220            CHECK(msg->findMessage("reply", &reply));
2221
2222            queueDecoderShutdown(audio, video, reply);
2223            break;
2224        }
2225
2226        case Source::kWhatDrmNoLicense:
2227        {
2228            notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE);
2229            break;
2230        }
2231
2232        default:
2233            TRESPASS();
2234    }
2235}
2236
2237void NuPlayer::onClosedCaptionNotify(const sp<AMessage> &msg) {
2238    int32_t what;
2239    CHECK(msg->findInt32("what", &what));
2240
2241    switch (what) {
2242        case NuPlayer::CCDecoder::kWhatClosedCaptionData:
2243        {
2244            sp<ABuffer> buffer;
2245            CHECK(msg->findBuffer("buffer", &buffer));
2246
2247            size_t inbandTracks = 0;
2248            if (mSource != NULL) {
2249                inbandTracks = mSource->getTrackCount();
2250            }
2251
2252            sendSubtitleData(buffer, inbandTracks);
2253            break;
2254        }
2255
2256        case NuPlayer::CCDecoder::kWhatTrackAdded:
2257        {
2258            notifyListener(MEDIA_INFO, MEDIA_INFO_METADATA_UPDATE, 0);
2259
2260            break;
2261        }
2262
2263        default:
2264            TRESPASS();
2265    }
2266
2267
2268}
2269
2270void NuPlayer::sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex) {
2271    int32_t trackIndex;
2272    int64_t timeUs, durationUs;
2273    CHECK(buffer->meta()->findInt32("trackIndex", &trackIndex));
2274    CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
2275    CHECK(buffer->meta()->findInt64("durationUs", &durationUs));
2276
2277    Parcel in;
2278    in.writeInt32(trackIndex + baseIndex);
2279    in.writeInt64(timeUs);
2280    in.writeInt64(durationUs);
2281    in.writeInt32(buffer->size());
2282    in.writeInt32(buffer->size());
2283    in.write(buffer->data(), buffer->size());
2284
2285    notifyListener(MEDIA_SUBTITLE_DATA, 0, 0, &in);
2286}
2287
2288void NuPlayer::sendTimedMetaData(const sp<ABuffer> &buffer) {
2289    int64_t timeUs;
2290    CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
2291
2292    Parcel in;
2293    in.writeInt64(timeUs);
2294    in.writeInt32(buffer->size());
2295    in.writeInt32(buffer->size());
2296    in.write(buffer->data(), buffer->size());
2297
2298    notifyListener(MEDIA_META_DATA, 0, 0, &in);
2299}
2300
2301void NuPlayer::sendTimedTextData(const sp<ABuffer> &buffer) {
2302    const void *data;
2303    size_t size = 0;
2304    int64_t timeUs;
2305    int32_t flag = TextDescriptions::LOCAL_DESCRIPTIONS;
2306
2307    AString mime;
2308    CHECK(buffer->meta()->findString("mime", &mime));
2309    CHECK(strcasecmp(mime.c_str(), MEDIA_MIMETYPE_TEXT_3GPP) == 0);
2310
2311    data = buffer->data();
2312    size = buffer->size();
2313
2314    Parcel parcel;
2315    if (size > 0) {
2316        CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
2317        flag |= TextDescriptions::IN_BAND_TEXT_3GPP;
2318        TextDescriptions::getParcelOfDescriptions(
2319                (const uint8_t *)data, size, flag, timeUs / 1000, &parcel);
2320    }
2321
2322    if ((parcel.dataSize() > 0)) {
2323        notifyListener(MEDIA_TIMED_TEXT, 0, 0, &parcel);
2324    } else {  // send an empty timed text
2325        notifyListener(MEDIA_TIMED_TEXT, 0, 0);
2326    }
2327}
2328////////////////////////////////////////////////////////////////////////////////
2329
2330sp<AMessage> NuPlayer::Source::getFormat(bool audio) {
2331    sp<MetaData> meta = getFormatMeta(audio);
2332
2333    if (meta == NULL) {
2334        return NULL;
2335    }
2336
2337    sp<AMessage> msg = new AMessage;
2338
2339    if(convertMetaDataToMessage(meta, &msg) == OK) {
2340        return msg;
2341    }
2342    return NULL;
2343}
2344
2345void NuPlayer::Source::notifyFlagsChanged(uint32_t flags) {
2346    sp<AMessage> notify = dupNotify();
2347    notify->setInt32("what", kWhatFlagsChanged);
2348    notify->setInt32("flags", flags);
2349    notify->post();
2350}
2351
2352void NuPlayer::Source::notifyVideoSizeChanged(const sp<AMessage> &format) {
2353    sp<AMessage> notify = dupNotify();
2354    notify->setInt32("what", kWhatVideoSizeChanged);
2355    notify->setMessage("format", format);
2356    notify->post();
2357}
2358
2359void NuPlayer::Source::notifyPrepared(status_t err) {
2360    sp<AMessage> notify = dupNotify();
2361    notify->setInt32("what", kWhatPrepared);
2362    notify->setInt32("err", err);
2363    notify->post();
2364}
2365
2366void NuPlayer::Source::notifyInstantiateSecureDecoders(const sp<AMessage> &reply) {
2367    sp<AMessage> notify = dupNotify();
2368    notify->setInt32("what", kWhatInstantiateSecureDecoders);
2369    notify->setMessage("reply", reply);
2370    notify->post();
2371}
2372
2373void NuPlayer::Source::onMessageReceived(const sp<AMessage> & /* msg */) {
2374    TRESPASS();
2375}
2376
2377}  // namespace android
2378