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