AwesomePlayer.cpp revision 6954535ba64374e4e941cd83019a7af53edfb098
1bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber/* 2bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 4bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * you may not use this file except in compliance with the License. 6bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * You may obtain a copy of the License at 7bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 8bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 10bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Unless required by applicable law or agreed to in writing, software 11bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * See the License for the specific language governing permissions and 14bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * limitations under the License. 15bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber */ 16bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 17bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber//#define LOG_NDEBUG 0 18bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#define LOG_TAG "AwesomePlayer" 19bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <utils/Log.h> 20bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 21988e3f0b2c74095deae580157c57935a98573052Andreas Huber#include <dlfcn.h> 22988e3f0b2c74095deae580157c57935a98573052Andreas Huber 23cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "include/ARTSPController.h" 24bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "include/AwesomePlayer.h" 25cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "include/LiveSource.h" 26733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber#include "include/SoftwareRenderer.h" 270a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/NuCachedSource2.h" 280a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/ThrottledSource.h" 29bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 3039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "ARTPSession.h" 3139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "APacketSource.h" 3239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "ASessionDescription.h" 3339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "UDPPusher.h" 3439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 354844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber#include <binder/IPCThreadState.h> 36bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/AudioPlayer.h> 37bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/DataSource.h> 38bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h> 39bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaBuffer.h> 40717826ececd8d39596f62418677721d70776add1Andreas Huber#include <media/stagefright/MediaDefs.h> 41bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaExtractor.h> 42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaDebug.h> 43bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaSource.h> 44bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MetaData.h> 45bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/OMXCodec.h> 46717826ececd8d39596f62418677721d70776add1Andreas Huber 473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <surfaceflinger/ISurface.h> 483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 49cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ALooper.h> 50e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 51bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android { 52bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kLowWaterMarkUs = 2000000ll; // 2secs 548650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kHighWaterMarkUs = 10000000ll; // 10secs 558650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 56bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event { 57c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomeEvent( 58c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomePlayer *player, 59c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*method)()) 60bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber : mPlayer(player), 61c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mMethod(method) { 62bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 63bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 64bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected: 65bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual ~AwesomeEvent() {} 66bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 67bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) { 68c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber (mPlayer->*mMethod)(); 69bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 70bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 71bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate: 72bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomePlayer *mPlayer; 73c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*mMethod)(); 74bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 75bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent(const AwesomeEvent &); 76bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent &operator=(const AwesomeEvent &); 77bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}; 78bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 79733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeRemoteRenderer : public AwesomeRenderer { 80733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeRemoteRenderer(const sp<IOMXRenderer> &target) 81733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber : mTarget(target) { 82733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 83733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 84733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual void render(MediaBuffer *buffer) { 85733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber void *id; 86733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber if (buffer->meta_data()->findPointer(kKeyBufferID, &id)) { 87733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mTarget->render((IOMX::buffer_id)id); 88733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 89733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 90733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 91733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate: 92733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber sp<IOMXRenderer> mTarget; 93733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 94733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeRemoteRenderer(const AwesomeRemoteRenderer &); 95733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeRemoteRenderer &operator=(const AwesomeRemoteRenderer &); 96733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber}; 97733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 98733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeLocalRenderer : public AwesomeRenderer { 99733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer( 100fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber bool previewOnly, 101988e3f0b2c74095deae580157c57935a98573052Andreas Huber const char *componentName, 102733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber OMX_COLOR_FORMATTYPE colorFormat, 103733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber const sp<ISurface> &surface, 104733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber size_t displayWidth, size_t displayHeight, 105733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber size_t decodedWidth, size_t decodedHeight) 106988e3f0b2c74095deae580157c57935a98573052Andreas Huber : mTarget(NULL), 107988e3f0b2c74095deae580157c57935a98573052Andreas Huber mLibHandle(NULL) { 108fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber init(previewOnly, componentName, 109988e3f0b2c74095deae580157c57935a98573052Andreas Huber colorFormat, surface, displayWidth, 110988e3f0b2c74095deae580157c57935a98573052Andreas Huber displayHeight, decodedWidth, decodedHeight); 111733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 112733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 113733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual void render(MediaBuffer *buffer) { 114fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber render((const uint8_t *)buffer->data() + buffer->range_offset(), 115fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber buffer->range_length()); 116fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber } 117fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 118fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber void render(const void *data, size_t size) { 119fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mTarget->render(data, size, NULL); 120733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 121733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 122733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprotected: 123733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual ~AwesomeLocalRenderer() { 124733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber delete mTarget; 125733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mTarget = NULL; 126988e3f0b2c74095deae580157c57935a98573052Andreas Huber 127988e3f0b2c74095deae580157c57935a98573052Andreas Huber if (mLibHandle) { 128988e3f0b2c74095deae580157c57935a98573052Andreas Huber dlclose(mLibHandle); 129988e3f0b2c74095deae580157c57935a98573052Andreas Huber mLibHandle = NULL; 130988e3f0b2c74095deae580157c57935a98573052Andreas Huber } 131733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 132733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 133733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate: 134988e3f0b2c74095deae580157c57935a98573052Andreas Huber VideoRenderer *mTarget; 135988e3f0b2c74095deae580157c57935a98573052Andreas Huber void *mLibHandle; 136988e3f0b2c74095deae580157c57935a98573052Andreas Huber 137988e3f0b2c74095deae580157c57935a98573052Andreas Huber void init( 138fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber bool previewOnly, 139988e3f0b2c74095deae580157c57935a98573052Andreas Huber const char *componentName, 140988e3f0b2c74095deae580157c57935a98573052Andreas Huber OMX_COLOR_FORMATTYPE colorFormat, 141988e3f0b2c74095deae580157c57935a98573052Andreas Huber const sp<ISurface> &surface, 142988e3f0b2c74095deae580157c57935a98573052Andreas Huber size_t displayWidth, size_t displayHeight, 143988e3f0b2c74095deae580157c57935a98573052Andreas Huber size_t decodedWidth, size_t decodedHeight); 144733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 145733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer(const AwesomeLocalRenderer &); 146733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);; 147733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber}; 148733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 149988e3f0b2c74095deae580157c57935a98573052Andreas Hubervoid AwesomeLocalRenderer::init( 150fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber bool previewOnly, 151988e3f0b2c74095deae580157c57935a98573052Andreas Huber const char *componentName, 152988e3f0b2c74095deae580157c57935a98573052Andreas Huber OMX_COLOR_FORMATTYPE colorFormat, 153988e3f0b2c74095deae580157c57935a98573052Andreas Huber const sp<ISurface> &surface, 154988e3f0b2c74095deae580157c57935a98573052Andreas Huber size_t displayWidth, size_t displayHeight, 155988e3f0b2c74095deae580157c57935a98573052Andreas Huber size_t decodedWidth, size_t decodedHeight) { 156fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber if (!previewOnly) { 157fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber // We will stick to the vanilla software-color-converting renderer 158fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber // for "previewOnly" mode, to avoid unneccessarily switching overlays 159fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber // more often than necessary. 160fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 161fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW); 162fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 163fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber if (mLibHandle) { 164fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber typedef VideoRenderer *(*CreateRendererFunc)( 165fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber const sp<ISurface> &surface, 166fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber const char *componentName, 167fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber OMX_COLOR_FORMATTYPE colorFormat, 168fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber size_t displayWidth, size_t displayHeight, 169fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber size_t decodedWidth, size_t decodedHeight); 170fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 171fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber CreateRendererFunc func = 172fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber (CreateRendererFunc)dlsym( 173fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mLibHandle, 174fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber "_Z14createRendererRKN7android2spINS_8ISurfaceEEEPKc20" 175fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber "OMX_COLOR_FORMATTYPEjjjj"); 176fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 177fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber if (func) { 178fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mTarget = 179fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber (*func)(surface, componentName, colorFormat, 180fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber displayWidth, displayHeight, 181fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber decodedWidth, decodedHeight); 182fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber } 183988e3f0b2c74095deae580157c57935a98573052Andreas Huber } 184988e3f0b2c74095deae580157c57935a98573052Andreas Huber } 185988e3f0b2c74095deae580157c57935a98573052Andreas Huber 186988e3f0b2c74095deae580157c57935a98573052Andreas Huber if (mTarget == NULL) { 187988e3f0b2c74095deae580157c57935a98573052Andreas Huber mTarget = new SoftwareRenderer( 188988e3f0b2c74095deae580157c57935a98573052Andreas Huber colorFormat, surface, displayWidth, displayHeight, 189988e3f0b2c74095deae580157c57935a98573052Andreas Huber decodedWidth, decodedHeight); 190988e3f0b2c74095deae580157c57935a98573052Andreas Huber } 191988e3f0b2c74095deae580157c57935a98573052Andreas Huber} 192988e3f0b2c74095deae580157c57935a98573052Andreas Huber 193bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer() 1942e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber : mQueueStarted(false), 1952e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mTimeSource(NULL), 196fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview(false), 197bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer(NULL), 198bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags(0), 199acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags(0), 200bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer(NULL), 2017b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mVideoBuffer(NULL), 2027b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mSuspensionState(NULL) { 203bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK_EQ(mClient.connect(), OK); 204bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 205bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber DataSource::RegisterDefaultSniffers(); 206bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 207c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent); 208bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 209c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone); 210bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 211c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate); 21266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 213c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 214c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mCheckAudioStatusEvent = new AwesomeEvent( 215c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onCheckAudioStatus); 216c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2171862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 220bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() { 2232e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mQueueStarted) { 2242e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.stop(); 2252e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 226bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 227bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 228bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 229bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mClient.disconnect(); 230bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 231bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 23266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::cancelPlayerEvents(bool keepBufferingGoing) { 233bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mVideoEvent->eventID()); 234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mStreamDoneEvent->eventID()); 236bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 2371862a33b246249630b654182afb5914da3480d4cAndreas Huber mQueue.cancelEvent(mCheckAudioStatusEvent->eventID()); 2381862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 23966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 24066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (!keepBufferingGoing) { 24166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.cancelEvent(mBufferingEvent->eventID()); 24266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 24366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 244bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 245bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2460726045216f576e97672ebeefc265d39c4ebaaa5Andreas Hubervoid AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) { 247bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 248bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mListener = listener; 249bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 250bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2515561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huberstatus_t AwesomePlayer::setDataSource( 2525561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 253bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 2547b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(uri, headers); 2557b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 256bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2577b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 2587b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 259bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 260bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 261bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri = uri; 26266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 263bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (headers) { 264bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders = *headers; 26566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 26666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 267bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // The actual work will be done during preparation in the call to 268bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // ::finishSetDataSource_l to avoid blocking the calling thread in 269bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // setDataSource for any significant time. 27066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 271bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 272bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 273bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 274bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource( 275bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int fd, int64_t offset, int64_t length) { 276bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 277bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 278bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 279bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2807b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<DataSource> dataSource = new FileSource(fd, offset, length); 281bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2827b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber status_t err = dataSource->initCheck(); 283bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 284bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 285bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return err; 286bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 287bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2887b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource = dataSource; 2897b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 2907b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(dataSource); 2917b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 2927b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 2937b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 2947b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const sp<DataSource> &dataSource) { 2957b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 296bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 297bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (extractor == NULL) { 298bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 299bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 300bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 301bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return setDataSource_l(extractor); 302bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 303bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 304bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { 305bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveAudio = false; 306bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveVideo = false; 307bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 308bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 309bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 310bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const char *mime; 311bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 312bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 313bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!haveVideo && !strncasecmp(mime, "video/", 6)) { 31488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber setVideoSource(extractor->getTrack(i)); 31588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber haveVideo = true; 316bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) { 31788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber setAudioSource(extractor->getTrack(i)); 31888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber haveAudio = true; 3198ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber 3206954535ba64374e4e941cd83019a7af53edfb098Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { 3216954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // Only do this for vorbis audio, none of the other audio 3226954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // formats even support this ringtone specific hack and 3236954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // retrieving the metadata on some extractors may turn out 3246954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // to be very expensive. 3256954535ba64374e4e941cd83019a7af53edfb098Andreas Huber sp<MetaData> fileMeta = extractor->getMetaData(); 3266954535ba64374e4e941cd83019a7af53edfb098Andreas Huber int32_t loop; 3276954535ba64374e4e941cd83019a7af53edfb098Andreas Huber if (fileMeta != NULL 3286954535ba64374e4e941cd83019a7af53edfb098Andreas Huber && fileMeta->findInt32(kKeyAutoLoop, &loop) && loop != 0) { 3296954535ba64374e4e941cd83019a7af53edfb098Andreas Huber mFlags |= AUTO_LOOPING; 3306954535ba64374e4e941cd83019a7af53edfb098Andreas Huber } 3318ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber } 332bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 333bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 334bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (haveAudio && haveVideo) { 335bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 336bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 337bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 338bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 339acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber if (!haveAudio && !haveVideo) { 340acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return UNKNOWN_ERROR; 341acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 342acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 343acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = extractor->flags(); 344acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 345acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 346bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 347bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 348bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset() { 349bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 350bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 351bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 352bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 353bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset_l() { 354e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mFlags & PREPARING) { 355e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mFlags |= PREPARE_CANCELLED; 356e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mConnectingDataSource != NULL) { 357e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGI("interrupting the connection process"); 358e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource->disconnect(); 359e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 360e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 361e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 362bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 363bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.wait(mLock); 364bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 365bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 366bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber cancelPlayerEvents(); 367bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 3680a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource.clear(); 36988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack.clear(); 37088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack.clear(); 37188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 3727b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // Shutdown audio first, so that the respone to the reset request 3737b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // appears to happen instantaneously as far as the user is concerned 3747b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // If we did this later, audio would continue playing while we 3757b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // shutdown the video-related resources and the player appear to 3767b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // not be as responsive to a reset request. 377e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mAudioPlayer == NULL && mAudioSource != NULL) { 378e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // If we had an audio player, it would have effectively 379e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // taken possession of the audio source and stopped it when 380e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // _it_ is stopped. Otherwise this is still our responsibility. 381e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mAudioSource->stop(); 382e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 3837b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mAudioSource.clear(); 3847b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 3857b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mTimeSource = NULL; 3867b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 3877b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber delete mAudioPlayer; 3887b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mAudioPlayer = NULL; 3897b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 390b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber mVideoRenderer.clear(); 391b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber 392bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mLastVideoBuffer) { 393bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer->release(); 394bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer = NULL; 395bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 396bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 397bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer) { 398bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 399bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 400bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 401bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 402cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber if (mRTSPController != NULL) { 403cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController->disconnect(); 404cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController.clear(); 405cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber } 406cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 40739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mRTPPusher.clear(); 40839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mRTCPPusher.clear(); 40939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mRTPSession.clear(); 410cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 411bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 412bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource->stop(); 41369f5f4c021ee55055df39718244c036faf2d3382Andreas Huber 41469f5f4c021ee55055df39718244c036faf2d3382Andreas Huber // The following hack is necessary to ensure that the OMX 41569f5f4c021ee55055df39718244c036faf2d3382Andreas Huber // component is completely released by the time we may try 41669f5f4c021ee55055df39718244c036faf2d3382Andreas Huber // to instantiate it again. 41769f5f4c021ee55055df39718244c036faf2d3382Andreas Huber wp<MediaSource> tmp = mVideoSource; 418bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource.clear(); 41969f5f4c021ee55055df39718244c036faf2d3382Andreas Huber while (tmp.promote() != NULL) { 42069f5f4c021ee55055df39718244c036faf2d3382Andreas Huber usleep(1000); 42169f5f4c021ee55055df39718244c036faf2d3382Andreas Huber } 42269f5f4c021ee55055df39718244c036faf2d3382Andreas Huber IPCThreadState::self()->flushCommands(); 423bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 424bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 425bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = -1; 426bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags = 0; 427acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = 0; 428bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoWidth = mVideoHeight = -1; 429bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = 0; 430bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoTimeUs = 0; 431bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 432bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeeking = false; 4331321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 434bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = 0; 43566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 436bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri.setTo(""); 437bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders.clear(); 4387b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 4397b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource.clear(); 4407b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 4417b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber delete mSuspensionState; 4427b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mSuspensionState = NULL; 443bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 444bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 445c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { 4460726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (mListener != NULL) { 4470726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber sp<MediaPlayerBase> listener = mListener.promote(); 4480726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 4490726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (listener != NULL) { 450c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber listener->sendEvent(msg, ext1, ext2); 45166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 45266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 45366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 45466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 4558650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber// Returns true iff cached duration is available/applicable. 4568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberbool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) { 4578650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber off_t totalSize; 4588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 4598650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mRTSPController != NULL) { 4608650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = mRTSPController->getQueueDurationUs(eos); 4618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 4628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mCachedSource != NULL && mDurationUs >= 0 4638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && mCachedSource->getSize(&totalSize) == OK) { 4648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t bitrate = totalSize * 8000000ll / mDurationUs; // in bits/sec 4658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 4668650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber size_t cachedDataRemaining = mCachedSource->approxDataRemaining(eos); 4678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = cachedDataRemaining * 8000000ll / bitrate; 4688650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 4698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 4708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 4718650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return false; 4728650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 4738650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 47466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::onBufferingUpdate() { 47566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber Mutex::Autolock autoLock(mLock); 476d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mBufferingEventPending) { 477d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 478d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 47966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 48066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 4818650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mCachedSource != NULL) { 482c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber bool eos; 4838650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&eos); 484c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 4858650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (eos) { 4868650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_BUFFERING_UPDATE, 100); 4878650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 4888650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber off_t size; 4898650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mDurationUs >= 0 && mCachedSource->getSize(&size) == OK) { 4908650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t bitrate = size * 8000000ll / mDurationUs; // in bits/sec 491c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 4928650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber size_t cachedSize = mCachedSource->cachedSize(); 4938650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate; 494c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 4958650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int percentage = 100.0 * (double)cachedDurationUs / mDurationUs; 4968650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (percentage > 100) { 4978650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber percentage = 100; 4988650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 499c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 5008650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage); 5018650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 5028650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // We don't know the bitrate of the stream, use absolute size 5038650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // limits to maintain the cache. 5048650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 5058650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber const size_t kLowWaterMarkBytes = 400000; 5068650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber const size_t kHighWaterMarkBytes = 1000000; 5078650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 5088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 5098650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDataRemaining < kLowWaterMarkBytes)) { 5108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache is running low (< %d) , pausing.", 5118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kLowWaterMarkBytes); 5128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags |= CACHE_UNDERRUN; 5138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 5148650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 5158650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) { 5168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 5178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache has filled up (> %d), resuming.", 5188650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 5198650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags &= ~CACHE_UNDERRUN; 5208650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 5218650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 5228650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 5238650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGV("cache has filled up (> %d), prepare is done", 5248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 5258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 5268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 5278650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 5288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 5298650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 5302415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 5312415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber 5328650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs; 5332a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber bool eos; 5348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (getCachedDuration_l(&cachedDurationUs, &eos)) { 5358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 5368650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDurationUs < kLowWaterMarkUs)) { 5378650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache is running low (%.2f secs) , pausing.", 5388650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 5398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags |= CACHE_UNDERRUN; 5408650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 5418650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 5428650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (eos || cachedDurationUs > kHighWaterMarkUs) { 5438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 5448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache has filled up (%.2f secs), resuming.", 5458650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 5468650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags &= ~CACHE_UNDERRUN; 5478650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 5488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 5498650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 5508650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGV("cache has filled up (%.2f secs), prepare is done", 5518650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 5528650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 5532a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 5542a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 5550a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 5560a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 5570a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber postBufferingEvent_l(); 5580726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber} 5590726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 560bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() { 561bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // Posted whenever any stream finishes playing. 562bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 563bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 564d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mStreamDoneEventPending) { 565d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 566d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 567bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 568bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 5695d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (mStreamDoneStatus != ERROR_END_OF_STREAM) { 5705d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber LOGV("MEDIA_ERROR %d", mStreamDoneStatus); 5715d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 5725d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l( 5735d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus); 5745d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 5755d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber pause_l(); 5765d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 5775d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= AT_EOS; 5785d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 5795d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 5805d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 5815d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber const bool allDone = 5825d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS)) 5835d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS)); 5845d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 5855d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!allDone) { 5865d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 5875d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 5885d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 5898ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber if (mFlags & (LOOPING | AUTO_LOOPING)) { 590bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekTo_l(0); 591bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 592a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoSource != NULL) { 593bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 594bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 595bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 5965d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber LOGV("MEDIA_PLAYBACK_COMPLETE"); 5975d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l(MEDIA_PLAYBACK_COMPLETE); 598bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 599bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber pause_l(); 6002e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 6012e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mFlags |= AT_EOS; 602bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 603bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 604bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 605bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() { 606bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 6070a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 6080a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 6090a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 6107b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return play_l(); 6117b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 612bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 6137b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::play_l() { 614bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & PLAYING) { 615bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 616bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 617bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 618bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (!(mFlags & PREPARED)) { 619bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber status_t err = prepare_l(); 620bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 621bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (err != OK) { 622bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return err; 623bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 624bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 625bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 626bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= PLAYING; 627bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= FIRST_FRAME; 628bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 629fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber bool deferredAudioSeek = false; 630fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber 631bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 632bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioPlayer == NULL) { 633bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSink != NULL) { 634ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber mAudioPlayer = new AudioPlayer(mAudioSink, this); 635bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->setSource(mAudioSource); 636e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 637e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber // We've already started the MediaSource in order to enable 638e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber // the prefetcher to read its data. 639e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber status_t err = mAudioPlayer->start( 640e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber true /* sourceAlreadyStarted */); 64188c030e0e0152791ff74f90249f55fce01371198Andreas Huber 64288c030e0e0152791ff74f90249f55fce01371198Andreas Huber if (err != OK) { 64388c030e0e0152791ff74f90249f55fce01371198Andreas Huber delete mAudioPlayer; 64488c030e0e0152791ff74f90249f55fce01371198Andreas Huber mAudioPlayer = NULL; 64588c030e0e0152791ff74f90249f55fce01371198Andreas Huber 64688c030e0e0152791ff74f90249f55fce01371198Andreas Huber mFlags &= ~(PLAYING | FIRST_FRAME); 64788c030e0e0152791ff74f90249f55fce01371198Andreas Huber 64888c030e0e0152791ff74f90249f55fce01371198Andreas Huber return err; 64988c030e0e0152791ff74f90249f55fce01371198Andreas Huber } 650bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 651bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSource = mAudioPlayer; 652bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 653fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber deferredAudioSeek = true; 6541862a33b246249630b654182afb5914da3480d4cAndreas Huber 6551862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = false; 6561862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = true; 657bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 658bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 659bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->resume(); 660bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 661bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 662bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 663bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mTimeSource == NULL && mAudioPlayer == NULL) { 6645d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSource = &mSystemTimeSource; 665bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 666bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 667bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 668a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber // Kick off video playback 669a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber postVideoEvent_l(); 670bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 671bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 672fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber if (deferredAudioSeek) { 673fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber // If there was a seek request while we were paused 674fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber // and we're just starting up again, honor the request now. 675fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber seekAudioIfNecessary_l(); 676fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber } 677fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber 6782e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mFlags & AT_EOS) { 6792e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // Legacy behaviour, if a stream finishes playing and then 6802e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // is started again, we play from the start... 6812e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber seekTo_l(0); 6822e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 6832e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 684bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 685bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 686bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 687bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() { 688bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mISurface != NULL) { 689bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 690bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 691bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int32_t format; 692bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const char *component; 693bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int32_t decodedWidth, decodedHeight; 694bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findInt32(kKeyColorFormat, &format)); 695bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findCString(kKeyDecoderComponent, &component)); 696bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); 697bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); 698bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 6994844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoRenderer.clear(); 7004844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 7014844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber // Must ensure that mVideoRenderer's destructor is actually executed 7024844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber // before creating a new one. 7034844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber IPCThreadState::self()->flushCommands(); 7044844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 705733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber if (!strncmp("OMX.", component, 4)) { 706733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber // Our OMX codecs allocate buffers on the media_server side 707733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber // therefore they require a remote IOMXRenderer that knows how 708733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber // to display them. 709733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mVideoRenderer = new AwesomeRemoteRenderer( 710733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mClient.interface()->createRenderer( 711733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mISurface, component, 712733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber (OMX_COLOR_FORMATTYPE)format, 713733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber decodedWidth, decodedHeight, 714733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mVideoWidth, mVideoHeight)); 715733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } else { 716733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber // Other decoders are instantiated locally and as a consequence 717733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber // allocate their buffers in local address space. 718733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mVideoRenderer = new AwesomeLocalRenderer( 719fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber false, // previewOnly 720988e3f0b2c74095deae580157c57935a98573052Andreas Huber component, 721733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber (OMX_COLOR_FORMATTYPE)format, 722733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mISurface, 723733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mVideoWidth, mVideoHeight, 724733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber decodedWidth, decodedHeight); 725733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 726bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 727bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 728bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 729bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() { 730bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 7310a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 7320a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 7330a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 734bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return pause_l(); 735bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 736bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 737bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause_l() { 738bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!(mFlags & PLAYING)) { 739bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 740bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 741bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 74266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber cancelPlayerEvents(true /* keepBufferingGoing */); 743bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 744bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioPlayer != NULL) { 745bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->pause(); 746bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 747bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 748bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags &= ~PLAYING; 749bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 750bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 751bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 752bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 753bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const { 7540a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN); 755bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 756bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 757bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setISurface(const sp<ISurface> &isurface) { 758bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 759bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 760bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mISurface = isurface; 761bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 762bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 763bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink( 764bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const sp<MediaPlayerBase::AudioSink> &audioSink) { 765bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 766bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 767bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioSink = audioSink; 768bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 769bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 770bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) { 771bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 772bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 773bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags = mFlags & ~LOOPING; 774bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 775bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (shouldLoop) { 776bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= LOOPING; 777bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 778bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 779bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 780bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 781bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 782bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) { 7832415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 784bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 785bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0) { 786bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 787bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 788bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 789bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *durationUs = mDurationUs; 790bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 791bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 792bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 793bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 794bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) { 7958d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber if (mRTSPController != NULL) { 7968d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber *positionUs = mRTSPController->getNormalPlayTimeUs(); 7978d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber } 7988d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber else if (mSeeking) { 799dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber *positionUs = mSeekTimeUs; 800dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber } else if (mVideoSource != NULL) { 8012415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 802bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mVideoTimeUs; 803bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (mAudioPlayer != NULL) { 804bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mAudioPlayer->getMediaTimeUs(); 805bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 806bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = 0; 807bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 808bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 809bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 810bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 811bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 812bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo(int64_t timeUs) { 813acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber if (mExtractorFlags 814acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber & (MediaExtractor::CAN_SEEK_FORWARD 815acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber | MediaExtractor::CAN_SEEK_BACKWARD)) { 816acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber Mutex::Autolock autoLock(mLock); 817acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return seekTo_l(timeUs); 818acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 819acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 820acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 821bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 822bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 823bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) { 824cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber if (mRTSPController != NULL) { 825cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController->seek(timeUs); 826cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 827cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 828cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mSeekNotificationSent = true; 829cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber return OK; 830cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber } 831cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 8320a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber if (mFlags & CACHE_UNDERRUN) { 8330a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 8340a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber play_l(); 8350a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 8360a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 837bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeeking = true; 8381321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 839bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = timeUs; 8405d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags &= ~(AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS); 841bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 842bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekAudioIfNecessary_l(); 843bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 8441321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!(mFlags & PLAYING)) { 8451321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber LOGV("seeking while paused, sending SEEK_COMPLETE notification" 8461321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber " immediately."); 8471321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 8481321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 8491321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 8501321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 8511321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 852bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 853bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 854bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 855bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() { 856a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mSeeking && mVideoSource == NULL && mAudioPlayer != NULL) { 857bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->seekTo(mSeekTimeUs); 858bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 8591862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = true; 8601862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = true; 8611321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 862bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 863bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 864bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 865bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getVideoDimensions( 866bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int32_t *width, int32_t *height) const { 867bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 868bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 869bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoWidth < 0 || mVideoHeight < 0) { 870bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 871bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 872bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 873bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *width = mVideoWidth; 874bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *height = mVideoHeight; 875bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 876bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 877bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 878bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 87988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setAudioSource(sp<MediaSource> source) { 88088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 881bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 88288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack = source; 88388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 88488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 88588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initAudioDecoder() { 88688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber sp<MetaData> meta = mAudioTrack->getFormat(); 887717826ececd8d39596f62418677721d70776add1Andreas Huber 888717826ececd8d39596f62418677721d70776add1Andreas Huber const char *mime; 889717826ececd8d39596f62418677721d70776add1Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 890717826ececd8d39596f62418677721d70776add1Andreas Huber 891717826ececd8d39596f62418677721d70776add1Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 89288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioSource = mAudioTrack; 893717826ececd8d39596f62418677721d70776add1Andreas Huber } else { 894717826ececd8d39596f62418677721d70776add1Andreas Huber mAudioSource = OMXCodec::Create( 89588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mAudioTrack->getFormat(), 896717826ececd8d39596f62418677721d70776add1Andreas Huber false, // createEncoder 89788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack); 898717826ececd8d39596f62418677721d70776add1Andreas Huber } 899bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 900bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 901bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 90288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 9032415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 904bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 905bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 906bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 907bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 908bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 909a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber status_t err = mAudioSource->start(); 910a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber 911a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber if (err != OK) { 912a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber mAudioSource.clear(); 913a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber return err; 914a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber } 91581f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) { 91681f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // For legacy reasons we're simply going to ignore the absence 91781f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // of an audio decoder for QCELP instead of aborting playback 91881f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // altogether. 91981f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber return OK; 92081f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } 921e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 922bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mAudioSource != NULL ? OK : UNKNOWN_ERROR; 923bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 924bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 92588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setVideoSource(sp<MediaSource> source) { 92688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 927bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 92888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack = source; 92988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 93088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 93188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initVideoDecoder() { 93239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber uint32_t flags = 0; 933bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource = OMXCodec::Create( 93488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mVideoTrack->getFormat(), 935bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber false, // createEncoder 93639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mVideoTrack, 93739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber NULL, flags); 938bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 939bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 940bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 94188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 9422415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 943bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 944bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 945bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 946bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 947bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 94888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(mVideoTrack->getFormat()->findInt32(kKeyWidth, &mVideoWidth)); 94988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(mVideoTrack->getFormat()->findInt32(kKeyHeight, &mVideoHeight)); 950bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 951139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber status_t err = mVideoSource->start(); 952139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber 953139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber if (err != OK) { 954139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber mVideoSource.clear(); 955139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber return err; 956139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber } 957bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 958bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 959bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mVideoSource != NULL ? OK : UNKNOWN_ERROR; 960bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 961bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 962c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onVideoEvent() { 963bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 9647b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber if (!mVideoEventPending) { 9657b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // The event has been cancelled in reset_l() but had already 9667b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // been scheduled for execution at that time. 9677b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return; 9687b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 969bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 970bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 971bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mSeeking) { 972bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mLastVideoBuffer) { 973bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer->release(); 974bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer = NULL; 975bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 976bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 977bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer) { 978bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 979bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 980bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 9810a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 9820a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber if (mCachedSource != NULL && mAudioSource != NULL) { 9830a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // We're going to seek the video source first, followed by 9840a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio source. 9850a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // In order to avoid jumps in the DataSource offset caused by 9860a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio codec prefetching data from the old locations 9870a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // while the video codec is already reading data from the new 9880a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // locations, we'll "pause" the audio source, causing it to 9890a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // stop reading input data until a subsequent seek. 9900a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 9910a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber if (mAudioPlayer != NULL) { 9920a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioPlayer->pause(); 9930a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 9940a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioSource->pause(); 9950a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 996bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 997bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 998bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!mVideoBuffer) { 999bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber MediaSource::ReadOptions options; 1000bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mSeeking) { 1001bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6); 1002bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1003abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber options.setSeekTo( 1004abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST_SYNC); 1005bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1006bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (;;) { 1007bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber status_t err = mVideoSource->read(&mVideoBuffer, &options); 1008c1689e49ac867de33f2e81289449878ac2e536a0Andreas Huber options.clearSeekTo(); 1009bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1010bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 1011bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK_EQ(mVideoBuffer, NULL); 1012bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1013bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err == INFO_FORMAT_CHANGED) { 1014bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("VideoSource signalled format change."); 1015bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1016a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1017fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1018a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1019a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1020bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber continue; 1021bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1022bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10235d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= VIDEO_AT_EOS; 10245295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(err); 1025bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1026bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1027bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10284844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber if (mVideoBuffer->range_length() == 0) { 102908411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // Some decoders, notably the PV AVC software decoder 103008411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // return spurious empty buffers that we just want to ignore. 103108411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber 10324844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer->release(); 10334844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer = NULL; 10344844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber continue; 10354844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber } 10364844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 1037bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 1038bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1039bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1040bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1041bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t timeUs; 1042bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 1043bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10442415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber { 10452415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 10462415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber mVideoTimeUs = timeUs; 10472415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 1048bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1049bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mSeeking) { 1050bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioPlayer != NULL) { 1051bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("seeking audio to %lld us (%.2f secs).", timeUs, timeUs / 1E6); 1052bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1053bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->seekTo(timeUs); 10540a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioPlayer->resume(); 10551862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = true; 10561862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = true; 10571321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } else if (!mSeekNotificationSent) { 1058bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // If we're playing video only, report seek complete now, 1059bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // otherwise audio player will notify us later. 10600726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 1061bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1062bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1063bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= FIRST_FRAME; 1064bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeeking = false; 10651321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 1066bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1067bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10685d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource; 10695d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 1070bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & FIRST_FRAME) { 1071bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags &= ~FIRST_FRAME; 1072bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10735d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs; 1074bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1075bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1076bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t realTimeUs, mediaTimeUs; 10775d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL 1078bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) { 1079bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; 1080bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1081bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10825d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 1083bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1084bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t latenessUs = nowUs - timeUs; 1085bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1086f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber if (mRTPSession != NULL) { 1087f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber // We'll completely ignore timestamps for gtalk videochat 1088f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber // and we'll play incoming video as fast as we get it. 1089f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber latenessUs = 0; 1090f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber } 1091f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber 1092650773d00356129ffd661cdaef3fb3095c343707Andreas Huber if (latenessUs > 40000) { 1093650773d00356129ffd661cdaef3fb3095c343707Andreas Huber // We're more than 40ms late. 1094ec9dd59902c8beea4ba6a842f3a843d46150d949Andreas Huber LOGV("we're late by %lld us (%.2f secs)", latenessUs, latenessUs / 1E6); 1095bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1096bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 1097bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1098bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1099bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 1100bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1101bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1102bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1103bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (latenessUs < -10000) { 1104bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // We're more than 10ms early. 1105bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1106bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(10000); 1107bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1108bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1109bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1110fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber if (mVideoRendererIsPreview || mVideoRenderer == NULL) { 1111fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1112fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 1113a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1114a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1115a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber 1116a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1117a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber mVideoRenderer->render(mVideoBuffer); 1118a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1119bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1120bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mLastVideoBuffer) { 1121bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer->release(); 1122bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer = NULL; 1123bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1124bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer = mVideoBuffer; 1125bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1126bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1127bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 1128bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1129bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1130bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) { 1131bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoEventPending) { 1132bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1133bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1134bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1135bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = true; 1136bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs); 1137bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1138bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 11395295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Hubervoid AwesomePlayer::postStreamDoneEvent_l(status_t status) { 1140bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mStreamDoneEventPending) { 1141bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1142bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1143bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = true; 11445295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber 11455295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber mStreamDoneStatus = status; 1146bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEvent(mStreamDoneEvent); 1147bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1148bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 114966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::postBufferingEvent_l() { 115066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (mBufferingEventPending) { 115166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber return; 115266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 115366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = true; 115466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.postEventWithDelay(mBufferingEvent, 1000000ll); 115566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 115666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 11571862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::postCheckAudioStatusEvent_l() { 11581862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mAudioStatusEventPending) { 11591862a33b246249630b654182afb5914da3480d4cAndreas Huber return; 11601862a33b246249630b654182afb5914da3480d4cAndreas Huber } 11611862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = true; 1162ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber mQueue.postEvent(mCheckAudioStatusEvent); 11631862a33b246249630b654182afb5914da3480d4cAndreas Huber} 11641862a33b246249630b654182afb5914da3480d4cAndreas Huber 11651862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::onCheckAudioStatus() { 11661862a33b246249630b654182afb5914da3480d4cAndreas Huber Mutex::Autolock autoLock(mLock); 1167d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mAudioStatusEventPending) { 1168d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber // Event was dispatched and while we were blocking on the mutex, 1169d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber // has already been cancelled. 1170d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 1171d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 1172d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber 11731862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 11741862a33b246249630b654182afb5914da3480d4cAndreas Huber 11751862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) { 11761862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = false; 11771321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 11781321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!mSeekNotificationSent) { 11791321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 11801321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 11811321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 1182dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber 1183dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber mSeeking = false; 11841862a33b246249630b654182afb5914da3480d4cAndreas Huber } 11851862a33b246249630b654182afb5914da3480d4cAndreas Huber 11865295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber status_t finalStatus; 11875295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) { 11881862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = false; 11895d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= AUDIO_AT_EOS; 11905d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= FIRST_FRAME; 11915295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(finalStatus); 11921862a33b246249630b654182afb5914da3480d4cAndreas Huber } 11931862a33b246249630b654182afb5914da3480d4cAndreas Huber} 11941862a33b246249630b654182afb5914da3480d4cAndreas Huber 1195c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepare() { 1196c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1197bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return prepare_l(); 1198bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 1199c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1200bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::prepare_l() { 1201bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARED) { 1202bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 1203bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1204bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1205bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1206bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1207bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1208bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1209bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = false; 1210c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber status_t err = prepareAsync_l(); 1211c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1212c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber if (err != OK) { 1213c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return err; 1214c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1215c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1216bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 1217c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mPreparedCondition.wait(mLock); 1218c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1219c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1220bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return mPrepareResult; 1221c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1222c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1223c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync() { 1224c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1225bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1226bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1227bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1228bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1229bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1230bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = true; 1231c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return prepareAsync_l(); 1232c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1233c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1234c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync_l() { 1235bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1236bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1237c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1238c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 12392e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (!mQueueStarted) { 12402e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.start(); 12412e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueueStarted = true; 12422e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 12432e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 1244bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags |= PREPARING; 1245c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = new AwesomeEvent( 1246c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onPrepareAsyncEvent); 1247c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1248c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mQueue.postEvent(mAsyncPrepareEvent); 1249c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1250c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return OK; 1251c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1252c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1253bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::finishSetDataSource_l() { 1254e94bd14078d327ef2f800e69907efce641a13272Andreas Huber sp<DataSource> dataSource; 1255e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1256e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (!strncasecmp("http://", mUri.string(), 7)) { 12570a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mConnectingDataSource = new NuHTTPDataSource; 1258e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1259e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.unlock(); 126079f77ef3b0a37660ba8c5bcb2dfbfda3860f2135Andreas Huber status_t err = mConnectingDataSource->connect(mUri, &mUriHeaders); 1261e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.lock(); 1262e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1263e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (err != OK) { 1264e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 1265e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1266e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGI("mConnectingDataSource->connect() returned %d", err); 1267e94bd14078d327ef2f800e69907efce641a13272Andreas Huber return err; 1268e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1269e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 12700a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#if 0 12710a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource = new NuCachedSource2( 12720a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber new ThrottledSource( 12730a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mConnectingDataSource, 50 * 1024 /* bytes/sec */)); 12740a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#else 12750a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource = new NuCachedSource2(mConnectingDataSource); 12760a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#endif 1277e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 12780a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 12790a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber dataSource = mCachedSource; 1280e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber } else if (!strncasecmp(mUri.string(), "httplive://", 11)) { 1281e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber String8 uri("http://"); 1282e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber uri.append(mUri.string() + 11); 1283e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 1284e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber dataSource = new LiveSource(uri.string()); 1285e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 12860a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource = new NuCachedSource2(dataSource); 12870a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber dataSource = mCachedSource; 1288e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 1289e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber sp<MediaExtractor> extractor = 1290e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber MediaExtractor::Create(dataSource, MEDIA_MIMETYPE_CONTAINER_MPEG2TS); 12910a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 12920a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber return setDataSource_l(extractor); 12931aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd } else if (!strncmp("rtsp://gtalk/", mUri.string(), 13)) { 129439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (mLooper == NULL) { 129539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mLooper = new ALooper; 1296a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber mLooper->setName("gtalk rtp"); 1297ff53123821a3ec2e71fdb1a971ea2cbae3119826Andreas Huber mLooper->start( 1298ff53123821a3ec2e71fdb1a971ea2cbae3119826Andreas Huber false /* runOnCallingThread */, 1299ff53123821a3ec2e71fdb1a971ea2cbae3119826Andreas Huber false /* canCallJava */, 1300ff53123821a3ec2e71fdb1a971ea2cbae3119826Andreas Huber PRIORITY_HIGHEST); 130139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 130239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 13031aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd const char *startOfCodecString = &mUri.string()[13]; 13041aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd const char *startOfSlash1 = strchr(startOfCodecString, '/'); 13051aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd if (startOfSlash1 == NULL) { 13061aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd return BAD_VALUE; 13071aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd } 13081aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd const char *startOfWidthString = &startOfSlash1[1]; 13091aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd const char *startOfSlash2 = strchr(startOfWidthString, '/'); 13101aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd if (startOfSlash2 == NULL) { 13111aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd return BAD_VALUE; 13121aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd } 13131aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd const char *startOfHeightString = &startOfSlash2[1]; 13141aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd 13151aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd String8 codecString(startOfCodecString, startOfSlash1 - startOfCodecString); 13161aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd String8 widthString(startOfWidthString, startOfSlash2 - startOfWidthString); 13171aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd String8 heightString(startOfHeightString); 13181aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd 131939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if 0 132039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mRTPPusher = new UDPPusher("/data/misc/rtpout.bin", 5434); 132139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mLooper->registerHandler(mRTPPusher); 132239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 132339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mRTCPPusher = new UDPPusher("/data/misc/rtcpout.bin", 5435); 132439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mLooper->registerHandler(mRTCPPusher); 132539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif 132639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 132739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mRTPSession = new ARTPSession; 132839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mLooper->registerHandler(mRTPSession); 132939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 133039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if 0 133139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber // My AMR SDP 133239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber static const char *raw = 133339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "v=0\r\n" 133439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "o=- 64 233572944 IN IP4 127.0.0.0\r\n" 133539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "s=QuickTime\r\n" 133639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "t=0 0\r\n" 133739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "a=range:npt=0-315\r\n" 133839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "a=isma-compliance:2,2.0,2\r\n" 133939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "m=audio 5434 RTP/AVP 97\r\n" 134039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "c=IN IP4 127.0.0.1\r\n" 134139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "b=AS:30\r\n" 134239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "a=rtpmap:97 AMR/8000/1\r\n" 134339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "a=fmtp:97 octet-align\r\n"; 134439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#elif 1 13451aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd String8 sdp; 13461aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd sdp.appendFormat( 134739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "v=0\r\n" 134839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "o=- 64 233572944 IN IP4 127.0.0.0\r\n" 134939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "s=QuickTime\r\n" 135039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "t=0 0\r\n" 135139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "a=range:npt=0-315\r\n" 135239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "a=isma-compliance:2,2.0,2\r\n" 135339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "m=video 5434 RTP/AVP 97\r\n" 135439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "c=IN IP4 127.0.0.1\r\n" 135539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber "b=AS:30\r\n" 13561aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd "a=rtpmap:97 %s/90000\r\n" 13571aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd "a=cliprect:0,0,%s,%s\r\n" 13581aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd "a=framesize:97 %s-%s\r\n", 13591aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd 13601aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd codecString.string(), 13611aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd heightString.string(), widthString.string(), 13621aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd widthString.string(), heightString.string() 13631aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd ); 13641aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd const char *raw = sdp.string(); 13651aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd 136639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif 136739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 136839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber sp<ASessionDescription> desc = new ASessionDescription; 136939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK(desc->setTo(raw, strlen(raw))); 137039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 137139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK_EQ(mRTPSession->setup(desc), (status_t)OK); 137239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 137339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (mRTPPusher != NULL) { 137439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mRTPPusher->start(); 137539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 137639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 137739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (mRTCPPusher != NULL) { 137839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mRTCPPusher->start(); 137939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 138039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 138139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK_EQ(mRTPSession->countTracks(), 1u); 138239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber sp<MediaSource> source = mRTPSession->trackAt(0); 138339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 138439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if 0 138539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber bool eos; 138639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber while (((APacketSource *)source.get()) 138739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber ->getQueuedDuration(&eos) < 5000000ll && !eos) { 138839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber usleep(100000ll); 138939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 139039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif 139139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 139239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber const char *mime; 139339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK(source->getFormat()->findCString(kKeyMIMEType, &mime)); 139439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 139539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (!strncasecmp("video/", mime, 6)) { 139639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber setVideoSource(source); 139739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } else { 139839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK(!strncasecmp("audio/", mime, 6)); 139939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber setAudioSource(source); 140039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 140139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 140239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mExtractorFlags = MediaExtractor::CAN_PAUSE; 140339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 140439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return OK; 1405cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } else if (!strncasecmp("rtsp://", mUri.string(), 7)) { 1406cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (mLooper == NULL) { 1407cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mLooper = new ALooper; 1408a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber mLooper->setName("rtsp"); 1409cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mLooper->start(); 1410cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 1411cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTSPController = new ARTSPController(mLooper); 1412cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber status_t err = mRTSPController->connect(mUri.string()); 1413cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1414cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber LOGI("ARTSPController::connect returned %d", err); 1415cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1416cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (err != OK) { 1417cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTSPController.clear(); 1418cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber return err; 1419cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 1420e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 1421cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber sp<MediaExtractor> extractor = mRTSPController.get(); 1422e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber return setDataSource_l(extractor); 1423e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } else { 1424e94bd14078d327ef2f800e69907efce641a13272Andreas Huber dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders); 1425e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1426bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1427bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (dataSource == NULL) { 1428bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1429bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1430bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1431bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 1432bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1433bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (extractor == NULL) { 1434bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1435bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1436bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1437bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return setDataSource_l(extractor); 1438bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 1439bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 144088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::abortPrepare(status_t err) { 144188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(err != OK); 144288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 144388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mIsAsyncPrepare) { 144488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 144588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber } 144688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 144788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPrepareResult = err; 1448e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mFlags &= ~(PREPARING|PREPARE_CANCELLED); 144988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAsyncPrepareEvent = NULL; 145088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPreparedCondition.broadcast(); 145188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 145288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 1453e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber// static 1454e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huberbool AwesomePlayer::ContinuePreparation(void *cookie) { 1455e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber AwesomePlayer *me = static_cast<AwesomePlayer *>(cookie); 1456e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 1457e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber return (me->mFlags & PREPARE_CANCELLED) == 0; 1458e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber} 1459e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 1460c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onPrepareAsyncEvent() { 14618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber Mutex::Autolock autoLock(mLock); 1462bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 14638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & PREPARE_CANCELLED) { 14648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("prepare was cancelled before doing anything"); 14658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(UNKNOWN_ERROR); 14668650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 14678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 1468e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 14698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mUri.size() > 0) { 14708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = finishSetDataSource_l(); 1471bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 14728650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 14738650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 14748650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 1475bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 14768650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 1477bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 14788650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mVideoTrack != NULL && mVideoSource == NULL) { 14798650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initVideoDecoder(); 14801322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 14818650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 14828650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 14838650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 14841322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 14858650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 14861322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 14878650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mAudioTrack != NULL && mAudioSource == NULL) { 14888650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initAudioDecoder(); 14891322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 14908650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 14918650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 14928650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 14931322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 1494c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1495c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 14968650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mCachedSource != NULL || mRTSPController != NULL) { 14978650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber postBufferingEvent_l(); 14988650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 14998650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 15008650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 15018650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 1502c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 15038650e1960905097f6f1d6aa462ccb1c93c656834Andreas Hubervoid AwesomePlayer::finishAsyncPrepare_l() { 1504bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mIsAsyncPrepare) { 1505bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mVideoWidth < 0 || mVideoHeight < 0) { 1506bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0); 1507bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } else { 1508bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_SET_VIDEO_SIZE, mVideoWidth, mVideoHeight); 1509bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1510c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1511bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_PREPARED); 1512bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1513c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1514bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPrepareResult = OK; 1515e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mFlags &= ~(PREPARING|PREPARE_CANCELLED); 1516bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags |= PREPARED; 1517c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = NULL; 1518bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.broadcast(); 1519c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1520c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 15217b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::suspend() { 1522e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGV("suspend"); 15237b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber Mutex::Autolock autoLock(mLock); 15247b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 15257b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber if (mSuspensionState != NULL) { 15265c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang if (mLastVideoBuffer == NULL) { 15275c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang //go into here if video is suspended again 15285c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang //after resuming without being played between 15295c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang //them 15305c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang SuspensionState *state = mSuspensionState; 15315c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang mSuspensionState = NULL; 15325c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang reset_l(); 15335c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang mSuspensionState = state; 15345c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang return OK; 15355c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang } 15365c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang 15375c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang delete mSuspensionState; 15385c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang mSuspensionState = NULL; 15397b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 15407b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 1541e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mFlags & PREPARING) { 1542e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mFlags |= PREPARE_CANCELLED; 1543e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mConnectingDataSource != NULL) { 1544e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGI("interrupting the connection process"); 1545e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource->disconnect(); 1546e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1547e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1548e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 15497b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber while (mFlags & PREPARING) { 15507b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mPreparedCondition.wait(mLock); 15517b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 15527b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 15537b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber SuspensionState *state = new SuspensionState; 15547b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber state->mUri = mUri; 15557b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber state->mUriHeaders = mUriHeaders; 15567b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber state->mFileSource = mFileSource; 15577b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 15588ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber state->mFlags = mFlags & (PLAYING | AUTO_LOOPING | LOOPING | AT_EOS); 15592415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber getPosition(&state->mPositionUs); 15607b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 1561fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber if (mLastVideoBuffer) { 1562fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber size_t size = mLastVideoBuffer->range_length(); 1563fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber if (size) { 1564fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber state->mLastVideoFrameSize = size; 1565fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber state->mLastVideoFrame = malloc(size); 1566fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber memcpy(state->mLastVideoFrame, 1567fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber (const uint8_t *)mLastVideoBuffer->data() 1568fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber + mLastVideoBuffer->range_offset(), 1569fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber size); 1570fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 1571fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber state->mVideoWidth = mVideoWidth; 1572fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber state->mVideoHeight = mVideoHeight; 1573fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 1574fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 1575fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber CHECK(meta->findInt32(kKeyColorFormat, &state->mColorFormat)); 1576fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber CHECK(meta->findInt32(kKeyWidth, &state->mDecodedWidth)); 1577fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber CHECK(meta->findInt32(kKeyHeight, &state->mDecodedHeight)); 1578fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber } 1579fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber } 1580fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 15817b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber reset_l(); 15827b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 15837b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mSuspensionState = state; 15847b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 15857b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return OK; 15867b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 15877b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 15887b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::resume() { 1589e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGV("resume"); 15907b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber Mutex::Autolock autoLock(mLock); 15917b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 15927b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber if (mSuspensionState == NULL) { 15937b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return INVALID_OPERATION; 15947b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 15957b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 15967b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber SuspensionState *state = mSuspensionState; 15977b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mSuspensionState = NULL; 15987b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 15997b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber status_t err; 16007b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber if (state->mFileSource != NULL) { 16017b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber err = setDataSource_l(state->mFileSource); 16027b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 16037b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber if (err == OK) { 16047b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource = state->mFileSource; 16057b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 16067b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } else { 16077b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber err = setDataSource_l(state->mUri, &state->mUriHeaders); 16087b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 16097b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 16107b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber if (err != OK) { 16117b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber delete state; 16127b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber state = NULL; 16137b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 16147b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return err; 16157b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 16167b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 16177b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber seekTo_l(state->mPositionUs); 16187b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 16198ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber mFlags = state->mFlags & (AUTO_LOOPING | LOOPING | AT_EOS); 16207b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 1621fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber if (state->mLastVideoFrame && mISurface != NULL) { 1622fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRenderer = 1623fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber new AwesomeLocalRenderer( 1624fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber true, // previewOnly 1625fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber "", 1626fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber (OMX_COLOR_FORMATTYPE)state->mColorFormat, 1627fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mISurface, 1628fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber state->mVideoWidth, 1629fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber state->mVideoHeight, 1630fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber state->mDecodedWidth, 1631fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber state->mDecodedHeight); 1632fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 1633fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = true; 1634fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 1635fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber ((AwesomeLocalRenderer *)mVideoRenderer.get())->render( 1636fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber state->mLastVideoFrame, state->mLastVideoFrameSize); 1637fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber } 1638fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 16397b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber if (state->mFlags & PLAYING) { 16407b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber play_l(); 16417b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 16427b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 16435c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang mSuspensionState = state; 16447b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber state = NULL; 16457b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 16467b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return OK; 16477b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 16487b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 1649acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberuint32_t AwesomePlayer::flags() const { 1650acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return mExtractorFlags; 1651acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber} 1652acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 1653ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioEOS() { 1654ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber postCheckAudioStatusEvent_l(); 1655ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 1656ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 1657ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioSeekComplete() { 1658ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber postCheckAudioStatusEvent_l(); 1659ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 1660ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 1661bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} // namespace android 1662bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1663