NuPlayerDriver.cpp revision 1173118eace0e9e347cb007f0da817cee87579ed
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 171d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyen//#define LOG_NDEBUG 0 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "NuPlayerDriver" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 2036a561b4ee35911fd6594c1592aab134be22f0f7Svetoslav Ganov 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "NuPlayerDriver.h" 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "NuPlayer.h" 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/stagefright/foundation/ADebug.h> 261d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyen#include <media/stagefright/foundation/ALooper.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectNuPlayerDriver::NuPlayerDriver() 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mResetInProgress(false), 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDurationUs(-1), 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPositionUs(-1), 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLooper(new ALooper), 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState(UNINITIALIZED), 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartupSeekTimeUs(-1) { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLooper->setName("NuPlayerDriver Looper"); 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLooper->start( 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, /* runOnCallingThread */ 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true, /* canCallJava */ 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PRIORITY_AUDIO); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlayer = new NuPlayer; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLooper->registerHandler(mPlayer); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlayer->setDriver(this); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectNuPlayerDriver::~NuPlayerDriver() { 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLooper->stop(); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t NuPlayerDriver::initCheck() { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return OK; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t NuPlayerDriver::setDataSource( 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *url, const KeyedVector<String8, String8> *headers) { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_EQ((int)mState, (int)UNINITIALIZED); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlayer->setDataSource(url, headers); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = STOPPED; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return OK; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) { 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return INVALID_OPERATION; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_EQ((int)mState, (int)UNINITIALIZED); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlayer->setDataSource(source); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = STOPPED; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return OK; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t NuPlayerDriver::setVideoSurface(const sp<Surface> &surface) { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlayer->setVideoSurface(surface); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return OK; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t NuPlayerDriver::setVideoSurfaceTexture( 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<ISurfaceTexture> &surfaceTexture) { 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlayer->setVideoSurfaceTexture(surfaceTexture); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return OK; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t NuPlayerDriver::prepare() { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return OK; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t NuPlayerDriver::prepareAsync() { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendEvent(MEDIA_PREPARED); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return OK; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t NuPlayerDriver::start() { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (mState) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case UNINITIALIZED: 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return INVALID_OPERATION; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STOPPED: 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlayer->start(); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11436a561b4ee35911fd6594c1592aab134be22f0f7Svetoslav Ganov if (mStartupSeekTimeUs >= 0) { 11536a561b4ee35911fd6594c1592aab134be22f0f7Svetoslav Ganov mPlayer->seekToAsync(mStartupSeekTimeUs); 11636a561b4ee35911fd6594c1592aab134be22f0f7Svetoslav Ganov mStartupSeekTimeUs = -1; 11736a561b4ee35911fd6594c1592aab134be22f0f7Svetoslav Ganov } 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PLAYING: 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return OK; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_EQ((int)mState, (int)PAUSED); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 126980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy mPlayer->resume(); 127980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy break; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = PLAYING; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return OK; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t NuPlayerDriver::stop() { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pause(); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t NuPlayerDriver::pause() { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (mState) { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case UNINITIALIZED: 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return INVALID_OPERATION; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STOPPED: 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return OK; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PLAYING: 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlayer->pause(); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_EQ((int)mState, (int)PAUSED); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return OK; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = PAUSED; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return OK; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool NuPlayerDriver::isPlaying() { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == PLAYING; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t NuPlayerDriver::seekTo(int msec) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_t seekTimeUs = msec * 1000ll; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (mState) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case UNINITIALIZED: 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return INVALID_OPERATION; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STOPPED: 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartupSeekTimeUs = seekTimeUs; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 175 } 176 case PLAYING: 177 case PAUSED: 178 { 179 mPlayer->seekToAsync(seekTimeUs); 180 break; 181 } 182 183 default: 184 TRESPASS(); 185 break; 186 } 187 188 return OK; 189} 190 191status_t NuPlayerDriver::getCurrentPosition(int *msec) { 192 Mutex::Autolock autoLock(mLock); 193 194 if (mPositionUs < 0) { 195 *msec = 0; 196 } else { 197 *msec = (mPositionUs + 500ll) / 1000; 198 } 199 200 return OK; 201} 202 203status_t NuPlayerDriver::getDuration(int *msec) { 204 Mutex::Autolock autoLock(mLock); 205 206 if (mDurationUs < 0) { 207 *msec = 0; 208 } else { 209 *msec = (mDurationUs + 500ll) / 1000; 210 } 211 212 return OK; 213} 214 215status_t NuPlayerDriver::reset() { 216 Mutex::Autolock autoLock(mLock); 217 mResetInProgress = true; 218 219 mPlayer->resetAsync(); 220 221 while (mResetInProgress) { 222 mCondition.wait(mLock); 223 } 224 225 mDurationUs = -1; 226 mPositionUs = -1; 227 mState = UNINITIALIZED; 228 mStartupSeekTimeUs = -1; 229 230 return OK; 231} 232 233status_t NuPlayerDriver::setLooping(int loop) { 234 return INVALID_OPERATION; 235} 236 237player_type NuPlayerDriver::playerType() { 238 return NU_PLAYER; 239} 240 241status_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) { 242 return INVALID_OPERATION; 243} 244 245void NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) { 246 mPlayer->setAudioSink(audioSink); 247} 248 249status_t NuPlayerDriver::getMetadata( 250 const media::Metadata::Filter& ids, Parcel *records) { 251 return INVALID_OPERATION; 252} 253 254void NuPlayerDriver::notifyResetComplete() { 255 Mutex::Autolock autoLock(mLock); 256 CHECK(mResetInProgress); 257 mResetInProgress = false; 258 mCondition.broadcast(); 259} 260 261void NuPlayerDriver::notifyDuration(int64_t durationUs) { 262 Mutex::Autolock autoLock(mLock); 263 mDurationUs = durationUs; 264} 265 266void NuPlayerDriver::notifyPosition(int64_t positionUs) { 267 Mutex::Autolock autoLock(mLock); 268 mPositionUs = positionUs; 269} 270 271void NuPlayerDriver::notifySeekComplete() { 272 sendEvent(MEDIA_SEEK_COMPLETE); 273} 274 275} // namespace android 276