18f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania/* 28f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania * Copyright (C) 2009 The Android Open Source Project 38f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania * 48f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania * Licensed under the Apache License, Version 2.0 (the "License"); 58f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania * you may not use this file except in compliance with the License. 68f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania * You may obtain a copy of the License at 78f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania * 88f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania * http://www.apache.org/licenses/LICENSE-2.0 98f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania * 108f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania * Unless required by applicable law or agreed to in writing, software 118f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania * distributed under the License is distributed on an "AS IS" BASIS, 128f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania * See the License for the specific language governing permissions and 148f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania * limitations under the License. 158f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania */ 168f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 178f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania#ifndef ANDROID_FRAMEWORKS_BASE_MEDIA_LIBMEDIAPLAYERSERVICE_TESTPLAYERSTUB_H__ 188f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania#define ANDROID_FRAMEWORKS_BASE_MEDIA_LIBMEDIAPLAYERSERVICE_TESTPLAYERSTUB_H__ 198f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 208f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania#include <media/MediaPlayerInterface.h> 218f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania#include <utils/Errors.h> 228f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 238f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catanianamespace android { 248f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Cataniaclass MediaPlayerBase; // in media/MediaPlayerInterface.h 258f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 268f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// Wrapper around a test media player that gets dynamically loaded. 278f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// 288f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// The URL passed to setDataSource has this format: 298f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// 308f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// test:<name of the .so>?url=<url for the real setDataSource impl.> 318f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// 328f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// e.g: 338f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// test:invoke_test_media_player.so?url=http://youtube.com/ 348f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// test:invoke_test_media_player.so?url=speedtest 358f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// 368f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// TestPlayerStub::setDataSource loads the library in the test url. 2 378f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// entry points with C linkage are expected. One to create the test 388f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// player and one to destroy it. 398f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// 408f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// extern "C" android::MediaPlayerBase* newPlayer(); 418f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// extern "C" android::status_t deletePlayer(android::MediaPlayerBase *p); 428f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// 438f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// Once the test player has been loaded, its setDataSource 448f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// implementation is called with the value of the 'url' parameter. 458f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// 468f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// typical usage in a java test: 478f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// ============================ 488f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// 498f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// MediaPlayer p = new MediaPlayer(); 508f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// p.setDataSource("test:invoke_mock_media_player.so?url=http://youtube.com"); 518f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// p.prepare(); 528f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// ... 538f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania// p.release(); 548f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 558f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Cataniaclass TestPlayerStub : public MediaPlayerInterface { 568f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania public: 578f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania typedef MediaPlayerBase* (*NEW_PLAYER)(); 588f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania typedef status_t (*DELETE_PLAYER)(MediaPlayerBase *); 598f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 608f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania TestPlayerStub(); 618f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual ~TestPlayerStub(); 628f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 638f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania // Called right after the constructor. Check if the current build 648f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania // allows test players. 658f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual status_t initCheck(); 668f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 678f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania // @param url Should be a test url. See class comment. 68256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber virtual status_t setDataSource( 69256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber const char* url, const KeyedVector<String8, String8> *headers); 708f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 718f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania // Test player for a file descriptor source is not supported. 728f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual status_t setDataSource(int, int64_t, int64_t) { 738f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania return INVALID_OPERATION; 748f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania } 758f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 768f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 778f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania // All the methods below wrap the mPlayer instance. 78cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten virtual status_t setVideoSurfaceTexture( 79cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten const android::sp<android::ISurfaceTexture>& st) { 80cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten return mPlayer->setVideoSurfaceTexture(st); 81cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten } 828f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual status_t prepare() {return mPlayer->prepare();} 838f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual status_t prepareAsync() {return mPlayer->prepareAsync();} 848f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual status_t start() {return mPlayer->start();} 858f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual status_t stop() {return mPlayer->stop();} 868f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual status_t pause() {return mPlayer->pause();} 878f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual bool isPlaying() {return mPlayer->isPlaying();} 888f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual status_t seekTo(int msec) {return mPlayer->seekTo(msec);} 898f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual status_t getCurrentPosition(int *p) { 908f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania return mPlayer->getCurrentPosition(p); 918f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania } 928f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual status_t getDuration(int *d) {return mPlayer->getDuration(d);} 938f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual status_t reset() {return mPlayer->reset();} 948f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual status_t setLooping(int b) {return mPlayer->setLooping(b);} 958f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual player_type playerType() {return mPlayer->playerType();} 968f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania virtual status_t invoke(const android::Parcel& in, android::Parcel *out) { 978f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania return mPlayer->invoke(in, out); 988f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania } 99d01ec6eab019e46398975202e9e4a198a603ad99Gloria Wang virtual status_t setParameter(int key, const Parcel &request) { 100d01ec6eab019e46398975202e9e4a198a603ad99Gloria Wang return mPlayer->setParameter(key, request); 101d01ec6eab019e46398975202e9e4a198a603ad99Gloria Wang } 102d01ec6eab019e46398975202e9e4a198a603ad99Gloria Wang virtual status_t getParameter(int key, Parcel *reply) { 103d01ec6eab019e46398975202e9e4a198a603ad99Gloria Wang return mPlayer->getParameter(key, reply); 104d01ec6eab019e46398975202e9e4a198a603ad99Gloria Wang } 1058f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 1068f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 1078f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania // @return true if the current build is 'eng' or 'test' and the 1088f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania // url's scheme is 'test:' 1098f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania static bool canBeUsed(const char *url); 1108f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 1118f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania private: 1128f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania // Release the player, dlclose the library. 1138f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania status_t resetInternal(); 1148f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania status_t parseUrl(); 1158f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 1168f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania char *mUrl; // test:foo.so?url=http://bar 1178f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania char *mFilename; // foo.so 1188f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania char *mContentUrl; // http://bar 1198f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania void *mHandle; // returned by dlopen 1208f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania NEW_PLAYER mNewPlayer; 1218f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania DELETE_PLAYER mDeletePlayer; 1228f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania MediaPlayerBase *mPlayer; // wrapped player 1238f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania}; 1248f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 1258f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania} // namespace android 1268f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania 1278f5fcab05f1d6f644a9c30f012b8ff302f24a118Nicolas Catania#endif 128