NuPlayerStreamListener.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 "NuPlayerStreamListener" 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h> 20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerStreamListener.h" 22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <binder/MemoryDealer.h> 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 255bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/foundation/AMessage.h> 265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/MediaErrors.h> 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 28f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 30f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayerStreamListener::NuPlayerStreamListener( 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<IStreamSource> &source, 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ALooper::handler_id id) 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : mSource(source), 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTargetID(id), 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mEOS(false), 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSendDataNotification(true) { 37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSource->setListener(this); 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mMemoryDealer = new MemoryDealer(kNumBuffers * kBufferSize); 40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < kNumBuffers; ++i) { 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<IMemory> mem = mMemoryDealer->allocate(kBufferSize); 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mem != NULL); 43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers.push(mem); 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSource->setBuffers(mBuffers); 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::NuPlayerStreamListener::start() { 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < kNumBuffers; ++i) { 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSource->onBufferAvailable(i); 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 55f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::NuPlayerStreamListener::queueBuffer(size_t index, size_t size) { 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber QueueEntry entry; 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry.mIsCommand = false; 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry.mIndex = index; 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry.mSize = size; 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry.mOffset = 0; 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mQueue.push_back(entry); 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mSendDataNotification) { 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSendDataNotification = false; 675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (mTargetID != 0) { 695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber (new AMessage(kWhatMoreDataQueued, mTargetID))->post(); 705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 74f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::NuPlayerStreamListener::issueCommand( 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Command cmd, bool synchronous, const sp<AMessage> &extra) { 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!synchronous); 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber QueueEntry entry; 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry.mIsCommand = true; 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry.mCommand = cmd; 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry.mExtra = extra; 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mQueue.push_back(entry); 85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mSendDataNotification) { 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSendDataNotification = false; 885bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 895bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (mTargetID != 0) { 905bc087c573c70c84c6a39946457590b42d392a33Andreas Huber (new AMessage(kWhatMoreDataQueued, mTargetID))->post(); 915bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huberssize_t NuPlayer::NuPlayerStreamListener::read( 9632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber void *data, size_t size, sp<AMessage> *extra) { 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_GT(size, 0u); 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber extra->clear(); 10032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mEOS) { 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return 0; 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mQueue.empty()) { 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSendDataNotification = true; 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber QueueEntry *entry = &*mQueue.begin(); 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (entry->mIsCommand) { 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (entry->mCommand) { 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case EOS: 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mQueue.erase(mQueue.begin()); 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry = NULL; 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mEOS = true; 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return 0; 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case DISCONTINUITY: 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 12832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber *extra = entry->mExtra; 12932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mQueue.erase(mQueue.begin()); 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry = NULL; 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return INFO_DISCONTINUITY; 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t copy = entry->mSize; 143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (copy > size) { 144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber copy = size; 145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(data, 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (const uint8_t *)mBuffers.editItemAt(entry->mIndex)->pointer() 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber + entry->mOffset, 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber copy); 151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry->mOffset += copy; 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry->mSize -= copy; 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (entry->mSize == 0) { 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSource->onBufferAvailable(entry->mIndex); 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mQueue.erase(mQueue.begin()); 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber entry = NULL; 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return copy; 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 165