/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_FRAMEWORKS_BASE_MEDIA_LIBMEDIAPLAYERSERVICE_TESTPLAYERSTUB_H__ #define ANDROID_FRAMEWORKS_BASE_MEDIA_LIBMEDIAPLAYERSERVICE_TESTPLAYERSTUB_H__ #include <media/MediaPlayerInterface.h> #include <utils/Errors.h> namespace android { class MediaPlayerBase; // in media/MediaPlayerInterface.h // Wrapper around a test media player that gets dynamically loaded. // // The URL passed to setDataSource has this format: // // test:<name of the .so>?url=<url for the real setDataSource impl.> // // e.g: // test:invoke_test_media_player.so?url=http://youtube.com/ // test:invoke_test_media_player.so?url=speedtest // // TestPlayerStub::setDataSource loads the library in the test url. 2 // entry points with C linkage are expected. One to create the test // player and one to destroy it. // // extern "C" android::MediaPlayerBase* newPlayer(); // extern "C" android::status_t deletePlayer(android::MediaPlayerBase *p); // // Once the test player has been loaded, its setDataSource // implementation is called with the value of the 'url' parameter. // // typical usage in a java test: // ============================ // // MediaPlayer p = new MediaPlayer(); // p.setDataSource("test:invoke_mock_media_player.so?url=http://youtube.com"); // p.prepare(); // ... // p.release(); class TestPlayerStub : public MediaPlayerInterface { public: typedef MediaPlayerBase* (*NEW_PLAYER)(); typedef status_t (*DELETE_PLAYER)(MediaPlayerBase *); TestPlayerStub(); virtual ~TestPlayerStub(); // Called right after the constructor. Check if the current build // allows test players. virtual status_t initCheck(); // @param url Should be a test url. See class comment. virtual status_t setDataSource( const char* url, const KeyedVector<String8, String8> *headers); // Test player for a file descriptor source is not supported. virtual status_t setDataSource(int, int64_t, int64_t) { return INVALID_OPERATION; } // All the methods below wrap the mPlayer instance. virtual status_t setVideoSurfaceTexture( const android::sp<android::IGraphicBufferProducer>& st) { return mPlayer->setVideoSurfaceTexture(st); } virtual status_t prepare() {return mPlayer->prepare();} virtual status_t prepareAsync() {return mPlayer->prepareAsync();} virtual status_t start() {return mPlayer->start();} virtual status_t stop() {return mPlayer->stop();} virtual status_t pause() {return mPlayer->pause();} virtual bool isPlaying() {return mPlayer->isPlaying();} virtual status_t seekTo(int msec) {return mPlayer->seekTo(msec);} virtual status_t getCurrentPosition(int *p) { return mPlayer->getCurrentPosition(p); } virtual status_t getDuration(int *d) {return mPlayer->getDuration(d);} virtual status_t reset() {return mPlayer->reset();} virtual status_t setLooping(int b) {return mPlayer->setLooping(b);} virtual player_type playerType() {return mPlayer->playerType();} virtual status_t invoke(const android::Parcel& in, android::Parcel *out) { return mPlayer->invoke(in, out); } virtual status_t setParameter(int key, const Parcel &request) { return mPlayer->setParameter(key, request); } virtual status_t getParameter(int key, Parcel *reply) { return mPlayer->getParameter(key, reply); } // @return true if the current build is 'eng' or 'test' and the // url's scheme is 'test:' static bool canBeUsed(const char *url); private: // Release the player, dlclose the library. status_t resetInternal(); status_t parseUrl(); char *mUrl; // test:foo.so?url=http://bar char *mFilename; // foo.so char *mContentUrl; // http://bar void *mHandle; // returned by dlopen NEW_PLAYER mNewPlayer; DELETE_PLAYER mDeletePlayer; MediaPlayerBase *mPlayer; // wrapped player }; } // namespace android #endif