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