1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2009 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_FRAMEWORKS_BASE_MEDIA_LIBMEDIAPLAYERSERVICE_TESTPLAYERSTUB_H__ 18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_FRAMEWORKS_BASE_MEDIA_LIBMEDIAPLAYERSERVICE_TESTPLAYERSTUB_H__ 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaPlayerInterface.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <utils/Errors.h> 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker namespace android { 24*ec779b8eSAndroid Build Coastguard Worker class MediaPlayerBase; // in media/MediaPlayerInterface.h 25*ec779b8eSAndroid Build Coastguard Worker 26*ec779b8eSAndroid Build Coastguard Worker // Wrapper around a test media player that gets dynamically loaded. 27*ec779b8eSAndroid Build Coastguard Worker // 28*ec779b8eSAndroid Build Coastguard Worker // The URL passed to setDataSource has this format: 29*ec779b8eSAndroid Build Coastguard Worker // 30*ec779b8eSAndroid Build Coastguard Worker // test:<name of the .so>?url=<url for the real setDataSource impl.> 31*ec779b8eSAndroid Build Coastguard Worker // 32*ec779b8eSAndroid Build Coastguard Worker // e.g: 33*ec779b8eSAndroid Build Coastguard Worker // test:invoke_test_media_player.so?url=http://youtube.com/ 34*ec779b8eSAndroid Build Coastguard Worker // test:invoke_test_media_player.so?url=speedtest 35*ec779b8eSAndroid Build Coastguard Worker // 36*ec779b8eSAndroid Build Coastguard Worker // TestPlayerStub::setDataSource loads the library in the test url. 2 37*ec779b8eSAndroid Build Coastguard Worker // entry points with C linkage are expected. One to create the test 38*ec779b8eSAndroid Build Coastguard Worker // player and one to destroy it. 39*ec779b8eSAndroid Build Coastguard Worker // 40*ec779b8eSAndroid Build Coastguard Worker // extern "C" android::MediaPlayerBase* newPlayer(); 41*ec779b8eSAndroid Build Coastguard Worker // extern "C" android::status_t deletePlayer(android::MediaPlayerBase *p); 42*ec779b8eSAndroid Build Coastguard Worker // 43*ec779b8eSAndroid Build Coastguard Worker // Once the test player has been loaded, its setDataSource 44*ec779b8eSAndroid Build Coastguard Worker // implementation is called with the value of the 'url' parameter. 45*ec779b8eSAndroid Build Coastguard Worker // 46*ec779b8eSAndroid Build Coastguard Worker // typical usage in a java test: 47*ec779b8eSAndroid Build Coastguard Worker // ============================ 48*ec779b8eSAndroid Build Coastguard Worker // 49*ec779b8eSAndroid Build Coastguard Worker // MediaPlayer p = new MediaPlayer(); 50*ec779b8eSAndroid Build Coastguard Worker // p.setDataSource("test:invoke_mock_media_player.so?url=http://youtube.com"); 51*ec779b8eSAndroid Build Coastguard Worker // p.prepare(); 52*ec779b8eSAndroid Build Coastguard Worker // ... 53*ec779b8eSAndroid Build Coastguard Worker // p.release(); 54*ec779b8eSAndroid Build Coastguard Worker 55*ec779b8eSAndroid Build Coastguard Worker class TestPlayerStub : public MediaPlayerInterface { 56*ec779b8eSAndroid Build Coastguard Worker public: 57*ec779b8eSAndroid Build Coastguard Worker typedef MediaPlayerBase* (*NEW_PLAYER)(); 58*ec779b8eSAndroid Build Coastguard Worker typedef status_t (*DELETE_PLAYER)(MediaPlayerBase *); 59*ec779b8eSAndroid Build Coastguard Worker 60*ec779b8eSAndroid Build Coastguard Worker TestPlayerStub(); 61*ec779b8eSAndroid Build Coastguard Worker virtual ~TestPlayerStub(); 62*ec779b8eSAndroid Build Coastguard Worker 63*ec779b8eSAndroid Build Coastguard Worker // Called right after the constructor. Check if the current build 64*ec779b8eSAndroid Build Coastguard Worker // allows test players. 65*ec779b8eSAndroid Build Coastguard Worker virtual status_t initCheck(); 66*ec779b8eSAndroid Build Coastguard Worker 67*ec779b8eSAndroid Build Coastguard Worker // @param url Should be a test url. See class comment. 68*ec779b8eSAndroid Build Coastguard Worker virtual status_t setDataSource( 69*ec779b8eSAndroid Build Coastguard Worker const sp<IMediaHTTPService> &httpService, 70*ec779b8eSAndroid Build Coastguard Worker const char* url, 71*ec779b8eSAndroid Build Coastguard Worker const KeyedVector<String8, String8> *headers); 72*ec779b8eSAndroid Build Coastguard Worker 73*ec779b8eSAndroid Build Coastguard Worker // Test player for a file descriptor source is not supported. setDataSource(int,int64_t,int64_t)74*ec779b8eSAndroid Build Coastguard Worker virtual status_t setDataSource(int, int64_t, int64_t) { 75*ec779b8eSAndroid Build Coastguard Worker return INVALID_OPERATION; 76*ec779b8eSAndroid Build Coastguard Worker } 77*ec779b8eSAndroid Build Coastguard Worker 78*ec779b8eSAndroid Build Coastguard Worker 79*ec779b8eSAndroid Build Coastguard Worker // All the methods below wrap the mPlayer instance. setVideoSurfaceTexture(const android::sp<android::IGraphicBufferProducer> & st)80*ec779b8eSAndroid Build Coastguard Worker virtual status_t setVideoSurfaceTexture( 81*ec779b8eSAndroid Build Coastguard Worker const android::sp<android::IGraphicBufferProducer>& st) { 82*ec779b8eSAndroid Build Coastguard Worker return mPlayer->setVideoSurfaceTexture(st); 83*ec779b8eSAndroid Build Coastguard Worker } prepare()84*ec779b8eSAndroid Build Coastguard Worker virtual status_t prepare() {return mPlayer->prepare();} prepareAsync()85*ec779b8eSAndroid Build Coastguard Worker virtual status_t prepareAsync() {return mPlayer->prepareAsync();} start()86*ec779b8eSAndroid Build Coastguard Worker virtual status_t start() {return mPlayer->start();} stop()87*ec779b8eSAndroid Build Coastguard Worker virtual status_t stop() {return mPlayer->stop();} pause()88*ec779b8eSAndroid Build Coastguard Worker virtual status_t pause() {return mPlayer->pause();} isPlaying()89*ec779b8eSAndroid Build Coastguard Worker virtual bool isPlaying() {return mPlayer->isPlaying();} 90*ec779b8eSAndroid Build Coastguard Worker virtual status_t seekTo( 91*ec779b8eSAndroid Build Coastguard Worker int msec, 92*ec779b8eSAndroid Build Coastguard Worker MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC) { 93*ec779b8eSAndroid Build Coastguard Worker return mPlayer->seekTo(msec, mode); 94*ec779b8eSAndroid Build Coastguard Worker } getCurrentPosition(int * p)95*ec779b8eSAndroid Build Coastguard Worker virtual status_t getCurrentPosition(int *p) { 96*ec779b8eSAndroid Build Coastguard Worker return mPlayer->getCurrentPosition(p); 97*ec779b8eSAndroid Build Coastguard Worker } getDuration(int * d)98*ec779b8eSAndroid Build Coastguard Worker virtual status_t getDuration(int *d) {return mPlayer->getDuration(d);} reset()99*ec779b8eSAndroid Build Coastguard Worker virtual status_t reset() {return mPlayer->reset();} setLooping(int b)100*ec779b8eSAndroid Build Coastguard Worker virtual status_t setLooping(int b) {return mPlayer->setLooping(b);} playerType()101*ec779b8eSAndroid Build Coastguard Worker virtual player_type playerType() {return mPlayer->playerType();} invoke(const android::Parcel & in,android::Parcel * out)102*ec779b8eSAndroid Build Coastguard Worker virtual status_t invoke(const android::Parcel& in, android::Parcel *out) { 103*ec779b8eSAndroid Build Coastguard Worker return mPlayer->invoke(in, out); 104*ec779b8eSAndroid Build Coastguard Worker } setParameter(int key,const Parcel & request)105*ec779b8eSAndroid Build Coastguard Worker virtual status_t setParameter(int key, const Parcel &request) { 106*ec779b8eSAndroid Build Coastguard Worker return mPlayer->setParameter(key, request); 107*ec779b8eSAndroid Build Coastguard Worker } getParameter(int key,Parcel * reply)108*ec779b8eSAndroid Build Coastguard Worker virtual status_t getParameter(int key, Parcel *reply) { 109*ec779b8eSAndroid Build Coastguard Worker return mPlayer->getParameter(key, reply); 110*ec779b8eSAndroid Build Coastguard Worker } 111*ec779b8eSAndroid Build Coastguard Worker 112*ec779b8eSAndroid Build Coastguard Worker 113*ec779b8eSAndroid Build Coastguard Worker // @return true if the current build is 'eng' or 'test' and the 114*ec779b8eSAndroid Build Coastguard Worker // url's scheme is 'test:' 115*ec779b8eSAndroid Build Coastguard Worker static bool canBeUsed(const char *url); 116*ec779b8eSAndroid Build Coastguard Worker 117*ec779b8eSAndroid Build Coastguard Worker private: 118*ec779b8eSAndroid Build Coastguard Worker // Release the player, dlclose the library. 119*ec779b8eSAndroid Build Coastguard Worker status_t resetInternal(); 120*ec779b8eSAndroid Build Coastguard Worker status_t parseUrl(); 121*ec779b8eSAndroid Build Coastguard Worker 122*ec779b8eSAndroid Build Coastguard Worker char *mUrl; // test:foo.so?url=http://bar 123*ec779b8eSAndroid Build Coastguard Worker char *mFilename; // foo.so 124*ec779b8eSAndroid Build Coastguard Worker char *mContentUrl; // http://bar 125*ec779b8eSAndroid Build Coastguard Worker void *mHandle; // returned by dlopen 126*ec779b8eSAndroid Build Coastguard Worker NEW_PLAYER mNewPlayer; 127*ec779b8eSAndroid Build Coastguard Worker DELETE_PLAYER mDeletePlayer; 128*ec779b8eSAndroid Build Coastguard Worker MediaPlayerBase *mPlayer; // wrapped player 129*ec779b8eSAndroid Build Coastguard Worker }; 130*ec779b8eSAndroid Build Coastguard Worker 131*ec779b8eSAndroid Build Coastguard Worker } // namespace android 132*ec779b8eSAndroid Build Coastguard Worker 133*ec779b8eSAndroid Build Coastguard Worker #endif 134