xref: /aosp_15_r20/frameworks/av/media/libmediaplayerservice/TestPlayerStub.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2009 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_FRAMEWORKS_BASE_MEDIA_LIBMEDIAPLAYERSERVICE_TESTPLAYERSTUB_H__
18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_FRAMEWORKS_BASE_MEDIA_LIBMEDIAPLAYERSERVICE_TESTPLAYERSTUB_H__
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaPlayerInterface.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <utils/Errors.h>
22*ec779b8eSAndroid Build Coastguard Worker 
23*ec779b8eSAndroid Build Coastguard Worker namespace android {
24*ec779b8eSAndroid Build Coastguard Worker class MediaPlayerBase;  // in media/MediaPlayerInterface.h
25*ec779b8eSAndroid Build Coastguard Worker 
26*ec779b8eSAndroid Build Coastguard Worker // Wrapper around a test media player that gets dynamically loaded.
27*ec779b8eSAndroid Build Coastguard Worker //
28*ec779b8eSAndroid Build Coastguard Worker // The URL passed to setDataSource has this format:
29*ec779b8eSAndroid Build Coastguard Worker //
30*ec779b8eSAndroid Build Coastguard Worker //   test:<name of the .so>?url=<url for the real setDataSource impl.>
31*ec779b8eSAndroid Build Coastguard Worker //
32*ec779b8eSAndroid Build Coastguard Worker // e.g:
33*ec779b8eSAndroid Build Coastguard Worker //   test:invoke_test_media_player.so?url=http://youtube.com/
34*ec779b8eSAndroid Build Coastguard Worker //   test:invoke_test_media_player.so?url=speedtest
35*ec779b8eSAndroid Build Coastguard Worker //
36*ec779b8eSAndroid Build Coastguard Worker // TestPlayerStub::setDataSource loads the library in the test url. 2
37*ec779b8eSAndroid Build Coastguard Worker // entry points with C linkage are expected. One to create the test
38*ec779b8eSAndroid Build Coastguard Worker // player and one to destroy it.
39*ec779b8eSAndroid Build Coastguard Worker //
40*ec779b8eSAndroid Build Coastguard Worker // extern "C" android::MediaPlayerBase* newPlayer();
41*ec779b8eSAndroid Build Coastguard Worker // extern "C" android::status_t deletePlayer(android::MediaPlayerBase *p);
42*ec779b8eSAndroid Build Coastguard Worker //
43*ec779b8eSAndroid Build Coastguard Worker // Once the test player has been loaded, its setDataSource
44*ec779b8eSAndroid Build Coastguard Worker // implementation is called with the value of the 'url' parameter.
45*ec779b8eSAndroid Build Coastguard Worker //
46*ec779b8eSAndroid Build Coastguard Worker // typical usage in a java test:
47*ec779b8eSAndroid Build Coastguard Worker // ============================
48*ec779b8eSAndroid Build Coastguard Worker //
49*ec779b8eSAndroid Build Coastguard Worker //  MediaPlayer p = new MediaPlayer();
50*ec779b8eSAndroid Build Coastguard Worker //  p.setDataSource("test:invoke_mock_media_player.so?url=http://youtube.com");
51*ec779b8eSAndroid Build Coastguard Worker //  p.prepare();
52*ec779b8eSAndroid Build Coastguard Worker //  ...
53*ec779b8eSAndroid Build Coastguard Worker //  p.release();
54*ec779b8eSAndroid Build Coastguard Worker 
55*ec779b8eSAndroid Build Coastguard Worker class TestPlayerStub : public MediaPlayerInterface {
56*ec779b8eSAndroid Build Coastguard Worker   public:
57*ec779b8eSAndroid Build Coastguard Worker     typedef MediaPlayerBase* (*NEW_PLAYER)();
58*ec779b8eSAndroid Build Coastguard Worker     typedef status_t (*DELETE_PLAYER)(MediaPlayerBase *);
59*ec779b8eSAndroid Build Coastguard Worker 
60*ec779b8eSAndroid Build Coastguard Worker     TestPlayerStub();
61*ec779b8eSAndroid Build Coastguard Worker     virtual ~TestPlayerStub();
62*ec779b8eSAndroid Build Coastguard Worker 
63*ec779b8eSAndroid Build Coastguard Worker     // Called right after the constructor. Check if the current build
64*ec779b8eSAndroid Build Coastguard Worker     // allows test players.
65*ec779b8eSAndroid Build Coastguard Worker     virtual status_t initCheck();
66*ec779b8eSAndroid Build Coastguard Worker 
67*ec779b8eSAndroid Build Coastguard Worker     // @param url Should be a test url. See class comment.
68*ec779b8eSAndroid Build Coastguard Worker     virtual status_t setDataSource(
69*ec779b8eSAndroid Build Coastguard Worker             const sp<IMediaHTTPService> &httpService,
70*ec779b8eSAndroid Build Coastguard Worker             const char* url,
71*ec779b8eSAndroid Build Coastguard Worker             const KeyedVector<String8, String8> *headers);
72*ec779b8eSAndroid Build Coastguard Worker 
73*ec779b8eSAndroid Build Coastguard Worker     // Test player for a file descriptor source is not supported.
setDataSource(int,int64_t,int64_t)74*ec779b8eSAndroid Build Coastguard Worker     virtual status_t setDataSource(int, int64_t, int64_t)  {
75*ec779b8eSAndroid Build Coastguard Worker         return INVALID_OPERATION;
76*ec779b8eSAndroid Build Coastguard Worker     }
77*ec779b8eSAndroid Build Coastguard Worker 
78*ec779b8eSAndroid Build Coastguard Worker 
79*ec779b8eSAndroid Build Coastguard Worker     // All the methods below wrap the mPlayer instance.
setVideoSurfaceTexture(const android::sp<android::IGraphicBufferProducer> & st)80*ec779b8eSAndroid Build Coastguard Worker     virtual status_t setVideoSurfaceTexture(
81*ec779b8eSAndroid Build Coastguard Worker             const android::sp<android::IGraphicBufferProducer>& st)  {
82*ec779b8eSAndroid Build Coastguard Worker         return mPlayer->setVideoSurfaceTexture(st);
83*ec779b8eSAndroid Build Coastguard Worker     }
prepare()84*ec779b8eSAndroid Build Coastguard Worker     virtual status_t prepare() {return mPlayer->prepare();}
prepareAsync()85*ec779b8eSAndroid Build Coastguard Worker     virtual status_t prepareAsync()  {return mPlayer->prepareAsync();}
start()86*ec779b8eSAndroid Build Coastguard Worker     virtual status_t start()  {return mPlayer->start();}
stop()87*ec779b8eSAndroid Build Coastguard Worker     virtual status_t stop()  {return mPlayer->stop();}
pause()88*ec779b8eSAndroid Build Coastguard Worker     virtual status_t pause()  {return mPlayer->pause();}
isPlaying()89*ec779b8eSAndroid Build Coastguard Worker     virtual bool isPlaying() {return mPlayer->isPlaying();}
90*ec779b8eSAndroid Build Coastguard Worker     virtual status_t seekTo(
91*ec779b8eSAndroid Build Coastguard Worker             int msec,
92*ec779b8eSAndroid Build Coastguard Worker             MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC) {
93*ec779b8eSAndroid Build Coastguard Worker         return mPlayer->seekTo(msec, mode);
94*ec779b8eSAndroid Build Coastguard Worker     }
getCurrentPosition(int * p)95*ec779b8eSAndroid Build Coastguard Worker     virtual status_t getCurrentPosition(int *p)  {
96*ec779b8eSAndroid Build Coastguard Worker         return mPlayer->getCurrentPosition(p);
97*ec779b8eSAndroid Build Coastguard Worker     }
getDuration(int * d)98*ec779b8eSAndroid Build Coastguard Worker     virtual status_t getDuration(int *d)  {return mPlayer->getDuration(d);}
reset()99*ec779b8eSAndroid Build Coastguard Worker     virtual status_t reset() {return mPlayer->reset();}
setLooping(int b)100*ec779b8eSAndroid Build Coastguard Worker     virtual status_t setLooping(int b)  {return mPlayer->setLooping(b);}
playerType()101*ec779b8eSAndroid Build Coastguard Worker     virtual player_type playerType() {return mPlayer->playerType();}
invoke(const android::Parcel & in,android::Parcel * out)102*ec779b8eSAndroid Build Coastguard Worker     virtual status_t invoke(const android::Parcel& in, android::Parcel *out) {
103*ec779b8eSAndroid Build Coastguard Worker         return mPlayer->invoke(in, out);
104*ec779b8eSAndroid Build Coastguard Worker     }
setParameter(int key,const Parcel & request)105*ec779b8eSAndroid Build Coastguard Worker     virtual status_t setParameter(int key, const Parcel &request) {
106*ec779b8eSAndroid Build Coastguard Worker         return mPlayer->setParameter(key, request);
107*ec779b8eSAndroid Build Coastguard Worker     }
getParameter(int key,Parcel * reply)108*ec779b8eSAndroid Build Coastguard Worker     virtual status_t getParameter(int key, Parcel *reply) {
109*ec779b8eSAndroid Build Coastguard Worker         return mPlayer->getParameter(key, reply);
110*ec779b8eSAndroid Build Coastguard Worker     }
111*ec779b8eSAndroid Build Coastguard Worker 
112*ec779b8eSAndroid Build Coastguard Worker 
113*ec779b8eSAndroid Build Coastguard Worker     // @return true if the current build is 'eng' or 'test' and the
114*ec779b8eSAndroid Build Coastguard Worker     //              url's scheme is 'test:'
115*ec779b8eSAndroid Build Coastguard Worker     static bool canBeUsed(const char *url);
116*ec779b8eSAndroid Build Coastguard Worker 
117*ec779b8eSAndroid Build Coastguard Worker   private:
118*ec779b8eSAndroid Build Coastguard Worker     // Release the player, dlclose the library.
119*ec779b8eSAndroid Build Coastguard Worker     status_t resetInternal();
120*ec779b8eSAndroid Build Coastguard Worker     status_t parseUrl();
121*ec779b8eSAndroid Build Coastguard Worker 
122*ec779b8eSAndroid Build Coastguard Worker     char *mUrl;                // test:foo.so?url=http://bar
123*ec779b8eSAndroid Build Coastguard Worker     char *mFilename;           // foo.so
124*ec779b8eSAndroid Build Coastguard Worker     char *mContentUrl;         // http://bar
125*ec779b8eSAndroid Build Coastguard Worker     void *mHandle;             // returned by dlopen
126*ec779b8eSAndroid Build Coastguard Worker     NEW_PLAYER    mNewPlayer;
127*ec779b8eSAndroid Build Coastguard Worker     DELETE_PLAYER mDeletePlayer;
128*ec779b8eSAndroid Build Coastguard Worker     MediaPlayerBase *mPlayer;  // wrapped player
129*ec779b8eSAndroid Build Coastguard Worker };
130*ec779b8eSAndroid Build Coastguard Worker 
131*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
132*ec779b8eSAndroid Build Coastguard Worker 
133*ec779b8eSAndroid Build Coastguard Worker #endif
134