NuPlayer.cpp revision 5d246efa220a7c7b22e490576c488b3853c664dd
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/*
2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License.
6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at
7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software
11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and
14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License.
15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */
16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0
18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "NuPlayer"
19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h>
20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h"
225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "HTTPLiveSource.h"
24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDecoder.h"
2543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber#include "NuPlayerDriver.h"
26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerRenderer.h"
275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "NuPlayerSource.h"
282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include "RTSPSource.h"
295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "StreamingSource.h"
30afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include "GenericSource.h"
315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h"
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h>
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h>
393fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include <media/stagefright/MediaDefs.h>
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h>
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h>
421173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h>
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include "avc_utils.h"
453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
46f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
50f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer()
519b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    : mUIDValid(false),
523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mVideoIsAVC(false),
539b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber      mAudioEOS(false),
54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mVideoEOS(false),
555bc087c573c70c84c6a39946457590b42d392a33Andreas Huber      mScanSourcesPending(false),
561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mScanSourcesGeneration(0),
576e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber      mTimeDiscontinuityPending(false),
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingAudio(NONE),
591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mFlushingVideo(NONE),
601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mResetInProgress(false),
613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mResetPostponed(false),
623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mSkipRenderingAudioUntilMediaTimeUs(-1ll),
633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mSkipRenderingVideoUntilMediaTimeUs(-1ll),
643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mVideoLateByUs(0ll),
653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mNumFramesTotal(0ll),
668b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen      mNumFramesDropped(0ll) {
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
69f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() {
70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) {
739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUIDValid = true;
749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUID = uid;
759b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber}
769b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
7743c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) {
7843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mDriver = driver;
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
81f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) {
82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->setObject("source", new StreamingSource(source));
855bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->post();
865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
88afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatic bool IsHTTPLiveURL(const char *url) {
89afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (!strncasecmp("http://", url, 7)
90afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            || !strncasecmp("https://", url, 8)) {
91afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        size_t len = strlen(url);
92afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {
93afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            return true;
94afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
95afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
96afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (strstr(url,"m3u8")) {
97afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            return true;
98afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
99afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
100afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
101afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return false;
102afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
103afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
1045bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource(
1055bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        const char *url, const KeyedVector<String8, String8> *headers) {
1065bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
108afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<Source> source;
109afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (IsHTTPLiveURL(url)) {
110afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        source = new HTTPLiveSource(url, headers, mUIDValid, mUID);
111afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    } else if (!strncasecmp(url, "rtsp://", 7)) {
112afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        source = new RTSPSource(url, headers, mUIDValid, mUID);
1132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    } else {
114afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        source = new GenericSource(url, headers, mUIDValid, mUID);
1152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
117afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->setObject("source", source);
118afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->post();
119afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
120afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
121afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
122afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
123afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
124afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<Source> source = new GenericSource(fd, offset, length);
125afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->setObject("source", source);
126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1291173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
1301173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
1311173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ?
1321173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                new SurfaceTextureClient(surfaceTexture) : NULL);
1331173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient));
134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
137f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id());
139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("sink", sink);
140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
143f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() {
144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatStart, id()))->post();
145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
14743c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() {
148b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatPause, id()))->post();
14943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
15043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
15143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() {
152b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatResume, id()))->post();
15343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
15443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() {
1561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (new AMessage(kWhatReset, id()))->post();
1571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
1581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
15943c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) {
16043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSeek, id());
16143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->setInt64("seekTimeUs", seekTimeUs);
16243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->post();
16343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
16443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
16553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static
1661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) {
16753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    switch (state) {
16853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        case FLUSHING_DECODER:
1691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = false;
17153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
17253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
17353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
1741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case FLUSHING_DECODER_SHUTDOWN:
1751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = true;
17753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
17853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
17953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
18053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        default:
18153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return false;
18253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    }
18353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber}
18453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
185f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetDataSource:
188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetDataSource");
190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(mSource == NULL);
192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1935bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            sp<RefBase> obj;
1945bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(msg->findObject("source", &obj));
195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1965bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource = static_cast<Source *>(obj.get());
197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2001173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        case kWhatSetVideoNativeWindow:
201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetVideoNativeWindow");
203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
2051173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            CHECK(msg->findObject("native-window", &obj));
206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2071173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get());
208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetAudioSink:
212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetAudioSink");
214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("sink", &obj));
217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatStart:
223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatStart");
22543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2263fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mVideoIsAVC = false;
2271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mAudioEOS = false;
2281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mVideoEOS = false;
22932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingAudioUntilMediaTimeUs = -1;
23032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingVideoUntilMediaTimeUs = -1;
2313fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mVideoLateByUs = 0;
2323fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mNumFramesTotal = 0;
2333fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mNumFramesDropped = 0;
2341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
2355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource->start();
236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mRenderer = new Renderer(
238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioSink,
239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    new AMessage(kWhatRendererNotify, id()));
240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            looper()->registerHandler(mRenderer);
242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            postScanSources();
244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatScanSources:
248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            int32_t generation;
2501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            CHECK(msg->findInt32("generation", &generation));
2511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (generation != mScanSourcesGeneration) {
2521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // Drop obsolete msg.
2531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
2541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
2551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
2565bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mScanSourcesPending = false;
2575bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
2583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("scanning sources haveAudio=%d, haveVideo=%d",
25943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 mAudioDecoder != NULL, mVideoDecoder != NULL);
26043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2615d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George            if (mNativeWindow != NULL) {
2625d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George                instantiateDecoder(false, &mVideoDecoder);
2635d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George            }
264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioSink != NULL) {
2665bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                instantiateDecoder(true, &mAudioDecoder);
267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
269eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber            status_t err;
270eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber            if ((err = mSource->feedMoreTSData()) != OK) {
2711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
2721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // We're not currently decoding anything (no audio or
2731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // video tracks found) and we just ran out of input data.
274eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber
275eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    if (err == ERROR_END_OF_STREAM) {
276eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                        notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
277eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    } else {
278eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                        notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
279eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    }
2801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                }
281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2845d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George            if (mAudioDecoder == NULL && mAudioSink != NULL ||
2855d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George                mVideoDecoder == NULL && mNativeWindow != NULL) {
286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->post(100000ll);
2875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mScanSourcesPending = true;
288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatVideoNotify:
293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatAudioNotify:
294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            bool audio = msg->what() == kWhatAudioNotify;
296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<AMessage> codecRequest;
298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findMessage("codec-request", &codecRequest));
299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(codecRequest->findInt32("what", &what));
302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == ACodec::kWhatFillThisBuffer) {
304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                status_t err = feedDecoderInputData(
305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        audio, codecRequest);
306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3075bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                if (err == -EWOULDBLOCK) {
308eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    if (mSource->feedMoreTSData() == OK) {
3091183a4ab06b9fe01fe39a4b8728bfc71789361fcAndreas Huber                        msg->post(10000ll);
3105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    }
311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatEOS) {
313dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                int32_t err;
314dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                CHECK(codecRequest->findInt32("err", &err));
315dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber
316dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                if (err == ERROR_END_OF_STREAM) {
3173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("got %s decoder EOS", audio ? "audio" : "video");
318dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                } else {
3193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("got %s decoder EOS w/ error %d",
320dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                         audio ? "audio" : "video",
321dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                         err);
322dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                }
323dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber
324dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                mRenderer->queueEOS(audio, err);
325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatFlushCompleted) {
3261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                bool needShutdown;
32753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
3291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingAudio, &needShutdown));
330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingAudio = FLUSHED;
331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
3321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingVideo, &needShutdown));
333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingVideo = FLUSHED;
3343fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
3353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mVideoLateByUs = 0;
336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("decoder %s flush completed", audio ? "audio" : "video");
339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (needShutdown) {
3413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("initiating %s decoder shutdown",
34253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                         audio ? "audio" : "video");
343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
34453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
34653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    if (audio) {
34753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingAudio = SHUTTING_DOWN_DECODER;
34853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    } else {
34953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingVideo = SHUTTING_DOWN_DECODER;
35053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    }
351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
3523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3533831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
3542c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            } else if (what == ACodec::kWhatOutputFormatChanged) {
35531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                if (audio) {
35631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t numChannels;
35731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("channel-count", &numChannels));
3582c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
35931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t sampleRate;
36031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("sample-rate", &sampleRate));
3612c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
3623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("Audio output format changed to %d Hz, %d channels",
36331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         sampleRate, numChannels);
3642c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
36531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->close();
3661948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent
3671948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    audio_output_flags_t flags;
3681948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    int64_t durationUs;
3691948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    // FIXME: we should handle the case where the video decoder is created after
3701948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    // we receive the format change indication. Current code will just make that
3711948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    // we select deep buffer with video which should not be a problem as it should
3721948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    // not prevent from keeping A/V sync.
3731948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    if (mVideoDecoder == NULL &&
3741948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                            mSource->getDuration(&durationUs) == OK &&
3751948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                            durationUs > AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US) {
3761948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                        flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
3771948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    } else {
3781948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                        flags = AUDIO_OUTPUT_FLAG_NONE;
3791948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                    }
3801948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent
3819806555d3930be43e11106281dee354820ac1c88Andreas Huber                    int32_t channelMask;
3829806555d3930be43e11106281dee354820ac1c88Andreas Huber                    if (!codecRequest->findInt32("channel-mask", &channelMask)) {
3839806555d3930be43e11106281dee354820ac1c88Andreas Huber                        channelMask = CHANNEL_MASK_USE_CHANNEL_ORDER;
3849806555d3930be43e11106281dee354820ac1c88Andreas Huber                    }
3859806555d3930be43e11106281dee354820ac1c88Andreas Huber
386078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                    CHECK_EQ(mAudioSink->open(
387078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                sampleRate,
388078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                numChannels,
3899806555d3930be43e11106281dee354820ac1c88Andreas Huber                                (audio_channel_mask_t)channelMask,
390078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                AUDIO_FORMAT_PCM_16_BIT,
3911948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                8 /* bufferCount */,
3921948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                NULL,
3931948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                NULL,
3941948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                                flags),
395078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                             (status_t)OK);
39631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->start();
3973831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
39831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mRenderer->signalAudioSinkChanged();
39931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                } else {
40031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    // video
40131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
40231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t width, height;
40331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("width", &width));
40431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("height", &height));
40531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
40631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t cropLeft, cropTop, cropRight, cropBottom;
40731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findRect(
40831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                "crop",
40931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                &cropLeft, &cropTop, &cropRight, &cropBottom));
41031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
4113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("Video output format changed to %d x %d "
412cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         "(crop: %d x %d @ (%d, %d))",
41331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         width, height,
414cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         (cropRight - cropLeft + 1),
415cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         (cropBottom - cropTop + 1),
416cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         cropLeft, cropTop);
41731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
41831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    notifyListener(
41931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            MEDIA_SET_VIDEO_SIZE,
42031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropRight - cropLeft + 1,
42131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropBottom - cropTop + 1);
42231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                }
4233831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            } else if (what == ACodec::kWhatShutdownCompleted) {
4243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("%s shutdown completed", audio ? "audio" : "video");
4253831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                if (audio) {
4263831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mAudioDecoder.clear();
4273831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4283831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
4293831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingAudio = SHUT_DOWN;
4303831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                } else {
4313831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mVideoDecoder.clear();
4323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4333831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
4343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingVideo = SHUT_DOWN;
4353831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                }
4363831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
438c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber            } else if (what == ACodec::kWhatError) {
43929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("Received error from %s decoder, aborting playback.",
440c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                     audio ? "audio" : "video");
441c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
442c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                mRenderer->queueEOS(audio, UNKNOWN_ERROR);
4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else if (what == ACodec::kWhatDrainThisBuffer) {
444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                renderBuffer(audio, codecRequest);
4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber                ALOGV("Unhandled codec notification %d.", what);
447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatRendererNotify:
453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("what", &what));
456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == Renderer::kWhatEOS) {
458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
461c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                int32_t finalResult;
462c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                CHECK(msg->findInt32("finalResult", &finalResult));
463c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioEOS = true;
466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mVideoEOS = true;
468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
470c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                if (finalResult == ERROR_END_OF_STREAM) {
4713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("reached %s EOS", audio ? "audio" : "video");
472c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                } else {
47329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("%s track encountered an error (%d)",
474c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                         audio ? "audio" : "video", finalResult);
475c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
476c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                    notifyListener(
477c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                            MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult);
478c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                }
479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if ((mAudioEOS || mAudioDecoder == NULL)
481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        && (mVideoEOS || mVideoDecoder == NULL)) {
482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
48443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            } else if (what == Renderer::kWhatPosition) {
48543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                int64_t positionUs;
48643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                CHECK(msg->findInt64("positionUs", &positionUs));
48743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
4883fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs));
4893fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
49043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (mDriver != NULL) {
49143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    sp<NuPlayerDriver> driver = mDriver.promote();
49243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    if (driver != NULL) {
49343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                        driver->notifyPosition(positionUs);
4943fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
4953fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        driver->notifyFrameStats(
4963fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                                mNumFramesTotal, mNumFramesDropped);
49743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    }
49843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
4993fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            } else if (what == Renderer::kWhatFlushComplete) {
500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete);
501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("renderer %s flush completed.", audio ? "audio" : "video");
506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatMoreDataQueued:
511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case kWhatReset:
5161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        {
5173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatReset");
5181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
519b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber            if (mRenderer != NULL) {
520b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // There's an edge case where the renderer owns all output
521b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // buffers and is paused, therefore the decoder will not read
522b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // more input data and will never encounter the matching
523b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // discontinuity. To avoid this, we resume the renderer.
524b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber
525b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                if (mFlushingAudio == AWAITING_DISCONTINUITY
526b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                        || mFlushingVideo == AWAITING_DISCONTINUITY) {
527b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                    mRenderer->resume();
528b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                }
529b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber            }
530b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber
5311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
5321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // We're currently flushing, postpone the reset until that's
5331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // completed.
5341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
535ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber                ALOGV("postponing reset mFlushingAudio=%d, mFlushingVideo=%d",
536ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber                      mFlushingAudio, mFlushingVideo);
5371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                mResetPostponed = true;
5391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
5401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
5411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
5431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                finishReset();
5441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
5451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
5461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            mTimeDiscontinuityPending = true;
5486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
5491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder != NULL) {
5501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(true /* audio */, true /* needShutdown */);
5511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
5521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mVideoDecoder != NULL) {
5541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(false /* audio */, true /* needShutdown */);
5551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
5561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mResetInProgress = true;
5581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            break;
5591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
5601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
56143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        case kWhatSeek:
56243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        {
56343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            int64_t seekTimeUs;
56443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
56543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
5663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)",
56743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 seekTimeUs, seekTimeUs / 1E6);
56843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
56943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            mSource->seekTo(seekTimeUs);
57043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
57143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            if (mDriver != NULL) {
57243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                sp<NuPlayerDriver> driver = mDriver.promote();
57343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (driver != NULL) {
57443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    driver->notifySeekComplete();
57543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
57643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            }
57743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
57843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
57943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
58043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
581b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatPause:
582b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
583b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
584b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->pause();
585b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
586b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
587b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
588b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatResume:
589b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
590b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
591b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->resume();
592b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
593b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
594b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6013831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() {
6023831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
6033831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
6043831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
6053831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6063831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
6073831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
6083831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
6093831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("both audio and video are flushed now.");
6113831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6126e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mTimeDiscontinuityPending) {
6136e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mRenderer->signalTimeDiscontinuity();
6146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mTimeDiscontinuityPending = false;
6156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
6163831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
61722fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mAudioDecoder != NULL) {
6183831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mAudioDecoder->signalResume();
6193831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
6203831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
62122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mVideoDecoder != NULL) {
6223831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mVideoDecoder->signalResume();
6233831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
6243831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6253831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingAudio = NONE;
6263831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingVideo = NONE;
627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mResetInProgress) {
6293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("reset completed");
6301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetInProgress = false;
6321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        finishReset();
6331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else if (mResetPostponed) {
6341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        (new AMessage(kWhatReset, id()))->post();
6351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetPostponed = false;
63622fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
6371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        postScanSources();
6381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
6391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
6401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() {
6421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mAudioDecoder == NULL);
6431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mVideoDecoder == NULL);
6441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6452bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    ++mScanSourcesGeneration;
6462bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mScanSourcesPending = false;
6472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
6481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer.clear();
6492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
6502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (mSource != NULL) {
6512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mSource->stop();
6522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mSource.clear();
6532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
6541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
65543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL) {
65643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
65743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
65843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyResetComplete();
65943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
66043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
6611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
6621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() {
6641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mScanSourcesPending) {
6651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        return;
666f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
6671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    sp<AMessage> msg = new AMessage(kWhatScanSources, id());
6691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->setInt32("generation", mScanSourcesGeneration);
6701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->post();
6711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mScanSourcesPending = true;
673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
674f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6755bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (*decoder != NULL) {
677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
679f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6805bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<MetaData> meta = mSource->getFormat(audio);
681f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    if (meta == NULL) {
683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6863fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    if (!audio) {
6873fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        const char *mime;
6883fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        CHECK(meta->findCString(kKeyMIMEType, &mime));
6893fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime);
6903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    }
6913fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
692f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify =
693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
694f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     id());
695f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6961173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    *decoder = audio ? new Decoder(notify) :
6971173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                       new Decoder(notify, mNativeWindow);
698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    looper()->registerHandler(*decoder);
699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7005bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    (*decoder)->configure(meta);
701f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
70243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    int64_t durationUs;
70343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
70443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
70543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
70643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyDuration(durationUs);
70743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
70843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
70943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
713f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
71753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    if ((audio && IsFlushingState(mFlushingAudio))
71853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            || (!audio && IsFlushingState(mFlushingVideo))) {
719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", INFO_DISCONTINUITY);
720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> accessUnit;
725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7263fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    bool dropAccessUnit;
7273fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    do {
7283fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
7295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
7303fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (err == -EWOULDBLOCK) {
7313fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return err;
7323fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        } else if (err != OK) {
7333fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            if (err == INFO_DISCONTINUITY) {
7343fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                int32_t type;
7353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
73653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
7373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                bool formatChange =
7386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    (audio &&
7396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                     (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT))
7406e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    || (!audio &&
7416e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT));
74253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
7436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0;
7446e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
745df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                ALOGI("%s discontinuity (formatChange=%d, time=%d)",
7466e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                     audio ? "audio" : "video", formatChange, timeChange);
74732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
7483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                if (audio) {
7493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingAudioUntilMediaTimeUs = -1;
7503fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                } else {
7513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingVideoUntilMediaTimeUs = -1;
7523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                }
75332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
7546e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                if (timeChange) {
7556e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    sp<AMessage> extra;
7566e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    if (accessUnit->meta()->findMessage("extra", &extra)
7576e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            && extra != NULL) {
7586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        int64_t resumeAtMediaTimeUs;
7596e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        if (extra->findInt64(
7606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
761df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                            ALOGI("suppressing rendering of %s until %lld us",
7626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    audio ? "audio" : "video", resumeAtMediaTimeUs);
7636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7646e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            if (audio) {
7656e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                mSkipRenderingAudioUntilMediaTimeUs =
7666e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    resumeAtMediaTimeUs;
7676e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            } else {
7686e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                mSkipRenderingVideoUntilMediaTimeUs =
7696e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    resumeAtMediaTimeUs;
7706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            }
7713fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        }
77232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    }
77332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                }
7743fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
7756e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                mTimeDiscontinuityPending =
7766e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    mTimeDiscontinuityPending || timeChange;
7776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7786e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                if (formatChange || timeChange) {
7796e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    flushDecoder(audio, formatChange);
7806e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                } else {
7816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    // This stream is unaffected by the discontinuity
7826e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7836e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    if (audio) {
7846e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        mFlushingAudio = FLUSHED;
7856e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    } else {
7866e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        mFlushingVideo = FLUSHED;
7876e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    }
7886e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7896e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    finishFlushIfPossible();
7906e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    return -EWOULDBLOCK;
7926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                }
79332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            }
79432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
7953fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->setInt32("err", err);
7963fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->post();
7973fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return OK;
798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8003fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio) {
8013fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesTotal;
8023fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
8033fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
8043fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        dropAccessUnit = false;
8053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio
8063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoLateByUs > 100000ll
8073fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoIsAVC
8083fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && !IsAVCReferenceFrame(accessUnit)) {
8093fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            dropAccessUnit = true;
8103fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesDropped;
8113fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
8123fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    } while (dropAccessUnit);
813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mediaTimeUs;
818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
8193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("feeding %s input buffer at media time %.2f secs",
820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         audio ? "audio" : "video",
821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mediaTimeUs / 1E6);
822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8242d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    reply->setBuffer("buffer", accessUnit);
825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->post();
826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
830f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
8313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    // ALOGV("renderBuffer %s", audio ? "audio" : "video");
832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
83618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) {
83718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // We're currently attempting to flush the decoder, in order
83818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // to complete this, the decoder wants all its buffers back,
83918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // so we don't want any output buffers it sent us (from before
84018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // we initiated the flush) to be stuck in the renderer's queue.
84118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
8423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("we're still flushing the %s decoder, sending its output buffer"
84318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber             " right back.", audio ? "audio" : "video");
84418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
84518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        reply->post();
84618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
84718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
84818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
8492d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    sp<ABuffer> buffer;
8502d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    CHECK(msg->findBuffer("buffer", &buffer));
851f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
85232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    int64_t &skipUntilMediaTimeUs =
85332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        audio
85432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            ? mSkipRenderingAudioUntilMediaTimeUs
85532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            : mSkipRenderingVideoUntilMediaTimeUs;
85632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
85732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    if (skipUntilMediaTimeUs >= 0) {
85832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        int64_t mediaTimeUs;
85932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs));
86032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
86132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        if (mediaTimeUs < skipUntilMediaTimeUs) {
8623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("dropping %s buffer at time %lld as requested.",
86332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 audio ? "audio" : "video",
86432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 mediaTimeUs);
86532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
86632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            reply->post();
86732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            return;
86832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        }
86932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
87032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        skipUntilMediaTimeUs = -1;
87132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    }
87232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mRenderer->queueBuffer(audio, buffer, reply);
874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
876f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) {
87743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver == NULL) {
878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
88143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<NuPlayerDriver> driver = mDriver.promote();
882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
88343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (driver == NULL) {
884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
887a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber    driver->notifyListener(msg, ext1, ext2);
888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) {
8916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) {
892df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("flushDecoder %s without decoder present",
8936e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber             audio ? "audio" : "video");
8946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
8956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
8961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    // Make sure we don't continue to scan sources until we finish flushing.
8971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    ++mScanSourcesGeneration;
89843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mScanSourcesPending = false;
8991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
9011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer->flush(audio);
9021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    FlushStatus newStatus =
9041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
9051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (audio) {
9071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingAudio == NONE
9081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingAudio == AWAITING_DISCONTINUITY);
9091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingAudio = newStatus;
9111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingVideo == NONE) {
9131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingVideo = (mVideoDecoder != NULL)
9141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
9151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
9161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
9171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else {
9181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingVideo == NONE
9191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingVideo == AWAITING_DISCONTINUITY);
9201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingVideo = newStatus;
9221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingAudio == NONE) {
9241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingAudio = (mAudioDecoder != NULL)
9251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
9261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
9271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
9281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
9291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
9301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
932