NuPlayer.cpp revision 32f3cefa373cd55e63deda36ca9d07c7fe22eaaf
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"
285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "StreamingSource.h"
295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h"
31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h>
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h>
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h>
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h>
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/Surface.h>
401173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h>
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
42f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
46f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer()
475bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    : mAudioEOS(false),
48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mVideoEOS(false),
495bc087c573c70c84c6a39946457590b42d392a33Andreas Huber      mScanSourcesPending(false),
501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mScanSourcesGeneration(0),
51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingAudio(NONE),
521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mFlushingVideo(NONE),
531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mResetInProgress(false),
541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mResetPostponed(false) {
55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
57f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() {
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6043c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) {
6143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mDriver = driver;
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
64f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) {
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->setObject("source", new StreamingSource(source));
685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->post();
695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
715bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource(
725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        const char *url, const KeyedVector<String8, String8> *headers) {
735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
757314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    uint32_t flags = 0;
767314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
777314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    if (headers) {
787314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        ssize_t index = headers->indexOfKey(String8("x-hide-urls-from-log"));
797314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
807314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        if (index >= 0) {
817314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber            flags |= HTTPLiveSource::kFlagIncognito;
827314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        }
837314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    }
847314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
857314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    msg->setObject("source", new HTTPLiveSource(url, flags));
86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
89f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setVideoSurface(const sp<Surface> &surface) {
901173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
911173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    msg->setObject("native-window", new NativeWindowWrapper(surface));
921173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    msg->post();
931173118eace0e9e347cb007f0da817cee87579edGlenn Kasten}
941173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
951173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
961173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
971173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ?
981173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                new SurfaceTextureClient(surfaceTexture) : NULL);
991173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient));
100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
103f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id());
105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("sink", sink);
106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
109f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() {
110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatStart, id()))->post();
111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
11343c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() {
114b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatPause, id()))->post();
11543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
11643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
11743c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() {
118b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatResume, id()))->post();
11943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
12043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() {
1221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (new AMessage(kWhatReset, id()))->post();
1231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
1241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
12543c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) {
12643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSeek, id());
12743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->setInt64("seekTimeUs", seekTimeUs);
12843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->post();
12943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
13043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
13153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static
1321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) {
13353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    switch (state) {
13453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        case FLUSHING_DECODER:
1351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = false;
13753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
13853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
13953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
1401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case FLUSHING_DECODER_SHUTDOWN:
1411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = true;
14353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
14453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
14553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
14653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        default:
14753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return false;
14853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    }
14953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber}
15053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
151f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetDataSource:
154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatSetDataSource");
156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(mSource == NULL);
158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1595bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            sp<RefBase> obj;
1605bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(msg->findObject("source", &obj));
161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1625bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource = static_cast<Source *>(obj.get());
163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1661173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        case kWhatSetVideoNativeWindow:
167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1681173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            LOGV("kWhatSetVideoNativeWindow");
169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
1711173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            CHECK(msg->findObject("native-window", &obj));
172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1731173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get());
174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetAudioSink:
178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatSetAudioSink");
180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("sink", &obj));
183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatStart:
189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
19043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            LOGV("kWhatStart");
19143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mAudioEOS = false;
1931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mVideoEOS = false;
19432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingAudioUntilMediaTimeUs = -1;
19532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingVideoUntilMediaTimeUs = -1;
1961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1975bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource->start();
198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mRenderer = new Renderer(
200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioSink,
201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    new AMessage(kWhatRendererNotify, id()));
202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            looper()->registerHandler(mRenderer);
204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            postScanSources();
206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatScanSources:
210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            int32_t generation;
2121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            CHECK(msg->findInt32("generation", &generation));
2131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (generation != mScanSourcesGeneration) {
2141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // Drop obsolete msg.
2151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
2161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
2171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
2185bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mScanSourcesPending = false;
2195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
22043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            LOGV("scanning sources haveAudio=%d, haveVideo=%d",
22143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 mAudioDecoder != NULL, mVideoDecoder != NULL);
22243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            instantiateDecoder(false, &mVideoDecoder);
224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioSink != NULL) {
2265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                instantiateDecoder(true, &mAudioDecoder);
227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            if (!mSource->feedMoreTSData()) {
2301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
2311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // We're not currently decoding anything (no audio or
2321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // video tracks found) and we just ran out of input data.
2331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
2341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                }
235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->post(100000ll);
2405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mScanSourcesPending = true;
241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatVideoNotify:
246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatAudioNotify:
247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            bool audio = msg->what() == kWhatAudioNotify;
249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<AMessage> codecRequest;
251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findMessage("codec-request", &codecRequest));
252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(codecRequest->findInt32("what", &what));
255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == ACodec::kWhatFillThisBuffer) {
257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                status_t err = feedDecoderInputData(
258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        audio, codecRequest);
259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2605bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                if (err == -EWOULDBLOCK) {
2615bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    if (mSource->feedMoreTSData()) {
2625bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                        msg->post();
2635bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    }
264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatEOS) {
266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mRenderer->queueEOS(audio, ERROR_END_OF_STREAM);
267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatFlushCompleted) {
2681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                bool needShutdown;
26953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
2711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingAudio, &needShutdown));
272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingAudio = FLUSHED;
273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
2741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingVideo, &needShutdown));
275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingVideo = FLUSHED;
276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("decoder %s flush completed", audio ? "audio" : "video");
279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (needShutdown) {
2811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    LOGV("initiating %s decoder shutdown",
28253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                         audio ? "audio" : "video");
283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
28453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
28653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    if (audio) {
28753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingAudio = SHUTTING_DOWN_DECODER;
28853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    } else {
28953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingVideo = SHUTTING_DOWN_DECODER;
29053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    }
291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
2923831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
2933831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
2942c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            } else if (what == ACodec::kWhatOutputFormatChanged) {
29531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                if (audio) {
29631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t numChannels;
29731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("channel-count", &numChannels));
2982c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
29931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t sampleRate;
30031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("sample-rate", &sampleRate));
3012c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
30231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    LOGV("Audio output format changed to %d Hz, %d channels",
30331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         sampleRate, numChannels);
3042c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
30531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->close();
30631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK_EQ(mAudioSink->open(sampleRate, numChannels), (status_t)OK);
30731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->start();
3083831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
30931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mRenderer->signalAudioSinkChanged();
31031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                } else {
31131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    // video
31231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
31331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t width, height;
31431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("width", &width));
31531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("height", &height));
31631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
31731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t cropLeft, cropTop, cropRight, cropBottom;
31831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findRect(
31931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                "crop",
32031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                &cropLeft, &cropTop, &cropRight, &cropBottom));
32131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
32231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    LOGV("Video output format changed to %d x %d "
32331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         "(crop: %d, %d, %d, %d)",
32431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         width, height,
32531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         cropLeft, cropTop, cropRight, cropBottom);
32631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
32731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    notifyListener(
32831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            MEDIA_SET_VIDEO_SIZE,
32931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropRight - cropLeft + 1,
33031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropBottom - cropTop + 1);
33131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                }
3323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            } else if (what == ACodec::kWhatShutdownCompleted) {
3331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("%s shutdown completed", audio ? "audio" : "video");
3343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                if (audio) {
3353831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mAudioDecoder.clear();
3363831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
3383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingAudio = SHUT_DOWN;
3393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                } else {
3403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mVideoDecoder.clear();
3413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
3433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingVideo = SHUT_DOWN;
3443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                }
3453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3463831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer);
349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                renderBuffer(audio, codecRequest);
351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatRendererNotify:
357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("what", &what));
360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == Renderer::kWhatEOS) {
362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioEOS = true;
367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mVideoEOS = true;
369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("reached %s EOS", audio ? "audio" : "video");
372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if ((mAudioEOS || mAudioDecoder == NULL)
374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        && (mVideoEOS || mVideoDecoder == NULL)) {
375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
37743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            } else if (what == Renderer::kWhatPosition) {
37843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                int64_t positionUs;
37943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                CHECK(msg->findInt64("positionUs", &positionUs));
38043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
38143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (mDriver != NULL) {
38243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    sp<NuPlayerDriver> driver = mDriver.promote();
38343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    if (driver != NULL) {
38443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                        driver->notifyPosition(positionUs);
38543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    }
38643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete);
389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("renderer %s flush completed.", audio ? "audio" : "video");
394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatMoreDataQueued:
399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case kWhatReset:
4041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        {
4051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatReset");
4061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
4081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // We're currently flushing, postpone the reset until that's
4091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // completed.
4101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("postponing reset");
4121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                mResetPostponed = true;
4141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
4151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
4181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                finishReset();
4191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
4201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder != NULL) {
4231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(true /* audio */, true /* needShutdown */);
4241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mVideoDecoder != NULL) {
4271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(false /* audio */, true /* needShutdown */);
4281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mResetInProgress = true;
4311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            break;
4321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
4331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
43443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        case kWhatSeek:
43543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        {
43643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            int64_t seekTimeUs;
43743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
43843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
43922fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber            LOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)",
44043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 seekTimeUs, seekTimeUs / 1E6);
44143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
44243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            mSource->seekTo(seekTimeUs);
44343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
44443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            if (mDriver != NULL) {
44543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                sp<NuPlayerDriver> driver = mDriver.promote();
44643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (driver != NULL) {
44743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    driver->notifySeekComplete();
44843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
44943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            }
45043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
45143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
45243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
45343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
454b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatPause:
455b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
456b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
457b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->pause();
458b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
459b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
460b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
461b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatResume:
462b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
463b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
464b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->resume();
465b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
466b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
467b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4743831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() {
4753831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
4763831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
4773831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
4783831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4793831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
4803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
4813831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
4823831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    LOGV("both audio and video are flushed now.");
4843831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4853831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mRenderer->signalTimeDiscontinuity();
4863831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
48722fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mAudioDecoder != NULL) {
4883831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mAudioDecoder->signalResume();
4893831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
4903831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
49122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mVideoDecoder != NULL) {
4923831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mVideoDecoder->signalResume();
4933831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
4943831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4953831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingAudio = NONE;
4963831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingVideo = NONE;
497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mResetInProgress) {
4991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        LOGV("reset completed");
5001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetInProgress = false;
5021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        finishReset();
5031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else if (mResetPostponed) {
5041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        (new AMessage(kWhatReset, id()))->post();
5051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetPostponed = false;
50622fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
5071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        postScanSources();
5081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
5091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
5101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() {
5121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mAudioDecoder == NULL);
5131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mVideoDecoder == NULL);
5141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer.clear();
5161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mSource.clear();
5171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
51843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL) {
51943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
52043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
52143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyResetComplete();
52243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
52343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
5241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
5251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() {
5271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mScanSourcesPending) {
5281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        return;
529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
5301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    sp<AMessage> msg = new AMessage(kWhatScanSources, id());
5321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->setInt32("generation", mScanSourcesGeneration);
5331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->post();
5341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mScanSourcesPending = true;
536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5385bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (*decoder != NULL) {
540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5435bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<MetaData> meta = mSource->getFormat(audio);
544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5455bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    if (meta == NULL) {
546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify =
550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     id());
552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5531173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    *decoder = audio ? new Decoder(notify) :
5541173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                       new Decoder(notify, mNativeWindow);
555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    looper()->registerHandler(*decoder);
556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5575bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    (*decoder)->configure(meta);
558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
55943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    int64_t durationUs;
56043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
56143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
56243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
56343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyDuration(durationUs);
56443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
56543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
56643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
570f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
57453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    if ((audio && IsFlushingState(mFlushingAudio))
57553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            || (!audio && IsFlushingState(mFlushingVideo))) {
576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", INFO_DISCONTINUITY);
577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> accessUnit;
5825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err == -EWOULDBLOCK) {
585f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else if (err != OK) {
587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (err == INFO_DISCONTINUITY) {
5885bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            int32_t type;
5895bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
5905bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
5915bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            bool formatChange =
5925bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                type == ATSParser::DISCONTINUITY_FORMATCHANGE;
59353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
5941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("%s discontinuity (formatChange=%d)",
59553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                 audio ? "audio" : "video", formatChange);
59653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
59732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            if (audio) {
59832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                mSkipRenderingAudioUntilMediaTimeUs = -1;
59932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            } else {
60032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                mSkipRenderingVideoUntilMediaTimeUs = -1;
60132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            }
60232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
60332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            sp<AMessage> extra;
60432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            if (accessUnit->meta()->findMessage("extra", &extra)
60532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    && extra != NULL) {
60632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                int64_t resumeAtMediaTimeUs;
60732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                if (extra->findInt64(
60832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                            "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
60932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    LOGI("suppressing rendering of %s until %lld us",
61032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                            audio ? "audio" : "video", resumeAtMediaTimeUs);
61132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
61232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    if (audio) {
61332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                        mSkipRenderingAudioUntilMediaTimeUs =
61432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                            resumeAtMediaTimeUs;
61532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    } else {
61632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                        mSkipRenderingVideoUntilMediaTimeUs =
61732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                            resumeAtMediaTimeUs;
61832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    }
61932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                }
62032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            }
62132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
6221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            flushDecoder(audio, formatChange);
623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", err);
626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
63043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // LOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mediaTimeUs;
634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
6351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    LOGV("feeding %s input buffer at media time %.2f secs",
636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         audio ? "audio" : "video",
637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mediaTimeUs / 1E6);
638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->setObject("buffer", accessUnit);
641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->post();
642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
646f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
64743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // LOGV("renderBuffer %s", audio ? "audio" : "video");
648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<RefBase> obj;
653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findObject("buffer", &obj));
654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
65732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    int64_t &skipUntilMediaTimeUs =
65832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        audio
65932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            ? mSkipRenderingAudioUntilMediaTimeUs
66032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            : mSkipRenderingVideoUntilMediaTimeUs;
66132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
66232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    if (skipUntilMediaTimeUs >= 0) {
66332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        int64_t mediaTimeUs;
66432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs));
66532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
66632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        if (mediaTimeUs < skipUntilMediaTimeUs) {
66732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            LOGV("dropping %s buffer at time %lld as requested.",
66832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 audio ? "audio" : "video",
66932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 mediaTimeUs);
67032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
67132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            reply->post();
67232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            return;
67332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        }
67432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
67532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        skipUntilMediaTimeUs = -1;
67632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    }
67732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mRenderer->queueBuffer(audio, buffer, reply);
679f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
681f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) {
68243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver == NULL) {
683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
68643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<NuPlayerDriver> driver = mDriver.promote();
687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
68843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (driver == NULL) {
689f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
69243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    driver->sendEvent(msg, ext1, ext2);
693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
694f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) {
6961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    // Make sure we don't continue to scan sources until we finish flushing.
6971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    ++mScanSourcesGeneration;
69843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mScanSourcesPending = false;
6991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
7011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer->flush(audio);
7021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    FlushStatus newStatus =
7041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
7051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (audio) {
7071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingAudio == NONE
7081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingAudio == AWAITING_DISCONTINUITY);
7091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingAudio = newStatus;
7111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingVideo == NONE) {
7131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingVideo = (mVideoDecoder != NULL)
7141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
7151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
7161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
7171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else {
7181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingVideo == NONE
7191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingVideo == AWAITING_DISCONTINUITY);
7201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingVideo = newStatus;
7221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingAudio == NONE) {
7241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingAudio = (mAudioDecoder != NULL)
7251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
7261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
7271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
7281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
7291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
7301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
732