android_LocAVPlayer.cpp revision 97876858aa17c7f24c6a1d60be09a57bc1824ba3
197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi/* 297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project 397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * 497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * you may not use this file except in compliance with the License. 697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * You may obtain a copy of the License at 797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * 897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * 1097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 1197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 1297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * See the License for the specific language governing permissions and 1497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * limitations under the License. 1597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi */ 1697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 1797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//#define USE_LOG SLAndroidLogLevel_Verbose 1897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 1997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi#include "sles_allinclusive.h" 2097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi#undef this // FIXME shouldn't have to do this, no pun intended 2197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi#include <media/IMediaPlayerService.h> 2297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 2397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 2497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivinamespace android { 2597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 2697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 2797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel TriviLocAVPlayer::LocAVPlayer(AudioPlayback_Parameters* params) : AVPlayer(params), 2897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mDataLocatorType(kDataLocatorNone) 2997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi{ 3097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi SL_LOGI("LocAVPlayer::LocAVPlayer()"); 3197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 3297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} 3397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 3497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 3597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel TriviLocAVPlayer::~LocAVPlayer() { 3697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi SL_LOGI("LocAVPlayer::~LocAVPlayer()"); 3797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 3897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi resetDataLocator(); 3997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} 4097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 4197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 4297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//-------------------------------------------------- 4397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi// Event handlers 4497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivivoid LocAVPlayer::onPrepare() { 4597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi SL_LOGI("LocAVPlayer::onPrepare()"); 4697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi Mutex::Autolock _l(mLock); 4797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi switch (mDataLocatorType) { 4897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi case kDataLocatorUri: 4997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mPlayer = mMediaPlayerService->create(getpid(), mPlayerClient /*IMediaPlayerClient*/, 5097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mDataLocator.uri /*url*/, NULL /*headers*/, mPlaybackParams.sessionId); 5197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi break; 5297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi case kDataLocatorFd: 5397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mPlayer = mMediaPlayerService->create(getpid(), mPlayerClient /*IMediaPlayerClient*/, 5497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mDataLocator.fdi.fd, mDataLocator.fdi.offset, mDataLocator.fdi.length, 5597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mPlaybackParams.sessionId); 5697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi break; 5797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi case kDataLocatorNone: 5897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi SL_LOGE("no data locator for MediaPlayer object"); 5997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi break; 6097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi default: 6197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi SL_LOGE("unsupported data locator %d for MediaPlayer object", mDataLocatorType); 6297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi break; 6397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi } 6497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi // blocks until mPlayer is prepared 6597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi AVPlayer::onPrepare(); 6697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi SL_LOGI("LocAVPlayer::onPrepare() done"); 6797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} 6897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 6997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 7097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//-------------------------------------------------- 7197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi/* 7297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * post-condition: mDataLocatorType == kDataLocatorNone 7397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * 7497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi */ 7597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivivoid LocAVPlayer::resetDataLocator() { 7697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi if (kDataLocatorUri == mDataLocatorType) { 7797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi if (NULL != mDataLocator.uri) { 7897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi free(mDataLocator.uri); 7997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mDataLocator.uri = NULL; 8097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi } 8197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi } 8297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mDataLocatorType = kDataLocatorNone; 8397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} 8497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 8597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 8697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivivoid LocAVPlayer::setDataSource(const char *uri) { 8797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi resetDataLocator(); 8897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 8997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi // FIXME: a copy of the URI has already been made and is guaranteed to exist 9097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi // as long as the SLES/OMXAL object exists, so the copy here is not necessary 9197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi size_t len = strlen((const char *) uri); 9297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi char* newUri = (char*) malloc(len + 1); 9397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi if (NULL == newUri) { 9497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi // mem issue 9597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi SL_LOGE("LocAVPlayer::setDataSource: not enough memory to allocator URI string"); 9697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi return; 9797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi } 9897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi memcpy(newUri, uri, len + 1); 9997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mDataLocator.uri = newUri; 10097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 10197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mDataLocatorType = kDataLocatorUri; 10297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} 10397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 10497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 10597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivivoid LocAVPlayer::setDataSource(const int fd, const int64_t offset, const int64_t length) { 10697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi resetDataLocator(); 10797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 10897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mDataLocator.fdi.fd = fd; 10997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 11097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi struct stat sb; 11197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi int ret = fstat(fd, &sb); 11297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi if (ret != 0) { 11397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi SL_LOGE("LocAVPlayer::setDataSource: fstat(%d) failed: %d, %s", fd, ret, strerror(errno)); 11497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi return; 11597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi } 11697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 11797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi if (offset >= sb.st_size) { 11897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi SL_LOGE("SfPlayer::setDataSource: invalid offset"); 11997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi return; 12097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi } 12197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mDataLocator.fdi.offset = offset; 12297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 12397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi if (PLAYER_FD_FIND_FILE_SIZE == length) { 12497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mDataLocator.fdi.length = sb.st_size; 12597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi } else if (offset + length > sb.st_size) { 12697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mDataLocator.fdi.length = sb.st_size - offset; 12797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi } else { 12897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mDataLocator.fdi.length = length; 12997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi } 13097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 13197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi mDataLocatorType = kDataLocatorFd; 13297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} 13397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 13497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} // namespace android 135