MediaPlayer_to_android.cpp revision e7bfcdc183454ec959ff51342f0973cabba219b2
115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek/* 215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * Copyright (C) 2010 The Android Open Source Project 315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * 415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * Licensed under the Apache License, Version 2.0 (the "License"); 515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * you may not use this file except in compliance with the License. 615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * You may obtain a copy of the License at 715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * 815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * http://www.apache.org/licenses/LICENSE-2.0 915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * 1015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * Unless required by applicable law or agreed to in writing, software 1115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * distributed under the License is distributed on an "AS IS" BASIS, 1215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * See the License for the specific language governing permissions and 1415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * limitations under the License. 1515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek */ 1615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 1715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek#include "sles_allinclusive.h" 1815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek#include "utils/RefBase.h" 1915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek#include "android_prompts.h" 2015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 2115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 2215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek//----------------------------------------------------------------------------- 2315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekstatic void player_handleMediaPlayerEventNotifications(const int event, const int data1, void* user) 2415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek{ 25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (NULL == user) { 2615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek return; 2715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek } 2815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 2915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek CMediaPlayer* mp = (CMediaPlayer*) user; 3015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek //SL_LOGV("received event %d, data %d from AVPlayer", event, data1); 3115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 3215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek switch(event) { 3315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 3415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek case android::GenericPlayer::kEventPrepared: { 3515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if (PLAYER_SUCCESS == data1) { 3615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek object_lock_exclusive(&mp->mObject); 3715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek SL_LOGV("Received AVPlayer::kEventPrepared from AVPlayer for CMediaPlayer %p", mp); 3815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mAndroidObjState = ANDROID_READY; 3915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek object_unlock_exclusive(&mp->mObject); 4015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek } 419a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg } 429a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg break; 4315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 4415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek default: 459a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg SL_LOGE("Received unknown event %d, data %d from AVPlayer", event, data1); 469a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg break; 4715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek } 4815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek} 4915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 5015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 5115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek//----------------------------------------------------------------------------- 5215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel KlimekXAresult android_Player_checkSourceSink(CMediaPlayer *mp) { 5315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 5415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek XAresult result = XA_RESULT_SUCCESS; 5515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 5615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek const SLDataSource *pSrc = &mp->mDataSource.u.mSource; 5715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink; 5815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 5915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek // format check: 6015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek const SLuint32 sourceLocatorType = *(SLuint32 *)pSrc->pLocator; 6115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek const SLuint32 sourceFormatType = *(SLuint32 *)pSrc->pFormat; 6215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek const SLuint32 audioSinkLocatorType = *(SLuint32 *)pAudioSnk->pLocator; 6315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek //const SLuint32 sinkFormatType = *(SLuint32 *)pAudioSnk->pFormat; 6415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 6515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek // Source check 6615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek switch(sourceLocatorType) { 6715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 6815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek case XA_DATALOCATOR_ANDROIDBUFFERQUEUE: { 6915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek switch (sourceFormatType) { 7015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek case XA_DATAFORMAT_MIME: { 7115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek SLDataFormat_MIME *df_mime = (SLDataFormat_MIME *) pSrc->pFormat; 7215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if (SL_CONTAINERTYPE_MPEG_TS != df_mime->containerType) { 7315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek SL_LOGE("Cannot create player with XA_DATALOCATOR_ANDROIDBUFFERQUEUE data source " 7415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek "that is not fed MPEG-2 TS data"); 7515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek return SL_RESULT_CONTENT_UNSUPPORTED; 7615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek } 7715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek } break; 7815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek default: 7915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek SL_LOGE("Cannot create player with XA_DATALOCATOR_ANDROIDBUFFERQUEUE data source " 8015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek "without SL_DATAFORMAT_MIME format"); 8115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek return XA_RESULT_CONTENT_UNSUPPORTED; 8215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek } 8315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek } break; 8415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 8515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek case XA_DATALOCATOR_URI: // intended fall-through 8615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek case XA_DATALOCATOR_ANDROIDFD: 8715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek break; 8815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 8915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek default: 9015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek SL_LOGE("Cannot create media player with data locator type 0x%x", 9115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek (unsigned) sourceLocatorType); 9215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek return SL_RESULT_PARAMETER_INVALID; 9315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek }// switch (locatorType) 9415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 9515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek // Audio sink check: only playback is supported here 9615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek switch(audioSinkLocatorType) { 9715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 9815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek case XA_DATALOCATOR_OUTPUTMIX: 9915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek break; 10015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 10115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek default: 10215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek SL_LOGE("Cannot create media player with audio sink data locator of type 0x%x", 10315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek (unsigned) audioSinkLocatorType); 10415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek return XA_RESULT_PARAMETER_INVALID; 10515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek }// switch (locaaudioSinkLocatorTypeorType) 10615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 10715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek return result; 10815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek} 10915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 11015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 11115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek//----------------------------------------------------------------------------- 11215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel KlimekXAresult android_Player_create(CMediaPlayer *mp) { 11315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 11415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek XAresult result = XA_RESULT_SUCCESS; 11515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 11615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek // FIXME verify data source 11715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource; 11815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek // FIXME verify audio data sink 11915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink; 12015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek // FIXME verify image data sink 12115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek const SLDataSink *pVideoSnk = &mp->mImageVideoSink.u.mSink; 12215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 12315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek XAuint32 sourceLocator = *(XAuint32 *)pDataSrc->pLocator; 12415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek switch(sourceLocator) { 12515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek // FIXME support Android simple buffer queue as well 12615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek case XA_DATALOCATOR_ANDROIDBUFFERQUEUE: 12715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mAndroidObjType = AV_PLR_TS_ABQ; 12815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek break; 12915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek case XA_DATALOCATOR_URI: // intended fall-through 13015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek case SL_DATALOCATOR_ANDROIDFD: 13115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mAndroidObjType = AV_PLR_URIFD; 132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case XA_DATALOCATOR_ADDRESS: // intended fall-through 134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines default: 13515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek SL_LOGE("Unable to create MediaPlayer for data source locator 0x%lx", sourceLocator); 13615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek result = XA_RESULT_PARAMETER_INVALID; 137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 13815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek } 13915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 14015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mAndroidObjState = ANDROID_UNINITIALIZED; 14115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE; 14215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mSessionId = android::AudioSystem::newAudioSessionId(); 14315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 14415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mAndroidAudioLevels.mAmplFromVolLevel = 1.0f; 14515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mAndroidAudioLevels.mAmplFromStereoPos[0] = 1.0f; 14615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mAndroidAudioLevels.mAmplFromStereoPos[1] = 1.0f; 14715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mAndroidAudioLevels.mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value 14815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mAndroidAudioLevels.mAuxSendLevel = 0; 14915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mDirectLevel = 0; // no attenuation 15015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 15115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek return result; 15215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek} 15315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 15415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 15515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek//----------------------------------------------------------------------------- 15622d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 15722d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel KlimekXAresult android_Player_realize(CMediaPlayer *mp, SLboolean async) { 15822d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek SL_LOGI("android_Player_realize_l(%p)", mp); 15922d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek XAresult result = XA_RESULT_SUCCESS; 16022d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek 16122d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource; 16222d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek const SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator; 16322d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek 16422d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek AudioPlayback_Parameters ap_params; 16522d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek ap_params.sessionId = mp->mSessionId; 16615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek ap_params.streamType = mp->mStreamType; 16715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek ap_params.trackcb = NULL; 16815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek ap_params.trackcbUser = NULL; 16915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 17015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek switch(mp->mAndroidObjType) { 17115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek case AV_PLR_TS_ABQ: { 17215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mAVPlayer = new android::StreamPlayer(&ap_params, true /*hasVideo*/); 17315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp); 17415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek } 17515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek break; 17615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek case AV_PLR_URIFD: { 17715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mAVPlayer = new android::LocAVPlayer(&ap_params, true /*hasVideo*/); 17815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp); 17915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek switch (mp->mDataSource.mLocator.mLocatorType) { 18015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek case XA_DATALOCATOR_URI: 18115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource( 18215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek (const char*)mp->mDataSource.mLocator.mURI.URI); 18315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek break; 18415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek case XA_DATALOCATOR_ANDROIDFD: { 18515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek int64_t offset = (int64_t)mp->mDataSource.mLocator.mFD.offset; 18615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource( 18715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek (int)mp->mDataSource.mLocator.mFD.fd, 18815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ? 18915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset, 19015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek (int64_t)mp->mDataSource.mLocator.mFD.length); 19115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek } 19215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek break; 19315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek default: 19415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek SL_LOGE("Invalid or unsupported data locator type %lu for data source", 19515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mDataSource.mLocator.mLocatorType); 19615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek result = XA_RESULT_PARAMETER_INVALID; 19715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek } 19815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek } 19915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek break; 20015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek case INVALID_TYPE: // intended fall-through 20115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek default: 20215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek SL_LOGE("Unable to realize MediaPlayer, invalid internal Android object type"); 20315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek result = XA_RESULT_PARAMETER_INVALID; 20415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek break; 20515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek } 20615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 20715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek return result; 20815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek} 20915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 21015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek//----------------------------------------------------------------------------- 21115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel KlimekXAresult android_Player_destroy(CMediaPlayer *mp) { 21215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek SL_LOGI("android_Player_destroy(%p)", mp); 21315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek XAresult result = XA_RESULT_SUCCESS; 21415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 21515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if (mp->mAVPlayer != 0) { 21615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek mp->mAVPlayer.clear(); 21715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek } 21815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 21915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek return result; 22015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek} 22115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 22215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek//----------------------------------------------------------------------------- 22315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek/** 22415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * pre-conditions: avp != NULL, surface != NULL 225 */ 226XAresult android_Player_setVideoSurface(android::GenericMediaPlayer *avp, 227 const android::sp<android::Surface> &surface) { 228 XAresult result = XA_RESULT_SUCCESS; 229 230 avp->setVideoSurface(surface); 231 232 return result; 233} 234 235 236/** 237 * pre-conditions: avp != NULL, surfaceTexture != NULL 238 */ 239XAresult android_Player_setVideoSurfaceTexture(android::GenericMediaPlayer *avp, 240 const android::sp<android::ISurfaceTexture> &surfaceTexture) { 241 XAresult result = XA_RESULT_SUCCESS; 242 243 avp->setVideoSurfaceTexture(surfaceTexture); 244 245 return result; 246} 247 248 249XAresult android_Player_getDuration(IPlay *pPlayItf, XAmillisecond *pDurMsec) { 250 XAresult result = XA_RESULT_SUCCESS; 251 CMediaPlayer *avp = (CMediaPlayer *)pPlayItf->mThis; 252 253 switch (avp->mAndroidObjType) { 254 255 case AV_PLR_TS_ABQ: // intended fall-through 256 case AV_PLR_URIFD: { 257 // FIXME implement for a MediaPlayer playing on URI or FD (on LocAVPlayer, returns -1) 258 int dur = -1; 259 if (avp->mAVPlayer != 0) { 260 avp->mAVPlayer->getDurationMsec(&dur); 261 } 262 if (dur < 0) { 263 *pDurMsec = SL_TIME_UNKNOWN; 264 } else { 265 *pDurMsec = (XAmillisecond)dur; 266 } 267 } break; 268 269 default: 270 *pDurMsec = XA_TIME_UNKNOWN; 271 break; 272 } 273 274 return result; 275} 276 277//----------------------------------------------------------------------------- 278/** 279 * pre-condition: avp != NULL 280 */ 281XAresult android_Player_setPlayState(android::GenericPlayer *avp, SLuint32 playState, 282 AndroidObject_state* pObjState) 283{ 284 XAresult result = XA_RESULT_SUCCESS; 285 AndroidObject_state objState = *pObjState; 286 287 switch (playState) { 288 case SL_PLAYSTATE_STOPPED: { 289 SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED"); 290 avp->stop(); 291 } 292 break; 293 case SL_PLAYSTATE_PAUSED: { 294 SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED"); 295 switch(objState) { 296 case ANDROID_UNINITIALIZED: 297 *pObjState = ANDROID_PREPARING; 298 avp->prepare(); 299 break; 300 case ANDROID_PREPARING: 301 break; 302 case ANDROID_READY: 303 avp->pause(); 304 break; 305 default: 306 SL_LOGE("Android object in invalid state"); 307 break; 308 } 309 } 310 break; 311 case SL_PLAYSTATE_PLAYING: { 312 SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING"); 313 switch(objState) { 314 case ANDROID_UNINITIALIZED: 315 *pObjState = ANDROID_PREPARING; 316 avp->prepare(); 317 // intended fall through 318 case ANDROID_PREPARING: 319 // intended fall through 320 case ANDROID_READY: 321 avp->play(); 322 break; 323 default: 324 SL_LOGE("Android object in invalid state"); 325 break; 326 } 327 } 328 break; 329 default: 330 // checked by caller, should not happen 331 break; 332 } 333 334 return result; 335} 336 337 338//----------------------------------------------------------------------------- 339void android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) { 340 if ((mp->mAndroidObjType == AV_PLR_TS_ABQ) && (mp->mAVPlayer != 0)) { 341 SL_LOGI("android_Player_androidBufferQueue_registerCallback_l"); 342 android::StreamPlayer* splr = static_cast<android::StreamPlayer*>(mp->mAVPlayer.get()); 343 splr->registerQueueCallback( 344 (const void*)mp, false /*userIsAudioPlayer*/, 345 mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf)); 346 347 } 348} 349 350 351void android_Player_androidBufferQueue_clear_l(CMediaPlayer *mp) { 352 if ((mp->mAndroidObjType == AV_PLR_TS_ABQ) && (mp->mAVPlayer != 0)) { 353 android::StreamPlayer* splr = static_cast<android::StreamPlayer*>(mp->mAVPlayer.get()); 354 splr->appClear_l(); 355 } 356} 357 358 359void android_Player_androidBufferQueue_onRefilled_l(CMediaPlayer *mp) { 360 if ((mp->mAndroidObjType == AV_PLR_TS_ABQ) && (mp->mAVPlayer != 0)) { 361 android::StreamPlayer* splr = static_cast<android::StreamPlayer*>(mp->mAVPlayer.get()); 362 splr->queueRefilled_l(); 363 } 364} 365 366 367 368