NuPlayer.cpp revision 2c2814b900a61fa07ddfff860b143fbbe9c740e9
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" 22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDecoder.h" 23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerRenderer.h" 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerStreamListener.h" 25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h> 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h> 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/Surface.h> 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 34f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 38f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer() 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : mEOS(false), 40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioEOS(false), 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS(false), 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio(NONE), 43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo(NONE) { 44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() { 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setListener(const wp<MediaPlayerBase> &listener) { 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mListener = listener; 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) { 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber source->incStrong(this); 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setPointer("source", source.get()); // XXX unsafe. 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 62f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setVideoSurface(const sp<Surface> &surface) { 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetVideoSurface, id()); 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("surface", surface); 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 68f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id()); 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("sink", sink); 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 74f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() { 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatStart, id()))->post(); 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 78f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetDataSource: 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("kWhatSetDataSource"); 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mSource == NULL); 85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void *ptr; 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("source", &ptr)); 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSource = static_cast<IStreamSource *>(ptr); 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSource->decStrong(this); 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mStreamListener = new NuPlayerStreamListener(mSource, id()); 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTSParser = new ATSParser; 94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetVideoSurface: 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("kWhatSetVideoSurface"); 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("surface", &obj)); 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSurface = static_cast<Surface *>(obj.get()); 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetAudioSink: 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("kWhatSetAudioSink"); 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("sink", &obj)); 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatStart: 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mStreamListener->start(); 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer = new Renderer( 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink, 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(kWhatRendererNotify, id())); 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(mRenderer); 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatScanSources, id()))->post(); 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatScanSources: 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber instantiateDecoder(false, &mVideoDecoder); 136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioSink != NULL) { 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber instantiateDecoder(true, &mAudioDecoder); 139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mEOS) { 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber feedMoreTSData(); 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(100000ll); 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatVideoNotify: 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatAudioNotify: 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio = msg->what() == kWhatAudioNotify; 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> codecRequest; 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("codec-request", &codecRequest)); 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(codecRequest->findInt32("what", &what)); 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == ACodec::kWhatFillThisBuffer) { 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = feedDecoderInputData( 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio, codecRequest); 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err == -EWOULDBLOCK && !mEOS) { 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber feedMoreTSData(); 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatEOS) { 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueEOS(audio, ERROR_END_OF_STREAM); 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatFlushCompleted) { 175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mFlushingAudio, (int)FLUSHING_DECODER); 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = FLUSHED; 178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mFlushingVideo, (int)FLUSHING_DECODER); 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = FLUSHED; 181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("decoder %s flush completed", audio ? "audio" : "video"); 184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mFlushingAudio == FLUSHED && mFlushingVideo == FLUSHED) { 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("both audio and video are flushed now."); 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->signalTimeDiscontinuity(); 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioDecoder != NULL) { 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioDecoder->signalResume(); 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mVideoDecoder != NULL) { 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoDecoder->signalResume(); 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = NONE; 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = NONE; 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2012c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } else if (what == ACodec::kWhatOutputFormatChanged) { 2022c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber CHECK(audio); 2032c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 2042c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber int32_t numChannels; 2052c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber CHECK(codecRequest->findInt32("channel-count", &numChannels)); 2062c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 2072c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber int32_t sampleRate; 2082c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); 2092c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 2102c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber LOGI("Audio output format changed to %d Hz, %d channels", 2112c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber sampleRate, numChannels); 2122c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 2132c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber mAudioSink->close(); 2142c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber CHECK_EQ(mAudioSink->open(sampleRate, numChannels), (status_t)OK); 2152c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber mAudioSink->start(); 216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer); 218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber renderBuffer(audio, codecRequest); 220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatRendererNotify: 226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("what", &what)); 229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == Renderer::kWhatEOS) { 231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioEOS = true; 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS = true; 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("reached %s EOS", audio ? "audio" : "video"); 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((mAudioEOS || mAudioDecoder == NULL) 243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && (mVideoEOS || mVideoDecoder == NULL)) { 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete); 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("renderer %s flush completed.", audio ? "audio" : "video"); 253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatMoreDataQueued: 258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 268f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::feedMoreTSData() { 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!mEOS); 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (int32_t i = 0; i < 10; ++i) { 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber char buffer[188]; 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t n = mStreamListener->read(buffer, sizeof(buffer)); 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (n == 0) { 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("input data EOS reached."); 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTSParser->signalEOS(ERROR_END_OF_STREAM); 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mEOS = true; 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (n == INFO_DISCONTINUITY) { 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTSParser->signalDiscontinuity(ATSParser::DISCONTINUITY_SEEK); 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (n < 0) { 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(n, -EWOULDBLOCK); 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer[0] == 0x00) { 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX legacy 288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTSParser->signalDiscontinuity(ATSParser::DISCONTINUITY_SEEK); 289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTSParser->feedTSPacket(buffer, sizeof(buffer)); 291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::dequeueNextAccessUnit( 297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ATSParser::SourceType *type, sp<ABuffer> *accessUnit) { 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber accessUnit->clear(); 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t audioErr = -EWOULDBLOCK; 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t audioTimeUs; 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AnotherPacketSource> audioSource = 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<AnotherPacketSource *>( 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTSParser->getSource(ATSParser::MPEG2ADTS_AUDIO).get()); 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audioSource != NULL) { 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audioErr = audioSource->nextBufferTime(&audioTimeUs); 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t videoErr = -EWOULDBLOCK; 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t videoTimeUs; 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AnotherPacketSource> videoSource = 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<AnotherPacketSource *>( 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTSParser->getSource(ATSParser::AVC_VIDEO).get()); 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (videoSource != NULL) { 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber videoErr = videoSource->nextBufferTime(&videoTimeUs); 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audioErr == -EWOULDBLOCK || videoErr == -EWOULDBLOCK) { 323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audioErr != OK && videoErr != OK) { 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return audioErr; 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (videoErr != OK || (audioErr == OK && audioTimeUs < videoTimeUs)) { 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *type = ATSParser::MPEG2ADTS_AUDIO; 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return audioSource->dequeueAccessUnit(accessUnit); 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *type = ATSParser::AVC_VIDEO; 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return videoSource->dequeueAccessUnit(accessUnit); 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::dequeueAccessUnit( 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ATSParser::SourceType type, sp<ABuffer> *accessUnit) { 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AnotherPacketSource> source = 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get()); 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (source == NULL) { 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t finalResult; 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!source->hasBufferAvailable(&finalResult)) { 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return finalResult == OK ? -EWOULDBLOCK : finalResult; 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return source->dequeueAccessUnit(accessUnit); 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::instantiateDecoder( 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio, sp<Decoder> *decoder) { 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (*decoder != NULL) { 359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ATSParser::SourceType type = 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO; 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AnotherPacketSource> source = 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<AnotherPacketSource *>( 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTSParser->getSource(type).get()); 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (source == NULL) { 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber id()); 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *decoder = new Decoder(notify, audio ? NULL : mSurface); 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(*decoder); 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<MetaData> &meta = source->getFormat(); 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (*decoder)->configure(meta); 382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 386f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((audio && mFlushingAudio == FLUSHING_DECODER) 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || (!audio && mFlushingVideo == FLUSHING_DECODER)) { 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", INFO_DISCONTINUITY); 393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> accessUnit; 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = dequeueAccessUnit( 399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO, 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &accessUnit); 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err == -EWOULDBLOCK) { 403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (err != OK) { 405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err == INFO_DISCONTINUITY) { 406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("%s discontinuity", audio ? "audio" : "video"); 407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->flush(audio); 409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushingAudio == NONE 412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = FLUSHING_DECODER; 414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mFlushingVideo == NONE) { 415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ? AWAITING_DISCONTINUITY 417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : FLUSHED; 418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushingVideo == NONE 421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = FLUSHING_DECODER; 423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mFlushingAudio == NONE) { 424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ? AWAITING_DISCONTINUITY 426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : FLUSHED; 427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", err); 432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("feeding %s input buffer at media time %.2f secs", 442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setObject("buffer", accessUnit); 447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 452f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("renderBuffer %s", audio ? "audio" : "video"); 454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("buffer", &obj)); 460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); 462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 466f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mListener == NULL) { 468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<MediaPlayerBase> listener = mListener.promote(); 472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (listener == NULL) { 474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber listener->sendEvent(msg, ext1, ext2); 478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 481