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