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( 69 const char* url, const KeyedVector<String8, String8> *headers); 70 71 // Test player for a file descriptor source is not supported. 72 virtual status_t setDataSource(int, int64_t, int64_t) { 73 return INVALID_OPERATION; 74 } 75 76 77 // All the methods below wrap the mPlayer instance. 78 virtual status_t setVideoSurfaceTexture( 79 const android::sp<android::IGraphicBufferProducer>& st) { 80 return mPlayer->setVideoSurfaceTexture(st); 81 } 82 virtual status_t prepare() {return mPlayer->prepare();} 83 virtual status_t prepareAsync() {return mPlayer->prepareAsync();} 84 virtual status_t start() {return mPlayer->start();} 85 virtual status_t stop() {return mPlayer->stop();} 86 virtual status_t pause() {return mPlayer->pause();} 87 virtual bool isPlaying() {return mPlayer->isPlaying();} 88 virtual status_t seekTo(int msec) {return mPlayer->seekTo(msec);} 89 virtual status_t getCurrentPosition(int *p) { 90 return mPlayer->getCurrentPosition(p); 91 } 92 virtual status_t getDuration(int *d) {return mPlayer->getDuration(d);} 93 virtual status_t reset() {return mPlayer->reset();} 94 virtual status_t setLooping(int b) {return mPlayer->setLooping(b);} 95 virtual player_type playerType() {return mPlayer->playerType();} 96 virtual status_t invoke(const android::Parcel& in, android::Parcel *out) { 97 return mPlayer->invoke(in, out); 98 } 99 virtual status_t setParameter(int key, const Parcel &request) { 100 return mPlayer->setParameter(key, request); 101 } 102 virtual status_t getParameter(int key, Parcel *reply) { 103 return mPlayer->getParameter(key, reply); 104 } 105 106 107 // @return true if the current build is 'eng' or 'test' and the 108 // url's scheme is 'test:' 109 static bool canBeUsed(const char *url); 110 111 private: 112 // Release the player, dlclose the library. 113 status_t resetInternal(); 114 status_t parseUrl(); 115 116 char *mUrl; // test:foo.so?url=http://bar 117 char *mFilename; // foo.so 118 char *mContentUrl; // http://bar 119 void *mHandle; // returned by dlopen 120 NEW_PLAYER mNewPlayer; 121 DELETE_PLAYER mDeletePlayer; 122 MediaPlayerBase *mPlayer; // wrapped player 123 }; 124 125 } // namespace android 126 127 #endif 128