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 23namespace android { 24class 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 55class 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::ISurfaceTexture>& 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