NuPlayer.cpp revision 4110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652f
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>
424110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen#include <media/stagefright/SkipCutBuffer.h>
431173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h>
44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include "avc_utils.h"
463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
47f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
51f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer()
529b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    : mUIDValid(false),
533fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mVideoIsAVC(false),
549b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber      mAudioEOS(false),
55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mVideoEOS(false),
565bc087c573c70c84c6a39946457590b42d392a33Andreas Huber      mScanSourcesPending(false),
571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mScanSourcesGeneration(0),
586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber      mTimeDiscontinuityPending(false),
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingAudio(NONE),
601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mFlushingVideo(NONE),
611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mResetInProgress(false),
623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mResetPostponed(false),
633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mSkipRenderingAudioUntilMediaTimeUs(-1ll),
643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mSkipRenderingVideoUntilMediaTimeUs(-1ll),
653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mVideoLateByUs(0ll),
663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mNumFramesTotal(0ll),
674110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen      mNumFramesDropped(0ll),
684110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen      mSkipCutBuffer(NULL) {
69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
71f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() {
724110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen    delete mSkipCutBuffer;
734110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen    mSkipCutBuffer = NULL;
74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
769b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) {
779b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUIDValid = true;
789b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUID = uid;
799b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber}
809b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
8143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) {
8243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mDriver = driver;
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
85f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) {
86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
885bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->setObject("source", new StreamingSource(source));
895bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->post();
905bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
915bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
92afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatic bool IsHTTPLiveURL(const char *url) {
93afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (!strncasecmp("http://", url, 7)
94afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            || !strncasecmp("https://", url, 8)) {
95afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        size_t len = strlen(url);
96afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {
97afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            return true;
98afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
99afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
100afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (strstr(url,"m3u8")) {
101afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            return true;
102afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
103afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
104afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
105afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return false;
106afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
107afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
1085bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource(
1095bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        const char *url, const KeyedVector<String8, String8> *headers) {
1105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
112afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<Source> source;
113afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (IsHTTPLiveURL(url)) {
114afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        source = new HTTPLiveSource(url, headers, mUIDValid, mUID);
115afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    } else if (!strncasecmp(url, "rtsp://", 7)) {
116afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        source = new RTSPSource(url, headers, mUIDValid, mUID);
1172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    } else {
118afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        source = new GenericSource(url, headers, mUIDValid, mUID);
1192bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1202bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
121afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->setObject("source", source);
122afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->post();
123afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
124afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
125afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
126afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
127afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
128afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<Source> source = new GenericSource(fd, offset, length);
129afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    msg->setObject("source", source);
130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1331173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
1341173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
1351173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ?
1361173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                new SurfaceTextureClient(surfaceTexture) : NULL);
1371173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient));
138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
141f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id());
143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("sink", sink);
144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
147f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() {
148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatStart, id()))->post();
149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
15143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() {
152b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatPause, id()))->post();
15343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
15443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
15543c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() {
156b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatResume, id()))->post();
15743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
15843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() {
1601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (new AMessage(kWhatReset, id()))->post();
1611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
1621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
16343c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) {
16443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSeek, id());
16543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->setInt64("seekTimeUs", seekTimeUs);
16643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->post();
16743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
16843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
16953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static
1701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) {
17153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    switch (state) {
17253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        case FLUSHING_DECODER:
1731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = false;
17553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
17653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
17753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
1781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case FLUSHING_DECODER_SHUTDOWN:
1791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = true;
18153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
18253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
18353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
18453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        default:
18553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return false;
18653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    }
18753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber}
18853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
189f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetDataSource:
192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetDataSource");
194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(mSource == NULL);
196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1975bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            sp<RefBase> obj;
1985bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(msg->findObject("source", &obj));
199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2005bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource = static_cast<Source *>(obj.get());
201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2041173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        case kWhatSetVideoNativeWindow:
205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetVideoNativeWindow");
207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
2091173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            CHECK(msg->findObject("native-window", &obj));
210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2111173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get());
212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetAudioSink:
216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSetAudioSink");
218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("sink", &obj));
221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatStart:
227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatStart");
22943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2303fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mVideoIsAVC = false;
2311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mAudioEOS = false;
2321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mVideoEOS = false;
23332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingAudioUntilMediaTimeUs = -1;
23432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingVideoUntilMediaTimeUs = -1;
2353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mVideoLateByUs = 0;
2363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mNumFramesTotal = 0;
2373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mNumFramesDropped = 0;
2381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
2395bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource->start();
240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2414110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen            sp<MetaData> meta = mSource->getFormat(true /* audio */);
2424110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen            if (meta != NULL) {
2434110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                int32_t delay = 0;
2444110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                if (!meta->findInt32(kKeyEncoderDelay, &delay)) {
2454110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                    delay = 0;
2464110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                }
2474110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                int32_t padding = 0;
2484110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                if (!meta->findInt32(kKeyEncoderPadding, &padding)) {
2494110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                    padding = 0;
2504110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                }
2514110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                int32_t numchannels = 0;
2524110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                if (delay + padding) {
2534110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                    if (meta->findInt32(kKeyChannelCount, &numchannels)) {
2544110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                        size_t frameSize = numchannels * sizeof(int16_t);
2554110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                        if (mSkipCutBuffer) {
2564110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                            size_t prevbuffersize = mSkipCutBuffer->size();
2574110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                            if (prevbuffersize != 0) {
2584110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                                ALOGW("Replacing SkipCutBuffer holding %d bytes", prevbuffersize);
2594110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                            }
2604110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                            delete mSkipCutBuffer;
2614110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                        }
2624110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                        mSkipCutBuffer = new SkipCutBuffer(delay * frameSize, padding * frameSize);
2634110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                    }
2644110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen                }
2654110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen            }
2664110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen
267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mRenderer = new Renderer(
268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioSink,
269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    new AMessage(kWhatRendererNotify, id()));
270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            looper()->registerHandler(mRenderer);
272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            postScanSources();
274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatScanSources:
278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            int32_t generation;
2801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            CHECK(msg->findInt32("generation", &generation));
2811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (generation != mScanSourcesGeneration) {
2821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // Drop obsolete msg.
2831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
2841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
2851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
2865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mScanSourcesPending = false;
2875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
2883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("scanning sources haveAudio=%d, haveVideo=%d",
28943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 mAudioDecoder != NULL, mVideoDecoder != NULL);
29043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2915bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            instantiateDecoder(false, &mVideoDecoder);
292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioSink != NULL) {
2945bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                instantiateDecoder(true, &mAudioDecoder);
295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
297eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber            status_t err;
298eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber            if ((err = mSource->feedMoreTSData()) != OK) {
2991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
3001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // We're not currently decoding anything (no audio or
3011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // video tracks found) and we just ran out of input data.
302eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber
303eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    if (err == ERROR_END_OF_STREAM) {
304eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                        notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
305eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    } else {
306eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                        notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
307eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    }
3081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                }
309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->post(100000ll);
3145bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mScanSourcesPending = true;
315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatVideoNotify:
320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatAudioNotify:
321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            bool audio = msg->what() == kWhatAudioNotify;
323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<AMessage> codecRequest;
325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findMessage("codec-request", &codecRequest));
326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(codecRequest->findInt32("what", &what));
329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == ACodec::kWhatFillThisBuffer) {
331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                status_t err = feedDecoderInputData(
332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        audio, codecRequest);
333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3345bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                if (err == -EWOULDBLOCK) {
335eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    if (mSource->feedMoreTSData() == OK) {
3361183a4ab06b9fe01fe39a4b8728bfc71789361fcAndreas Huber                        msg->post(10000ll);
3375bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    }
338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatEOS) {
340dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                int32_t err;
341dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                CHECK(codecRequest->findInt32("err", &err));
342dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber
343dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                if (err == ERROR_END_OF_STREAM) {
3443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("got %s decoder EOS", audio ? "audio" : "video");
345dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                } else {
3463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("got %s decoder EOS w/ error %d",
347dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                         audio ? "audio" : "video",
348dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                         err);
349dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                }
350dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber
351dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                mRenderer->queueEOS(audio, err);
352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatFlushCompleted) {
3531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                bool needShutdown;
35453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
3561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingAudio, &needShutdown));
357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingAudio = FLUSHED;
358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
3591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingVideo, &needShutdown));
360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingVideo = FLUSHED;
3613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
3623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mVideoLateByUs = 0;
363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("decoder %s flush completed", audio ? "audio" : "video");
366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (needShutdown) {
3683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("initiating %s decoder shutdown",
36953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                         audio ? "audio" : "video");
370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
37153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
37353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    if (audio) {
37453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingAudio = SHUTTING_DOWN_DECODER;
37553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    } else {
37653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingVideo = SHUTTING_DOWN_DECODER;
37753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    }
378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
3793831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
3812c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            } else if (what == ACodec::kWhatOutputFormatChanged) {
38231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                if (audio) {
38331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t numChannels;
38431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("channel-count", &numChannels));
3852c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
38631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t sampleRate;
38731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("sample-rate", &sampleRate));
3882c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
3893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("Audio output format changed to %d Hz, %d channels",
39031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         sampleRate, numChannels);
3912c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
39231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->close();
393078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                    CHECK_EQ(mAudioSink->open(
394078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                sampleRate,
395078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                numChannels,
396786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi                                CHANNEL_MASK_USE_CHANNEL_ORDER,
397078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                AUDIO_FORMAT_PCM_16_BIT,
398078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                8 /* bufferCount */),
399078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                             (status_t)OK);
40031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->start();
4013831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
40231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mRenderer->signalAudioSinkChanged();
40331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                } else {
40431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    // video
40531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
40631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t width, height;
40731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("width", &width));
40831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("height", &height));
40931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
41031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t cropLeft, cropTop, cropRight, cropBottom;
41131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findRect(
41231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                "crop",
41331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                &cropLeft, &cropTop, &cropRight, &cropBottom));
41431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
4153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("Video output format changed to %d x %d "
416cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         "(crop: %d x %d @ (%d, %d))",
41731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         width, height,
418cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         (cropRight - cropLeft + 1),
419cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         (cropBottom - cropTop + 1),
420cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         cropLeft, cropTop);
42131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
42231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    notifyListener(
42331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            MEDIA_SET_VIDEO_SIZE,
42431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropRight - cropLeft + 1,
42531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropBottom - cropTop + 1);
42631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                }
4273831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            } else if (what == ACodec::kWhatShutdownCompleted) {
4283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("%s shutdown completed", audio ? "audio" : "video");
4293831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                if (audio) {
4303831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mAudioDecoder.clear();
4313831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
4333831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingAudio = SHUT_DOWN;
4343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                } else {
4353831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mVideoDecoder.clear();
4363831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
4383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingVideo = SHUT_DOWN;
4393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                }
4403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
442c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber            } else if (what == ACodec::kWhatError) {
44329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("Received error from %s decoder, aborting playback.",
444c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                     audio ? "audio" : "video");
445c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
446c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                mRenderer->queueEOS(audio, UNKNOWN_ERROR);
4475778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else if (what == ACodec::kWhatDrainThisBuffer) {
448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                renderBuffer(audio, codecRequest);
4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                ALOGV("Unhandled codec notification %d.", what);
451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatRendererNotify:
457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("what", &what));
460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == Renderer::kWhatEOS) {
462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
465c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                int32_t finalResult;
466c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                CHECK(msg->findInt32("finalResult", &finalResult));
467c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioEOS = true;
470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mVideoEOS = true;
472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
474c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                if (finalResult == ERROR_END_OF_STREAM) {
4753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("reached %s EOS", audio ? "audio" : "video");
476c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                } else {
47729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("%s track encountered an error (%d)",
478c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                         audio ? "audio" : "video", finalResult);
479c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
480c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                    notifyListener(
481c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                            MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult);
482c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                }
483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if ((mAudioEOS || mAudioDecoder == NULL)
485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        && (mVideoEOS || mVideoDecoder == NULL)) {
486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
48843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            } else if (what == Renderer::kWhatPosition) {
48943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                int64_t positionUs;
49043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                CHECK(msg->findInt64("positionUs", &positionUs));
49143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
4923fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs));
4933fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
49443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (mDriver != NULL) {
49543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    sp<NuPlayerDriver> driver = mDriver.promote();
49643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    if (driver != NULL) {
49743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                        driver->notifyPosition(positionUs);
4983fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
4993fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        driver->notifyFrameStats(
5003fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                                mNumFramesTotal, mNumFramesDropped);
50143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    }
50243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
5033fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            } else if (what == Renderer::kWhatFlushComplete) {
504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete);
505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("renderer %s flush completed.", audio ? "audio" : "video");
510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatMoreDataQueued:
515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case kWhatReset:
5201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        {
5213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatReset");
5221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
523b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber            if (mRenderer != NULL) {
524b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // There's an edge case where the renderer owns all output
525b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // buffers and is paused, therefore the decoder will not read
526b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // more input data and will never encounter the matching
527b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // discontinuity. To avoid this, we resume the renderer.
528b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber
529b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                if (mFlushingAudio == AWAITING_DISCONTINUITY
530b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                        || mFlushingVideo == AWAITING_DISCONTINUITY) {
531b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                    mRenderer->resume();
532b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                }
533b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber            }
534b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber
5351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
5361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // We're currently flushing, postpone the reset until that's
5371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // completed.
5381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
539ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber                ALOGV("postponing reset mFlushingAudio=%d, mFlushingVideo=%d",
540ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber                      mFlushingAudio, mFlushingVideo);
5411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                mResetPostponed = true;
5431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
5441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
5451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
5471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                finishReset();
5481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
5491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
5501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            mTimeDiscontinuityPending = true;
5526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
5531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder != NULL) {
5541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(true /* audio */, true /* needShutdown */);
5551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
5561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mVideoDecoder != NULL) {
5581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(false /* audio */, true /* needShutdown */);
5591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
5601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mResetInProgress = true;
5621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            break;
5631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
5641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
56543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        case kWhatSeek:
56643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        {
56743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            int64_t seekTimeUs;
56843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
56943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
5703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)",
57143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 seekTimeUs, seekTimeUs / 1E6);
57243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
57343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            mSource->seekTo(seekTimeUs);
57443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
57543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            if (mDriver != NULL) {
57643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                sp<NuPlayerDriver> driver = mDriver.promote();
57743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (driver != NULL) {
57843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    driver->notifySeekComplete();
57943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
58043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            }
58143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
58243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
58343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
58443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
585b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatPause:
586b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
587b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
588b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->pause();
589b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
590b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
591b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
592b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatResume:
593b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
594b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
595b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->resume();
596b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
597b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
598b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6053831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() {
6063831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
6073831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
6083831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
6093831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6103831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
6113831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
6123831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
6133831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("both audio and video are flushed now.");
6153831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mTimeDiscontinuityPending) {
6176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mRenderer->signalTimeDiscontinuity();
6186e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mTimeDiscontinuityPending = false;
6196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
6203831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
62122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mAudioDecoder != NULL) {
6223831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mAudioDecoder->signalResume();
6233831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
6243831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
62522fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mVideoDecoder != NULL) {
6263831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mVideoDecoder->signalResume();
6273831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
6283831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
6293831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingAudio = NONE;
6303831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingVideo = NONE;
631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mResetInProgress) {
6333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("reset completed");
6341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetInProgress = false;
6361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        finishReset();
6371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else if (mResetPostponed) {
6381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        (new AMessage(kWhatReset, id()))->post();
6391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetPostponed = false;
64022fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
6411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        postScanSources();
6421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
6431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
6441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() {
6461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mAudioDecoder == NULL);
6471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mVideoDecoder == NULL);
6481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    ++mScanSourcesGeneration;
6502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mScanSourcesPending = false;
6512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
6521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer.clear();
6532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
6542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (mSource != NULL) {
6552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mSource->stop();
6562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mSource.clear();
6572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
6581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
65943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL) {
66043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
66143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
66243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyResetComplete();
66343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
66443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
6651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
6661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() {
6681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mScanSourcesPending) {
6691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        return;
670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
6711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    sp<AMessage> msg = new AMessage(kWhatScanSources, id());
6731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->setInt32("generation", mScanSourcesGeneration);
6741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->post();
6751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mScanSourcesPending = true;
677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6795bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (*decoder != NULL) {
681f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
682f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<MetaData> meta = mSource->getFormat(audio);
685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    if (meta == NULL) {
687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
688f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
689f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    if (!audio) {
6913fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        const char *mime;
6923fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        CHECK(meta->findCString(kKeyMIMEType, &mime));
6933fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime);
6943fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    }
6953fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify =
697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     id());
699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7001173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    *decoder = audio ? new Decoder(notify) :
7011173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                       new Decoder(notify, mNativeWindow);
702f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    looper()->registerHandler(*decoder);
703f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7045bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    (*decoder)->configure(meta);
705f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
70643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    int64_t durationUs;
70743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
70843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
70943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
71043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyDuration(durationUs);
71143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
71243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
71343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
717f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
72153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    if ((audio && IsFlushingState(mFlushingAudio))
72253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            || (!audio && IsFlushingState(mFlushingVideo))) {
723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", INFO_DISCONTINUITY);
724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> accessUnit;
729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7303fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    bool dropAccessUnit;
7313fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    do {
7323fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
7335bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
7343fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (err == -EWOULDBLOCK) {
7353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return err;
7363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        } else if (err != OK) {
7373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            if (err == INFO_DISCONTINUITY) {
7383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                int32_t type;
7393fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
74053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
7413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                bool formatChange =
7426e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    (audio &&
7436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                     (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT))
7446e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    || (!audio &&
7456e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT));
74653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
7476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0;
7486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
749df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                ALOGI("%s discontinuity (formatChange=%d, time=%d)",
7506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                     audio ? "audio" : "video", formatChange, timeChange);
75132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
7523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                if (audio) {
7533fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingAudioUntilMediaTimeUs = -1;
7543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                } else {
7553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingVideoUntilMediaTimeUs = -1;
7563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                }
75732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
7586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                if (timeChange) {
7596e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    sp<AMessage> extra;
7606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    if (accessUnit->meta()->findMessage("extra", &extra)
7616e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            && extra != NULL) {
7626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        int64_t resumeAtMediaTimeUs;
7636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        if (extra->findInt64(
7646e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
765df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                            ALOGI("suppressing rendering of %s until %lld us",
7666e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    audio ? "audio" : "video", resumeAtMediaTimeUs);
7676e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7686e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            if (audio) {
7696e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                mSkipRenderingAudioUntilMediaTimeUs =
7706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    resumeAtMediaTimeUs;
7716e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            } else {
7726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                mSkipRenderingVideoUntilMediaTimeUs =
7736e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    resumeAtMediaTimeUs;
7746e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            }
7753fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        }
77632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    }
77732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                }
7783fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
7796e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                mTimeDiscontinuityPending =
7806e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    mTimeDiscontinuityPending || timeChange;
7816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7826e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                if (formatChange || timeChange) {
7836e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    flushDecoder(audio, formatChange);
7846e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                } else {
7856e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    // This stream is unaffected by the discontinuity
7866e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7876e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    if (audio) {
7886e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        mFlushingAudio = FLUSHED;
7896e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    } else {
7906e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        mFlushingVideo = FLUSHED;
7916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    }
7926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7936e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    finishFlushIfPossible();
7946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    return -EWOULDBLOCK;
7966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                }
79732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            }
79832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
7993fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->setInt32("err", err);
8003fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->post();
8013fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return OK;
802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8043fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio) {
8053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesTotal;
8063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
8073fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
8083fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        dropAccessUnit = false;
8093fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio
8103fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoLateByUs > 100000ll
8113fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoIsAVC
8123fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && !IsAVCReferenceFrame(accessUnit)) {
8133fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            dropAccessUnit = true;
8143fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesDropped;
8153fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
8163fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    } while (dropAccessUnit);
817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mediaTimeUs;
822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
8233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("feeding %s input buffer at media time %.2f secs",
824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         audio ? "audio" : "video",
825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mediaTimeUs / 1E6);
826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8282d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    reply->setBuffer("buffer", accessUnit);
829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->post();
830f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
834f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
8353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    // ALOGV("renderBuffer %s", audio ? "audio" : "video");
836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
839f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
84018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) {
84118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // We're currently attempting to flush the decoder, in order
84218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // to complete this, the decoder wants all its buffers back,
84318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // so we don't want any output buffers it sent us (from before
84418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // we initiated the flush) to be stuck in the renderer's queue.
84518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
8463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("we're still flushing the %s decoder, sending its output buffer"
84718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber             " right back.", audio ? "audio" : "video");
84818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
84918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        reply->post();
85018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
85118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
85218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
8532d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    sp<ABuffer> buffer;
8542d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    CHECK(msg->findBuffer("buffer", &buffer));
855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
85632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    int64_t &skipUntilMediaTimeUs =
85732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        audio
85832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            ? mSkipRenderingAudioUntilMediaTimeUs
85932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            : mSkipRenderingVideoUntilMediaTimeUs;
86032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
86132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    if (skipUntilMediaTimeUs >= 0) {
86232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        int64_t mediaTimeUs;
86332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs));
86432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
86532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        if (mediaTimeUs < skipUntilMediaTimeUs) {
8663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("dropping %s buffer at time %lld as requested.",
86732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 audio ? "audio" : "video",
86832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 mediaTimeUs);
86932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
87032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            reply->post();
87132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            return;
87232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        }
87332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
87432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        skipUntilMediaTimeUs = -1;
87532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    }
87632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
8774110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen    if (audio && mSkipCutBuffer) {
8784110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen        mSkipCutBuffer->submit(buffer);
8794110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen    }
8804110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen
881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mRenderer->queueBuffer(audio, buffer, reply);
882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
884f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) {
88543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver == NULL) {
886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
88943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<NuPlayerDriver> driver = mDriver.promote();
890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
89143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (driver == NULL) {
892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
895a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber    driver->notifyListener(msg, ext1, ext2);
896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) {
8996e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) {
900df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("flushDecoder %s without decoder present",
9016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber             audio ? "audio" : "video");
9026e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
9036e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    // Make sure we don't continue to scan sources until we finish flushing.
9051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    ++mScanSourcesGeneration;
90643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mScanSourcesPending = false;
9071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
9091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer->flush(audio);
9101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    FlushStatus newStatus =
9121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
9131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (audio) {
9151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingAudio == NONE
9161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingAudio == AWAITING_DISCONTINUITY);
9171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingAudio = newStatus;
9191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingVideo == NONE) {
9211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingVideo = (mVideoDecoder != NULL)
9221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
9231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
9241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
9251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else {
9261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingVideo == NONE
9271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingVideo == AWAITING_DISCONTINUITY);
9281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingVideo = newStatus;
9301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingAudio == NONE) {
9321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingAudio = (mAudioDecoder != NULL)
9331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
9341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
9351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
9361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
9371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
9381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
940