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();}
90     virtual status_t seekTo(
91             int msec,
92             MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC) {
93         return mPlayer->seekTo(msec, mode);
94     }
getCurrentPosition(int * p)95     virtual status_t getCurrentPosition(int *p)  {
96         return mPlayer->getCurrentPosition(p);
97     }
getDuration(int * d)98     virtual status_t getDuration(int *d)  {return mPlayer->getDuration(d);}
reset()99     virtual status_t reset() {return mPlayer->reset();}
setLooping(int b)100     virtual status_t setLooping(int b)  {return mPlayer->setLooping(b);}
playerType()101     virtual player_type playerType() {return mPlayer->playerType();}
invoke(const android::Parcel & in,android::Parcel * out)102     virtual status_t invoke(const android::Parcel& in, android::Parcel *out) {
103         return mPlayer->invoke(in, out);
104     }
setParameter(int key,const Parcel & request)105     virtual status_t setParameter(int key, const Parcel &request) {
106         return mPlayer->setParameter(key, request);
107     }
getParameter(int key,Parcel * reply)108     virtual status_t getParameter(int key, Parcel *reply) {
109         return mPlayer->getParameter(key, reply);
110     }
111 
112 
113     // @return true if the current build is 'eng' or 'test' and the
114     //              url's scheme is 'test:'
115     static bool canBeUsed(const char *url);
116 
117   private:
118     // Release the player, dlclose the library.
119     status_t resetInternal();
120     status_t parseUrl();
121 
122     char *mUrl;                // test:foo.so?url=http://bar
123     char *mFilename;           // foo.so
124     char *mContentUrl;         // http://bar
125     void *mHandle;             // returned by dlopen
126     NEW_PLAYER    mNewPlayer;
127     DELETE_PLAYER mDeletePlayer;
128     MediaPlayerBase *mPlayer;  // wrapped player
129 };
130 
131 }  // namespace android
132 
133 #endif
134