MediaPlayer_to_android.cpp revision f731cc1f3cd5911b0aff730bd504ee47a3ba3c6c
143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/* 243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Copyright (C) 2010 The Android Open Source Project 343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Licensed under the Apache License, Version 2.0 (the "License"); 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * you may not use this file except in compliance with the License. 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * You may obtain a copy of the License at 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * http://www.apache.org/licenses/LICENSE-2.0 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Unless required by applicable law or agreed to in writing, software 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * distributed under the License is distributed on an "AS IS" BASIS, 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * See the License for the specific language governing permissions and 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * limitations under the License. 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "sles_allinclusive.h" 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "utils/RefBase.h" 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "android_prompts.h" 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LocAVPlayer and StreamPlayer derive from GenericMediaPlayer, 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// so no need to #include "android_GenericMediaPlayer.h" 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "android_LocAVPlayer.h" 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "android_StreamPlayer.h" 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//----------------------------------------------------------------------------- 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic void player_handleMediaPlayerEventNotifications(int event, int data1, int data2, void* user) 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen{ 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (NULL == user) { 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return; 3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen CMediaPlayer* mp = (CMediaPlayer*) user; 3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGV("received event %d, data %d from AVPlayer", event, data1); 359258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch(event) { 3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case android::GenericPlayer::kEventPrepared: { 3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (PLAYER_SUCCESS == data1) { 4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen object_lock_exclusive(&mp->mObject); 4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGV("Received AVPlayer::kEventPrepared from AVPlayer for CMediaPlayer %p", mp); 4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen mp->mAndroidObjState = ANDROID_READY; 4371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org object_unlock_exclusive(&mp->mObject); 4471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case android::GenericPlayer::kEventHasVideoSize: { 4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGV("Received AVPlayer::kEventHasVideoSize (%d,%d) for CMediaPlayer %p", 50061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org data1, data2, mp); 51061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org 52c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org object_lock_exclusive(&mp->mObject); 5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // remove an existing video info entry (here we only have one video stream) 5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for(size_t i=0 ; i < mp->mStreamInfo.mStreamInfoTable.size() ; i++) { 5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (XA_DOMAINTYPE_VIDEO == mp->mStreamInfo.mStreamInfoTable.itemAt(i).domain) { 5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen mp->mStreamInfo.mStreamInfoTable.removeAt(i); 58061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org break; 59061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org } 60c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 61c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // update the stream information with a new video info entry 62c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org StreamInfo streamInfo; 63c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org streamInfo.domain = XA_DOMAINTYPE_VIDEO; 64061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org streamInfo.videoInfo.codecId = 0;// unknown, we don't have that info FIXME 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen streamInfo.videoInfo.width = (XAuint32)data1; 66061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org streamInfo.videoInfo.height = (XAuint32)data2; 6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen streamInfo.videoInfo.bitRate = 0;// unknown, we don't have that info FIXME 6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen streamInfo.videoInfo.duration = XA_TIME_UNKNOWN; 6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen StreamInfo &contInfo = mp->mStreamInfo.mStreamInfoTable.editItemAt(0); 7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen contInfo.containerInfo.numStreams = 1; 7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ssize_t index = mp->mStreamInfo.mStreamInfoTable.add(streamInfo); 7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen xaStreamEventChangeCallback callback = mp->mStreamInfo.mCallback; 74061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org void* callbackPContext = mp->mStreamInfo.mContext; 7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen object_unlock_exclusive(&mp->mObject); 7743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // enqueue notification (outside of lock) that the stream information has been updated 7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if ((NULL != callback) && (index >= 0)) { 8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef XA_SYNCHRONOUS_STREAMCBEVENT_PROPERTYCHANGE 8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*callback)(&mp->mStreamInfo.mItf, XA_STREAMCBEVENT_PROPERTYCHANGE /*eventId*/, 8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1 /*streamIndex, only one stream supported here, 0 is reserved*/, 8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen NULL /*pEventData, always NULL in OpenMAX AL 1.0.1*/, 8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen callbackPContext /*pContext*/); 85061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org#else 86061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org SLresult res = EnqueueAsyncCallback_piipp(mp, callback, 87061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org /*p1*/ &mp->mStreamInfo.mItf, 88061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org /*i1*/ XA_STREAMCBEVENT_PROPERTYCHANGE /*eventId*/, 89061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org /*i2*/ 1 /*streamIndex, only one stream supported here, 0 is reserved*/, 90061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org /*p2*/ NULL /*pEventData, always NULL in OpenMAX AL 1.0.1*/, 91061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org /*p3*/ callbackPContext /*pContext*/); 92061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org#endif 93061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org } 94061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org break; 95061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org } 9643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case android::GenericPlayer::kEventEndOfStream: { 9843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGV("Received AVPlayer::kEventEndOfStream for CMediaPlayer %p", mp); 9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen object_lock_exclusive(&mp->mObject); 10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // should be xaPlayCallback but we're sharing the itf between SL and AL 102061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org slPlayCallback playCallback = NULL; 103061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org void * playContext = NULL; 104061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org // XAPlayItf callback or no callback? 10543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (mp->mPlay.mEventFlags & XA_PLAYEVENT_HEADATEND) { 106061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org playCallback = mp->mPlay.mCallback; 107061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org playContext = mp->mPlay.mContext; 108061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org } 109061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org object_unlock_exclusive(&mp->mObject); 11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // enqueue callback with no lock held 11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (NULL != playCallback) { 11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef XA_SYNCHRONOUS_PLAYEVENT_HEADATEND 11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (*playCallback)(&mp->mPlay.mItf, playContext, XA_PLAYEVENT_HEADATEND); 11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#else 11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SLresult res = EnqueueAsyncCallback_ppi(mp, playCallback, &mp->mPlay.mItf, playContext, 11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen XA_PLAYEVENT_HEADATEND); 118061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org LOGW_IF(SL_RESULT_SUCCESS != res, 11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "Callback %p(%p, %p, XA_PLAYEVENT_HEADATEND) dropped", playCallback, 12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen &mp->mPlay.mItf, playContext); 12168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org#endif 12268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } 12368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org break; 12468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } 12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 126eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org case android::GenericPlayer::kEventChannelCount: { 127eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org SL_LOGV("kEventChannelCount channels = %d", data1); 128061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org object_lock_exclusive(&mp->mObject); 129061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org if (UNKNOWN_NUMCHANNELS == mp->mNumChannels && UNKNOWN_NUMCHANNELS != data1) { 130061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org mp->mNumChannels = data1; 131c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org android_Player_volumeUpdate(mp); 132c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 133c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org object_unlock_exclusive(&mp->mObject); 134c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case android::GenericPlayer::kEventPrefetchFillLevelUpdate: { 13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGV("kEventPrefetchFillLevelUpdate"); 1397276f14ca716596e0a0d17539516370c1f453847kasper.lund } 1407276f14ca716596e0a0d17539516370c1f453847kasper.lund break; 1417276f14ca716596e0a0d17539516370c1f453847kasper.lund 1427276f14ca716596e0a0d17539516370c1f453847kasper.lund case android::GenericPlayer::kEventPrefetchStatusChange: { 1437276f14ca716596e0a0d17539516370c1f453847kasper.lund SL_LOGV("kEventPrefetchStatusChange"); 1447276f14ca716596e0a0d17539516370c1f453847kasper.lund } 1457276f14ca716596e0a0d17539516370c1f453847kasper.lund break; 1467276f14ca716596e0a0d17539516370c1f453847kasper.lund 14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1487276f14ca716596e0a0d17539516370c1f453847kasper.lund default: { 1497276f14ca716596e0a0d17539516370c1f453847kasper.lund SL_LOGE("Received unknown event %d, data %d from AVPlayer", event, data1); 1507276f14ca716596e0a0d17539516370c1f453847kasper.lund } 1517276f14ca716596e0a0d17539516370c1f453847kasper.lund } 15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//----------------------------------------------------------------------------- 15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenXAresult android_Player_checkSourceSink(CMediaPlayer *mp) { 15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen XAresult result = XA_RESULT_SUCCESS; 159236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 160236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org const SLDataSource *pSrc = &mp->mDataSource.u.mSource; 16143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink; 16243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 163245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org // format check: 16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const SLuint32 sourceLocatorType = *(SLuint32 *)pSrc->pLocator; 16543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const SLuint32 sourceFormatType = *(SLuint32 *)pSrc->pFormat; 16643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const SLuint32 audioSinkLocatorType = *(SLuint32 *)pAudioSnk->pLocator; 16743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen //const SLuint32 sinkFormatType = *(SLuint32 *)pAudioSnk->pFormat; 1684af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 1694af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Source check 1704af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org switch(sourceLocatorType) { 17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case XA_DATALOCATOR_ANDROIDBUFFERQUEUE: { 17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (sourceFormatType) { 17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case XA_DATAFORMAT_MIME: { 17543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SLDataFormat_MIME *df_mime = (SLDataFormat_MIME *) pSrc->pFormat; 176245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org if (SL_CONTAINERTYPE_MPEG_TS != df_mime->containerType) { 17743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGE("Cannot create player with XA_DATALOCATOR_ANDROIDBUFFERQUEUE data source " 1784af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org "that is not fed MPEG-2 TS data"); 1794af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org return SL_RESULT_CONTENT_UNSUPPORTED; 18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1814af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org } break; 18243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: 1834af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org SL_LOGE("Cannot create player with XA_DATALOCATOR_ANDROIDBUFFERQUEUE data source " 1844af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org "without SL_DATAFORMAT_MIME format"); 1854af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org return XA_RESULT_CONTENT_UNSUPPORTED; 1864af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org } 1874af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org } break; 1884af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 1894af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org case XA_DATALOCATOR_URI: // intended fall-through 1904af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org case XA_DATALOCATOR_ANDROIDFD: 191236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org break; 19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1934af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org default: 1944af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org SL_LOGE("Cannot create media player with data locator type 0x%x", 1954af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org (unsigned) sourceLocatorType); 1964af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org return SL_RESULT_PARAMETER_INVALID; 19743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }// switch (locatorType) 19843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Audio sink check: only playback is supported here 20043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch(audioSinkLocatorType) { 20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 20243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case XA_DATALOCATOR_OUTPUTMIX: 20343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 20443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: 20643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGE("Cannot create media player with audio sink data locator of type 0x%x", 207236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org (unsigned) audioSinkLocatorType); 20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return XA_RESULT_PARAMETER_INVALID; 209236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org }// switch (locaaudioSinkLocatorTypeorType) 21043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 213236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 21443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//----------------------------------------------------------------------------- 21643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenXAresult android_Player_create(CMediaPlayer *mp) { 21743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen XAresult result = XA_RESULT_SUCCESS; 21943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // FIXME verify data source 22143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource; 22243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // FIXME verify audio data sink 22343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink; 22443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // FIXME verify image data sink 22543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const SLDataSink *pVideoSnk = &mp->mImageVideoSink.u.mSink; 22643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen XAuint32 sourceLocator = *(XAuint32 *)pDataSrc->pLocator; 22843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch(sourceLocator) { 22943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // FIXME support Android simple buffer queue as well 23043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case XA_DATALOCATOR_ANDROIDBUFFERQUEUE: 231236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org mp->mAndroidObjType = AUDIOVIDEOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE; 23243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case XA_DATALOCATOR_URI: // intended fall-through 234236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org case SL_DATALOCATOR_ANDROIDFD: 23543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen mp->mAndroidObjType = AUDIOVIDEOPLAYER_FROM_URIFD; 23643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 23743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case XA_DATALOCATOR_ADDRESS: // intended fall-through 238236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org default: 23943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGE("Unable to create MediaPlayer for data source locator 0x%x", sourceLocator); 24043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen result = XA_RESULT_PARAMETER_INVALID; 24143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 24243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 24343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 24443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // FIXME duplicates an initialization also done by higher level 24543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen mp->mAndroidObjState = ANDROID_UNINITIALIZED; 24643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen mp->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE; 24743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen mp->mSessionId = android::AudioSystem::newAudioSessionId(); 24843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 24943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 25043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 25143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//----------------------------------------------------------------------------- 25443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 255236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgXAresult android_Player_realize(CMediaPlayer *mp, SLboolean async) { 25643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGV("android_Player_realize_l(%p)", mp); 25743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen XAresult result = XA_RESULT_SUCCESS; 25843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource; 26043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator; 26143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen AudioPlayback_Parameters ap_params; 26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ap_params.sessionId = mp->mSessionId; 26443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ap_params.streamType = mp->mStreamType; 26543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ap_params.trackcb = NULL; 26643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ap_params.trackcbUser = NULL; 26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch(mp->mAndroidObjType) { 26943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case AUDIOVIDEOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE: { 27043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen mp->mAVPlayer = new android::StreamPlayer(&ap_params, true /*hasVideo*/); 27143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp); 27243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 27343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 27443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case AUDIOVIDEOPLAYER_FROM_URIFD: { 27543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen mp->mAVPlayer = new android::LocAVPlayer(&ap_params, true /*hasVideo*/); 27643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp); 27765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org switch (mp->mDataSource.mLocator.mLocatorType) { 27865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org case XA_DATALOCATOR_URI: 27965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource( 28065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org (const char*)mp->mDataSource.mLocator.mURI.URI); 28143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 28271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org case XA_DATALOCATOR_ANDROIDFD: { 28343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int64_t offset = (int64_t)mp->mDataSource.mLocator.mFD.offset; 28443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource( 28543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (int)mp->mDataSource.mLocator.mFD.fd, 28643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ? 28743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset, 28843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen (int64_t)mp->mDataSource.mLocator.mFD.length); 28943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 29043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 29143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: 29243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGE("Invalid or unsupported data locator type %u for data source", 29343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen mp->mDataSource.mLocator.mLocatorType); 29443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen result = XA_RESULT_PARAMETER_INVALID; 29543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 29643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 29743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 29843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case INVALID_TYPE: // intended fall-through 29943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: 30043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGE("Unable to realize MediaPlayer, invalid internal Android object type"); 30143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen result = XA_RESULT_PARAMETER_INVALID; 30243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 30343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 30443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 30543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 30643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 30743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 30843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//----------------------------------------------------------------------------- 30943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenXAresult android_Player_destroy(CMediaPlayer *mp) { 31043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGV("android_Player_destroy(%p)", mp); 31143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen XAresult result = XA_RESULT_SUCCESS; 31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 31365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org if (mp->mAVPlayer != 0) { 31465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org mp->mAVPlayer.clear(); 31543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 31643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 31765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org return result; 31843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 31943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 32043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//----------------------------------------------------------------------------- 32143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/** 32243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * pre-conditions: gp != 0, surface != 0 32343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 32443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenXAresult android_Player_setVideoSurface(const android::sp<android::GenericPlayer> &gp, 32537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com const android::sp<android::Surface> &surface) { 32637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com XAresult result = XA_RESULT_SUCCESS; 32737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 32837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com android::GenericMediaPlayer* gmp = static_cast<android::GenericMediaPlayer*>(gp.get()); 32965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org gmp->setVideoSurface(surface); 33065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 33165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org return result; 33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 33343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 33443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 33543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/** 33643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * pre-conditions: gp != 0, surfaceTexture != 0 33743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 33843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenXAresult android_Player_setVideoSurfaceTexture(const android::sp<android::GenericPlayer> &gp, 33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const android::sp<android::ISurfaceTexture> &surfaceTexture) { 34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen XAresult result = XA_RESULT_SUCCESS; 34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen android::GenericMediaPlayer* gmp = static_cast<android::GenericMediaPlayer*>(gp.get()); 34343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen gmp->setVideoSurfaceTexture(surfaceTexture); 34443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 34543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 34643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 34743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 34843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 34943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenXAresult android_Player_getDuration(IPlay *pPlayItf, XAmillisecond *pDurMsec) { 35043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen XAresult result = XA_RESULT_SUCCESS; 35143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen CMediaPlayer *avp = (CMediaPlayer *)pPlayItf->mThis; 35243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 35343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (avp->mAndroidObjType) { 35443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 35543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case AUDIOVIDEOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE: // intended fall-through 35637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com case AUDIOVIDEOPLAYER_FROM_URIFD: { 35743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int dur = -1; 35843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (avp->mAVPlayer != 0) { 35943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen avp->mAVPlayer->getDurationMsec(&dur); 36043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 36143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (dur == ANDROID_UNKNOWN_TIME) { 36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *pDurMsec = XA_TIME_UNKNOWN; 36343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 36443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *pDurMsec = (XAmillisecond)dur; 36543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 36643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } break; 36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: 36943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // we shouldn't be here 37043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen assert(false); 371c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break; 37243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 37343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 37543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 37643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenXAresult android_Player_getPosition(IPlay *pPlayItf, XAmillisecond *pPosMsec) { 37943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGD("android_Player_getPosition()"); 38043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen XAresult result = XA_RESULT_SUCCESS; 38143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen CMediaPlayer *avp = (CMediaPlayer *)pPlayItf->mThis; 38243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 38343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (avp->mAndroidObjType) { 38443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 38543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case AUDIOVIDEOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE: // intended fall-through 38643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case AUDIOVIDEOPLAYER_FROM_URIFD: { 38743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int pos = -1; 38843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (avp->mAVPlayer != 0) { 38943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen avp->mAVPlayer->getPositionMsec(&pos); 39043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 39143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (pos == ANDROID_UNKNOWN_TIME) { 39243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *pPosMsec = XA_TIME_UNKNOWN; 39343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 39443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *pPosMsec = (XAmillisecond)pos; 39543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 39643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } break; 39743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 39843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: 39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // we shouldn't be here 40043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen assert(false); 40143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 40343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 40643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//----------------------------------------------------------------------------- 40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/** 41043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * pre-condition: mp != NULL 41143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 41243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid android_Player_volumeUpdate(CMediaPlayer* mp) 41343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen{ 41443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen android::GenericPlayer* avp = mp->mAVPlayer.get(); 41543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (avp != NULL) { 41643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen float volumes[2]; 41743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // MediaPlayer does not currently support EffectSend or MuteSolo 41843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen android_player_volumeUpdate(volumes, &mp->mVolume, mp->mNumChannels, 1.0f, NULL); 41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen float leftVol = volumes[0], rightVol = volumes[1]; 42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen avp->setVolume(leftVol, rightVol); 42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//----------------------------------------------------------------------------- 42543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/** 42643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * pre-condition: gp != 0 42743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenXAresult android_Player_setPlayState(const android::sp<android::GenericPlayer> &gp, 42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SLuint32 playState, 43043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen AndroidObjectState* pObjState) 43143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen{ 43243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen XAresult result = XA_RESULT_SUCCESS; 43343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen AndroidObjectState objState = *pObjState; 43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 43543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (playState) { 43643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case SL_PLAYSTATE_STOPPED: { 43743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED"); 43843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen gp->stop(); 43943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 44143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case SL_PLAYSTATE_PAUSED: { 44243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED"); 4435a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org switch(objState) { 4445a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org case ANDROID_UNINITIALIZED: 4455a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org *pObjState = ANDROID_PREPARING; 4465a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org gp->prepare(); 4475a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org break; 4485a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org case ANDROID_PREPARING: 4495a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org break; 4505a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org case ANDROID_READY: 4515a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org gp->pause(); 4525a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org break; 4535a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org default: 4545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org SL_LOGE("Android object in invalid state"); 4555a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org break; 4565a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 4575a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 4585a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org break; 45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case SL_PLAYSTATE_PLAYING: { 4605a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING"); 46143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch(objState) { 46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case ANDROID_UNINITIALIZED: 46343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *pObjState = ANDROID_PREPARING; 46443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen gp->prepare(); 46543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // intended fall through 46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case ANDROID_PREPARING: 46743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // intended fall through 46843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case ANDROID_READY: 46943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen gp->play(); 47043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 47143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: 47243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SL_LOGE("Android object in invalid state"); 47343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 47443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 47543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 47643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 47743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: 47843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // checked by caller, should not happen 47943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 48343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/** 48743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * pre-condition: mp != NULL 48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 48943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenXAresult android_Player_seek(CMediaPlayer *mp, SLmillisecond posMsec) { 49043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen XAresult result = XA_RESULT_SUCCESS; 49143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (mp->mAndroidObjType) { 492236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org case AUDIOVIDEOPLAYER_FROM_URIFD: 493236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org if (mp->mAVPlayer !=0) { 494236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org mp->mAVPlayer->seek(posMsec); 495236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org } 496236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org break; 497236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org case AUDIOVIDEOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE: // intended fall-through 498236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org default: { 499236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org result = XA_RESULT_PARAMETER_INVALID; 500236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org } 501236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org } 50241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org return result; 50341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 50441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org 505236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 506236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org/** 507236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org * pre-condition: mp != NULL 508236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org */ 509236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgXAresult android_Player_loop(CMediaPlayer *mp, SLboolean loopEnable) { 510236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org XAresult result = XA_RESULT_SUCCESS; 511236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org switch (mp->mAndroidObjType) { 512236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org case AUDIOVIDEOPLAYER_FROM_URIFD: 513236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org if (mp->mAVPlayer !=0) { 514236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org mp->mAVPlayer->loop(loopEnable); 515236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org } 516236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org break; 517236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org case AUDIOVIDEOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE: // intended fall-through 518236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org default: { 519236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org result = XA_RESULT_PARAMETER_INVALID; 520236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org } 521236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org } 522236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org return result; 523236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org} 524236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 52541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org 52641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org//----------------------------------------------------------------------------- 52741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgvoid android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) { 528236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org if ((mp->mAndroidObjType == AUDIOVIDEOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE) 529236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org && (mp->mAVPlayer != 0)) { 530236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org SL_LOGD("android_Player_androidBufferQueue_registerCallback_l"); 531236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org android::StreamPlayer* splr = static_cast<android::StreamPlayer*>(mp->mAVPlayer.get()); 532236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org splr->registerQueueCallback( 533236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org (const void*)mp, false /*userIsAudioPlayer*/, 534236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf)); 535236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 536236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org } 53741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 53841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org 53941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org 540236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgvoid android_Player_androidBufferQueue_clear_l(CMediaPlayer *mp) { 54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if ((mp->mAndroidObjType == AUDIOVIDEOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE) 542236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org && (mp->mAVPlayer != 0)) { 54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen android::StreamPlayer* splr = static_cast<android::StreamPlayer*>(mp->mAVPlayer.get()); 54443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen splr->appClear_l(); 54543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid android_Player_androidBufferQueue_onRefilled_l(CMediaPlayer *mp) { 55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if ((mp->mAndroidObjType == AUDIOVIDEOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE) 55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen && (mp->mAVPlayer != 0)) { 55243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen android::StreamPlayer* splr = static_cast<android::StreamPlayer*>(mp->mAVPlayer.get()); 55343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen splr->queueRefilled_l(); 55443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 55643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 55743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 55843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 55943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen