TestPlayerStub.h revision 5daeb129a2c2ba3d14ccd94af283b5f561c783ea
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 setVideoISurface(const android::sp<android::ISurface>& s)  {
79        return mPlayer->setVideoISurface(s);
80    }
81    virtual status_t setVideoSurface(const android::sp<android::Surface>& s)  {
82        return mPlayer->setVideoSurface(s);
83    }
84    virtual status_t prepare() {return mPlayer->prepare();}
85    virtual status_t prepareAsync()  {return mPlayer->prepareAsync();}
86    virtual status_t start()  {return mPlayer->start();}
87    virtual status_t stop()  {return mPlayer->stop();}
88    virtual status_t pause()  {return mPlayer->pause();}
89    virtual bool isPlaying() {return mPlayer->isPlaying();}
90    virtual status_t seekTo(int msec) {return mPlayer->seekTo(msec);}
91    virtual status_t getCurrentPosition(int *p)  {
92        return mPlayer->getCurrentPosition(p);
93    }
94    virtual status_t getDuration(int *d)  {return mPlayer->getDuration(d);}
95    virtual status_t reset() {return mPlayer->reset();}
96    virtual status_t setLooping(int b)  {return mPlayer->setLooping(b);}
97    virtual player_type playerType() {return mPlayer->playerType();}
98    virtual status_t invoke(const android::Parcel& in, android::Parcel *out) {
99        return mPlayer->invoke(in, out);
100    }
101
102
103    // @return true if the current build is 'eng' or 'test' and the
104    //              url's scheme is 'test:'
105    static bool canBeUsed(const char *url);
106
107  private:
108    // Release the player, dlclose the library.
109    status_t resetInternal();
110    status_t parseUrl();
111
112    char *mUrl;                // test:foo.so?url=http://bar
113    char *mFilename;           // foo.so
114    char *mContentUrl;         // http://bar
115    void *mHandle;             // returned by dlopen
116    NEW_PLAYER    mNewPlayer;
117    DELETE_PLAYER mDeletePlayer;
118    MediaPlayerBase *mPlayer;  // wrapped player
119};
120
121}  // namespace android
122
123#endif
124