NuPlayer.cpp revision 46d13e3606b87d71379287672b54b50d0d9aa5cc
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "NuPlayer"
19010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski#include <utils/Log.h>
204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
213f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh#include "NuPlayer.h"
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn#include "HTTPLiveSource.h"
243abd75ba3a981850cac43a401d0014a836559cb0Kenny Root#include "NuPlayerDecoder.h"
254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski#include "NuPlayerDriver.h"
264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski#include "NuPlayerRenderer.h"
2791268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn#include "NuPlayerSource.h"
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "RTSPSource.h"
296f357d3284a833cc50a990e14b39f389b8972254Jeff Brown#include "StreamingSource.h"
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GenericSource.h"
314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski#include "mp4/MP4Source.h"
324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "ATSParser.h"
340068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
359ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski#include <cutils/properties.h> // for property_get
36010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski#include <media/stagefright/foundation/hexdump.h>
37cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn#include <media/stagefright/foundation/ABuffer.h>
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/stagefright/foundation/ADebug.h>
394b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski#include <media/stagefright/foundation/AMessage.h>
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/stagefright/ACodec.h>
41010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski#include <media/stagefright/MediaDefs.h>
42e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn#include <media/stagefright/MediaErrors.h>
43cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn#include <media/stagefright/MetaData.h>
447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn#include <gui/IGraphicBufferProducer.h>
45713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
46713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato#include "avc_utils.h"
47713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
4806f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski#include "ESDS.h"
4921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski#include <media/stagefright/Utils.h>
50e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
51e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornnamespace android {
5261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski
538a9b22056b13477f59df934928c00c58b5871c95Joe Onoratostruct NuPlayer::Action : public RefBase {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Action() {}
55bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski
564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    virtual void execute(NuPlayer *player) = 0;
5732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
58d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornprivate:
5932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    DISALLOW_EVIL_CONSTRUCTORS(Action);
60e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani};
61cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
6220b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinskistruct NuPlayer::SeekAction : public Action {
6332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    SeekAction(int64_t seekTimeUs)
640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        : mSeekTimeUs(seekTimeUs) {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void execute(NuPlayer *player) {
68515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        player->performSeek(mSeekTimeUs);
69515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    }
70515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
71515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiprivate:
72515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    int64_t mSeekTimeUs;
73713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
74e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    DISALLOW_EVIL_CONSTRUCTORS(SeekAction);
75010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski};
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct NuPlayer::SetSurfaceAction : public Action {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SetSurfaceAction(const sp<NativeWindowWrapper> &wrapper)
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        : mWrapper(wrapper) {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
81cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
8268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    virtual void execute(NuPlayer *player) {
8368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        player->performSetSurface(mWrapper);
84c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
85c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
86010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiprivate:
87010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    sp<NativeWindowWrapper> mWrapper;
88010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
89010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    DISALLOW_EVIL_CONSTRUCTORS(SetSurfaceAction);
90010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski};
91010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
92010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski// Use this if there's no state necessary to save in order to execute
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// the action.
94010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskistruct NuPlayer::SimpleAction : public Action {
95010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    typedef void (NuPlayer::*ActionFunc)();
96010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
97010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    SimpleAction(ActionFunc func)
98010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        : mFunc(func) {
99010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
100010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
101010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    virtual void execute(NuPlayer *player) {
102010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        (player->*mFunc)();
103010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
104010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
105010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiprivate:
106010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    ActionFunc mFunc;
1073f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
1084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    DISALLOW_EVIL_CONSTRUCTORS(SimpleAction);
1094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski};
1104b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
111010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski////////////////////////////////////////////////////////////////////////////////
112a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
11361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam LesinskiNuPlayer::NuPlayer()
1144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    : mUIDValid(false),
1154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski      mSourceFlags(0),
1164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski      mVideoIsAVC(false),
1174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski      mAudioEOS(false),
1184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski      mVideoEOS(false),
1194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski      mScanSourcesPending(false),
1204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski      mScanSourcesGeneration(0),
1214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski      mPollDurationGeneration(0),
1224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski      mTimeDiscontinuityPending(false),
123a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski      mFlushingAudio(NONE),
124a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski      mFlushingVideo(NONE),
125a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski      mSkipRenderingAudioUntilMediaTimeUs(-1ll),
126a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski      mSkipRenderingVideoUntilMediaTimeUs(-1ll),
127a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski      mVideoLateByUs(0ll),
128a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski      mNumFramesTotal(0ll),
129010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski      mNumFramesDropped(0ll),
13056d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski      mVideoScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW),
13156d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski      mStarted(false) {
13256d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski}
13356d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski
13456d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam LesinskiNuPlayer::~NuPlayer() {
13556d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski}
13661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski
13761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinskivoid NuPlayer::setUID(uid_t uid) {
13861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski    mUIDValid = true;
13961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski    mUID = uid;
14061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski}
14161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski
14261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinskivoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) {
1434b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    mDriver = driver;
1444b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski}
1454b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
146010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskivoid NuPlayer::setDataSourceAsync(const sp<IStreamSource> &source) {
1474b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
1484b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1494b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    sp<AMessage> notify = new AMessage(kWhatSourceNotify, id());
1504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    char prop[PROPERTY_VALUE_MAX];
1524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    if (property_get("media.stagefright.use-mp4source", prop, NULL)
1534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            && (!strcmp(prop, "1") || !strcasecmp(prop, "true"))) {
1544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        msg->setObject("source", new MP4Source(notify, source));
1559f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    } else {
15661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        msg->setObject("source", new StreamingSource(notify, source));
1579f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    }
15861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski
159a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski    msg->post();
160a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski}
16161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski
16261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinskistatic bool IsHTTPLiveURL(const char *url) {
163a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski    if (!strncasecmp("http://", url, 7)
16461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            || !strncasecmp("https://", url, 8)) {
16561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        size_t len = strlen(url);
16661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {
16761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            return true;
16861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        }
16961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski
17061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        if (strstr(url,"m3u8")) {
17161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            return true;
1724b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
17361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski    }
1744b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    return false;
1764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski}
17768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
17868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharanvoid NuPlayer::setDataSourceAsync(
17968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        const char *url, const KeyedVector<String8, String8> *headers) {
18068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
18168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    size_t len = strlen(url);
18268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
18368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    sp<AMessage> notify = new AMessage(kWhatSourceNotify, id());
18468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
18568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    sp<Source> source;
18668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    if (IsHTTPLiveURL(url)) {
18768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        source = new HTTPLiveSource(notify, url, headers, mUIDValid, mUID);
18868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    } else if (!strncasecmp(url, "rtsp://", 7)) {
18968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        source = new RTSPSource(notify, url, headers, mUIDValid, mUID);
19068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    } else if ((!strncasecmp(url, "http://", 7)
19168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                || !strncasecmp(url, "https://", 8))
19268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    && ((len >= 4 && !strcasecmp(".sdp", &url[len - 4]))
19368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    || strstr(url, ".sdp?"))) {
19468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        source = new RTSPSource(notify, url, headers, mUIDValid, mUID, true);
19568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    } else {
19668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        source = new GenericSource(notify, url, headers, mUIDValid, mUID);
19768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    }
19868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
19968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    msg->setObject("source", source);
20068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    msg->post();
20168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan}
20268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
20368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharanvoid NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_t length) {
2040068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
2054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
2064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    sp<AMessage> notify = new AMessage(kWhatSourceNotify, id());
20720b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski
20820b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski    sp<Source> source = new GenericSource(notify, fd, offset, length);
20920b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski    msg->setObject("source", source);
21020b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski    msg->post();
2114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski}
2124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
21368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharanvoid NuPlayer::prepareAsync() {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    (new AMessage(kWhatPrepare, id()))->post();
21568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan}
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid NuPlayer::setVideoSurfaceTextureAsync(
218f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        const sp<IGraphicBufferProducer> &bufferProducer) {
219f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
220f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
221e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    if (bufferProducer == NULL) {
2226832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski        msg->setObject("native-window", NULL);
2232c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    } else {
2242c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown        msg->setObject(
2252c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown                "native-window",
2262c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown                new NativeWindowWrapper(
2272c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown                    new SurfaceTextureClient(bufferProducer)));
2282c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
2292c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
230010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    msg->post();
231010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski}
232010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
233c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackbornvoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
2342c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id());
2352c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    msg->setObject("sink", sink);
23655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    msg->post();
2378a9b22056b13477f59df934928c00c58b5871c95Joe Onorato}
2384b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
239010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskivoid NuPlayer::start() {
24055280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    (new AMessage(kWhatStart, id()))->post();
2416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn}
24255280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn
24320b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinskivoid NuPlayer::pause() {
24420b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski    (new AMessage(kWhatPause, id()))->post();
24520b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski}
24655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn
24755280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackbornvoid NuPlayer::resume() {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    (new AMessage(kWhatResume, id()))->post();
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid NuPlayer::resetAsync() {
25291268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn    (new AMessage(kWhatReset, id()))->post();
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid NuPlayer::seekToAsync(int64_t seekTimeUs) {
256cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    sp<AMessage> msg = new AMessage(kWhatSeek, id());
257cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    msg->setInt64("seekTimeUs", seekTimeUs);
258cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    msg->post();
259cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn}
2608ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
261cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn// static
262cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) {
263cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    switch (state) {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case FLUSHING_DECODER:
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (needShutdown != NULL) {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                *needShutdown = false;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case FLUSHING_DECODER_SHUTDOWN:
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (needShutdown != NULL) {
2720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                *needShutdown = true;
2734b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
2744b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            return true;
2754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
2764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        default:
2774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            return false;
2784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
2794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski}
2804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
2812f1993ec460166413e7887f151630f6708077c0fDianne Hackbornvoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
2822f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    switch (msg->what()) {
283b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        case kWhatSetDataSource:
284b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        {
285b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            ALOGV("kWhatSetDataSource");
286b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski
287b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            CHECK(mSource == NULL);
288b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski
289b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            sp<RefBase> obj;
290b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            CHECK(msg->findObject("source", &obj));
291b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski
2922f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mSource = static_cast<Source *>(obj.get());
2932f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2942f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            looper()->registerHandler(mSource);
2952f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2962f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            CHECK(mDriver != NULL);
2972f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            sp<NuPlayerDriver> driver = mDriver.promote();
2982f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            if (driver != NULL) {
2992f1993ec460166413e7887f151630f6708077c0fDianne Hackborn                driver->notifySetDataSourceCompleted(OK);
30061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            }
3012f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            break;
3022f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3032f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3042f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        case kWhatPrepare:
3052f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        {
3062f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mSource->prepareAsync();
3072f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            break;
3082f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3092f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3101e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        case kWhatPollDuration:
3111e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        {
3121e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            int32_t generation;
3131e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            CHECK(msg->findInt32("generation", &generation));
3141e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
3151e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            if (generation != mPollDurationGeneration) {
3161e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn                // stale
3171e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn                break;
3181e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            }
3191e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
3201e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            int64_t durationUs;
3211e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
322a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn                sp<NuPlayerDriver> driver = mDriver.promote();
3232f1993ec460166413e7887f151630f6708077c0fDianne Hackborn                if (driver != NULL) {
324a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn                    driver->notifyDuration(durationUs);
3252f1993ec460166413e7887f151630f6708077c0fDianne Hackborn                }
3262f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            }
3272f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
328a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            msg->post(1000000ll);  // poll again in a second.
3292f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            break;
330a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn        }
3312f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3322f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        case kWhatSetVideoNativeWindow:
3332f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        {
3342f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            ALOGV("kWhatSetVideoNativeWindow");
3352f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDeferredActions.push_back(
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    new SimpleAction(&NuPlayer::performDecoderShutdown));
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            sp<RefBase> obj;
3408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            CHECK(msg->findObject("native-window", &obj));
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
342010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            mDeferredActions.push_back(
3434b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    new SetSurfaceAction(
3444b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                        static_cast<NativeWindowWrapper *>(obj.get())));
3454b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (obj != NULL) {
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If there is a new surface texture, instantiate decoders
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // again if possible.
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDeferredActions.push_back(
3500068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        new SimpleAction(&NuPlayer::performScanSources));
3510068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            }
3520068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            processDeferredActions();
3540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            break;
3550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
3560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
357010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        case kWhatSetAudioSink:
3584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        {
3594b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            ALOGV("kWhatSetAudioSink");
3604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
3610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            sp<RefBase> obj;
3620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            CHECK(msg->findObject("sink", &obj));
3630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
3650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            break;
3660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
3670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        case kWhatStart:
3690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        {
3700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            ALOGV("kWhatStart");
3714870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn
3724870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            mVideoIsAVC = false;
3734870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            mAudioEOS = false;
3744870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            mVideoEOS = false;
3754870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            mSkipRenderingAudioUntilMediaTimeUs = -1;
3764870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            mSkipRenderingVideoUntilMediaTimeUs = -1;
377ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            mVideoLateByUs = 0;
378ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            mNumFramesTotal = 0;
379ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            mNumFramesDropped = 0;
380ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            mStarted = true;
381ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
382ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            mSource->start();
383ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
384ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            mRenderer = new Renderer(
385ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn                    mAudioSink,
386ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn                    new AMessage(kWhatRendererNotify, id()));
387ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
388ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            looper()->registerHandler(mRenderer);
389ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
390ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            postScanSources();
391099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            break;
392099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
393099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
394099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        case kWhatScanSources:
395099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        {
396099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            int32_t generation;
397099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            CHECK(msg->findInt32("generation", &generation));
398fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            if (generation != mScanSourcesGeneration) {
399fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn                // Drop obsolete msg.
400fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn                break;
401fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            }
402fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
403fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mScanSourcesPending = false;
404fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
405fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            ALOGV("scanning sources haveAudio=%d, haveVideo=%d",
406fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn                 mAudioDecoder != NULL, mVideoDecoder != NULL);
407fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
408fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            bool mHadAnySourcesBefore =
409fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn                (mAudioDecoder != NULL) || (mVideoDecoder != NULL);
410fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
411fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            if (mNativeWindow != NULL) {
412fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn                instantiateDecoder(false, &mVideoDecoder);
413fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            }
414fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
415fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            if (mAudioSink != NULL) {
416fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn                instantiateDecoder(true, &mAudioDecoder);
417fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            }
418fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
419fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            if (!mHadAnySourcesBefore
420fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn                    && (mAudioDecoder != NULL || mVideoDecoder != NULL)) {
421fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn                // This is the first time we've found anything playable.
422fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
423fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn                if (mSourceFlags & Source::FLAG_DYNAMIC_DURATION) {
424fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn                    schedulePollDuration();
425fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn                }
4261e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            }
4271e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
4281e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            status_t err;
4291e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            if ((err = mSource->feedMoreTSData()) != OK) {
4301e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn                if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
4311e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn                    // We're not currently decoding anything (no audio or
4321e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn                    // video tracks found) and we just ran out of input data.
4331e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
4341e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn                    if (err == ERROR_END_OF_STREAM) {
4351e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn                        notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
4361e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn                    } else {
4371e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn                        notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
4381e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn                    }
4391e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn                }
440a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn                break;
4413d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn            }
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((mAudioDecoder == NULL && mAudioSink != NULL)
444e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    || (mVideoDecoder == NULL && mNativeWindow != NULL)) {
44540c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn                msg->post(100000ll);
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScanSourcesPending = true;
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
449cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case kWhatVideoNotify:
452cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        case kWhatAudioNotify:
453cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        {
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool audio = msg->what() == kWhatAudioNotify;
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<AMessage> codecRequest;
457a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            CHECK(msg->findMessage("codec-request", &codecRequest));
458a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn
4597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            int32_t what;
4607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            CHECK(codecRequest->findInt32("what", &what));
461a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn
462a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            if (what == ACodec::kWhatFillThisBuffer) {
4637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                status_t err = feedDecoderInputData(
4647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                        audio, codecRequest);
4657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
466cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                if (err == -EWOULDBLOCK) {
467cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (mSource->feedMoreTSData() == OK) {
468e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                        msg->post(10000ll);
469e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    }
470e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                }
471cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            } else if (what == ACodec::kWhatEOS) {
472e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                int32_t err;
473e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                CHECK(codecRequest->findInt32("err", &err));
474e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
475e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                if (err == ERROR_END_OF_STREAM) {
476cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    ALOGV("got %s decoder EOS", audio ? "audio" : "video");
477cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                } else {
4787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    ALOGV("got %s decoder EOS w/ error %d",
4797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                         audio ? "audio" : "video",
480cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                         err);
4817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                }
4827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
4837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                mRenderer->queueEOS(audio, err);
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (what == ACodec::kWhatFlushCompleted) {
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bool needShutdown;
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                if (audio) {
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CHECK(IsFlushingState(mFlushingAudio, &needShutdown));
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFlushingAudio = FLUSHED;
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CHECK(IsFlushingState(mFlushingVideo, &needShutdown));
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFlushingVideo = FLUSHED;
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    mVideoLateByUs = 0;
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ALOGV("decoder %s flush completed", audio ? "audio" : "video");
498a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
499a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                if (needShutdown) {
500a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                    ALOGV("initiating %s decoder shutdown",
501a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                         audio ? "audio" : "video");
502a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
503a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
504a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
505a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                    if (audio) {
506a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                        mFlushingAudio = SHUTTING_DOWN_DECODER;
507a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                    } else {
508a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                        mFlushingVideo = SHUTTING_DOWN_DECODER;
509a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                    }
510a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                }
511a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                finishFlushIfPossible();
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (what == ACodec::kWhatOutputFormatChanged) {
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (audio) {
5156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    int32_t numChannels;
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CHECK(codecRequest->findInt32(
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "channel-count", &numChannels));
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int32_t sampleRate;
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CHECK(codecRequest->findInt32("sample-rate", &sampleRate));
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    ALOGV("Audio output format changed to %d Hz, %d channels",
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         sampleRate, numChannels);
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAudioSink->close();
526e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    audio_output_flags_t flags;
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int64_t durationUs;
529e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown                    // FIXME: we should handle the case where the video decoder
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // is created after we receive the format change indication.
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Current code will just make that we select deep buffer
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // with video which should not be a problem as it should
533617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    // not prevent from keeping A/V sync.
534617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    if (mVideoDecoder == NULL &&
535617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            mSource->getDuration(&durationUs) == OK &&
536617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            durationUs
537617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                                > AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US) {
538617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
539617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    } else {
540e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown                        flags = AUDIO_OUTPUT_FLAG_NONE;
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
543e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown                    int32_t channelMask;
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!codecRequest->findInt32("channel-mask", &channelMask)) {
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        channelMask = CHANNEL_MASK_USE_CHANNEL_ORDER;
546617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    }
547280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn
548280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn                    CHECK_EQ(mAudioSink->open(
549280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn                                sampleRate,
550280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn                                numChannels,
551280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn                                (audio_channel_mask_t)channelMask,
552280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn                                AUDIO_FORMAT_PCM_16_BIT,
553280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn                                8 /* bufferCount */,
554e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown                                NULL,
555617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                                NULL,
556617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                                flags),
557e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown                             (status_t)OK);
558617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mAudioSink->start();
559617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
560e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn                    mRenderer->signalAudioSinkChanged();
5611e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn                } else {
5621e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn                    // video
5631e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
5641e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn                    int32_t width, height;
5651e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn                    CHECK(codecRequest->findInt32("width", &width));
5661e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn                    CHECK(codecRequest->findInt32("height", &height));
5671e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
5682ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn                    int32_t cropLeft, cropTop, cropRight, cropBottom;
569e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn                    CHECK(codecRequest->findRect(
570e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn                                "crop",
5712ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn                                &cropLeft, &cropTop, &cropRight, &cropBottom));
572e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
573e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn                    int32_t displayWidth = cropRight - cropLeft + 1;
574e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn                    int32_t displayHeight = cropBottom - cropTop + 1;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ALOGV("Video output format changed to %d x %d "
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         "(crop: %d x %d @ (%d, %d))",
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         width, height,
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         displayWidth,
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         displayHeight,
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         cropLeft, cropTop);
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sp<AMessage> videoInputFormat =
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mSource->getFormat(false /* audio */);
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Take into account sample aspect ratio if necessary:
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int32_t sarWidth, sarHeight;
588105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    if (videoInputFormat->findInt32("sar-width", &sarWidth)
589e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                            && videoInputFormat->findInt32(
590627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                                "sar-height", &sarHeight)) {
591627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                        ALOGV("Sample aspect ratio %d : %d",
592e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                              sarWidth, sarHeight);
593627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
594627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                        displayWidth = (displayWidth * sarWidth) / sarHeight;
595627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
596627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                        ALOGV("display dimensions %d x %d",
597627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                              displayWidth, displayHeight);
598627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    }
599627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
600627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    notifyListener(
601627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                            MEDIA_SET_VIDEO_SIZE, displayWidth, displayHeight);
60232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                }
603f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            } else if (what == ACodec::kWhatShutdownCompleted) {
60432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                ALOGV("%s shutdown completed", audio ? "audio" : "video");
605e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if (audio) {
60632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                    mAudioDecoder.clear();
607e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
60832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
60932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                    mFlushingAudio = SHUT_DOWN;
61032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                } else {
61158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mVideoDecoder.clear();
612105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
613105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
61458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mFlushingVideo = SHUT_DOWN;
615105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                }
616105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
617105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                finishFlushIfPossible();
61858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            } else if (what == ACodec::kWhatError) {
619105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                ALOGE("Received error from %s decoder, aborting playback.",
620105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                     audio ? "audio" : "video");
62158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
622105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mRenderer->queueEOS(audio, UNKNOWN_ERROR);
623105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            } else if (what == ACodec::kWhatDrainThisBuffer) {
624d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood                renderBuffer(audio, codecRequest);
625244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            } else if (what != ACodec::kWhatComponentAllocated
626244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                    && what != ACodec::kWhatComponentConfigured
627244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                    && what != ACodec::kWhatBuffersAllocated) {
628244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                ALOGV("Unhandled codec notification %d '%c%c%c%c'.",
629244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                      what,
630244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                      what >> 24,
631244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                      (what >> 16) & 0xff,
632244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                      (what >> 8) & 0xff,
633244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                      what & 0xff);
634244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
635244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
636244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            break;
637244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
638244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
639244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        case kWhatRendererNotify:
640244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        {
641244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            int32_t what;
642244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            CHECK(msg->findInt32("what", &what));
643244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
644244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            if (what == Renderer::kWhatEOS) {
645244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                int32_t audio;
646244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                CHECK(msg->findInt32("audio", &audio));
647244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
648244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                int32_t finalResult;
649244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                CHECK(msg->findInt32("finalResult", &finalResult));
650244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
651244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                if (audio) {
652244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                    mAudioEOS = true;
65310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn                } else {
65410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn                    mVideoEOS = true;
65510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn                }
65610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
65710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn                if (finalResult == ERROR_END_OF_STREAM) {
65810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn                    ALOGV("reached %s EOS", audio ? "audio" : "video");
65910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn                } else {
66010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn                    ALOGE("%s track encountered an error (%d)",
66110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn                         audio ? "audio" : "video", finalResult);
66210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
66310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn                    notifyListener(
66410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn                            MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult);
66510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn                }
66610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
6676d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk                if ((mAudioEOS || mAudioDecoder == NULL)
668abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn                        && (mVideoEOS || mVideoDecoder == NULL)) {
669abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
6706d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk                }
671abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn            } else if (what == Renderer::kWhatPosition) {
672abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn                int64_t positionUs;
673abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn                CHECK(msg->findInt64("positionUs", &positionUs));
6746d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
675abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn                CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs));
676abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
6776d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk                if (mDriver != NULL) {
6786d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk                    sp<NuPlayerDriver> driver = mDriver.promote();
6796d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk                    if (driver != NULL) {
6806d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk                        driver->notifyPosition(positionUs);
6816d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6826d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk                        driver->notifyFrameStats(
6836d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk                                mNumFramesTotal, mNumFramesDropped);
6846d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk                    }
6856d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk                }
6866d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            } else if (what == Renderer::kWhatFlushComplete) {
6876d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk                int32_t audio;
6886d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk                CHECK(msg->findInt32("audio", &audio));
6896d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6906d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk                ALOGV("renderer %s flush completed.", audio ? "audio" : "video");
6916d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            } else if (what == Renderer::kWhatVideoRenderingStart) {
6926d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk                notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0);
6936d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            }
6946d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            break;
6956d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6966d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6976d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        case kWhatMoreDataQueued:
6986d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        {
6996d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            break;
7006d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
7016d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7026d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        case kWhatReset:
7036d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        {
7046d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            ALOGV("kWhatReset");
7056d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
706abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn            mDeferredActions.push_back(
707abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn                    new SimpleAction(&NuPlayer::performDecoderShutdown));
708abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
709e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            mDeferredActions.push_back(
710e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    new SimpleAction(&NuPlayer::performReset));
711e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
712e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            processDeferredActions();
713e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            break;
714e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        }
7150c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn
716a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        case kWhatSeek:
71706f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski        {
71806f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski            int64_t seekTimeUs;
71906f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
7209f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski
7219f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            ALOGV("kWhatSeek seekTimeUs=%lld us", seekTimeUs);
722a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
7230c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn            mDeferredActions.push_back(
7240c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                    new SimpleAction(&NuPlayer::performDecoderFlush));
725e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
726e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            mDeferredActions.push_back(new SeekAction(seekTimeUs));
72758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
728d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            processDeferredActions();
729d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            break;
73058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
731d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
732d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        case kWhatPause:
733d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        {
73458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            CHECK(mRenderer != NULL);
735d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mSource->pause();
736d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mRenderer->pause();
73758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            break;
73858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
73958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
74058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        case kWhatResume:
74158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        {
74258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            CHECK(mRenderer != NULL);
74358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mSource->resume();
74458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mRenderer->resume();
745d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            break;
746d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
747d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
748ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        case kWhatSourceNotify:
749ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        {
750ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            onSourceNotify(msg);
751ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            break;
752ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        }
753ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn
754ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        default:
7553251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            TRESPASS();
7563251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            break;
7573251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7583251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn}
7593251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
7603251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackbornvoid NuPlayer::finishFlushIfPossible() {
7613251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
7623251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        return;
7633251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7643251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
7653251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
7663251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        return;
7673251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7683251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
769105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    ALOGV("both audio and video are flushed now.");
770105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
771105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    if (mTimeDiscontinuityPending) {
772105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mRenderer->signalTimeDiscontinuity();
773105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mTimeDiscontinuityPending = false;
774105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
775105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
776105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    if (mAudioDecoder != NULL) {
777105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mAudioDecoder->signalResume();
778105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
779105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
780105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    if (mVideoDecoder != NULL) {
781105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mVideoDecoder->signalResume();
7826ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    }
7836ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
784105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    mFlushingAudio = NONE;
785105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    mFlushingVideo = NONE;
7866ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
787105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    processDeferredActions();
788105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project}
7896ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
7906ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pellyvoid NuPlayer::postScanSources() {
791105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    if (mScanSourcesPending) {
792105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return;
7936ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    }
794105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
795105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    sp<AMessage> msg = new AMessage(kWhatScanSources, id());
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    msg->setInt32("generation", mScanSourcesGeneration);
7975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    msg->post();
7985347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
7995347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    mScanSourcesPending = true;
8005347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt}
8015347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
8025347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwaltstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
8035347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    if (*decoder != NULL) {
8045347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        return OK;
8055347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
8065347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
8075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    sp<AMessage> format = mSource->getFormat(audio);
8085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
8095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    if (format == NULL) {
8105347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        return -EWOULDBLOCK;
8117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    if (!audio) {
8147e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        AString mime;
8157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        CHECK(format->findString("mime", &mime));
8167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime.c_str());
8177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    sp<AMessage> notify =
8207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
8217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                     id());
8227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    *decoder = audio ? new Decoder(notify) :
8247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                       new Decoder(notify, mNativeWindow);
8256ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    looper()->registerHandler(*decoder);
8267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    (*decoder)->configure(format);
8286ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
8297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    int64_t durationUs;
8307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
8317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        sp<NuPlayerDriver> driver = mDriver.promote();
8326ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly        if (driver != NULL) {
8337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            driver->notifyDuration(durationUs);
8347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8356ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    }
8367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    return OK;
8387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn}
839a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
840a029ea131836725b050e1a7550aa171b68171522Robert Greenwaltstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
841a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    sp<AMessage> reply;
842a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    CHECK(msg->findMessage("reply", &reply));
843a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
844a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    if ((audio && IsFlushingState(mFlushingAudio))
845a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            || (!audio && IsFlushingState(mFlushingVideo))) {
846a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        reply->setInt32("err", INFO_DISCONTINUITY);
847a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        reply->post();
848a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        return OK;
849a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
850a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
851a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    sp<ABuffer> accessUnit;
852a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
8537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    bool dropAccessUnit;
8547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    do {
8557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
8567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        if (err == -EWOULDBLOCK) {
8587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            return err;
8597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        } else if (err != OK) {
8604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (err == INFO_DISCONTINUITY) {
8617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                int32_t type;
8627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
8637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                bool formatChange =
8657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    (audio &&
8667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                     (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT))
8677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    || (!audio &&
8687a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey                            (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT));
8694b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
8701059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0;
8711059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
8724b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                ALOGI("%s discontinuity (formatChange=%d, time=%d)",
8731059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                     audio ? "audio" : "video", formatChange, timeChange);
8741059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
8751059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                if (audio) {
8767a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey                    mSkipRenderingAudioUntilMediaTimeUs = -1;
8777a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey                } else {
8787a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey                    mSkipRenderingVideoUntilMediaTimeUs = -1;
8797a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey                }
8807a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey
8817a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey                if (timeChange) {
8827a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey                    sp<AMessage> extra;
8837a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey                    if (accessUnit->meta()->findMessage("extra", &extra)
8848ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                            && extra != NULL) {
88508c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn                        int64_t resumeAtMediaTimeUs;
8868ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                        if (extra->findInt64(
8878ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                                    "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
88808c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn                            ALOGI("suppressing rendering of %s until %lld us",
8898ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                                    audio ? "audio" : "video", resumeAtMediaTimeUs);
8908ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
8918ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                            if (audio) {
8928ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                                mSkipRenderingAudioUntilMediaTimeUs =
8938ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                                    resumeAtMediaTimeUs;
8948ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                            } else {
8958ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                                mSkipRenderingVideoUntilMediaTimeUs =
8968ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                                    resumeAtMediaTimeUs;
8978ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                            }
8988ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                        }
8998ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                    }
9008ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                }
9018ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9028ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                mTimeDiscontinuityPending =
9038ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                    mTimeDiscontinuityPending || timeChange;
9048ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9058ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn                if (formatChange || timeChange) {
9066771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski                    if (mFlushingAudio == NONE && mFlushingVideo == NONE) {
9076771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski                        // And we'll resume scanning sources once we're done
9086771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski                        // flushing.
9099f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                        mDeferredActions.push_front(
9109f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                                new SimpleAction(
9119f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                                    &NuPlayer::performScanSources));
9126771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski                    }
9136771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
9146771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski                    flushDecoder(audio, formatChange);
9156771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski                } else {
9166771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski                    // This stream is unaffected by the discontinuity
9179f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski
9189f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                    if (audio) {
9199f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                        mFlushingAudio = FLUSHED;
9209f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                    } else {
9219f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                        mFlushingVideo = FLUSHED;
9229f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                    }
9239f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski
9249f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                    finishFlushIfPossible();
9259f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski
9269f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                    return -EWOULDBLOCK;
9279f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                }
9286771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski            }
9296771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
930010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            reply->setInt32("err", err);
931010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            reply->post();
932010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return OK;
933010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
934010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
935010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (!audio) {
936010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            ++mNumFramesTotal;
937010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
938010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
939010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        dropAccessUnit = false;
940010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (!audio
941010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                && mVideoLateByUs > 100000ll
942010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                && mVideoIsAVC
943010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                && !IsAVCReferenceFrame(accessUnit)) {
944010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            dropAccessUnit = true;
945010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            ++mNumFramesDropped;
946010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
947010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    } while (dropAccessUnit);
948010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
949010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
950010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
951010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski#if 0
952010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    int64_t mediaTimeUs;
953010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
954010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    ALOGV("feeding %s input buffer at media time %.2f secs",
955010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski         audio ? "audio" : "video",
956010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski         mediaTimeUs / 1E6);
957010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski#endif
958010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
959010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    reply->setBuffer("buffer", accessUnit);
960010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    reply->post();
961010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
962010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    return OK;
963010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski}
964010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
965010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskivoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
966010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    // ALOGV("renderBuffer %s", audio ? "audio" : "video");
967010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
968010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    sp<AMessage> reply;
969010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    CHECK(msg->findMessage("reply", &reply));
970010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) {
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We're currently attempting to flush the decoder, in order
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to complete this, the decoder wants all its buffers back,
9744b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // so we don't want any output buffers it sent us (from before
975d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // we initiated the flush) to be stuck in the renderer's queue.
976d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
977a8018ac47a0c0725882a041a1c42e67f52129f02Adam Lesinski        ALOGV("we're still flushing the %s decoder, sending its output buffer"
978d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski             " right back.", audio ? "audio" : "video");
979d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
980d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        reply->post();
981d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        return;
982d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    }
983d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
984d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    sp<ABuffer> buffer;
985d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    CHECK(msg->findBuffer("buffer", &buffer));
986d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
987d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    int64_t &skipUntilMediaTimeUs =
988d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        audio
989d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            ? mSkipRenderingAudioUntilMediaTimeUs
990926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski            : mSkipRenderingVideoUntilMediaTimeUs;
991a8018ac47a0c0725882a041a1c42e67f52129f02Adam Lesinski
992d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    if (skipUntilMediaTimeUs >= 0) {
993d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        int64_t mediaTimeUs;
994d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs));
995d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
996d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        if (mediaTimeUs < skipUntilMediaTimeUs) {
997d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            ALOGV("dropping %s buffer at time %lld as requested.",
998010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                 audio ? "audio" : "video",
999d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                 mediaTimeUs);
1000926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski
1001a8018ac47a0c0725882a041a1c42e67f52129f02Adam Lesinski            reply->post();
1002d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            return;
1003d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        }
1004d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
1005633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        skipUntilMediaTimeUs = -1;
1006633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mRenderer->queueBuffer(audio, buffer, reply);
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid NuPlayer::notifyListener(int msg, int ext1, int ext2) {
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mDriver == NULL) {
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<NuPlayerDriver> driver = mDriver.promote();
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (driver == NULL) {
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    driver->notifyListener(msg, ext1, ext2);
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid NuPlayer::flushDecoder(bool audio, bool needShutdown) {
1026c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) {
1027c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        ALOGI("flushDecoder %s without decoder present",
1028515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski             audio ? "audio" : "video");
1029515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    }
1030515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1031515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    // Make sure we don't continue to scan sources until we finish flushing.
1032c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    ++mScanSourcesGeneration;
1033c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    mScanSourcesPending = false;
1034c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1035c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
1036c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    mRenderer->flush(audio);
1037c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1038c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    FlushStatus newStatus =
1039c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
1040515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1041515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    if (audio) {
1042515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        CHECK(mFlushingAudio == NONE
1043515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                || mFlushingAudio == AWAITING_DISCONTINUITY);
1044515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1045515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        mFlushingAudio = newStatus;
1046515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1047515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        if (mFlushingVideo == NONE) {
1048515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mFlushingVideo = (mVideoDecoder != NULL)
1049c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                ? AWAITING_DISCONTINUITY
1050515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                : FLUSHED;
1051515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        }
1052c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    } else {
1053515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        CHECK(mFlushingVideo == NONE
1054c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                || mFlushingVideo == AWAITING_DISCONTINUITY);
1055c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1056c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        mFlushingVideo = newStatus;
1057c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1058c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        if (mFlushingAudio == NONE) {
1059c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            mFlushingAudio = (mAudioDecoder != NULL)
1060515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                ? AWAITING_DISCONTINUITY
1061515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                : FLUSHED;
1062515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        }
1063515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    }
1064515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski}
1065515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1066515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskisp<AMessage> NuPlayer::Source::getFormat(bool audio) {
1067515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    sp<MetaData> meta = getFormatMeta(audio);
1068515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1069515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    if (meta == NULL) {
1070515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        return NULL;
1071515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    }
1072515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1073515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    sp<AMessage> msg = new AMessage;
1074515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1075515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    if(convertMetaDataToMessage(meta, &msg) == OK) {
1076515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        return msg;
1077515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    }
1078515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    return NULL;
1079515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski}
1080515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1081515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskistatus_t NuPlayer::setVideoScalingMode(int32_t mode) {
1082515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    mVideoScalingMode = mode;
1083515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    if (mNativeWindow != NULL) {
1084c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        status_t ret = native_window_set_scaling_mode(
1085c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mNativeWindow->getNativeWindow().get(), mVideoScalingMode);
1086515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        if (ret != OK) {
1087c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            ALOGE("Failed to set scaling mode (%d): %s",
1088ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                -ret, strerror(-ret));
108991268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn            return ret;
10901e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn        }
1091d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn    }
1092865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn    return OK;
1093865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn}
10941476d32b87d85885838fb066bcca48f1df9750b6Joe Onorato
1095099bc627c463d9941e23e480f25a78a154429c55Dianne Hackbornvoid NuPlayer::schedulePollDuration() {
1096c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    sp<AMessage> msg = new AMessage(kWhatPollDuration, id());
1097c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    msg->setInt32("generation", mPollDurationGeneration);
1098d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn    msg->post();
1099ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn}
1100ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
1101d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackbornvoid NuPlayer::cancelPollDuration() {
1102d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn    ++mPollDurationGeneration;
1103cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn}
1104fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn
1105fc0641340ff927d9c35d5613723d25858f751118Dianne Hackbornvoid NuPlayer::processDeferredActions() {
1106fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn    while (!mDeferredActions.empty()) {
1107fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        // We won't execute any deferred actions until we're no longer in
1108fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        // an intermediate state, i.e. one more more decoders are currently
11090068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        // flushing or shutting down.
11101e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
1111fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        if (mRenderer != NULL) {
1112ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            // There's an edge case where the renderer owns all output
1113ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            // buffers and is paused, therefore the decoder will not read
1114cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            // more input data and will never encounter the matching
1115cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            // discontinuity. To avoid this, we resume the renderer.
1116cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
1117cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            if (mFlushingAudio == AWAITING_DISCONTINUITY
1118cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    || mFlushingVideo == AWAITING_DISCONTINUITY) {
1119cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                mRenderer->resume();
1120cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            }
11210068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
1122cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
11230068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
1124cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            // We're currently flushing, postpone the reset until that's
11259a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            // completed.
11269a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn
11279a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            ALOGV("postponing action mFlushingAudio=%d, mFlushingVideo=%d",
11289a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn                  mFlushingAudio, mFlushingVideo);
1129cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
1130cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            break;
1131cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
1132cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
1133cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        sp<Action> action = *mDeferredActions.begin();
1134cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mDeferredActions.erase(mDeferredActions.begin());
1135cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
1136cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        action->execute(this);
11374b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11403abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootvoid NuPlayer::performSeek(int64_t seekTimeUs) {
11413abd75ba3a981850cac43a401d0014a836559cb0Kenny Root    ALOGV("performSeek seekTimeUs=%lld us (%.2f secs)",
11423abd75ba3a981850cac43a401d0014a836559cb0Kenny Root          seekTimeUs,
11433abd75ba3a981850cac43a401d0014a836559cb0Kenny Root          seekTimeUs / 1E6);
11443abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
11453abd75ba3a981850cac43a401d0014a836559cb0Kenny Root    mSource->seekTo(seekTimeUs);
11463abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
11473abd75ba3a981850cac43a401d0014a836559cb0Kenny Root    if (mDriver != NULL) {
1148c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        sp<NuPlayerDriver> driver = mDriver.promote();
11490068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if (driver != NULL) {
11500068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            driver->notifyPosition(seekTimeUs);
11510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            driver->notifySeekComplete();
115216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        }
1153c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
1154cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn
1155e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    // everything's flushed, continue playback.
1156c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn}
1157c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1158e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornvoid NuPlayer::performDecoderFlush() {
11590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    ALOGV("performDecoderFlush");
11600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
1161099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    if (mAudioDecoder != NULL && mVideoDecoder == NULL) {
1162c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        return;
1163c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
1164c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1165c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    mTimeDiscontinuityPending = true;
1166c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1167c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    if (mAudioDecoder != NULL) {
1168c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        flushDecoder(true /* audio */, false /* needShutdown */);
1169c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
1170c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1171c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    if (mVideoDecoder != NULL) {
117216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        flushDecoder(false /* audio */, false /* needShutdown */);
117349021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn    }
11740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn}
1175c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1176c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackbornvoid NuPlayer::performDecoderShutdown() {
1177c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    ALOGV("performDecoderShutdown");
1178d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn
1179d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn    if (mAudioDecoder != NULL && mVideoDecoder == NULL) {
1180e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        return;
1181e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    }
11823d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn
1183e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    mTimeDiscontinuityPending = true;
11840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mAudioDecoder != NULL) {
1186010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        flushDecoder(true /* audio */, true /* needShutdown */);
11870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
1188010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
11890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    if (mVideoDecoder != NULL) {
11900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        flushDecoder(false /* audio */, true /* needShutdown */);
11910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
11920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn}
11930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1194d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackbornvoid NuPlayer::performReset() {
1195d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn    ALOGV("performReset");
1196d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn
1197d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn    CHECK(mAudioDecoder == NULL);
1198d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn    CHECK(mVideoDecoder == NULL);
1199d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn
1200d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn    cancelPollDuration();
1201d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn
1202d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn    ++mScanSourcesGeneration;
1203d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn    mScanSourcesPending = false;
1204d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn
1205d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn    mRenderer.clear();
1206fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn
1207cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    if (mSource != NULL) {
1208cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mSource->stop();
1209cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
1210cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        looper()->unregisterHandler(mSource->id());
1211cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
1212cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mSource.clear();
1213fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn    }
1214cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
1215cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    if (mDriver != NULL) {
1216cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        sp<NuPlayerDriver> driver = mDriver.promote();
1217cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if (driver != NULL) {
1218cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            driver->notifyResetComplete();
1219cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
1220ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    }
1221ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
1222ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    mStarted = false;
1223e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood}
1224a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn
1225cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornvoid NuPlayer::performScanSources() {
12260ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    ALOGV("performScanSources");
1227ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
1228cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn    if (!mStarted) {
1229cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        return;
1230cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn    }
1231cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn
1232e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey    if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
1233cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        postScanSources();
1234cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn    }
1235cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn}
1236cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn
1237cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornvoid NuPlayer::performSetSurface(const sp<NativeWindowWrapper> &wrapper) {
1238cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn    ALOGV("performSetSurface");
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mNativeWindow = wrapper;
1241e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
12420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    // XXX - ignore error from setVideoScalingMode for now
12430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    setVideoScalingMode(mVideoScalingMode);
12440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
124513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn    if (mDriver != NULL) {
124613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        sp<NuPlayerDriver> driver = mDriver.promote();
124713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        if (driver != NULL) {
124813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            driver->notifySetSurfaceComplete();
124913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        }
125013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn    }
125113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn}
1252010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
125313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackbornvoid NuPlayer::onSourceNotify(const sp<AMessage> &msg) {
125413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn    int32_t what;
1255d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn    CHECK(msg->findInt32("what", &what));
125613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
1257ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn    switch (what) {
1258ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        case Source::kWhatPrepared:
1259ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        {
12601e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn            int32_t err;
1261ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            CHECK(msg->findInt32("err", &err));
1262ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn
1263ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            sp<NuPlayerDriver> driver = mDriver.promote();
1264ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            if (driver != NULL) {
1265ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                driver->notifyPrepareCompleted(err);
12664b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
12670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            break;
12689cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn        }
12699cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn
12700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        case Source::kWhatFlagsChanged:
12710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        {
12720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            uint32_t flags;
12730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            CHECK(msg->findInt32("flags", (int32_t *)&flags));
12740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
12750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            if ((mSourceFlags & Source::FLAG_DYNAMIC_DURATION)
12760068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    && (!(flags & Source::FLAG_DYNAMIC_DURATION))) {
12770068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                cancelPollDuration();
12780068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            } else if (!(mSourceFlags & Source::FLAG_DYNAMIC_DURATION)
12790068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    && (flags & Source::FLAG_DYNAMIC_DURATION)
12800068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    && (mAudioDecoder != NULL || mVideoDecoder != NULL)) {
12810068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                schedulePollDuration();
12824b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
12830068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
12840068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            mSourceFlags = flags;
12850068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            break;
12860068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
12870068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
12880068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        case Source::kWhatVideoSizeChanged:
12890068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        {
12909ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski            int32_t width, height;
12910068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            CHECK(msg->findInt32("width", &width));
12920068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            CHECK(msg->findInt32("height", &height));
12930068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
12940068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            notifyListener(MEDIA_SET_VIDEO_SIZE, width, height);
12950068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            break;
12960068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
1297e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1298c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        case Source::kWhatBufferingStart:
129916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        {
130016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn            notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_START, 0);
130116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn            break;
1302e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
1303e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1304e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        case Source::kWhatBufferingEnd:
1305c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        {
130616b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn            notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_END, 0);
130716b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn            break;
130816b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        }
1309e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TRESPASS();
13124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
1313010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski}
1314010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1315010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski////////////////////////////////////////////////////////////////////////////////
1316010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1317010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskivoid NuPlayer::Source::notifyFlagsChanged(uint32_t flags) {
1318010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    sp<AMessage> notify = dupNotify();
1319010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    notify->setInt32("what", kWhatFlagsChanged);
1320010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    notify->setInt32("flags", flags);
1321010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    notify->post();
1322010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski}
1323010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1324010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskivoid NuPlayer::Source::notifyVideoSizeChanged(int32_t width, int32_t height) {
1325010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    sp<AMessage> notify = dupNotify();
1326010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    notify->setInt32("what", kWhatVideoSizeChanged);
1327010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    notify->setInt32("width", width);
1328010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    notify->setInt32("height", height);
1329010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    notify->post();
1330010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski}
1331010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1332010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskivoid NuPlayer::Source::notifyPrepared(status_t err) {
1333010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    sp<AMessage> notify = dupNotify();
1334010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    notify->setInt32("what", kWhatPrepared);
1335010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    notify->setInt32("err", err);
1336010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    notify->post();
1337010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski}
1338010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1339010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskivoid NuPlayer::Source::onMessageReceived(const sp<AMessage> &msg) {
1340010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    TRESPASS();
1341010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski}
1342010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1343010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski}  // namespace android
1344010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski